@itwin/core-frontend 5.15.0-dev.3 → 5.15.0-dev.5
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 +11 -1
- package/lib/cjs/IModelApp.d.ts +19 -1
- package/lib/cjs/IModelApp.d.ts.map +1 -1
- package/lib/cjs/IModelApp.js +15 -0
- package/lib/cjs/IModelApp.js.map +1 -1
- package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.d.ts.map +1 -1
- package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.js +7 -14
- package/lib/cjs/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
- package/lib/cjs/quantity-formatting/FormatsProviderReloadCoordinator.d.ts +53 -0
- package/lib/cjs/quantity-formatting/FormatsProviderReloadCoordinator.d.ts.map +1 -0
- package/lib/cjs/quantity-formatting/FormatsProviderReloadCoordinator.js +145 -0
- package/lib/cjs/quantity-formatting/FormatsProviderReloadCoordinator.js.map +1 -0
- package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts +23 -34
- package/lib/cjs/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
- package/lib/cjs/quantity-formatting/QuantityFormatter.js +99 -90
- package/lib/cjs/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/cjs/tile/map/CesiumTerrainProvider.d.ts +27 -6
- package/lib/cjs/tile/map/CesiumTerrainProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/CesiumTerrainProvider.js +51 -21
- package/lib/cjs/tile/map/CesiumTerrainProvider.js.map +1 -1
- package/lib/esm/IModelApp.d.ts +19 -1
- package/lib/esm/IModelApp.d.ts.map +1 -1
- package/lib/esm/IModelApp.js +15 -0
- package/lib/esm/IModelApp.js.map +1 -1
- package/lib/esm/RealityDataSourceCesiumIonAssetImpl.d.ts.map +1 -1
- package/lib/esm/RealityDataSourceCesiumIonAssetImpl.js +7 -14
- package/lib/esm/RealityDataSourceCesiumIonAssetImpl.js.map +1 -1
- package/lib/esm/quantity-formatting/FormatsProviderReloadCoordinator.d.ts +53 -0
- package/lib/esm/quantity-formatting/FormatsProviderReloadCoordinator.d.ts.map +1 -0
- package/lib/esm/quantity-formatting/FormatsProviderReloadCoordinator.js +140 -0
- package/lib/esm/quantity-formatting/FormatsProviderReloadCoordinator.js.map +1 -0
- package/lib/esm/quantity-formatting/QuantityFormatter.d.ts +23 -34
- package/lib/esm/quantity-formatting/QuantityFormatter.d.ts.map +1 -1
- package/lib/esm/quantity-formatting/QuantityFormatter.js +99 -90
- package/lib/esm/quantity-formatting/QuantityFormatter.js.map +1 -1
- package/lib/esm/tile/map/CesiumTerrainProvider.d.ts +27 -6
- package/lib/esm/tile/map/CesiumTerrainProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/CesiumTerrainProvider.js +50 -22
- package/lib/esm/tile/map/CesiumTerrainProvider.js.map +1 -1
- package/lib/public/locales/en/iModelJs.json +3 -1
- package/lib/public/scripts/parse-imdl-worker.js +2 -2
- package/lib/test-public/scripts/parse-imdl-worker.js +2 -2
- package/lib/test-public/test-worker.js +1 -1
- package/package.json +21 -21
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
/** @internal */
|
|
6
|
+
export class ReloadSupersededError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super("QuantityFormatter reload was superseded by a newer request.");
|
|
9
|
+
this.name = "ReloadSupersededError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Serializes formatting reloads and resolves or rejects the caller waiting for formatting to become ready.
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export class FormatsProviderReloadCoordinator {
|
|
17
|
+
_host;
|
|
18
|
+
_disposedError;
|
|
19
|
+
_reloadInFlight = false;
|
|
20
|
+
_pendingReload;
|
|
21
|
+
_pendingFormatsChange;
|
|
22
|
+
_reloadCaller;
|
|
23
|
+
_isDisposed = false;
|
|
24
|
+
constructor(_host, _disposedError) {
|
|
25
|
+
this._host = _host;
|
|
26
|
+
this._disposedError = _disposedError;
|
|
27
|
+
}
|
|
28
|
+
dispose() {
|
|
29
|
+
if (this._isDisposed)
|
|
30
|
+
return;
|
|
31
|
+
this._isDisposed = true;
|
|
32
|
+
this._pendingReload = undefined;
|
|
33
|
+
this._pendingFormatsChange = undefined;
|
|
34
|
+
this._rejectReloadCaller(this._disposedError);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Runs an action that schedules a reload and waits for the reload queue to drain.
|
|
38
|
+
* A newer call rejects an older call that is still waiting.
|
|
39
|
+
*/
|
|
40
|
+
async runAndWaitForReload(action) {
|
|
41
|
+
if (this._isDisposed)
|
|
42
|
+
throw this._disposedError;
|
|
43
|
+
let caller;
|
|
44
|
+
const reload = new Promise((resolve, reject) => {
|
|
45
|
+
caller = { resolve, reject };
|
|
46
|
+
});
|
|
47
|
+
this._rejectReloadCaller(new ReloadSupersededError());
|
|
48
|
+
this._reloadCaller = caller;
|
|
49
|
+
try {
|
|
50
|
+
action();
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (this._reloadCaller === caller)
|
|
54
|
+
this._reloadCaller = undefined;
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
await reload;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Runs a reload now, or queues it if one is already running.
|
|
61
|
+
* Pending format changes are merged and kept apart from other pending reloads, so a later unit-system or units-provider reload cannot drop a provider change.
|
|
62
|
+
* If a reload is already running, this method returns immediately; use [[runAndWaitForReload]] when the caller must wait for completion.
|
|
63
|
+
* The waiting caller is rejected if any reload fails before the queue drains.
|
|
64
|
+
*/
|
|
65
|
+
async scheduleReload(intent) {
|
|
66
|
+
if (this._isDisposed)
|
|
67
|
+
return;
|
|
68
|
+
if (this._reloadInFlight) {
|
|
69
|
+
if (intent.scope === "formatsChanged")
|
|
70
|
+
this._pendingFormatsChange = mergeFormatsChanges(this._pendingFormatsChange, intent);
|
|
71
|
+
else
|
|
72
|
+
this._pendingReload = intent;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this._reloadInFlight = true;
|
|
76
|
+
let failure;
|
|
77
|
+
let current = intent;
|
|
78
|
+
while (current) {
|
|
79
|
+
try {
|
|
80
|
+
this._host.startReload();
|
|
81
|
+
await this._host.executeReload(current);
|
|
82
|
+
if (this._stopAfterDisposal())
|
|
83
|
+
return;
|
|
84
|
+
current = this._takePendingReload();
|
|
85
|
+
if (!current) {
|
|
86
|
+
await this._host.finalizeReload();
|
|
87
|
+
if (this._stopAfterDisposal())
|
|
88
|
+
return;
|
|
89
|
+
current = this._takePendingReload();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (this._stopAfterDisposal())
|
|
94
|
+
return;
|
|
95
|
+
// Keep draining so queued work still runs, but report the failure to the waiting caller.
|
|
96
|
+
this._host.handleReloadFailure(error);
|
|
97
|
+
failure = { error };
|
|
98
|
+
current = this._takePendingReload();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this._reloadInFlight = false;
|
|
102
|
+
if (failure)
|
|
103
|
+
this._rejectReloadCaller(failure.error);
|
|
104
|
+
else
|
|
105
|
+
this._resolveReloadCaller();
|
|
106
|
+
}
|
|
107
|
+
_stopAfterDisposal() {
|
|
108
|
+
if (!this._isDisposed)
|
|
109
|
+
return false;
|
|
110
|
+
this._reloadInFlight = false;
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
_takePendingReload() {
|
|
114
|
+
const next = this._pendingFormatsChange ?? this._pendingReload;
|
|
115
|
+
if (next === this._pendingFormatsChange)
|
|
116
|
+
this._pendingFormatsChange = undefined;
|
|
117
|
+
else
|
|
118
|
+
this._pendingReload = undefined;
|
|
119
|
+
return next;
|
|
120
|
+
}
|
|
121
|
+
_resolveReloadCaller() {
|
|
122
|
+
const caller = this._reloadCaller;
|
|
123
|
+
this._reloadCaller = undefined;
|
|
124
|
+
caller?.resolve();
|
|
125
|
+
}
|
|
126
|
+
_rejectReloadCaller(error) {
|
|
127
|
+
const caller = this._reloadCaller;
|
|
128
|
+
this._reloadCaller = undefined;
|
|
129
|
+
caller?.reject(error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function mergeFormatsChanges(pending, next) {
|
|
133
|
+
if (!pending)
|
|
134
|
+
return next;
|
|
135
|
+
const pendingNames = pending.args.formatsChanged;
|
|
136
|
+
const nextNames = next.args.formatsChanged;
|
|
137
|
+
const formatsChanged = pendingNames === "all" || nextNames === "all" ? "all" : [...new Set([...pendingNames, ...nextNames])];
|
|
138
|
+
return { scope: "formatsChanged", args: { formatsChanged } };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=FormatsProviderReloadCoordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatsProviderReloadCoordinator.js","sourceRoot":"","sources":["../../../src/quantity-formatting/FormatsProviderReloadCoordinator.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\r\nimport { FormatsChangedArgs } from \"@itwin/core-quantity\";\r\n\r\n/** @internal */\r\nexport class ReloadSupersededError extends Error {\r\n public constructor() {\r\n super(\"QuantityFormatter reload was superseded by a newer request.\");\r\n this.name = \"ReloadSupersededError\";\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport type ReloadIntent =\r\n | { scope: \"full\" }\r\n | { scope: \"formatsChanged\"; args: FormatsChangedArgs }\r\n | { scope: \"activeSystem\" };\r\n\r\ntype FormatsChangedIntent = Extract<ReloadIntent, { scope: \"formatsChanged\" }>;\r\n\r\ninterface ReloadCoordinatorHost {\r\n startReload(): void;\r\n executeReload(intent: ReloadIntent): Promise<void>;\r\n finalizeReload(): Promise<void>;\r\n handleReloadFailure(error: unknown): void;\r\n}\r\n\r\ninterface ReloadCaller {\r\n resolve: () => void;\r\n reject: (reason?: unknown) => void;\r\n}\r\n\r\n/**\r\n * Serializes formatting reloads and resolves or rejects the caller waiting for formatting to become ready.\r\n * @internal\r\n */\r\nexport class FormatsProviderReloadCoordinator {\r\n private _reloadInFlight = false;\r\n private _pendingReload: ReloadIntent | undefined;\r\n private _pendingFormatsChange: FormatsChangedIntent | undefined;\r\n private _reloadCaller: ReloadCaller | undefined;\r\n private _isDisposed = false;\r\n\r\n public constructor(private readonly _host: ReloadCoordinatorHost, private readonly _disposedError: Error) {}\r\n\r\n public dispose(): void {\r\n if (this._isDisposed)\r\n return;\r\n\r\n this._isDisposed = true;\r\n this._pendingReload = undefined;\r\n this._pendingFormatsChange = undefined;\r\n this._rejectReloadCaller(this._disposedError);\r\n }\r\n\r\n /**\r\n * Runs an action that schedules a reload and waits for the reload queue to drain.\r\n * A newer call rejects an older call that is still waiting.\r\n */\r\n public async runAndWaitForReload(action: () => void): Promise<void> {\r\n if (this._isDisposed)\r\n throw this._disposedError;\r\n\r\n let caller!: ReloadCaller;\r\n const reload = new Promise<void>((resolve, reject) => {\r\n caller = { resolve, reject };\r\n });\r\n\r\n this._rejectReloadCaller(new ReloadSupersededError());\r\n this._reloadCaller = caller;\r\n\r\n try {\r\n action();\r\n } catch (error) {\r\n if (this._reloadCaller === caller)\r\n this._reloadCaller = undefined;\r\n throw error;\r\n }\r\n\r\n await reload;\r\n }\r\n\r\n /**\r\n * Runs a reload now, or queues it if one is already running.\r\n * Pending format changes are merged and kept apart from other pending reloads, so a later unit-system or units-provider reload cannot drop a provider change.\r\n * If a reload is already running, this method returns immediately; use [[runAndWaitForReload]] when the caller must wait for completion.\r\n * The waiting caller is rejected if any reload fails before the queue drains.\r\n */\r\n public async scheduleReload(intent: ReloadIntent): Promise<void> {\r\n if (this._isDisposed)\r\n return;\r\n\r\n if (this._reloadInFlight) {\r\n if (intent.scope === \"formatsChanged\")\r\n this._pendingFormatsChange = mergeFormatsChanges(this._pendingFormatsChange, intent);\r\n else\r\n this._pendingReload = intent;\r\n return;\r\n }\r\n\r\n this._reloadInFlight = true;\r\n let failure: { error: unknown } | undefined;\r\n let current: ReloadIntent | undefined = intent;\r\n while (current) {\r\n try {\r\n this._host.startReload();\r\n await this._host.executeReload(current);\r\n if (this._stopAfterDisposal())\r\n return;\r\n\r\n current = this._takePendingReload();\r\n if (!current) {\r\n await this._host.finalizeReload();\r\n if (this._stopAfterDisposal())\r\n return;\r\n current = this._takePendingReload();\r\n }\r\n } catch (error) {\r\n if (this._stopAfterDisposal())\r\n return;\r\n\r\n // Keep draining so queued work still runs, but report the failure to the waiting caller.\r\n this._host.handleReloadFailure(error);\r\n failure = { error };\r\n current = this._takePendingReload();\r\n }\r\n }\r\n\r\n this._reloadInFlight = false;\r\n if (failure)\r\n this._rejectReloadCaller(failure.error);\r\n else\r\n this._resolveReloadCaller();\r\n }\r\n\r\n private _stopAfterDisposal(): boolean {\r\n if (!this._isDisposed)\r\n return false;\r\n\r\n this._reloadInFlight = false;\r\n return true;\r\n }\r\n\r\n private _takePendingReload(): ReloadIntent | undefined {\r\n const next = this._pendingFormatsChange ?? this._pendingReload;\r\n if (next === this._pendingFormatsChange)\r\n this._pendingFormatsChange = undefined;\r\n else\r\n this._pendingReload = undefined;\r\n return next;\r\n }\r\n\r\n private _resolveReloadCaller(): void {\r\n const caller = this._reloadCaller;\r\n this._reloadCaller = undefined;\r\n caller?.resolve();\r\n }\r\n\r\n private _rejectReloadCaller(error: unknown): void {\r\n const caller = this._reloadCaller;\r\n this._reloadCaller = undefined;\r\n caller?.reject(error);\r\n }\r\n}\r\n\r\nfunction mergeFormatsChanges(pending: FormatsChangedIntent | undefined, next: FormatsChangedIntent): FormatsChangedIntent {\r\n if (!pending)\r\n return next;\r\n\r\n const pendingNames = pending.args.formatsChanged;\r\n const nextNames = next.args.formatsChanged;\r\n const formatsChanged = pendingNames === \"all\" || nextNames === \"all\" ? \"all\" : [...new Set([...pendingNames, ...nextNames])];\r\n return { scope: \"formatsChanged\", args: { formatsChanged } };\r\n}\r\n"]}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { BeEvent, BeUiEvent, BeUnorderedUiEvent } from "@itwin/core-bentley";
|
|
5
5
|
import { AddFormattingSpecArgs, AlternateUnitLabelsProvider, FormatDefinition, FormatProps, FormatsChangedArgs, FormatSpecHandle, FormatsProvider, FormatsProviderContext, FormatterSpec, FormattingReadyCollector, FormattingSpecArgs, FormattingSpecEntry, FormattingSpecProvider, ParserSpec, QuantityParseResult, SyncFormatsProvider, UnitConversionProps, UnitProps, UnitsProvider, UnitSystemKey } from "@itwin/core-quantity";
|
|
6
6
|
import { IModelConnection } from "../IModelConnection";
|
|
7
|
+
import { ReloadIntent } from "./FormatsProviderReloadCoordinator";
|
|
7
8
|
import { CustomFormatPropEditorSpec } from "./QuantityTypesEditorSpecs";
|
|
8
9
|
/**
|
|
9
10
|
* Defines standard format types for tools that need to display measurements to user.
|
|
@@ -222,30 +223,14 @@ export declare class FormatsProviderManager implements FormatsProvider, SyncForm
|
|
|
222
223
|
getFormatSync(name: string, system?: UnitSystemKey, context?: FormatsProviderContext): FormatDefinition | undefined;
|
|
223
224
|
get formatsProvider(): FormatsProvider;
|
|
224
225
|
set formatsProvider(formatsProvider: FormatsProvider);
|
|
226
|
+
/**
|
|
227
|
+
* Replaces the underlying formats provider and raises an event indicating that all formats changed.
|
|
228
|
+
* @param formatsProvider The formats provider to use for subsequent format lookups.
|
|
229
|
+
* @param impliedUnitSystem The unit system implied by the replacement provider, if any. Not stored here; [[QuantityFormatter]] applies it as the active unit system when handling `onFormatsChanged`.
|
|
230
|
+
* @internal
|
|
231
|
+
*/
|
|
232
|
+
setFormatsProvider(formatsProvider: FormatsProvider, impliedUnitSystem?: UnitSystemKey): void;
|
|
225
233
|
}
|
|
226
|
-
/** Class that supports formatting quantity values into strings and parsing strings into quantity values. This class also maintains
|
|
227
|
-
* the "active" unit system and caches FormatterSpecs and ParserSpecs for the "active" unit system to allow synchronous access to
|
|
228
|
-
* parsing and formatting values. The support unit systems are defined by [[UnitSystemKey]] and is kept in synch with the unit systems
|
|
229
|
-
* provided by the Presentation Manager on the backend. The QuantityFormatter contains a registry of quantity type definitions. These definitions implement
|
|
230
|
-
* the [[QuantityTypeDefinition]] interface, which among other things, provide default [[FormatProps]], and provide methods
|
|
231
|
-
* to generate both a [[FormatterSpec]] and a [[ParserSpec]]. There are built-in quantity types that are
|
|
232
|
-
* identified by the [[QuantityType]] enum. [[CustomQuantityTypeDefinition]] can be registered to extend the available quantity types available
|
|
233
|
-
* by frontend tools. The QuantityFormatter also allows the default formats to be overriden.
|
|
234
|
-
*
|
|
235
|
-
* @public
|
|
236
|
-
*/
|
|
237
|
-
/** Discriminated union describing what a queued reload should do.
|
|
238
|
-
* @internal
|
|
239
|
-
*/
|
|
240
|
-
type ReloadIntent = {
|
|
241
|
-
scope: "full";
|
|
242
|
-
} | {
|
|
243
|
-
scope: "formatsChanged";
|
|
244
|
-
args: FormatsChangedArgs;
|
|
245
|
-
} | {
|
|
246
|
-
scope: "activeSystem";
|
|
247
|
-
emitSystemChanged?: boolean;
|
|
248
|
-
};
|
|
249
234
|
/** The QuantityFormatter class provides methods for formatting and parsing quantities. There are a set of standard quantity types
|
|
250
235
|
* identified by the [[QuantityType]] enum. [[CustomQuantityTypeDefinition]] can be registered to extend the available quantity types available
|
|
251
236
|
* by frontend tools. The QuantityFormatter also allows the default formats to be overriden.
|
|
@@ -320,10 +305,13 @@ export declare class QuantityFormatter implements UnitsProvider, FormattingSpecP
|
|
|
320
305
|
private _hasEverBeenReady;
|
|
321
306
|
private _initializedPromise;
|
|
322
307
|
private _resolveInitialized;
|
|
323
|
-
private
|
|
324
|
-
private
|
|
325
|
-
private
|
|
308
|
+
private _emitSystemChangedOnReady;
|
|
309
|
+
private _isDisposed;
|
|
310
|
+
private readonly _disposedError;
|
|
311
|
+
private readonly _reloadCoordinator;
|
|
326
312
|
private _removeFormatsProviderListener?;
|
|
313
|
+
private _activeFormatSpecsTarget?;
|
|
314
|
+
private _activeParserSpecsTarget?;
|
|
327
315
|
/**
|
|
328
316
|
* constructor
|
|
329
317
|
* @param showMetricOrUnitSystem - Pass in `true` to show Metric formatted quantity values. Defaults to Imperial. To explicitly
|
|
@@ -331,21 +319,23 @@ export declare class QuantityFormatter implements UnitsProvider, FormattingSpecP
|
|
|
331
319
|
*/
|
|
332
320
|
constructor(showMetricOrUnitSystem?: boolean | UnitSystemKey);
|
|
333
321
|
[Symbol.dispose](): void;
|
|
322
|
+
/** Runs an action that schedules a reload and waits for the reload queue to drain.
|
|
323
|
+
* The most recent call wins. If another call is made before this reload queue drains, this call is rejected.
|
|
324
|
+
* @internal
|
|
325
|
+
*/
|
|
326
|
+
runAndWaitForReload(action: () => void): Promise<void>;
|
|
334
327
|
/** Schedule an async reload. If no reload is in flight, runs immediately. If a reload is
|
|
335
|
-
* already in flight, stores the intent as pending
|
|
336
|
-
*
|
|
328
|
+
* already in flight, stores the intent as pending. Pending format changes are merged and run before
|
|
329
|
+
* the latest other pending intent. `finalizeReload()` fires only when the queue is fully drained.
|
|
337
330
|
*
|
|
338
331
|
* **Await semantics:** When a reload is already in flight, the returned promise resolves
|
|
339
332
|
* immediately *without* the requested reload having run. Callers that need to know when
|
|
340
|
-
*
|
|
333
|
+
* an explicitly triggered reload has actually completed should use [[runAndWaitForReload]].
|
|
341
334
|
*
|
|
342
|
-
* Reload intents:
|
|
343
|
-
* - `"full"` — rebuild entire registry + re-register provider listener (onInitialized, setUnitsProvider)
|
|
344
|
-
* - `"formatsChanged"` — patch registry from provider + load maps (formatsChanged listener)
|
|
345
|
-
* - `"activeSystem"` — reload format/parsing maps for current unit system (setActiveUnitSystem, reinitializeFormatAndParsingsMaps)
|
|
346
335
|
* @internal
|
|
347
336
|
*/
|
|
348
337
|
protected scheduleReload(intent: ReloadIntent): Promise<void>;
|
|
338
|
+
private _handleReloadFailure;
|
|
349
339
|
/** Execute the reload work for a given intent. All reload logic is centralized here.
|
|
350
340
|
* @internal
|
|
351
341
|
*/
|
|
@@ -555,5 +545,4 @@ export declare class QuantityFormatter implements UnitsProvider, FormattingSpecP
|
|
|
555
545
|
*/
|
|
556
546
|
addFormattingSpecsToRegistry(args: AddFormattingSpecArgs): Promise<void>;
|
|
557
547
|
}
|
|
558
|
-
export {};
|
|
559
548
|
//# sourceMappingURL=QuantityFormatter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuantityFormatter.d.ts","sourceRoot":"","sources":["../../../src/quantity-formatting/QuantityFormatter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QuantityFormatter.d.ts","sourceRoot":"","sources":["../../../src/quantity-formatting/QuantityFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import { BasicUnitsProvider, Format, FormatSpecHandle, FormatterSpec, Formatting
|
|
|
10
10
|
import { FrontendLoggerCategory } from "../common/FrontendLoggerCategory";
|
|
11
11
|
import { IModelApp } from "../IModelApp";
|
|
12
12
|
import { getDefaultAlternateUnitLabels } from "./AlternateUnitLabels";
|
|
13
|
+
import { FormatsProviderReloadCoordinator } from "./FormatsProviderReloadCoordinator";
|
|
13
14
|
// cSpell:ignore FORMATPROPS FORMATKEY ussurvey uscustomary USCUSTOM
|
|
14
15
|
/**
|
|
15
16
|
* Defines standard format types for tools that need to display measurements to user.
|
|
@@ -194,12 +195,24 @@ export class FormatsProviderManager {
|
|
|
194
195
|
}
|
|
195
196
|
get formatsProvider() { return this; }
|
|
196
197
|
set formatsProvider(formatsProvider) {
|
|
198
|
+
this.setFormatsProvider(formatsProvider);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Replaces the underlying formats provider and raises an event indicating that all formats changed.
|
|
202
|
+
* @param formatsProvider The formats provider to use for subsequent format lookups.
|
|
203
|
+
* @param impliedUnitSystem The unit system implied by the replacement provider, if any. Not stored here; [[QuantityFormatter]] applies it as the active unit system when handling `onFormatsChanged`.
|
|
204
|
+
* @internal
|
|
205
|
+
*/
|
|
206
|
+
setFormatsProvider(formatsProvider, impliedUnitSystem) {
|
|
197
207
|
this._removeProviderListener?.();
|
|
198
208
|
this._formatsProvider = formatsProvider;
|
|
199
209
|
this._removeProviderListener = this._formatsProvider.onFormatsChanged.addListener((args) => {
|
|
200
210
|
this.onFormatsChanged.raiseEvent(args);
|
|
201
211
|
});
|
|
202
|
-
|
|
212
|
+
const args = { formatsChanged: "all" };
|
|
213
|
+
if (impliedUnitSystem !== undefined)
|
|
214
|
+
args.impliedUnitSystem = impliedUnitSystem;
|
|
215
|
+
this.onFormatsChanged.raiseEvent(args);
|
|
203
216
|
}
|
|
204
217
|
}
|
|
205
218
|
/** The QuantityFormatter class provides methods for formatting and parsing quantities. There are a set of standard quantity types
|
|
@@ -280,10 +293,13 @@ export class QuantityFormatter {
|
|
|
280
293
|
_hasEverBeenReady = false;
|
|
281
294
|
_initializedPromise;
|
|
282
295
|
_resolveInitialized;
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
296
|
+
_emitSystemChangedOnReady = false;
|
|
297
|
+
_isDisposed = false;
|
|
298
|
+
_disposedError = new Error("QuantityFormatter was disposed before the reload completed.");
|
|
299
|
+
_reloadCoordinator;
|
|
286
300
|
_removeFormatsProviderListener;
|
|
301
|
+
_activeFormatSpecsTarget;
|
|
302
|
+
_activeParserSpecsTarget;
|
|
287
303
|
/**
|
|
288
304
|
* constructor
|
|
289
305
|
* @param showMetricOrUnitSystem - Pass in `true` to show Metric formatted quantity values. Defaults to Imperial. To explicitly
|
|
@@ -293,6 +309,12 @@ export class QuantityFormatter {
|
|
|
293
309
|
this._initializedPromise = new Promise((resolve) => {
|
|
294
310
|
this._resolveInitialized = resolve;
|
|
295
311
|
});
|
|
312
|
+
this._reloadCoordinator = new FormatsProviderReloadCoordinator({
|
|
313
|
+
startReload: () => { this._isReady = false; },
|
|
314
|
+
executeReload: async (intent) => this._executeReload(intent),
|
|
315
|
+
finalizeReload: async () => this.finalizeReload(),
|
|
316
|
+
handleReloadFailure: (error) => this._handleReloadFailure(error),
|
|
317
|
+
}, this._disposedError);
|
|
296
318
|
if (undefined !== showMetricOrUnitSystem) {
|
|
297
319
|
if (typeof showMetricOrUnitSystem === "boolean")
|
|
298
320
|
this._activeUnitSystem = showMetricOrUnitSystem ? "metric" : "imperial";
|
|
@@ -301,70 +323,44 @@ export class QuantityFormatter {
|
|
|
301
323
|
}
|
|
302
324
|
}
|
|
303
325
|
[Symbol.dispose]() {
|
|
326
|
+
if (this._isDisposed)
|
|
327
|
+
return;
|
|
328
|
+
this._isDisposed = true;
|
|
329
|
+
this._isReady = false;
|
|
330
|
+
this._emitSystemChangedOnReady = false;
|
|
331
|
+
this._reloadCoordinator.dispose();
|
|
304
332
|
if (this._removeFormatsProviderListener) {
|
|
305
333
|
this._removeFormatsProviderListener();
|
|
306
334
|
this._removeFormatsProviderListener = undefined;
|
|
307
335
|
}
|
|
308
336
|
}
|
|
337
|
+
/** Runs an action that schedules a reload and waits for the reload queue to drain.
|
|
338
|
+
* The most recent call wins. If another call is made before this reload queue drains, this call is rejected.
|
|
339
|
+
* @internal
|
|
340
|
+
*/
|
|
341
|
+
async runAndWaitForReload(action) {
|
|
342
|
+
return this._reloadCoordinator.runAndWaitForReload(action);
|
|
343
|
+
}
|
|
309
344
|
/** Schedule an async reload. If no reload is in flight, runs immediately. If a reload is
|
|
310
|
-
* already in flight, stores the intent as pending
|
|
311
|
-
*
|
|
345
|
+
* already in flight, stores the intent as pending. Pending format changes are merged and run before
|
|
346
|
+
* the latest other pending intent. `finalizeReload()` fires only when the queue is fully drained.
|
|
312
347
|
*
|
|
313
348
|
* **Await semantics:** When a reload is already in flight, the returned promise resolves
|
|
314
349
|
* immediately *without* the requested reload having run. Callers that need to know when
|
|
315
|
-
*
|
|
350
|
+
* an explicitly triggered reload has actually completed should use [[runAndWaitForReload]].
|
|
316
351
|
*
|
|
317
|
-
* Reload intents:
|
|
318
|
-
* - `"full"` — rebuild entire registry + re-register provider listener (onInitialized, setUnitsProvider)
|
|
319
|
-
* - `"formatsChanged"` — patch registry from provider + load maps (formatsChanged listener)
|
|
320
|
-
* - `"activeSystem"` — reload format/parsing maps for current unit system (setActiveUnitSystem, reinitializeFormatAndParsingsMaps)
|
|
321
352
|
* @internal
|
|
322
353
|
*/
|
|
323
354
|
async scheduleReload(intent) {
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
this.
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
try {
|
|
333
|
-
await this._executeReload(intent);
|
|
355
|
+
return this._reloadCoordinator.scheduleReload(intent);
|
|
356
|
+
}
|
|
357
|
+
_handleReloadFailure(error) {
|
|
358
|
+
if (!this._isDisposed)
|
|
359
|
+
Logger.logError(`${FrontendLoggerCategory.Package}.QuantityFormatter`, BentleyError.getErrorMessage(error));
|
|
360
|
+
if (this._hasEverBeenReady && !this._isDisposed) {
|
|
361
|
+
Logger.logWarning(`${FrontendLoggerCategory.Package}.QuantityFormatter`, "Reload failed — restoring previous ready state. Cached specs may be stale.");
|
|
362
|
+
this._isReady = true;
|
|
334
363
|
}
|
|
335
|
-
catch (err) {
|
|
336
|
-
Logger.logError(`${FrontendLoggerCategory.Package}.QuantityFormatter`, BentleyError.getErrorMessage(err));
|
|
337
|
-
this._reloadInFlight = false;
|
|
338
|
-
// If there's a pending reload, still try to run it
|
|
339
|
-
if (this._pendingReload) {
|
|
340
|
-
const next = this._pendingReload;
|
|
341
|
-
this._pendingReload = undefined;
|
|
342
|
-
return this.scheduleReload(next);
|
|
343
|
-
}
|
|
344
|
-
// Restore prior ready state so stale-but-usable specs remain accessible
|
|
345
|
-
if (this._hasEverBeenReady) {
|
|
346
|
-
Logger.logWarning(`${FrontendLoggerCategory.Package}.QuantityFormatter`, "Reload failed — restoring previous ready state. Cached specs may be stale.");
|
|
347
|
-
this._isReady = true;
|
|
348
|
-
}
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
// Current reload succeeded — check if another was queued
|
|
352
|
-
if (this._pendingReload) {
|
|
353
|
-
const next = this._pendingReload;
|
|
354
|
-
this._pendingReload = undefined;
|
|
355
|
-
this._reloadInFlight = false;
|
|
356
|
-
return this.scheduleReload(next);
|
|
357
|
-
}
|
|
358
|
-
// Queue is drained — finalize
|
|
359
|
-
await this.finalizeReload();
|
|
360
|
-
// A new reload may have been queued during the async finalizeReload window
|
|
361
|
-
if (this._pendingReload) {
|
|
362
|
-
const next = this._pendingReload;
|
|
363
|
-
this._pendingReload = undefined;
|
|
364
|
-
this._reloadInFlight = false;
|
|
365
|
-
return this.scheduleReload(next);
|
|
366
|
-
}
|
|
367
|
-
this._reloadInFlight = false;
|
|
368
364
|
}
|
|
369
365
|
/** Execute the reload work for a given intent. All reload logic is centralized here.
|
|
370
366
|
* @internal
|
|
@@ -373,47 +369,51 @@ export class QuantityFormatter {
|
|
|
373
369
|
switch (intent.scope) {
|
|
374
370
|
case "full":
|
|
375
371
|
await this._reloadCore();
|
|
372
|
+
return;
|
|
373
|
+
case "formatsChanged":
|
|
374
|
+
await this._rebuildRegistryFromProvider(intent.args);
|
|
376
375
|
break;
|
|
377
|
-
case "formatsChanged": {
|
|
378
|
-
const { args } = intent;
|
|
379
|
-
await this._rebuildRegistryFromProvider(args);
|
|
380
|
-
if (args.impliedUnitSystem && args.impliedUnitSystem !== this._activeUnitSystem) {
|
|
381
|
-
this._activeUnitSystem = args.impliedUnitSystem;
|
|
382
|
-
}
|
|
383
|
-
await this.loadFormatAndParsingMapsForSystem(this._activeUnitSystem);
|
|
384
|
-
if (args.impliedUnitSystem) {
|
|
385
|
-
this._deferredSystemChangedEmit = { system: this._activeUnitSystem };
|
|
386
|
-
}
|
|
387
|
-
break;
|
|
388
|
-
}
|
|
389
|
-
case "activeSystem":
|
|
390
|
-
await this.loadFormatAndParsingMapsForSystem(this._activeUnitSystem);
|
|
391
|
-
if (intent.emitSystemChanged) {
|
|
392
|
-
this._deferredSystemChangedEmit = { system: this._activeUnitSystem };
|
|
393
|
-
}
|
|
394
|
-
break;
|
|
395
376
|
}
|
|
377
|
+
// Build the active specs in temporary maps so readers keep using complete specs until the new ones are ready.
|
|
378
|
+
const nextFormatSpecs = new Map();
|
|
379
|
+
const nextParserSpecs = new Map();
|
|
380
|
+
this._activeFormatSpecsTarget = nextFormatSpecs;
|
|
381
|
+
this._activeParserSpecsTarget = nextParserSpecs;
|
|
382
|
+
try {
|
|
383
|
+
await this.loadFormatAndParsingMapsForSystem(this._activeUnitSystem);
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
this._activeFormatSpecsTarget = undefined;
|
|
387
|
+
this._activeParserSpecsTarget = undefined;
|
|
388
|
+
}
|
|
389
|
+
this._activeFormatSpecsByType = nextFormatSpecs;
|
|
390
|
+
this._activeParserSpecsByType = nextParserSpecs;
|
|
396
391
|
}
|
|
397
392
|
/** Called when the reload queue is fully drained after a successful reload.
|
|
398
393
|
* Sets `isReady` to true, resolves `whenInitialized` (one-shot), and emits ready events.
|
|
399
394
|
* @internal
|
|
400
395
|
*/
|
|
401
396
|
async finalizeReload() {
|
|
397
|
+
if (this._isDisposed)
|
|
398
|
+
return;
|
|
402
399
|
// Phase 1: Let providers register async work
|
|
403
400
|
const collector = new FormattingReadyCollector();
|
|
404
401
|
this.onBeforeFormattingReady.raiseEvent(collector);
|
|
405
402
|
await collector.awaitAll();
|
|
403
|
+
if (this._isDisposed)
|
|
404
|
+
return;
|
|
406
405
|
// Phase 2: Signal ready to consumers
|
|
407
406
|
this._isReady = true;
|
|
408
407
|
this._hasEverBeenReady = true;
|
|
409
408
|
this._resolveInitialized();
|
|
410
409
|
this.onFormattingReady.emit();
|
|
411
|
-
|
|
410
|
+
if (this._isDisposed)
|
|
411
|
+
return;
|
|
412
|
+
// Phase 3: Emit unit-system-changed if the unit system was changed since the last ready state, reporting the system that is now active.
|
|
412
413
|
// This fires after isReady === true so listeners can safely use the formatter.
|
|
413
|
-
if (this.
|
|
414
|
-
|
|
415
|
-
this.
|
|
416
|
-
this.onActiveFormattingUnitSystemChanged.emit(args);
|
|
414
|
+
if (this._emitSystemChangedOnReady) {
|
|
415
|
+
this._emitSystemChangedOnReady = false;
|
|
416
|
+
this.onActiveFormattingUnitSystemChanged.emit({ system: this._activeUnitSystem });
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
419
|
getOverrideFormatPropsByQuantityType(quantityTypeKey, unitSystem) {
|
|
@@ -484,8 +484,8 @@ export class QuantityFormatter {
|
|
|
484
484
|
async loadFormatAndParserSpec(quantityTypeDefinition, formatProps) {
|
|
485
485
|
const formatterSpec = await quantityTypeDefinition.generateFormatterSpec(formatProps, this.unitsProvider);
|
|
486
486
|
const parserSpec = await quantityTypeDefinition.generateParserSpec(formatProps, this.unitsProvider, this.alternateUnitLabelsProvider);
|
|
487
|
-
this._activeFormatSpecsByType.set(quantityTypeDefinition.key, formatterSpec);
|
|
488
|
-
this._activeParserSpecsByType.set(quantityTypeDefinition.key, parserSpec);
|
|
487
|
+
(this._activeFormatSpecsTarget ?? this._activeFormatSpecsByType).set(quantityTypeDefinition.key, formatterSpec);
|
|
488
|
+
(this._activeParserSpecsTarget ?? this._activeParserSpecsByType).set(quantityTypeDefinition.key, parserSpec);
|
|
489
489
|
}
|
|
490
490
|
// repopulate formatSpec and parserSpec entries using only default format
|
|
491
491
|
async loadDefaultFormatAndParserSpecForQuantity(typeKey) {
|
|
@@ -542,17 +542,20 @@ export class QuantityFormatter {
|
|
|
542
542
|
* @internal
|
|
543
543
|
*/
|
|
544
544
|
async onInitialized() {
|
|
545
|
+
// Register once, before the first reload, so provider changes made while a units-provider reload is running are not missed.
|
|
546
|
+
this._removeFormatsProviderListener ??= IModelApp.formatsProvider.onFormatsChanged.addListener((args) => {
|
|
547
|
+
if (args.impliedUnitSystem && args.impliedUnitSystem !== this._activeUnitSystem) {
|
|
548
|
+
this._activeUnitSystem = args.impliedUnitSystem;
|
|
549
|
+
this._emitSystemChangedOnReady = true;
|
|
550
|
+
}
|
|
551
|
+
void this.scheduleReload({ scope: "formatsChanged", args });
|
|
552
|
+
});
|
|
545
553
|
await this.scheduleReload({ scope: "full" });
|
|
546
554
|
}
|
|
547
555
|
/** Core reload logic — does all async I/O and cache rebuilding without events or state management.
|
|
548
556
|
* @internal
|
|
549
557
|
*/
|
|
550
558
|
async _reloadCore() {
|
|
551
|
-
// Remove any existing listener before re-registering to avoid duplicates when called via setUnitsProvider.
|
|
552
|
-
if (this._removeFormatsProviderListener) {
|
|
553
|
-
this._removeFormatsProviderListener();
|
|
554
|
-
this._removeFormatsProviderListener = undefined;
|
|
555
|
-
}
|
|
556
559
|
await this.initializeQuantityTypesRegistry();
|
|
557
560
|
const initialKoQs = [["DefaultToolsUnits.LENGTH", "Units.M"], ["DefaultToolsUnits.ANGLE", "Units.RAD"], ["DefaultToolsUnits.AREA", "Units.SQ_M"], ["DefaultToolsUnits.VOLUME", "Units.CUB_M"], ["DefaultToolsUnits.LENGTH_COORDINATE", "Units.M"], ["CivilUnits.STATION", "Units.M"], ["CivilUnits.LENGTH", "Units.M"], ["AecUnits.LENGTH", "Units.M"]];
|
|
558
561
|
for (const entry of initialKoQs) {
|
|
@@ -565,10 +568,6 @@ export class QuantityFormatter {
|
|
|
565
568
|
}
|
|
566
569
|
}
|
|
567
570
|
}
|
|
568
|
-
// Register formatsProvider listener that triggers a queued reload when formats change
|
|
569
|
-
this._removeFormatsProviderListener = IModelApp.formatsProvider.onFormatsChanged.addListener((args) => {
|
|
570
|
-
void this.scheduleReload({ scope: "formatsChanged", args });
|
|
571
|
-
});
|
|
572
571
|
// initialize default format and parsing specs
|
|
573
572
|
await this.loadFormatAndParsingMapsForSystem();
|
|
574
573
|
}
|
|
@@ -662,6 +661,9 @@ export class QuantityFormatter {
|
|
|
662
661
|
await IModelApp.quantityFormatter.resetToUseInternalUnitsProvider();
|
|
663
662
|
return;
|
|
664
663
|
}
|
|
664
|
+
// Disposal can occur while the reload is awaited, so do not notify afterward.
|
|
665
|
+
if (this._isDisposed)
|
|
666
|
+
return;
|
|
665
667
|
this.onUnitsProviderChanged.emit();
|
|
666
668
|
}
|
|
667
669
|
/**
|
|
@@ -701,7 +703,11 @@ export class QuantityFormatter {
|
|
|
701
703
|
this._overrideFormatPropsByUnitSystem = overrideFormatPropsByUnitSystem;
|
|
702
704
|
}
|
|
703
705
|
unitSystemKey && (this._activeUnitSystem = unitSystemKey);
|
|
704
|
-
|
|
706
|
+
if (fireUnitSystemChanged)
|
|
707
|
+
this._emitSystemChangedOnReady = true;
|
|
708
|
+
await this.scheduleReload({ scope: "activeSystem" });
|
|
709
|
+
if (this._isDisposed)
|
|
710
|
+
return;
|
|
705
711
|
IModelApp.toolAdmin && startDefaultTool && await IModelApp.toolAdmin.startDefaultTool();
|
|
706
712
|
}
|
|
707
713
|
/** Set the Active unit system to one of the supported types. This will asynchronously load the formatter and parser specs for the activated system. */
|
|
@@ -714,7 +720,10 @@ export class QuantityFormatter {
|
|
|
714
720
|
if (this._activeUnitSystem === systemType)
|
|
715
721
|
return;
|
|
716
722
|
this._activeUnitSystem = systemType;
|
|
717
|
-
|
|
723
|
+
this._emitSystemChangedOnReady = true;
|
|
724
|
+
await this.scheduleReload({ scope: "activeSystem" });
|
|
725
|
+
if (this._isDisposed)
|
|
726
|
+
return;
|
|
718
727
|
// allow settings provider to store the change
|
|
719
728
|
await this._unitFormattingSettingsProvider?.storeUnitSystemSetting({ system: systemType });
|
|
720
729
|
if (IModelApp.toolAdmin && restartActiveTool)
|