@itwin/presentation-frontend 4.0.0-dev.4 → 4.0.0-dev.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -3
- package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.js +1 -1
- package/lib/cjs/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
- package/lib/cjs/presentation-frontend/Presentation.d.ts +0 -2
- package/lib/cjs/presentation-frontend/Presentation.d.ts.map +1 -1
- package/lib/cjs/presentation-frontend/Presentation.js +3 -6
- package/lib/cjs/presentation-frontend/Presentation.js.map +1 -1
- package/lib/cjs/presentation-frontend/PresentationManager.js +8 -11
- package/lib/cjs/presentation-frontend/PresentationManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/RulesetVariablesManager.js +1 -1
- package/lib/cjs/presentation-frontend/RulesetVariablesManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/StateTracker.js +3 -4
- package/lib/cjs/presentation-frontend/StateTracker.js.map +1 -1
- package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js +5 -8
- package/lib/cjs/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHelper.d.ts +4 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHelper.d.ts.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHelper.js +4 -1
- package/lib/cjs/presentation-frontend/selection/SelectionHelper.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionManager.js +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionManager.js.map +1 -1
- package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.d.ts +2 -2
- package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.js +2 -2
- package/lib/cjs/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
- package/lib/esm/presentation-frontend/ConnectivityInformationProvider.js +1 -1
- package/lib/esm/presentation-frontend/ConnectivityInformationProvider.js.map +1 -1
- package/lib/esm/presentation-frontend/Presentation.d.ts +0 -2
- package/lib/esm/presentation-frontend/Presentation.d.ts.map +1 -1
- package/lib/esm/presentation-frontend/Presentation.js +3 -6
- package/lib/esm/presentation-frontend/Presentation.js.map +1 -1
- package/lib/esm/presentation-frontend/PresentationManager.js +8 -11
- package/lib/esm/presentation-frontend/PresentationManager.js.map +1 -1
- package/lib/esm/presentation-frontend/RulesetVariablesManager.js +1 -1
- package/lib/esm/presentation-frontend/RulesetVariablesManager.js.map +1 -1
- package/lib/esm/presentation-frontend/StateTracker.js +3 -4
- package/lib/esm/presentation-frontend/StateTracker.js.map +1 -1
- package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js +5 -8
- package/lib/esm/presentation-frontend/favorite-properties/FavoritePropertiesStorage.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionHelper.d.ts +4 -1
- package/lib/esm/presentation-frontend/selection/SelectionHelper.d.ts.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionHelper.js +4 -1
- package/lib/esm/presentation-frontend/selection/SelectionHelper.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionManager.js +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionManager.js.map +1 -1
- package/lib/esm/presentation-frontend/selection/SelectionScopesManager.d.ts +2 -2
- package/lib/esm/presentation-frontend/selection/SelectionScopesManager.js +2 -2
- package/lib/esm/presentation-frontend/selection/SelectionScopesManager.js.map +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FavoritePropertiesStorage.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/favorite-properties/FavoritePropertiesStorage.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Core\r\n */\r\n\r\nimport { AccessToken, compareStrings, Dictionary, Guid, IDisposable, isIDisposable, OrderedComparator } from \"@itwin/core-bentley\";\r\nimport { InternetConnectivityStatus } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"@itwin/core-frontend\";\r\nimport { PresentationError, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { ConnectivityInformationProvider, IConnectivityInformationProvider } from \"../ConnectivityInformationProvider\";\r\nimport { FavoritePropertiesOrderInfo, PropertyFullName } from \"./FavoritePropertiesManager\";\r\n\r\n/** @internal */\r\nexport const IMODELJS_PRESENTATION_SETTING_NAMESPACE = \"imodeljs.presentation\";\r\n/** @internal */\r\nexport const DEPRECATED_PROPERTIES_SETTING_NAMESPACE = \"Properties\";\r\n/** @internal */\r\nexport const FAVORITE_PROPERTIES_SETTING_NAME = \"FavoriteProperties\";\r\n/** @internal */\r\nexport const FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME = \"FavoritePropertiesOrderInfo\";\r\n\r\n/**\r\n * Stores user preferences for favorite properties.\r\n * @public\r\n */\r\nexport interface IFavoritePropertiesStorage {\r\n /** Load Favorite properties from user-specific settings.\r\n * @param iTwinId ITwin Id, if the settings is specific to a iTwin, otherwise undefined.\r\n * @param imodelId iModel Id, if the setting is specific to an iModel, otherwise undefined. The iTwinId must be specified if iModelId is specified.\r\n */\r\n loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined>;\r\n /** Saves Favorite properties to user-specific settings.\r\n * @param properties Favorite properties to save.\r\n * @param iTwinId iTwin Id, if the settings is specific to a iTwin, otherwise undefined.\r\n * @param iModelId iModel Id, if the setting is specific to an iModel, otherwise undefined. The iTwinId must be specified if iModelId is specified.\r\n */\r\n saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string): Promise<void>;\r\n /** Load array of FavoritePropertiesOrderInfo from user-specific settings.\r\n * Setting is specific to an iModel.\r\n * @param iTwinId iTwin Id.\r\n * @param imodelId iModel Id.\r\n */\r\n loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined>;\r\n /** Saves FavoritePropertiesOrderInfo array to user-specific settings.\r\n * Setting is specific to an iModel.\r\n * @param orderInfo Array of FavoritePropertiesOrderInfo to save.\r\n * @param iTwinId iTwin Id.\r\n * @param imodelId iModel Id.\r\n */\r\n savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string): Promise<void>;\r\n}\r\n\r\n/**\r\n * Available implementations of [[IFavoritePropertiesStorage]].\r\n * @public\r\n */\r\nexport enum DefaultFavoritePropertiesStorageTypes {\r\n /** A no-op storage that doesn't store or return anything. Used for cases when favorite properties aren't used by the application. */\r\n Noop,\r\n /** A storage that stores favorite properties information in a browser local storage. */\r\n BrowserLocalStorage,\r\n /** A storage that stores favorite properties in a user preferences storage (see [[IModelApp.userPreferences]]). */\r\n UserPreferencesStorage,\r\n}\r\n\r\n/**\r\n * A factory method to create one of the available [[IFavoritePropertiesStorage]] implementations.\r\n * @public\r\n */\r\nexport function createFavoritePropertiesStorage(type: DefaultFavoritePropertiesStorageTypes): IFavoritePropertiesStorage {\r\n switch (type) {\r\n case DefaultFavoritePropertiesStorageTypes.Noop: return new NoopFavoritePropertiesStorage();\r\n case DefaultFavoritePropertiesStorageTypes.BrowserLocalStorage: return new BrowserLocalFavoritePropertiesStorage();\r\n case DefaultFavoritePropertiesStorageTypes.UserPreferencesStorage: return new OfflineCachingFavoritePropertiesStorage({ impl: new IModelAppFavoritePropertiesStorage() });\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class IModelAppFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n\r\n private async ensureIsSignedIn(): Promise<{ accessToken: AccessToken }> {\r\n const accessToken = IModelApp.authorizationClient ? await IModelApp.authorizationClient.getAccessToken() : \"\";\r\n if (accessToken)\r\n return { accessToken };\r\n throw new PresentationError(PresentationStatus.Error, \"Current user is not authorized to use the settings service\");\r\n }\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n let setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n });\r\n\r\n if (setting !== undefined)\r\n return new Set<PropertyFullName>(setting);\r\n\r\n // try to check the old namespace\r\n setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: DEPRECATED_PROPERTIES_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n });\r\n\r\n if (setting !== undefined && setting.hasOwnProperty(\"nestedContentInfos\") && setting.hasOwnProperty(\"propertyInfos\") && setting.hasOwnProperty(\"baseFieldInfos\"))\r\n return new Set<PropertyFullName>([...setting.nestedContentInfos, ...setting.propertyInfos, ...setting.baseFieldInfos]);\r\n\r\n return undefined;\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string): Promise<void> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n await IModelApp.userPreferences.save({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n content: Array.from(properties),\r\n });\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n const setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME,\r\n });\r\n return setting as FavoritePropertiesOrderInfo[];\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string) {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n await IModelApp.userPreferences.save({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME,\r\n content: orderInfos,\r\n });\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface OfflineCachingFavoritePropertiesStorageProps {\r\n impl: IFavoritePropertiesStorage;\r\n connectivityInfo?: IConnectivityInformationProvider;\r\n}\r\n/** @internal */\r\nexport class OfflineCachingFavoritePropertiesStorage implements IFavoritePropertiesStorage, IDisposable {\r\n\r\n private _connectivityInfo: IConnectivityInformationProvider;\r\n private _impl: IFavoritePropertiesStorage;\r\n private _propertiesOfflineCache = new DictionaryWithReservations<ITwinAndIModelIdsKey, Set<PropertyFullName>>(iTwinAndIModelIdsKeyComparer);\r\n private _propertiesOrderOfflineCache = new DictionaryWithReservations<ITwinAndIModelIdsKey, FavoritePropertiesOrderInfo[]>(iTwinAndIModelIdsKeyComparer);\r\n\r\n public constructor(props: OfflineCachingFavoritePropertiesStorageProps) {\r\n this._impl = props.impl;\r\n // istanbul ignore next\r\n this._connectivityInfo = props.connectivityInfo ?? new ConnectivityInformationProvider();\r\n this._connectivityInfo.onInternetConnectivityChanged.addListener(this.onConnectivityStatusChanged);\r\n }\r\n\r\n public dispose() {\r\n if (isIDisposable(this._connectivityInfo))\r\n this._connectivityInfo.dispose();\r\n }\r\n\r\n public get impl() { return this._impl; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onConnectivityStatusChanged = (args: { status: InternetConnectivityStatus }) => {\r\n // istanbul ignore else\r\n if (args.status === InternetConnectivityStatus.Online) {\r\n // note: we're copying the cached values to temp arrays because `saveProperties` and `savePropertiesOrder` both\r\n // attempt to modify cache dictionaries\r\n\r\n const propertiesCache = new Array<{ properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string }>();\r\n this._propertiesOfflineCache.forEach((key, value) => propertiesCache.push({ properties: value, iTwinId: key[0], imodelId: key[1] }));\r\n propertiesCache.forEach(async (cached) => this.saveProperties(cached.properties, cached.iTwinId, cached.imodelId));\r\n\r\n const ordersCache = new Array<{ order: FavoritePropertiesOrderInfo[], iTwinId?: string, imodelId: string }>();\r\n this._propertiesOrderOfflineCache.forEach((key, value) => ordersCache.push({ order: value, iTwinId: key[0], imodelId: key[1]! }));\r\n ordersCache.forEach(async (cached) => this.savePropertiesOrder(cached.order, cached.iTwinId, cached.imodelId));\r\n }\r\n };\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string) {\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Online) {\r\n try {\r\n return await this._impl.loadProperties(iTwinId, imodelId);\r\n } catch {\r\n // return from offline cache if the above fails\r\n }\r\n }\r\n return this._propertiesOfflineCache.get([iTwinId, imodelId]);\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string) {\r\n const key: ITwinAndIModelIdsKey = [iTwinId, imodelId];\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Offline) {\r\n this._propertiesOfflineCache.set(key, properties);\r\n return;\r\n }\r\n const reservationId = this._propertiesOfflineCache.reserve(key);\r\n try {\r\n await this._impl.saveProperties(properties, iTwinId, imodelId);\r\n this._propertiesOfflineCache.reservedDelete(key, reservationId);\r\n } catch {\r\n this._propertiesOfflineCache.reservedSet(key, properties, reservationId);\r\n }\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string) {\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Online) {\r\n try {\r\n return await this._impl.loadPropertiesOrder(iTwinId, imodelId);\r\n } catch {\r\n // return from offline cache if the above fails\r\n }\r\n }\r\n return this._propertiesOrderOfflineCache.get([iTwinId, imodelId]);\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string) {\r\n const key: ITwinAndIModelIdsKey = [iTwinId, imodelId];\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Offline) {\r\n this._propertiesOrderOfflineCache.set(key, orderInfos);\r\n return;\r\n }\r\n const reservationId = this._propertiesOrderOfflineCache.reserve(key);\r\n try {\r\n await this._impl.savePropertiesOrder(orderInfos, iTwinId, imodelId);\r\n this._propertiesOrderOfflineCache.reservedDelete(key, reservationId);\r\n } catch {\r\n this._propertiesOrderOfflineCache.reservedSet(key, orderInfos, reservationId);\r\n }\r\n }\r\n\r\n}\r\n\r\nclass DictionaryWithReservations<TKey, TValue> {\r\n private _impl: Dictionary<TKey, { value?: TValue, lastReservationId?: string }>;\r\n public constructor(compareKeys: OrderedComparator<TKey>) {\r\n this._impl = new Dictionary(compareKeys);\r\n }\r\n public get(key: TKey) { return this._impl.get(key)?.value; }\r\n public forEach(func: (key: TKey, value: TValue) => void): void {\r\n this._impl.forEach((key, entry) => {\r\n // istanbul ignore else\r\n if (entry.value)\r\n func(key, entry.value);\r\n });\r\n }\r\n public reserve(key: TKey) {\r\n const reservationId = Guid.createValue();\r\n this._impl.set(key, { lastReservationId: reservationId });\r\n return reservationId;\r\n }\r\n public set(key: TKey, value: TValue) { return this._impl.set(key, { value }); }\r\n public reservedSet(key: TKey, value: TValue, reservationId: string) {\r\n const entry = this._impl.get(key);\r\n if (entry && entry.lastReservationId === reservationId)\r\n this._impl.set(key, { value });\r\n }\r\n public reservedDelete(key: TKey, reservationId: string) {\r\n const entry = this._impl.get(key);\r\n if (entry && entry.lastReservationId === reservationId)\r\n this._impl.delete(key);\r\n }\r\n}\r\ntype ITwinAndIModelIdsKey = [string | undefined, string | undefined];\r\n\r\n// istanbul ignore next\r\nfunction iTwinAndIModelIdsKeyComparer(lhs: ITwinAndIModelIdsKey, rhs: ITwinAndIModelIdsKey) {\r\n const iTwinIdCompare = compareStrings(lhs[0] ?? \"\", rhs[0] ?? \"\");\r\n return (iTwinIdCompare !== 0) ? iTwinIdCompare : compareStrings(lhs[1] ?? \"\", rhs[1] ?? \"\");\r\n}\r\n\r\n/** @internal */\r\nexport class NoopFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n // istanbul ignore next\r\n public async loadProperties(_iTwinId?: string, _imodelId?: string): Promise<Set<PropertyFullName> | undefined> { return undefined; }\r\n // istanbul ignore next\r\n public async saveProperties(_properties: Set<PropertyFullName>, _iTwinId?: string, _imodelId?: string) { }\r\n // istanbul ignore next\r\n public async loadPropertiesOrder(_iTwinId: string | undefined, _imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> { return undefined; }\r\n // istanbul ignore next\r\n public async savePropertiesOrder(_orderInfos: FavoritePropertiesOrderInfo[], _iTwinId: string | undefined, _imodelId: string): Promise<void> { }\r\n}\r\n\r\n/** @internal */\r\nexport class BrowserLocalFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n private _localStorage: Storage;\r\n\r\n public constructor(props?: { localStorage?: Storage }) {\r\n // istanbul ignore next\r\n this._localStorage = props?.localStorage ?? window.localStorage;\r\n }\r\n\r\n public createFavoritesSettingItemKey(iTwinId?: string, imodelId?: string): string {\r\n return `${IMODELJS_PRESENTATION_SETTING_NAMESPACE}${FAVORITE_PROPERTIES_SETTING_NAME}?iTwinId=${iTwinId}&imodelId=${imodelId}`;\r\n }\r\n public createOrderSettingItemKey(iTwinId?: string, imodelId?: string): string {\r\n return `${IMODELJS_PRESENTATION_SETTING_NAMESPACE}${FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME}?iTwinId=${iTwinId}&imodelId=${imodelId}`;\r\n }\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined> {\r\n const value = this._localStorage.getItem(this.createFavoritesSettingItemKey(iTwinId, imodelId));\r\n if (!value)\r\n return undefined;\r\n\r\n const properties: PropertyFullName[] = JSON.parse(value);\r\n return new Set(properties);\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string) {\r\n this._localStorage.setItem(this.createFavoritesSettingItemKey(iTwinId, imodelId), JSON.stringify([...properties]));\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> {\r\n const value = this._localStorage.getItem(this.createOrderSettingItemKey(iTwinId, imodelId));\r\n if (!value)\r\n return undefined;\r\n\r\n const orderInfos: FavoritePropertiesOrderInfo[] = JSON.parse(value).map((json: any) => ({\r\n ...json,\r\n orderedTimestamp: new Date(json.orderedTimestamp),\r\n }));\r\n return orderInfos;\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string): Promise<void> {\r\n this._localStorage.setItem(this.createOrderSettingItemKey(iTwinId, imodelId), JSON.stringify(orderInfos));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"FavoritePropertiesStorage.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/favorite-properties/FavoritePropertiesStorage.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Core\r\n */\r\n\r\nimport { AccessToken, compareStrings, Dictionary, Guid, IDisposable, isIDisposable, OrderedComparator } from \"@itwin/core-bentley\";\r\nimport { InternetConnectivityStatus } from \"@itwin/core-common\";\r\nimport { IModelApp } from \"@itwin/core-frontend\";\r\nimport { PresentationError, PresentationStatus } from \"@itwin/presentation-common\";\r\nimport { ConnectivityInformationProvider, IConnectivityInformationProvider } from \"../ConnectivityInformationProvider\";\r\nimport { FavoritePropertiesOrderInfo, PropertyFullName } from \"./FavoritePropertiesManager\";\r\n\r\n/** @internal */\r\nexport const IMODELJS_PRESENTATION_SETTING_NAMESPACE = \"imodeljs.presentation\";\r\n/** @internal */\r\nexport const DEPRECATED_PROPERTIES_SETTING_NAMESPACE = \"Properties\";\r\n/** @internal */\r\nexport const FAVORITE_PROPERTIES_SETTING_NAME = \"FavoriteProperties\";\r\n/** @internal */\r\nexport const FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME = \"FavoritePropertiesOrderInfo\";\r\n\r\n/**\r\n * Stores user preferences for favorite properties.\r\n * @public\r\n */\r\nexport interface IFavoritePropertiesStorage {\r\n /** Load Favorite properties from user-specific settings.\r\n * @param iTwinId ITwin Id, if the settings is specific to a iTwin, otherwise undefined.\r\n * @param imodelId iModel Id, if the setting is specific to an iModel, otherwise undefined. The iTwinId must be specified if iModelId is specified.\r\n */\r\n loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined>;\r\n /** Saves Favorite properties to user-specific settings.\r\n * @param properties Favorite properties to save.\r\n * @param iTwinId iTwin Id, if the settings is specific to a iTwin, otherwise undefined.\r\n * @param iModelId iModel Id, if the setting is specific to an iModel, otherwise undefined. The iTwinId must be specified if iModelId is specified.\r\n */\r\n saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string): Promise<void>;\r\n /** Load array of FavoritePropertiesOrderInfo from user-specific settings.\r\n * Setting is specific to an iModel.\r\n * @param iTwinId iTwin Id.\r\n * @param imodelId iModel Id.\r\n */\r\n loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined>;\r\n /** Saves FavoritePropertiesOrderInfo array to user-specific settings.\r\n * Setting is specific to an iModel.\r\n * @param orderInfo Array of FavoritePropertiesOrderInfo to save.\r\n * @param iTwinId iTwin Id.\r\n * @param imodelId iModel Id.\r\n */\r\n savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string): Promise<void>;\r\n}\r\n\r\n/**\r\n * Available implementations of [[IFavoritePropertiesStorage]].\r\n * @public\r\n */\r\nexport enum DefaultFavoritePropertiesStorageTypes {\r\n /** A no-op storage that doesn't store or return anything. Used for cases when favorite properties aren't used by the application. */\r\n Noop,\r\n /** A storage that stores favorite properties information in a browser local storage. */\r\n BrowserLocalStorage,\r\n /** A storage that stores favorite properties in a user preferences storage (see [[IModelApp.userPreferences]]). */\r\n UserPreferencesStorage,\r\n}\r\n\r\n/**\r\n * A factory method to create one of the available [[IFavoritePropertiesStorage]] implementations.\r\n * @public\r\n */\r\nexport function createFavoritePropertiesStorage(type: DefaultFavoritePropertiesStorageTypes): IFavoritePropertiesStorage {\r\n switch (type) {\r\n case DefaultFavoritePropertiesStorageTypes.Noop: return new NoopFavoritePropertiesStorage();\r\n case DefaultFavoritePropertiesStorageTypes.BrowserLocalStorage: return new BrowserLocalFavoritePropertiesStorage();\r\n case DefaultFavoritePropertiesStorageTypes.UserPreferencesStorage: return new OfflineCachingFavoritePropertiesStorage({ impl: new IModelAppFavoritePropertiesStorage() });\r\n }\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport class IModelAppFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n\r\n private async ensureIsSignedIn(): Promise<{ accessToken: AccessToken }> {\r\n const accessToken = IModelApp.authorizationClient ? await IModelApp.authorizationClient.getAccessToken() : \"\";\r\n if (accessToken)\r\n return { accessToken };\r\n throw new PresentationError(PresentationStatus.Error, \"Current user is not authorized to use the settings service\");\r\n }\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n let setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n });\r\n\r\n if (setting !== undefined)\r\n return new Set<PropertyFullName>(setting);\r\n\r\n // try to check the old namespace\r\n setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: DEPRECATED_PROPERTIES_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n });\r\n\r\n if (setting !== undefined && setting.hasOwnProperty(\"nestedContentInfos\") && setting.hasOwnProperty(\"propertyInfos\") && setting.hasOwnProperty(\"baseFieldInfos\"))\r\n return new Set<PropertyFullName>([...setting.nestedContentInfos, ...setting.propertyInfos, ...setting.baseFieldInfos]);\r\n\r\n return undefined;\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string): Promise<void> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n await IModelApp.userPreferences.save({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_SETTING_NAME,\r\n content: Array.from(properties),\r\n });\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n const setting = await IModelApp.userPreferences.get({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME,\r\n });\r\n return setting as FavoritePropertiesOrderInfo[];\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string) {\r\n if (!IModelApp.userPreferences)\r\n throw new PresentationError(PresentationStatus.Error, \"User preferences service is not set up\");\r\n\r\n const { accessToken } = await this.ensureIsSignedIn();\r\n await IModelApp.userPreferences.save({\r\n accessToken,\r\n iTwinId,\r\n iModelId: imodelId,\r\n namespace: IMODELJS_PRESENTATION_SETTING_NAMESPACE,\r\n key: FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME,\r\n content: orderInfos,\r\n });\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport interface OfflineCachingFavoritePropertiesStorageProps {\r\n impl: IFavoritePropertiesStorage;\r\n connectivityInfo?: IConnectivityInformationProvider;\r\n}\r\n/** @internal */\r\nexport class OfflineCachingFavoritePropertiesStorage implements IFavoritePropertiesStorage, IDisposable {\r\n\r\n private _connectivityInfo: IConnectivityInformationProvider;\r\n private _impl: IFavoritePropertiesStorage;\r\n private _propertiesOfflineCache = new DictionaryWithReservations<ITwinAndIModelIdsKey, Set<PropertyFullName>>(iTwinAndIModelIdsKeyComparer);\r\n private _propertiesOrderOfflineCache = new DictionaryWithReservations<ITwinAndIModelIdsKey, FavoritePropertiesOrderInfo[]>(iTwinAndIModelIdsKeyComparer);\r\n\r\n public constructor(props: OfflineCachingFavoritePropertiesStorageProps) {\r\n this._impl = props.impl;\r\n // istanbul ignore next\r\n this._connectivityInfo = props.connectivityInfo ?? new ConnectivityInformationProvider();\r\n this._connectivityInfo.onInternetConnectivityChanged.addListener(this.onConnectivityStatusChanged);\r\n }\r\n\r\n public dispose() {\r\n if (isIDisposable(this._connectivityInfo))\r\n this._connectivityInfo.dispose();\r\n }\r\n\r\n public get impl() { return this._impl; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onConnectivityStatusChanged = (args: { status: InternetConnectivityStatus }) => {\r\n // istanbul ignore else\r\n if (args.status === InternetConnectivityStatus.Online) {\r\n // note: we're copying the cached values to temp arrays because `saveProperties` and `savePropertiesOrder` both\r\n // attempt to modify cache dictionaries\r\n\r\n const propertiesCache = new Array<{ properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string }>();\r\n this._propertiesOfflineCache.forEach((key, value) => propertiesCache.push({ properties: value, iTwinId: key[0], imodelId: key[1] }));\r\n propertiesCache.forEach(async (cached) => this.saveProperties(cached.properties, cached.iTwinId, cached.imodelId));\r\n\r\n const ordersCache = new Array<{ order: FavoritePropertiesOrderInfo[], iTwinId?: string, imodelId: string }>();\r\n this._propertiesOrderOfflineCache.forEach((key, value) => ordersCache.push({ order: value, iTwinId: key[0], imodelId: key[1]! }));\r\n ordersCache.forEach(async (cached) => this.savePropertiesOrder(cached.order, cached.iTwinId, cached.imodelId));\r\n }\r\n };\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string) {\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Online) {\r\n try {\r\n return await this._impl.loadProperties(iTwinId, imodelId);\r\n } catch {\r\n // return from offline cache if the above fails\r\n }\r\n }\r\n return this._propertiesOfflineCache.get([iTwinId, imodelId]);\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string) {\r\n const key: ITwinAndIModelIdsKey = [iTwinId, imodelId];\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Offline) {\r\n this._propertiesOfflineCache.set(key, properties);\r\n return;\r\n }\r\n const reservationId = this._propertiesOfflineCache.reserve(key);\r\n try {\r\n await this._impl.saveProperties(properties, iTwinId, imodelId);\r\n this._propertiesOfflineCache.reservedDelete(key, reservationId);\r\n } catch {\r\n this._propertiesOfflineCache.reservedSet(key, properties, reservationId);\r\n }\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string) {\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Online) {\r\n try {\r\n return await this._impl.loadPropertiesOrder(iTwinId, imodelId);\r\n } catch {\r\n // return from offline cache if the above fails\r\n }\r\n }\r\n return this._propertiesOrderOfflineCache.get([iTwinId, imodelId]);\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string) {\r\n const key: ITwinAndIModelIdsKey = [iTwinId, imodelId];\r\n if (this._connectivityInfo.status === InternetConnectivityStatus.Offline) {\r\n this._propertiesOrderOfflineCache.set(key, orderInfos);\r\n return;\r\n }\r\n const reservationId = this._propertiesOrderOfflineCache.reserve(key);\r\n try {\r\n await this._impl.savePropertiesOrder(orderInfos, iTwinId, imodelId);\r\n this._propertiesOrderOfflineCache.reservedDelete(key, reservationId);\r\n } catch {\r\n this._propertiesOrderOfflineCache.reservedSet(key, orderInfos, reservationId);\r\n }\r\n }\r\n\r\n}\r\n\r\nclass DictionaryWithReservations<TKey, TValue> {\r\n private _impl: Dictionary<TKey, { value?: TValue, lastReservationId?: string }>;\r\n public constructor(compareKeys: OrderedComparator<TKey>) {\r\n this._impl = new Dictionary(compareKeys);\r\n }\r\n public get(key: TKey) { return this._impl.get(key)?.value; }\r\n public forEach(func: (key: TKey, value: TValue) => void): void {\r\n this._impl.forEach((key, entry) => {\r\n // istanbul ignore else\r\n if (entry.value)\r\n func(key, entry.value);\r\n });\r\n }\r\n public reserve(key: TKey) {\r\n const reservationId = Guid.createValue();\r\n this._impl.set(key, { lastReservationId: reservationId });\r\n return reservationId;\r\n }\r\n public set(key: TKey, value: TValue) { return this._impl.set(key, { value }); }\r\n public reservedSet(key: TKey, value: TValue, reservationId: string) {\r\n const entry = this._impl.get(key);\r\n if (entry && entry.lastReservationId === reservationId)\r\n this._impl.set(key, { value });\r\n }\r\n public reservedDelete(key: TKey, reservationId: string) {\r\n const entry = this._impl.get(key);\r\n if (entry && entry.lastReservationId === reservationId)\r\n this._impl.delete(key);\r\n }\r\n}\r\ntype ITwinAndIModelIdsKey = [string | undefined, string | undefined];\r\n\r\n// istanbul ignore next\r\nfunction iTwinAndIModelIdsKeyComparer(lhs: ITwinAndIModelIdsKey, rhs: ITwinAndIModelIdsKey) {\r\n const iTwinIdCompare = compareStrings(lhs[0] ?? \"\", rhs[0] ?? \"\");\r\n return (iTwinIdCompare !== 0) ? iTwinIdCompare : compareStrings(lhs[1] ?? \"\", rhs[1] ?? \"\");\r\n}\r\n\r\n/** @internal */\r\nexport class NoopFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n // istanbul ignore next\r\n public async loadProperties(_iTwinId?: string, _imodelId?: string): Promise<Set<PropertyFullName> | undefined> { return undefined; }\r\n // istanbul ignore next\r\n public async saveProperties(_properties: Set<PropertyFullName>, _iTwinId?: string, _imodelId?: string) { }\r\n // istanbul ignore next\r\n public async loadPropertiesOrder(_iTwinId: string | undefined, _imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> { return undefined; }\r\n // istanbul ignore next\r\n public async savePropertiesOrder(_orderInfos: FavoritePropertiesOrderInfo[], _iTwinId: string | undefined, _imodelId: string): Promise<void> { }\r\n}\r\n\r\n/** @internal */\r\nexport class BrowserLocalFavoritePropertiesStorage implements IFavoritePropertiesStorage {\r\n private _localStorage: Storage;\r\n\r\n public constructor(props?: { localStorage?: Storage }) {\r\n // istanbul ignore next\r\n this._localStorage = props?.localStorage ?? window.localStorage;\r\n }\r\n\r\n public createFavoritesSettingItemKey(iTwinId?: string, imodelId?: string): string {\r\n return `${IMODELJS_PRESENTATION_SETTING_NAMESPACE}${FAVORITE_PROPERTIES_SETTING_NAME}?iTwinId=${iTwinId}&imodelId=${imodelId}`;\r\n }\r\n public createOrderSettingItemKey(iTwinId?: string, imodelId?: string): string {\r\n return `${IMODELJS_PRESENTATION_SETTING_NAMESPACE}${FAVORITE_PROPERTIES_ORDER_INFO_SETTING_NAME}?iTwinId=${iTwinId}&imodelId=${imodelId}`;\r\n }\r\n\r\n public async loadProperties(iTwinId?: string, imodelId?: string): Promise<Set<PropertyFullName> | undefined> {\r\n const value = this._localStorage.getItem(this.createFavoritesSettingItemKey(iTwinId, imodelId));\r\n if (!value)\r\n return undefined;\r\n\r\n const properties: PropertyFullName[] = JSON.parse(value);\r\n return new Set(properties);\r\n }\r\n\r\n public async saveProperties(properties: Set<PropertyFullName>, iTwinId?: string, imodelId?: string) {\r\n this._localStorage.setItem(this.createFavoritesSettingItemKey(iTwinId, imodelId), JSON.stringify([...properties]));\r\n }\r\n\r\n public async loadPropertiesOrder(iTwinId: string | undefined, imodelId: string): Promise<FavoritePropertiesOrderInfo[] | undefined> {\r\n const value = this._localStorage.getItem(this.createOrderSettingItemKey(iTwinId, imodelId));\r\n if (!value)\r\n return undefined;\r\n\r\n const orderInfos: FavoritePropertiesOrderInfo[] = JSON.parse(value).map((json: any) => ({\r\n ...json,\r\n orderedTimestamp: new Date(json.orderedTimestamp),\r\n }));\r\n return orderInfos;\r\n }\r\n\r\n public async savePropertiesOrder(orderInfos: FavoritePropertiesOrderInfo[], iTwinId: string | undefined, imodelId: string): Promise<void> {\r\n this._localStorage.setItem(this.createOrderSettingItemKey(iTwinId, imodelId), JSON.stringify(orderInfos));\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionHelper.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAW,MAAM,4BAA4B,CAAC;AAEhE
|
|
1
|
+
{"version":3,"file":"SelectionHelper.d.ts","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAW,MAAM,4BAA4B,CAAC;AAEhE;;;GAGG;AACH,qBAAa,eAAe;IAG1B,OAAO;IAEP;;;;OAIG;WACW,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE;CAe/D"}
|
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
* @module UnifiedSelection
|
|
7
7
|
*/
|
|
8
8
|
import { Key, NodeKey } from "@itwin/presentation-common";
|
|
9
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* Helper class for working with selection.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
10
13
|
export class SelectionHelper {
|
|
11
14
|
// istanbul ignore next
|
|
12
15
|
constructor() { }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionHelper.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAQ,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAEhE
|
|
1
|
+
{"version":3,"file":"SelectionHelper.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionHelper.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,GAAG,EAAQ,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;;GAGG;AACH,MAAM,OAAO,eAAe;IAE1B,uBAAuB;IACvB,gBAAwB,CAAC;IAEzB;;;;OAIG;IACI,MAAM,CAAC,mBAAmB,CAAC,IAAoB;QACpD,MAAM,MAAM,GAAG,IAAI,KAAK,EAAO,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YACxB,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;gBACtB,IAAI,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC;oBACjC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;;oBAEjC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACpB;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aAClB;QACH,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;CAEF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Key, Keys, NodeKey } from \"@itwin/presentation-common\";\r\n\r\n/**\r\n * Helper class for working with selection.\r\n * @public\r\n */\r\nexport class SelectionHelper {\r\n\r\n // istanbul ignore next\r\n private constructor() { }\r\n\r\n /**\r\n * Re-map the given keyset for selection. This means all instance node keys get converted\r\n * to instance keys, because in that case we want to select instances instead of nodes. All\r\n * other types of keys ar left as is.\r\n */\r\n public static getKeysForSelection(keys: Readonly<Keys>): Key[] {\r\n const result = new Array<Key>();\r\n keys.forEach((key: Key) => {\r\n if (Key.isNodeKey(key)) {\r\n if (NodeKey.isInstancesNodeKey(key))\r\n result.push(...key.instanceKeys);\r\n else\r\n result.push(key);\r\n } else {\r\n result.push(key);\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -44,7 +44,7 @@ export class SelectionManager {
|
|
|
44
44
|
}
|
|
45
45
|
/** @internal */
|
|
46
46
|
// istanbul ignore next
|
|
47
|
-
getToolSelectionSyncHandler(imodel) {
|
|
47
|
+
getToolSelectionSyncHandler(imodel) { return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler; }
|
|
48
48
|
/**
|
|
49
49
|
* Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).
|
|
50
50
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\r\nimport { AsyncTasksTracker, Keys, KeySet, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\nimport { HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\r\nimport { ISelectionProvider } from \"./ISelectionProvider\";\r\nimport { SelectionChangeEvent, SelectionChangeEventArgs, SelectionChangeType } from \"./SelectionChangeEvent\";\r\nimport { createSelectionScopeProps, SelectionScopesManager } from \"./SelectionScopesManager\";\r\n\r\n/**\r\n * Properties for creating [[SelectionManager]].\r\n * @public\r\n */\r\nexport interface SelectionManagerProps {\r\n /** A manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n scopes: SelectionScopesManager;\r\n}\r\n\r\n/**\r\n * The selection manager which stores the overall selection.\r\n * @public\r\n */\r\nexport class SelectionManager implements ISelectionProvider {\r\n private _selectionContainerMap = new Map<IModelConnection, SelectionContainer>();\r\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number, handler: ToolSelectionSyncHandler }>();\r\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\r\n\r\n /** An event which gets broadcasted on selection changes */\r\n public readonly selectionChange: SelectionChangeEvent;\r\n\r\n /** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n public readonly scopes: SelectionScopesManager;\r\n\r\n /**\r\n * Creates an instance of SelectionManager.\r\n */\r\n constructor(props: SelectionManagerProps) {\r\n this.selectionChange = new SelectionChangeEvent();\r\n this.scopes = props.scopes;\r\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\r\n this.onConnectionClose(imodel);\r\n });\r\n }\r\n\r\n private onConnectionClose(imodel: IModelConnection): void {\r\n this.clearSelection(\"Connection Close Event\", imodel);\r\n this._selectionContainerMap.delete(imodel);\r\n this._hiliteSetProviders.delete(imodel);\r\n }\r\n\r\n private getContainer(imodel: IModelConnection): SelectionContainer {\r\n let selectionContainer = this._selectionContainerMap.get(imodel);\r\n if (!selectionContainer) {\r\n selectionContainer = new SelectionContainer();\r\n this._selectionContainerMap.set(imodel, selectionContainer);\r\n }\r\n return selectionContainer;\r\n }\r\n\r\n /** @internal */\r\n // istanbul ignore next\r\n public getToolSelectionSyncHandler(imodel: IModelConnection) { return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler; }\r\n\r\n /**\r\n * Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).\r\n */\r\n public setSyncWithIModelToolSelection(imodel: IModelConnection, sync = true) {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (sync) {\r\n if (!registration || registration.requestorsCount === 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { requestorsCount: 1, handler: new ToolSelectionSyncHandler(imodel, this) });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount: registration.requestorsCount + 1 });\r\n }\r\n } else {\r\n if (registration && registration.requestorsCount > 0) {\r\n const requestorsCount = registration.requestorsCount - 1;\r\n if (requestorsCount > 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.delete(imodel);\r\n registration.handler.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Temporarily suspends tool selection synchronization until the returned `IDisposable`\r\n * is disposed.\r\n */\r\n public suspendIModelToolSelectionSync(imodel: IModelConnection): IDisposable {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (!registration)\r\n return { dispose: () => { } };\r\n\r\n const wasSuspended = registration.handler.isSuspended;\r\n registration.handler.isSuspended = true;\r\n return { dispose: () => (registration.handler.isSuspended = wasSuspended) };\r\n }\r\n\r\n /** Get the selection levels currently stored in this manager for the specified imodel */\r\n public getSelectionLevels(imodel: IModelConnection): number[] {\r\n return this.getContainer(imodel).getSelectionLevels();\r\n }\r\n\r\n /** Get the selection currently stored in this manager */\r\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\r\n return this.getContainer(imodel).getSelection(level);\r\n }\r\n\r\n private handleEvent(evt: SelectionChangeEventArgs): void {\r\n const container = this.getContainer(evt.imodel);\r\n const selectedItemsSet = container.getSelection(evt.level);\r\n const guidBefore = selectedItemsSet.guid;\r\n switch (evt.changeType) {\r\n case SelectionChangeType.Add:\r\n selectedItemsSet.add(evt.keys);\r\n break;\r\n case SelectionChangeType.Remove:\r\n selectedItemsSet.delete(evt.keys);\r\n break;\r\n case SelectionChangeType.Replace:\r\n if (selectedItemsSet.size !== evt.keys.size || !selectedItemsSet.hasAll(evt.keys)) {\r\n // note: the above check is only needed to avoid changing\r\n // guid of the keyset if we're replacing keyset with the same keys\r\n selectedItemsSet.clear().add(evt.keys);\r\n }\r\n break;\r\n case SelectionChangeType.Clear:\r\n selectedItemsSet.clear();\r\n break;\r\n }\r\n\r\n if (selectedItemsSet.guid === guidBefore)\r\n return;\r\n\r\n container.clear(evt.level + 1);\r\n this.selectionChange.raiseEvent(evt, this);\r\n }\r\n\r\n /**\r\n * Add keys to the selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public addToSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Add,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to remove\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public removeFromSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Remove,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Replace current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public replaceSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Replace,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Clear current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public clearSelection(source: string, imodel: IModelConnection, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Clear,\r\n keys: new KeySet(),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Add keys to selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to add\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async addToSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.addToSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to remove\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async removeFromSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.removeFromSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Replace current selection with keys after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to replace with\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async replaceSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.replaceSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Get the current hilite set for the specified imodel\r\n * @public\r\n */\r\n public async getHiliteSet(imodel: IModelConnection): Promise<HiliteSet> {\r\n let provider = this._hiliteSetProviders.get(imodel);\r\n if (!provider) {\r\n provider = HiliteSetProvider.create({ imodel });\r\n this._hiliteSetProviders.set(imodel, provider);\r\n }\r\n return provider.getHiliteSet(this.getSelection(imodel));\r\n }\r\n}\r\n\r\n/** @internal */\r\nclass SelectionContainer {\r\n private readonly _selectedItemsSetMap: Map<number, KeySet>;\r\n\r\n constructor() {\r\n this._selectedItemsSetMap = new Map<number, KeySet>();\r\n }\r\n\r\n public getSelection(level: number): KeySet {\r\n let selectedItemsSet = this._selectedItemsSetMap.get(level);\r\n if (!selectedItemsSet) {\r\n selectedItemsSet = new KeySet();\r\n this._selectedItemsSetMap.set(level, selectedItemsSet);\r\n }\r\n return selectedItemsSet;\r\n }\r\n\r\n public getSelectionLevels(): number[] {\r\n const levels = new Array<number>();\r\n for (const entry of this._selectedItemsSetMap.entries()) {\r\n if (!entry[1].isEmpty)\r\n levels.push(entry[0]);\r\n }\r\n return levels.sort();\r\n }\r\n\r\n public clear(level: number) {\r\n const keys = this._selectedItemsSetMap.keys();\r\n for (const key of keys) {\r\n if (key >= level) {\r\n const selectedItemsSet = this._selectedItemsSetMap.get(key)!;\r\n selectedItemsSet.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const TRANSIENT_ELEMENT_CLASSNAME = \"/TRANSIENT\";\r\n\r\n/** @internal */\r\nexport class ToolSelectionSyncHandler implements IDisposable {\r\n\r\n private _selectionSourceName = \"Tool\";\r\n private _logicalSelection: SelectionManager;\r\n private _imodel: IModelConnection;\r\n private _imodelToolSelectionListenerDisposeFunc: () => void;\r\n private _asyncsTracker = new AsyncTasksTracker();\r\n public isSuspended?: boolean;\r\n\r\n public constructor(imodel: IModelConnection, logicalSelection: SelectionManager) {\r\n this._imodel = imodel;\r\n this._logicalSelection = logicalSelection;\r\n this._imodelToolSelectionListenerDisposeFunc = imodel.selectionSet.onChanged.addListener(this.onToolSelectionChanged);\r\n }\r\n\r\n public dispose() {\r\n this._imodelToolSelectionListenerDisposeFunc();\r\n }\r\n\r\n /** note: used only it tests */\r\n public get pendingAsyncs() { return this._asyncsTracker.pendingAsyncs; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onToolSelectionChanged = async (ev: SelectionSetEvent): Promise<void> => {\r\n // ignore selection change event if the handler is suspended\r\n if (this.isSuspended)\r\n return;\r\n\r\n // this component only cares about its own imodel\r\n const imodel = ev.set.iModel;\r\n if (imodel !== this._imodel)\r\n return;\r\n\r\n // determine the level of selection changes\r\n // wip: may want to allow selecting at different levels?\r\n const selectionLevel = 0;\r\n\r\n let ids: Id64Arg;\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n ids = ev.added;\r\n break;\r\n case SelectionSetEventType.Replace:\r\n ids = ev.set.elements;\r\n break;\r\n default:\r\n ids = ev.removed;\r\n break;\r\n }\r\n\r\n // we're always using scoped selection changer even if the scope is set to \"element\" - that\r\n // makes sure we're adding to selection keys with concrete classes and not \"BisCore:Element\", which\r\n // we can't because otherwise our keys compare fails (presentation components load data with\r\n // concrete classes)\r\n const changer = new ScopedSelectionChanger(this._selectionSourceName, this._imodel, this._logicalSelection, createSelectionScopeProps(this._logicalSelection.scopes.activeScope));\r\n\r\n // we know what to do immediately on `clear` events\r\n if (SelectionSetEventType.Clear === ev.type) {\r\n await changer.clear(selectionLevel);\r\n return;\r\n }\r\n\r\n const parsedIds = parseIds(ids);\r\n await using(this._asyncsTracker.trackAsyncTask(), async (_r) => {\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n await changer.add(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Replace:\r\n await changer.replace(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Remove:\r\n await changer.remove(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n }\r\n });\r\n };\r\n}\r\n\r\nconst parseIds = (ids: Id64Arg): { persistent: Id64Arg, transient: Id64Arg } => {\r\n let allPersistent = true;\r\n let allTransient = true;\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n allPersistent = false;\r\n else\r\n allTransient = false;\r\n\r\n if (!allPersistent && !allTransient)\r\n break;\r\n }\r\n\r\n // avoid making a copy if ids are only persistent or only transient\r\n if (allPersistent) {\r\n return { persistent: ids, transient: [] };\r\n } else if (allTransient) {\r\n return { persistent: [], transient: ids };\r\n }\r\n\r\n // if `ids` contain mixed ids, we have to copy.. use Array instead of\r\n // a Set for performance\r\n const persistentElementIds: Id64Array = [];\r\n const transientElementIds: Id64Array = [];\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n transientElementIds.push(id);\r\n else\r\n persistentElementIds.push(id);\r\n }\r\n\r\n return { persistent: persistentElementIds, transient: transientElementIds };\r\n};\r\n\r\nfunction addTransientKeys(transientIds: Id64Arg, keys: KeySet): void {\r\n for (const id of Id64.iterable(transientIds))\r\n keys.add({ className: TRANSIENT_ELEMENT_CLASSNAME, id });\r\n}\r\n\r\n/** @internal */\r\nclass ScopedSelectionChanger {\r\n public readonly name: string;\r\n public readonly imodel: IModelConnection;\r\n public readonly manager: SelectionManager;\r\n public readonly scope: SelectionScopeProps | SelectionScope | string;\r\n public constructor(name: string, imodel: IModelConnection, manager: SelectionManager, scope: SelectionScopeProps | SelectionScope | string) {\r\n this.name = name;\r\n this.imodel = imodel;\r\n this.manager = manager;\r\n this.scope = scope;\r\n }\r\n public async clear(level: number): Promise<void> {\r\n this.manager.clearSelection(this.name, this.imodel, level);\r\n }\r\n public async add(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.addToSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async remove(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.removeFromSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async replace(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.replaceSelection(this.name, this.imodel, keys, level);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SelectionManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64, Id64Arg, Id64Array, IDisposable, using } from \"@itwin/core-bentley\";\r\nimport { IModelConnection, SelectionSetEvent, SelectionSetEventType } from \"@itwin/core-frontend\";\r\nimport { AsyncTasksTracker, Keys, KeySet, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\nimport { HiliteSet, HiliteSetProvider } from \"./HiliteSetProvider\";\r\nimport { ISelectionProvider } from \"./ISelectionProvider\";\r\nimport { SelectionChangeEvent, SelectionChangeEventArgs, SelectionChangeType } from \"./SelectionChangeEvent\";\r\nimport { createSelectionScopeProps, SelectionScopesManager } from \"./SelectionScopesManager\";\r\n\r\n/**\r\n * Properties for creating [[SelectionManager]].\r\n * @public\r\n */\r\nexport interface SelectionManagerProps {\r\n /** A manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n scopes: SelectionScopesManager;\r\n}\r\n\r\n/**\r\n * The selection manager which stores the overall selection.\r\n * @public\r\n */\r\nexport class SelectionManager implements ISelectionProvider {\r\n private _selectionContainerMap = new Map<IModelConnection, SelectionContainer>();\r\n private _imodelToolSelectionSyncHandlers = new Map<IModelConnection, { requestorsCount: number, handler: ToolSelectionSyncHandler }>();\r\n private _hiliteSetProviders = new Map<IModelConnection, HiliteSetProvider>();\r\n\r\n /** An event which gets broadcasted on selection changes */\r\n public readonly selectionChange: SelectionChangeEvent;\r\n\r\n /** Manager for [selection scopes]($docs/presentation/unified-selection/index#selection-scopes) */\r\n public readonly scopes: SelectionScopesManager;\r\n\r\n /**\r\n * Creates an instance of SelectionManager.\r\n */\r\n constructor(props: SelectionManagerProps) {\r\n this.selectionChange = new SelectionChangeEvent();\r\n this.scopes = props.scopes;\r\n IModelConnection.onClose.addListener((imodel: IModelConnection) => {\r\n this.onConnectionClose(imodel);\r\n });\r\n }\r\n\r\n private onConnectionClose(imodel: IModelConnection): void {\r\n this.clearSelection(\"Connection Close Event\", imodel);\r\n this._selectionContainerMap.delete(imodel);\r\n this._hiliteSetProviders.delete(imodel);\r\n }\r\n\r\n private getContainer(imodel: IModelConnection): SelectionContainer {\r\n let selectionContainer = this._selectionContainerMap.get(imodel);\r\n if (!selectionContainer) {\r\n selectionContainer = new SelectionContainer();\r\n this._selectionContainerMap.set(imodel, selectionContainer);\r\n }\r\n return selectionContainer;\r\n }\r\n\r\n /** @internal */\r\n // istanbul ignore next\r\n public getToolSelectionSyncHandler(imodel: IModelConnection) { return this._imodelToolSelectionSyncHandlers.get(imodel)?.handler; }\r\n\r\n /**\r\n * Request the manager to sync with imodel's tool selection (see `IModelConnection.selectionSet`).\r\n */\r\n public setSyncWithIModelToolSelection(imodel: IModelConnection, sync = true) {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (sync) {\r\n if (!registration || registration.requestorsCount === 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { requestorsCount: 1, handler: new ToolSelectionSyncHandler(imodel, this) });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount: registration.requestorsCount + 1 });\r\n }\r\n } else {\r\n if (registration && registration.requestorsCount > 0) {\r\n const requestorsCount = registration.requestorsCount - 1;\r\n if (requestorsCount > 0) {\r\n this._imodelToolSelectionSyncHandlers.set(imodel, { ...registration, requestorsCount });\r\n } else {\r\n this._imodelToolSelectionSyncHandlers.delete(imodel);\r\n registration.handler.dispose();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Temporarily suspends tool selection synchronization until the returned `IDisposable`\r\n * is disposed.\r\n */\r\n public suspendIModelToolSelectionSync(imodel: IModelConnection): IDisposable {\r\n const registration = this._imodelToolSelectionSyncHandlers.get(imodel);\r\n if (!registration)\r\n return { dispose: () => { } };\r\n\r\n const wasSuspended = registration.handler.isSuspended;\r\n registration.handler.isSuspended = true;\r\n return { dispose: () => (registration.handler.isSuspended = wasSuspended) };\r\n }\r\n\r\n /** Get the selection levels currently stored in this manager for the specified imodel */\r\n public getSelectionLevels(imodel: IModelConnection): number[] {\r\n return this.getContainer(imodel).getSelectionLevels();\r\n }\r\n\r\n /** Get the selection currently stored in this manager */\r\n public getSelection(imodel: IModelConnection, level: number = 0): Readonly<KeySet> {\r\n return this.getContainer(imodel).getSelection(level);\r\n }\r\n\r\n private handleEvent(evt: SelectionChangeEventArgs): void {\r\n const container = this.getContainer(evt.imodel);\r\n const selectedItemsSet = container.getSelection(evt.level);\r\n const guidBefore = selectedItemsSet.guid;\r\n switch (evt.changeType) {\r\n case SelectionChangeType.Add:\r\n selectedItemsSet.add(evt.keys);\r\n break;\r\n case SelectionChangeType.Remove:\r\n selectedItemsSet.delete(evt.keys);\r\n break;\r\n case SelectionChangeType.Replace:\r\n if (selectedItemsSet.size !== evt.keys.size || !selectedItemsSet.hasAll(evt.keys)) {\r\n // note: the above check is only needed to avoid changing\r\n // guid of the keyset if we're replacing keyset with the same keys\r\n selectedItemsSet.clear().add(evt.keys);\r\n }\r\n break;\r\n case SelectionChangeType.Clear:\r\n selectedItemsSet.clear();\r\n break;\r\n }\r\n\r\n if (selectedItemsSet.guid === guidBefore)\r\n return;\r\n\r\n container.clear(evt.level + 1);\r\n this.selectionChange.raiseEvent(evt, this);\r\n }\r\n\r\n /**\r\n * Add keys to the selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public addToSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Add,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to remove\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public removeFromSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Remove,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Replace current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param keys Keys to add\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public replaceSelection(source: string, imodel: IModelConnection, keys: Keys, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Replace,\r\n keys: new KeySet(keys),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Clear current selection\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public clearSelection(source: string, imodel: IModelConnection, level: number = 0, rulesetId?: string): void {\r\n const evt: SelectionChangeEventArgs = {\r\n source,\r\n level,\r\n imodel,\r\n changeType: SelectionChangeType.Clear,\r\n keys: new KeySet(),\r\n timestamp: new Date(),\r\n rulesetId,\r\n };\r\n this.handleEvent(evt);\r\n }\r\n\r\n /**\r\n * Add keys to selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to add\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async addToSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.addToSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Remove keys from current selection after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to remove\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async removeFromSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.removeFromSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Replace current selection with keys after applying [selection scope]($docs/presentation/unified-selection/index#selection-scopes) on them.\r\n * @param source Name of the selection source\r\n * @param imodel iModel associated with the selection\r\n * @param ids Element IDs to replace with\r\n * @param scope Selection scope to apply\r\n * @param level Selection level (see [selection levels documentation section]($docs/presentation/unified-selection/index#selection-levels))\r\n * @param rulesetId ID of the ruleset in case the selection was changed from a rules-driven control\r\n */\r\n public async replaceSelectionWithScope(source: string, imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string, level: number = 0, rulesetId?: string): Promise<void> {\r\n const scopedKeys = await this.scopes.computeSelection(imodel, ids, scope);\r\n this.replaceSelection(source, imodel, scopedKeys, level, rulesetId);\r\n }\r\n\r\n /**\r\n * Get the current hilite set for the specified imodel\r\n * @public\r\n */\r\n public async getHiliteSet(imodel: IModelConnection): Promise<HiliteSet> {\r\n let provider = this._hiliteSetProviders.get(imodel);\r\n if (!provider) {\r\n provider = HiliteSetProvider.create({ imodel });\r\n this._hiliteSetProviders.set(imodel, provider);\r\n }\r\n return provider.getHiliteSet(this.getSelection(imodel));\r\n }\r\n}\r\n\r\n/** @internal */\r\nclass SelectionContainer {\r\n private readonly _selectedItemsSetMap: Map<number, KeySet>;\r\n\r\n constructor() {\r\n this._selectedItemsSetMap = new Map<number, KeySet>();\r\n }\r\n\r\n public getSelection(level: number): KeySet {\r\n let selectedItemsSet = this._selectedItemsSetMap.get(level);\r\n if (!selectedItemsSet) {\r\n selectedItemsSet = new KeySet();\r\n this._selectedItemsSetMap.set(level, selectedItemsSet);\r\n }\r\n return selectedItemsSet;\r\n }\r\n\r\n public getSelectionLevels(): number[] {\r\n const levels = new Array<number>();\r\n for (const entry of this._selectedItemsSetMap.entries()) {\r\n if (!entry[1].isEmpty)\r\n levels.push(entry[0]);\r\n }\r\n return levels.sort();\r\n }\r\n\r\n public clear(level: number) {\r\n const keys = this._selectedItemsSetMap.keys();\r\n for (const key of keys) {\r\n if (key >= level) {\r\n const selectedItemsSet = this._selectedItemsSetMap.get(key)!;\r\n selectedItemsSet.clear();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport const TRANSIENT_ELEMENT_CLASSNAME = \"/TRANSIENT\";\r\n\r\n/** @internal */\r\nexport class ToolSelectionSyncHandler implements IDisposable {\r\n\r\n private _selectionSourceName = \"Tool\";\r\n private _logicalSelection: SelectionManager;\r\n private _imodel: IModelConnection;\r\n private _imodelToolSelectionListenerDisposeFunc: () => void;\r\n private _asyncsTracker = new AsyncTasksTracker();\r\n public isSuspended?: boolean;\r\n\r\n public constructor(imodel: IModelConnection, logicalSelection: SelectionManager) {\r\n this._imodel = imodel;\r\n this._logicalSelection = logicalSelection;\r\n this._imodelToolSelectionListenerDisposeFunc = imodel.selectionSet.onChanged.addListener(this.onToolSelectionChanged);\r\n }\r\n\r\n public dispose() {\r\n this._imodelToolSelectionListenerDisposeFunc();\r\n }\r\n\r\n /** note: used only it tests */\r\n public get pendingAsyncs() { return this._asyncsTracker.pendingAsyncs; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private onToolSelectionChanged = async (ev: SelectionSetEvent): Promise<void> => {\r\n // ignore selection change event if the handler is suspended\r\n if (this.isSuspended)\r\n return;\r\n\r\n // this component only cares about its own imodel\r\n const imodel = ev.set.iModel;\r\n if (imodel !== this._imodel)\r\n return;\r\n\r\n // determine the level of selection changes\r\n // wip: may want to allow selecting at different levels?\r\n const selectionLevel = 0;\r\n\r\n let ids: Id64Arg;\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n ids = ev.added;\r\n break;\r\n case SelectionSetEventType.Replace:\r\n ids = ev.set.elements;\r\n break;\r\n default:\r\n ids = ev.removed;\r\n break;\r\n }\r\n\r\n // we're always using scoped selection changer even if the scope is set to \"element\" - that\r\n // makes sure we're adding to selection keys with concrete classes and not \"BisCore:Element\", which\r\n // we can't because otherwise our keys compare fails (presentation components load data with\r\n // concrete classes)\r\n const changer = new ScopedSelectionChanger(this._selectionSourceName, this._imodel, this._logicalSelection, createSelectionScopeProps(this._logicalSelection.scopes.activeScope));\r\n\r\n // we know what to do immediately on `clear` events\r\n if (SelectionSetEventType.Clear === ev.type) {\r\n await changer.clear(selectionLevel);\r\n return;\r\n }\r\n\r\n const parsedIds = parseIds(ids);\r\n await using(this._asyncsTracker.trackAsyncTask(), async (_r) => {\r\n switch (ev.type) {\r\n case SelectionSetEventType.Add:\r\n await changer.add(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Replace:\r\n await changer.replace(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n case SelectionSetEventType.Remove:\r\n await changer.remove(parsedIds.transient, parsedIds.persistent, selectionLevel);\r\n break;\r\n }\r\n });\r\n };\r\n}\r\n\r\nconst parseIds = (ids: Id64Arg): { persistent: Id64Arg, transient: Id64Arg } => {\r\n let allPersistent = true;\r\n let allTransient = true;\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n allPersistent = false;\r\n else\r\n allTransient = false;\r\n\r\n if (!allPersistent && !allTransient)\r\n break;\r\n }\r\n\r\n // avoid making a copy if ids are only persistent or only transient\r\n if (allPersistent) {\r\n return { persistent: ids, transient: [] };\r\n } else if (allTransient) {\r\n return { persistent: [], transient: ids };\r\n }\r\n\r\n // if `ids` contain mixed ids, we have to copy.. use Array instead of\r\n // a Set for performance\r\n const persistentElementIds: Id64Array = [];\r\n const transientElementIds: Id64Array = [];\r\n for (const id of Id64.iterable(ids)) {\r\n if (Id64.isTransient(id))\r\n transientElementIds.push(id);\r\n else\r\n persistentElementIds.push(id);\r\n }\r\n\r\n return { persistent: persistentElementIds, transient: transientElementIds };\r\n};\r\n\r\nfunction addTransientKeys(transientIds: Id64Arg, keys: KeySet): void {\r\n for (const id of Id64.iterable(transientIds))\r\n keys.add({ className: TRANSIENT_ELEMENT_CLASSNAME, id });\r\n}\r\n\r\n/** @internal */\r\nclass ScopedSelectionChanger {\r\n public readonly name: string;\r\n public readonly imodel: IModelConnection;\r\n public readonly manager: SelectionManager;\r\n public readonly scope: SelectionScopeProps | SelectionScope | string;\r\n public constructor(name: string, imodel: IModelConnection, manager: SelectionManager, scope: SelectionScopeProps | SelectionScope | string) {\r\n this.name = name;\r\n this.imodel = imodel;\r\n this.manager = manager;\r\n this.scope = scope;\r\n }\r\n public async clear(level: number): Promise<void> {\r\n this.manager.clearSelection(this.name, this.imodel, level);\r\n }\r\n public async add(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.addToSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async remove(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.removeFromSelection(this.name, this.imodel, keys, level);\r\n }\r\n public async replace(transientIds: Id64Arg, persistentIds: Id64Arg, level: number): Promise<void> {\r\n const keys = await this.manager.scopes.computeSelection(this.imodel, persistentIds, this.scope);\r\n addTransientKeys(transientIds, keys);\r\n this.manager.replaceSelection(this.name, this.imodel, keys, level);\r\n }\r\n}\r\n"]}
|
|
@@ -44,10 +44,10 @@ export declare class SelectionScopesManager {
|
|
|
44
44
|
computeSelection(imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string): Promise<KeySet>;
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* Normalizes given scope options and returns [[
|
|
47
|
+
* Normalizes given scope options and returns [[SelectionScopeProps]] that can be used for
|
|
48
48
|
* calculating selection with scope.
|
|
49
49
|
*
|
|
50
|
-
* @
|
|
50
|
+
* @public
|
|
51
51
|
*/
|
|
52
52
|
export declare function createSelectionScopeProps(scope: SelectionScopeProps | SelectionScope | string | undefined): SelectionScopeProps;
|
|
53
53
|
/**
|
|
@@ -61,10 +61,10 @@ export class SelectionScopesManager {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Normalizes given scope options and returns [[
|
|
64
|
+
* Normalizes given scope options and returns [[SelectionScopeProps]] that can be used for
|
|
65
65
|
* calculating selection with scope.
|
|
66
66
|
*
|
|
67
|
-
* @
|
|
67
|
+
* @public
|
|
68
68
|
*/
|
|
69
69
|
export function createSelectionScopeProps(scope) {
|
|
70
70
|
if (!scope)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionScopesManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionScopesManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64Arg } from \"@itwin/core-bentley\";\r\nimport { IModelConnection } from \"@itwin/core-frontend\";\r\nimport { DEFAULT_KEYS_BATCH_SIZE, KeySet, RpcRequestsHandler, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\n\r\n/**\r\n * Properties for creating [[SelectionScopesManager]].\r\n * @public\r\n */\r\nexport interface SelectionScopesManagerProps {\r\n /** RPC handler to use for requesting selection scopes */\r\n rpcRequestsHandler: RpcRequestsHandler;\r\n\r\n /** Provider of active locale to use for localizing scopes */\r\n localeProvider?: () => string | undefined;\r\n}\r\n\r\n/**\r\n * A manager that knows available [selection scopes]($docs/presentation/unified-selection/index#selection-scopes)\r\n * and can compute logical selection based on element IDs and selection scope.\r\n *\r\n * @public\r\n */\r\nexport class SelectionScopesManager {\r\n\r\n private _rpcRequestsHandler: RpcRequestsHandler;\r\n private _getLocale: () => string | undefined;\r\n private _activeScope: SelectionScopeProps | SelectionScope | string | undefined;\r\n\r\n public constructor(props: SelectionScopesManagerProps) {\r\n this._rpcRequestsHandler = props.rpcRequestsHandler;\r\n this._getLocale = props.localeProvider ? props.localeProvider : (() => undefined);\r\n }\r\n\r\n /** Get active locale */\r\n public get activeLocale() { return this._getLocale(); }\r\n\r\n /** The active selection scope or its id */\r\n public get activeScope() { return this._activeScope; }\r\n public set activeScope(scope: SelectionScopeProps | SelectionScope | string | undefined) { this._activeScope = scope; }\r\n\r\n /**\r\n * Get available selection scopes.\r\n * @param imodel The iModel to get selection scopes for\r\n * @param locale Optional locale to use when localizing scopes' label and description\r\n */\r\n public async getSelectionScopes(imodel: IModelConnection, locale?: string): Promise<SelectionScope[]> {\r\n if (!locale)\r\n locale = this._getLocale();\r\n return this._rpcRequestsHandler.getSelectionScopes({ imodel: imodel.getRpcProps(), locale });\r\n }\r\n\r\n /**\r\n * Computes keys that need to be added to logical selection based on provided selection scope.\r\n * @param ids Element IDs to compute selection for\r\n * @param scope Selection scope to apply\r\n */\r\n public async computeSelection(imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string): Promise<KeySet> {\r\n const scopeProps = createSelectionScopeProps(scope);\r\n\r\n // convert ids input to array\r\n if (typeof ids === \"string\")\r\n ids = [ids];\r\n else if (ids instanceof Set)\r\n ids = [...ids];\r\n\r\n // compute selection in batches to avoid HTTP 413\r\n const keys = new KeySet();\r\n const batchSize = DEFAULT_KEYS_BATCH_SIZE;\r\n const batchesCount = Math.ceil(ids.length / batchSize);\r\n const batchKeyPromises = [];\r\n for (let batchIndex = 0; batchIndex < batchesCount; ++batchIndex) {\r\n const batchStart = batchSize * batchIndex;\r\n const batchEnd = (batchStart + batchSize > ids.length) ? ids.length : (batchStart + batchSize);\r\n const batchIds = (0 === batchIndex && ids.length <= batchEnd) ? ids : ids.slice(batchStart, batchEnd);\r\n batchKeyPromises.push(this._rpcRequestsHandler.computeSelection({ imodel: imodel.getRpcProps(), elementIds: batchIds, scope: scopeProps }));\r\n }\r\n const batchKeys = (await Promise.all(batchKeyPromises)).map(KeySet.fromJSON);\r\n batchKeys.forEach((bk) => keys.add(bk));\r\n return keys;\r\n }\r\n}\r\n\r\n/**\r\n * Normalizes given scope options and returns [[
|
|
1
|
+
{"version":3,"file":"SelectionScopesManager.js","sourceRoot":"","sources":["../../../../src/presentation-frontend/selection/SelectionScopesManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module UnifiedSelection\r\n */\r\n\r\nimport { Id64Arg } from \"@itwin/core-bentley\";\r\nimport { IModelConnection } from \"@itwin/core-frontend\";\r\nimport { DEFAULT_KEYS_BATCH_SIZE, KeySet, RpcRequestsHandler, SelectionScope, SelectionScopeProps } from \"@itwin/presentation-common\";\r\n\r\n/**\r\n * Properties for creating [[SelectionScopesManager]].\r\n * @public\r\n */\r\nexport interface SelectionScopesManagerProps {\r\n /** RPC handler to use for requesting selection scopes */\r\n rpcRequestsHandler: RpcRequestsHandler;\r\n\r\n /** Provider of active locale to use for localizing scopes */\r\n localeProvider?: () => string | undefined;\r\n}\r\n\r\n/**\r\n * A manager that knows available [selection scopes]($docs/presentation/unified-selection/index#selection-scopes)\r\n * and can compute logical selection based on element IDs and selection scope.\r\n *\r\n * @public\r\n */\r\nexport class SelectionScopesManager {\r\n\r\n private _rpcRequestsHandler: RpcRequestsHandler;\r\n private _getLocale: () => string | undefined;\r\n private _activeScope: SelectionScopeProps | SelectionScope | string | undefined;\r\n\r\n public constructor(props: SelectionScopesManagerProps) {\r\n this._rpcRequestsHandler = props.rpcRequestsHandler;\r\n this._getLocale = props.localeProvider ? props.localeProvider : (() => undefined);\r\n }\r\n\r\n /** Get active locale */\r\n public get activeLocale() { return this._getLocale(); }\r\n\r\n /** The active selection scope or its id */\r\n public get activeScope() { return this._activeScope; }\r\n public set activeScope(scope: SelectionScopeProps | SelectionScope | string | undefined) { this._activeScope = scope; }\r\n\r\n /**\r\n * Get available selection scopes.\r\n * @param imodel The iModel to get selection scopes for\r\n * @param locale Optional locale to use when localizing scopes' label and description\r\n */\r\n public async getSelectionScopes(imodel: IModelConnection, locale?: string): Promise<SelectionScope[]> {\r\n if (!locale)\r\n locale = this._getLocale();\r\n return this._rpcRequestsHandler.getSelectionScopes({ imodel: imodel.getRpcProps(), locale });\r\n }\r\n\r\n /**\r\n * Computes keys that need to be added to logical selection based on provided selection scope.\r\n * @param ids Element IDs to compute selection for\r\n * @param scope Selection scope to apply\r\n */\r\n public async computeSelection(imodel: IModelConnection, ids: Id64Arg, scope: SelectionScopeProps | SelectionScope | string): Promise<KeySet> {\r\n const scopeProps = createSelectionScopeProps(scope);\r\n\r\n // convert ids input to array\r\n if (typeof ids === \"string\")\r\n ids = [ids];\r\n else if (ids instanceof Set)\r\n ids = [...ids];\r\n\r\n // compute selection in batches to avoid HTTP 413\r\n const keys = new KeySet();\r\n const batchSize = DEFAULT_KEYS_BATCH_SIZE;\r\n const batchesCount = Math.ceil(ids.length / batchSize);\r\n const batchKeyPromises = [];\r\n for (let batchIndex = 0; batchIndex < batchesCount; ++batchIndex) {\r\n const batchStart = batchSize * batchIndex;\r\n const batchEnd = (batchStart + batchSize > ids.length) ? ids.length : (batchStart + batchSize);\r\n const batchIds = (0 === batchIndex && ids.length <= batchEnd) ? ids : ids.slice(batchStart, batchEnd);\r\n batchKeyPromises.push(this._rpcRequestsHandler.computeSelection({ imodel: imodel.getRpcProps(), elementIds: batchIds, scope: scopeProps }));\r\n }\r\n const batchKeys = (await Promise.all(batchKeyPromises)).map(KeySet.fromJSON);\r\n batchKeys.forEach((bk) => keys.add(bk));\r\n return keys;\r\n }\r\n}\r\n\r\n/**\r\n * Normalizes given scope options and returns [[SelectionScopeProps]] that can be used for\r\n * calculating selection with scope.\r\n *\r\n * @public\r\n */\r\nexport function createSelectionScopeProps(scope: SelectionScopeProps | SelectionScope | string | undefined): SelectionScopeProps {\r\n if (!scope)\r\n return { id: \"element\" };\r\n if (typeof scope === \"string\")\r\n return { id: scope };\r\n return scope;\r\n}\r\n\r\n/**\r\n * Determines the scope id\r\n * @param scope Selection scope\r\n * @public\r\n * @deprecated in 3.x. This is an internal utility that should've never become public.\r\n */\r\n// istanbul ignore next\r\nexport function getScopeId(scope: SelectionScope | string | undefined): string {\r\n return createSelectionScopeProps(scope).id;\r\n}\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/presentation-frontend",
|
|
3
|
-
"version": "4.0.0-dev.
|
|
3
|
+
"version": "4.0.0-dev.40",
|
|
4
4
|
"description": "Frontend of iModel.js Presentation library",
|
|
5
5
|
"main": "lib/cjs/presentation-frontend.js",
|
|
6
6
|
"module": "lib/esm/presentation-frontend.js",
|
|
@@ -22,28 +22,28 @@
|
|
|
22
22
|
"url": "http://www.bentley.com"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@itwin/core-bentley": "^4.0.0-dev.
|
|
26
|
-
"@itwin/core-common": "^4.0.0-dev.
|
|
27
|
-
"@itwin/core-frontend": "^4.0.0-dev.
|
|
28
|
-
"@itwin/core-quantity": "^4.0.0-dev.
|
|
29
|
-
"@itwin/presentation-common": "^4.0.0-dev.
|
|
25
|
+
"@itwin/core-bentley": "^4.0.0-dev.40",
|
|
26
|
+
"@itwin/core-common": "^4.0.0-dev.40",
|
|
27
|
+
"@itwin/core-frontend": "^4.0.0-dev.40",
|
|
28
|
+
"@itwin/core-quantity": "^4.0.0-dev.40",
|
|
29
|
+
"@itwin/presentation-common": "^4.0.0-dev.40"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@itwin/build-tools": "4.0.0-dev.
|
|
33
|
-
"@itwin/core-bentley": "4.0.0-dev.
|
|
34
|
-
"@itwin/core-common": "4.0.0-dev.
|
|
35
|
-
"@itwin/core-frontend": "4.0.0-dev.
|
|
36
|
-
"@itwin/core-i18n": "4.0.0-dev.
|
|
37
|
-
"@itwin/core-quantity": "4.0.0-dev.
|
|
38
|
-
"@itwin/eslint-plugin": "4.0.0-dev.
|
|
39
|
-
"@itwin/presentation-common": "4.0.0-dev.
|
|
32
|
+
"@itwin/build-tools": "4.0.0-dev.40",
|
|
33
|
+
"@itwin/core-bentley": "4.0.0-dev.40",
|
|
34
|
+
"@itwin/core-common": "4.0.0-dev.40",
|
|
35
|
+
"@itwin/core-frontend": "4.0.0-dev.40",
|
|
36
|
+
"@itwin/core-i18n": "4.0.0-dev.40",
|
|
37
|
+
"@itwin/core-quantity": "4.0.0-dev.40",
|
|
38
|
+
"@itwin/eslint-plugin": "4.0.0-dev.31",
|
|
39
|
+
"@itwin/presentation-common": "4.0.0-dev.40",
|
|
40
40
|
"@types/chai": "4.3.1",
|
|
41
41
|
"@types/chai-as-promised": "^7",
|
|
42
42
|
"@types/chai-jest-snapshot": "^1.3.0",
|
|
43
43
|
"@types/deep-equal": "^1",
|
|
44
44
|
"@types/faker": "^4.1.0",
|
|
45
45
|
"@types/mocha": "^8.2.2",
|
|
46
|
-
"@types/node": "18.11.5",
|
|
46
|
+
"@types/node": "^18.11.5",
|
|
47
47
|
"@types/sinon": "^9.0.0",
|
|
48
48
|
"@types/sinon-chai": "^3.2.0",
|
|
49
49
|
"chai": "^4.1.2",
|