@itwin/imodel-components-react 3.1.0-dev.8 → 3.2.0-dev.0

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.
Files changed (72) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/lib/cjs/imodel-components-react/color/ColorPickerPopup.scss +1 -0
  3. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
  4. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js +1 -1
  5. package/lib/cjs/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  6. package/lib/cjs/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
  7. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js +3 -3
  8. package/lib/cjs/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  9. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
  10. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js +1 -1
  11. package/lib/cjs/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  12. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
  13. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js +6 -6
  14. package/lib/cjs/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  15. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
  16. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +1 -1
  17. package/lib/cjs/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  18. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts +0 -6
  19. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  20. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js +37 -46
  21. package/lib/cjs/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  22. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  23. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js +10 -6
  24. package/lib/cjs/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  25. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.d.ts.map +1 -1
  26. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js +1 -0
  27. package/lib/cjs/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  28. package/lib/cjs/imodel-components-react.d.ts +0 -1
  29. package/lib/cjs/imodel-components-react.d.ts.map +1 -1
  30. package/lib/cjs/imodel-components-react.js +0 -1
  31. package/lib/cjs/imodel-components-react.js.map +1 -1
  32. package/lib/esm/imodel-components-react/color/ColorPickerPopup.scss +1 -0
  33. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.d.ts.map +1 -1
  34. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js +2 -2
  35. package/lib/esm/imodel-components-react/quantityformat/FormatPrecision.js.map +1 -1
  36. package/lib/esm/imodel-components-react/quantityformat/FormatType.d.ts.map +1 -1
  37. package/lib/esm/imodel-components-react/quantityformat/FormatType.js +4 -4
  38. package/lib/esm/imodel-components-react/quantityformat/FormatType.js.map +1 -1
  39. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.d.ts.map +1 -1
  40. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js +2 -2
  41. package/lib/esm/imodel-components-react/quantityformat/FormatUnitLabel.js.map +1 -1
  42. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.d.ts.map +1 -1
  43. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js +7 -7
  44. package/lib/esm/imodel-components-react/quantityformat/MiscFormatOptions.js.map +1 -1
  45. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.d.ts.map +1 -1
  46. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js +2 -2
  47. package/lib/esm/imodel-components-react/quantityformat/misc/ThousandsSeparator.js.map +1 -1
  48. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts +0 -6
  49. package/lib/esm/imodel-components-react/timeline/TimelineComponent.d.ts.map +1 -1
  50. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js +37 -46
  51. package/lib/esm/imodel-components-react/timeline/TimelineComponent.js.map +1 -1
  52. package/lib/esm/imodel-components-react/viewport/ViewportComponent.d.ts.map +1 -1
  53. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js +10 -6
  54. package/lib/esm/imodel-components-react/viewport/ViewportComponent.js.map +1 -1
  55. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.d.ts.map +1 -1
  56. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js +1 -0
  57. package/lib/esm/imodel-components-react/viewport/ViewportComponentEvents.js.map +1 -1
  58. package/lib/esm/imodel-components-react.d.ts +0 -1
  59. package/lib/esm/imodel-components-react.d.ts.map +1 -1
  60. package/lib/esm/imodel-components-react.js +0 -1
  61. package/lib/esm/imodel-components-react.js.map +1 -1
  62. package/package.json +21 -21
  63. package/lib/cjs/imodel-components-react/timeline/ContextMenu.d.ts +0 -55
  64. package/lib/cjs/imodel-components-react/timeline/ContextMenu.d.ts.map +0 -1
  65. package/lib/cjs/imodel-components-react/timeline/ContextMenu.js +0 -82
  66. package/lib/cjs/imodel-components-react/timeline/ContextMenu.js.map +0 -1
  67. package/lib/cjs/imodel-components-react/timeline/ContextMenu.scss +0 -81
  68. package/lib/esm/imodel-components-react/timeline/ContextMenu.d.ts +0 -55
  69. package/lib/esm/imodel-components-react/timeline/ContextMenu.d.ts.map +0 -1
  70. package/lib/esm/imodel-components-react/timeline/ContextMenu.js +0 -55
  71. package/lib/esm/imodel-components-react/timeline/ContextMenu.js.map +0 -1
  72. package/lib/esm/imodel-components-react/timeline/ContextMenu.scss +0 -81
@@ -9,13 +9,13 @@ import "./TimelineComponent.scss";
9
9
  import classnames from "classnames";
10
10
  import * as React from "react";
11
11
  import { UiAdmin } from "@itwin/appui-abstract";
12
- import { ContextMenu, ContextMenuDirection, ContextMenuItem } from "@itwin/core-react";
13
12
  import { toDateString, toTimeString, UiComponents } from "@itwin/components-react";
14
13
  import { UiIModelComponents } from "../UiIModelComponents";
15
14
  import { InlineEdit } from "./InlineEdit";
16
15
  import { TimelinePausePlayAction } from "./interfaces";
17
16
  import { PlayButton, PlayerButton } from "./PlayerButton";
18
17
  import { Scrubber } from "./Scrubber";
18
+ import { DropdownMenu, MenuDivider, MenuItem } from "@itwin/itwinui-react";
19
19
  // cspell:ignore millisec
20
20
  const slowSpeed = 60 * 1000;
21
21
  const mediumSpeed = 20 * 1000;
@@ -30,7 +30,6 @@ export class TimelineComponent extends React.Component {
30
30
  this._timeLastCycle = 0;
31
31
  this._requestFrame = 0;
32
32
  this._unmounted = false;
33
- this._settings = null;
34
33
  this._standardTimelineMenuItems = [
35
34
  { label: UiIModelComponents.translate("timeline.slow"), timelineDuration: slowSpeed },
36
35
  { label: UiIModelComponents.translate("timeline.medium"), timelineDuration: mediumSpeed },
@@ -155,16 +154,10 @@ export class TimelineComponent extends React.Component {
155
154
  const milliseconds = this._getMilliseconds(value);
156
155
  this._onSetTotalDuration(milliseconds);
157
156
  };
158
- this._onSettingsClick = () => {
159
- this.setState((prevState) => ({ isSettingsOpen: !prevState.isSettingsOpen }));
160
- };
161
- this._onCloseSettings = () => {
162
- this.setState({ isSettingsOpen: false });
163
- };
164
157
  this._changeRepeatSetting = (newValue) => {
165
158
  // istanbul ignore else
166
159
  if (newValue !== undefined) {
167
- this.setState(() => ({ repeat: newValue, isSettingsOpen: false }), () => {
160
+ this.setState(() => ({ repeat: newValue }), () => {
168
161
  // istanbul ignore else
169
162
  if (this.props.onSettingsChange) {
170
163
  this.props.onSettingsChange({ loop: this.state.repeat });
@@ -173,7 +166,7 @@ export class TimelineComponent extends React.Component {
173
166
  }
174
167
  };
175
168
  this._onRepeatChanged = () => {
176
- this.setState((prevState) => ({ repeat: !prevState.repeat, isSettingsOpen: false }), () => {
169
+ this.setState((prevState) => ({ repeat: !prevState.repeat }), () => {
177
170
  // istanbul ignore else
178
171
  if (this.props.onSettingsChange) {
179
172
  this.props.onSettingsChange({ loop: this.state.repeat });
@@ -189,7 +182,7 @@ export class TimelineComponent extends React.Component {
189
182
  return new Date();
190
183
  };
191
184
  this._onSetTotalDuration = (milliseconds) => {
192
- this.setState({ totalDuration: milliseconds, isSettingsOpen: false }, () => {
185
+ this.setState({ totalDuration: milliseconds }, () => {
193
186
  // istanbul ignore else
194
187
  if (this.props.onSettingsChange) {
195
188
  this.props.onSettingsChange({ duration: milliseconds });
@@ -197,31 +190,40 @@ export class TimelineComponent extends React.Component {
197
190
  });
198
191
  };
199
192
  this._renderSettings = () => {
200
- const { totalDuration } = this.state;
201
- let contextMenuItems = [];
202
- if (!this.props.appMenuItems) {
203
- contextMenuItems = this._standardTimelineMenuItems;
204
- }
205
- else {
206
- if (this.props.appMenuItemOption === "append") {
207
- contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
208
- }
209
- else if (this.props.appMenuItemOption === "prefix") {
210
- contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
193
+ const createMenuItemNodes = (close) => {
194
+ const { totalDuration } = this.state;
195
+ let contextMenuItems = [];
196
+ if (!this.props.appMenuItems) {
197
+ contextMenuItems = this._standardTimelineMenuItems;
211
198
  }
212
199
  else {
213
- contextMenuItems = this.props.appMenuItems;
200
+ if (this.props.appMenuItemOption === "append") {
201
+ contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);
202
+ }
203
+ else if (this.props.appMenuItemOption === "prefix") {
204
+ contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);
205
+ }
206
+ else {
207
+ contextMenuItems = this.props.appMenuItems;
208
+ }
214
209
  }
215
- }
216
- return (React.createElement(React.Fragment, null,
217
- React.createElement("span", { "data-testid": "timeline-settings", className: "timeline-settings icon icon-more-vertical-2", ref: (element) => this._settings = element, onClick: this._onSettingsClick, role: "button", tabIndex: -1, title: UiComponents.translate("button.label.settings") }),
218
- React.createElement(ContextMenu, { opened: this.state.isSettingsOpen, onOutsideClick: this._onCloseSettings, direction: ContextMenuDirection.BottomRight, "data-testid": "timeline-contextmenu-div" },
219
- this.state.includeRepeat && React.createElement(ContextMenuItem, { icon: this.state.repeat && "icon icon-checkmark", onSelect: this._onRepeatChanged }, this._repeatLabel),
220
- this.state.includeRepeat && React.createElement("div", { className: "separator", role: "separator" }),
221
- this._createMenuItemNodes(contextMenuItems, totalDuration))));
210
+ const itemNodes = [];
211
+ let keyIndex = 0;
212
+ if (this.state.includeRepeat) {
213
+ const checked = this.state.repeat;
214
+ const icon = checked ? React.createElement("span", { className: "icon icon-checkmark" }) : React.createElement("span", null);
215
+ itemNodes.push(React.createElement(MenuItem, { key: ++keyIndex, onClick: () => { this._onRepeatChanged(); close(); }, icon: icon }, this._repeatLabel));
216
+ itemNodes.push(React.createElement(MenuDivider, { key: ++keyIndex }));
217
+ }
218
+ contextMenuItems.forEach((item, index) => {
219
+ itemNodes.push(this._createMenuItemNode(item, index + keyIndex + 1, totalDuration, close));
220
+ });
221
+ return itemNodes;
222
+ };
223
+ return (React.createElement(DropdownMenu, { menuItems: createMenuItemNodes },
224
+ React.createElement("span", { "data-testid": "timeline-settings", className: "timeline-settings icon icon-more-vertical-2", role: "button", tabIndex: -1, title: UiComponents.translate("button.label.settings") })));
222
225
  };
223
226
  this.state = {
224
- isSettingsOpen: false,
225
227
  isPlaying: false,
226
228
  minimized: true,
227
229
  currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,
@@ -293,22 +295,11 @@ export class TimelineComponent extends React.Component {
293
295
  return Number(time) * 1000;
294
296
  }
295
297
  }
296
- _createMenuItemNodes(itemList, currentTimelineDuration) {
297
- const itemNodes = [];
298
- itemList.forEach((item, index) => {
299
- const reactItem = this._createMenuItemNode(item, index, currentTimelineDuration);
300
- // istanbul ignore else
301
- if (reactItem)
302
- itemNodes.push(reactItem);
303
- });
304
- return itemNodes;
305
- }
306
- _createMenuItemNode(item, index, currentTimelineDuration) {
307
- let node = null;
298
+ _createMenuItemNode(item, index, currentTimelineDuration, close) {
308
299
  const label = item.label;
309
- const iconSpec = currentTimelineDuration === item.timelineDuration ? "icon icon-checkmark" : undefined;
310
- node = (React.createElement(ContextMenuItem, { key: index, onSelect: () => this._onSetTotalDuration(item.timelineDuration), icon: iconSpec }, label));
311
- return node;
300
+ const checked = currentTimelineDuration === item.timelineDuration;
301
+ const icon = checked ? React.createElement("span", { className: "icon icon-checkmark" }) : React.createElement("span", null);
302
+ return (React.createElement(MenuItem, { key: index, icon: icon, onClick: () => { this._onSetTotalDuration(item.timelineDuration); close(); } }, label));
312
303
  }
313
304
  render() {
314
305
  const { startDate, endDate, showDuration, timeZoneOffset } = this.props;
@@ -1 +1 @@
1
- {"version":3,"file":"TimelineComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"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 Timeline\r\n */\r\n\r\nimport \"./TimelineComponent.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { GenericUiEventArgs, UiAdmin } from \"@itwin/appui-abstract\";\r\nimport { ContextMenu, ContextMenuDirection, ContextMenuItem } from \"@itwin/core-react\";\r\nimport { toDateString, toTimeString, UiComponents } from \"@itwin/components-react\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\nimport { InlineEdit } from \"./InlineEdit\";\r\nimport { PlaybackSettings, TimelinePausePlayAction, TimelinePausePlayArgs } from \"./interfaces\";\r\nimport { PlayButton, PlayerButton } from \"./PlayerButton\";\r\nimport { Scrubber } from \"./Scrubber\";\r\n\r\n// cspell:ignore millisec\r\n\r\nconst slowSpeed = 60 * 1000;\r\nconst mediumSpeed = 20 * 1000;\r\nconst fastSpeed = 10 * 1000;\r\n/**\r\n * [[TimelineMenuItemOption]]: specifies how the app wants the timeline speeds to be installed on the TimelineComponent's ContextMenu\r\n * \"replace\" : use the app-supplied items in place of the standard items\r\n * \"append\" : add the app-supplied items following the standard items\r\n * \"prefix\" : add the app-supplied items before the standard items\r\n *\r\n * @public\r\n */\r\nexport type TimelineMenuItemOption = \"replace\" | \"append\" | \"prefix\";\r\n/**\r\n * [[TimelineMenuItemProps]] specifies playback speed entries in the Timeline's ContextMenu\r\n * @public\r\n */\r\nexport interface TimelineMenuItemProps {\r\n /** localized label for menu item */\r\n label: string;\r\n\r\n /** duration for the entire timeline to play */\r\n timelineDuration: number;\r\n}\r\n/** TimelineDateMarkerProps: Mark a date on the timeline with an indicator\r\n * @public\r\n */\r\nexport interface TimelineDateMarkerProps {\r\n /** Date to mark. If undefined, today's date will be used. */\r\n date?: Date;\r\n /** ReactNode to use as the marker on the timeline. If undefined, a short vertical bar will mark the date. */\r\n dateMarker?: React.ReactNode;\r\n}\r\n/**\r\n * [[TimelineComponentProps]] configure the timeline\r\n * @public\r\n */\r\nexport interface TimelineComponentProps {\r\n /** Start date: beginning of the date range of a date-based timeline. */\r\n startDate?: Date;\r\n /** End date: end of the date range of a date-based timeline. */\r\n endDate?: Date;\r\n /** Total duration: range of the timeline in milliseconds. */\r\n totalDuration: number;\r\n /** Initial value for the current duration (the location of the thumb) in milliseconds */\r\n initialDuration?: number;\r\n /** Show in minimized mode (For future use. This prop will always be treated as true.) */\r\n minimized?: boolean;\r\n /** When playing, repeat indefinitely */\r\n repeat?: boolean;\r\n /** Show duration instead of time */\r\n showDuration?: boolean;\r\n /** Callback with current duration value (as a fraction) */\r\n onChange?: (duration: number) => void;\r\n /** Callback triggered when play/pause button is pressed */\r\n onPlayPause?: (playing: boolean) => void;\r\n /** Callback triggered when backward/forward buttons are pressed */\r\n onJump?: (forward: boolean) => void;\r\n /** Callback triggered when a setting is changed */\r\n onSettingsChange?: (arg: PlaybackSettings) => void;\r\n /** Always display in miniMode with no expand menu (For future use. This prop will always be treated as true) */\r\n alwaysMinimized?: boolean;\r\n /** ComponentId -- must be set to use TimelineComponentEvents */\r\n componentId?: string;\r\n /** Include the repeat option on the Timeline Context Menu */\r\n includeRepeat?: boolean;\r\n /** App-supplied speed entries in the Timeline Context Menu */\r\n appMenuItems?: TimelineMenuItemProps[];\r\n /** How to include the supplied app menu items in the Timeline Context Menu (prefix, append, replace)*/\r\n appMenuItemOption?: TimelineMenuItemOption;\r\n /** Display date and time offset by the number of minutes specified. When undefined - local timezone will be used */\r\n timeZoneOffset?: number;\r\n /** Display a marker on the timeline rail to indicate current date - will only work if starDate and endDate are defined */\r\n markDate?: TimelineDateMarkerProps;\r\n\r\n}\r\n/** @internal */\r\ninterface TimelineComponentState {\r\n /** Settings popup is opened or closed */\r\n isSettingsOpen: boolean;\r\n /** True if timeline is currently playing, false if paused */\r\n isPlaying: boolean;\r\n /** Minimized mode (For future use. This will always be true) */\r\n minimized?: boolean;\r\n /** Current duration in milliseconds */\r\n currentDuration: number;\r\n /** Total duration in milliseconds */\r\n totalDuration: number;\r\n /** If true, automatically restart when the timeline is finished playing */\r\n repeat: boolean;\r\n /** If true, include the repeat option in the timeline context menu */\r\n includeRepeat: boolean;\r\n}\r\n\r\n/**\r\n * [[TimelineComponent]] is used to playback timeline data\r\n * @public\r\n */\r\nexport class TimelineComponent extends React.Component<TimelineComponentProps, TimelineComponentState> {\r\n private _timeLastCycle = 0;\r\n private _requestFrame = 0;\r\n private _unmounted = false;\r\n private _settings: HTMLElement | null = null;\r\n private _repeatLabel: string;\r\n private _removeListener?: () => void;\r\n private _standardTimelineMenuItems: TimelineMenuItemProps[] = [\r\n { label: UiIModelComponents.translate(\"timeline.slow\"), timelineDuration: slowSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.medium\"), timelineDuration: mediumSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.fast\"), timelineDuration: fastSpeed },\r\n ];\r\n\r\n constructor(props: TimelineComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isSettingsOpen: false,\r\n isPlaying: false,\r\n minimized: true,\r\n currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,\r\n totalDuration: this.props.totalDuration,\r\n repeat: this.props.repeat ? true : false,\r\n includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,\r\n };\r\n\r\n this._repeatLabel = UiIModelComponents.translate(\"timeline.repeat\");\r\n // istanbul ignore else\r\n if (this.props.componentId) { // can't handle an event if we have no id\r\n this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);\r\n }\r\n }\r\n\r\n public override componentWillUnmount() {\r\n if (this._removeListener)\r\n this._removeListener();\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this._unmounted = true;\r\n }\r\n\r\n public override shouldComponentUpdate(nextProps: TimelineComponentProps, nextState: TimelineComponentState) {\r\n let result = false;\r\n\r\n // istanbul ignore next\r\n if (nextState !== this.state || nextProps !== this.props ||\r\n nextProps.startDate !== this.props.startDate ||\r\n nextProps.endDate !== this.props.endDate ||\r\n nextProps.initialDuration !== this.props.initialDuration ||\r\n nextProps.repeat !== this.props.repeat\r\n )\r\n result = true;\r\n\r\n return result;\r\n }\r\n\r\n public override componentDidUpdate(prevProps: TimelineComponentProps) {\r\n // istanbul ignore else\r\n if (this.props.initialDuration !== prevProps.initialDuration) {\r\n this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.repeat !== prevProps.repeat) {\r\n this._changeRepeatSetting(this.props.repeat);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.totalDuration !== prevProps.totalDuration) {\r\n this._onSetTotalDuration(this.props.totalDuration);\r\n }\r\n }\r\n private _handleTimelinePausePlayEvent = (args: GenericUiEventArgs): void => {\r\n const timelineArgs = args as TimelinePausePlayArgs;\r\n // istanbul ignore else\r\n if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)\r\n return;\r\n\r\n let startPlaying: boolean;\r\n switch (timelineArgs.timelineAction) {\r\n case TimelinePausePlayAction.Play:\r\n startPlaying = true;\r\n break;\r\n case TimelinePausePlayAction.Pause:\r\n startPlaying = false;\r\n break;\r\n case TimelinePausePlayAction.Toggle:\r\n startPlaying = !this.state.isPlaying;\r\n break;\r\n // istanbul ignore next\r\n default:\r\n return; // throw error?\r\n }\r\n if (startPlaying)\r\n this._onPlay();\r\n else\r\n this._onPause();\r\n };\r\n\r\n // user clicked backward button\r\n private _onBackward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(false);\r\n };\r\n\r\n // user clicked forward button\r\n private _onForward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(true);\r\n };\r\n\r\n // user clicked play button\r\n private _onPlay = () => {\r\n // istanbul ignore if\r\n if (this.state.isPlaying)\r\n return;\r\n\r\n // timeline was complete, restart from the beginning\r\n if (this.state.currentDuration >= this.state.totalDuration) {\r\n this._replay();\r\n } else\r\n this._play();\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(true);\r\n };\r\n\r\n // user clicked pause button\r\n private _onPause = () => {\r\n // istanbul ignore if\r\n if (!this.state.isPlaying)\r\n return;\r\n\r\n // stop requesting frames\r\n window.cancelAnimationFrame(this._requestFrame);\r\n\r\n // stop playing\r\n this.setState({ isPlaying: false });\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n };\r\n\r\n // user clicked on timeline rail or dragged scrubber handle\r\n private _onTimelineChange = (values: ReadonlyArray<number>) => {\r\n const currentDuration = values[0];\r\n this._setDuration(currentDuration);\r\n };\r\n\r\n // set the current duration, which will call the OnChange callback\r\n private _setDuration = (currentDuration: number) => {\r\n this._timeLastCycle = new Date().getTime();\r\n // istanbul ignore else\r\n if (!this._unmounted)\r\n this.setState({ currentDuration });\r\n // istanbul ignore else\r\n if (this.props.onChange) {\r\n const fraction = currentDuration / this.state.totalDuration;\r\n this.props.onChange(fraction);\r\n }\r\n };\r\n\r\n // recursively update the animation until we hit the end or the pause button is clicked\r\n private _updateAnimation = (_timestamp: number) => {\r\n // istanbul ignore else\r\n if (!this.state.isPlaying && !this._unmounted) {\r\n return;\r\n }\r\n\r\n // update duration\r\n const currentTime = new Date().getTime();\r\n const millisecondsElapsed = currentTime - this._timeLastCycle;\r\n const duration = this.state.currentDuration + millisecondsElapsed;\r\n this._setDuration(duration);\r\n\r\n // stop the animation!\r\n if (duration >= this.state.totalDuration) {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this.setState({ isPlaying: false });\r\n if (this.state.repeat)\r\n this._replay();\r\n else {\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // continue the animation - request the next frame\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n };\r\n\r\n private _play() {\r\n // start playing\r\n this.setState({ isPlaying: true }, () => {\r\n // request the next frame\r\n this._timeLastCycle = new Date().getTime();\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n });\r\n }\r\n\r\n private _replay = () => {\r\n // timeline was complete, restart from the beginning\r\n this.setState({ currentDuration: 0 }, (() => this._play()));\r\n };\r\n\r\n private _displayTime(millisec: number) {\r\n const addZero = (i: number) => {\r\n return (i < 10) ? `0${i}` : i;\r\n };\r\n\r\n const date = new Date(millisec);\r\n // const hours = date.getUTCHours();\r\n const minutes = date.getUTCMinutes();\r\n const seconds = date.getUTCSeconds();\r\n return `${addZero(minutes)}:${addZero(seconds)}`;\r\n }\r\n\r\n private _getMilliseconds(time: string) {\r\n // istanbul ignore else - WIP\r\n if (time.indexOf(\":\") !== -1) {\r\n return (Number(time.split(\":\")[0]) * 60 + Number(time.split(\":\")[1])) * 1000;\r\n } else {\r\n return Number(time) * 1000;\r\n }\r\n }\r\n\r\n // user changed the total duration\r\n private _onTotalDurationChange = (value: string) => {\r\n // NOTE: we should reset the current duration to 0\r\n const milliseconds = this._getMilliseconds(value);\r\n this._onSetTotalDuration(milliseconds);\r\n };\r\n\r\n private _onSettingsClick = () => {\r\n this.setState((prevState) => ({ isSettingsOpen: !prevState.isSettingsOpen }));\r\n };\r\n\r\n private _onCloseSettings = () => {\r\n this.setState({ isSettingsOpen: false });\r\n };\r\n\r\n private _changeRepeatSetting = (newValue?: boolean) => {\r\n // istanbul ignore else\r\n if (newValue !== undefined) {\r\n this.setState(\r\n () => ({ repeat: newValue, isSettingsOpen: false }),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n }\r\n };\r\n\r\n private _onRepeatChanged = () => {\r\n this.setState(\r\n (prevState) => ({ repeat: !prevState.repeat, isSettingsOpen: false }),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n };\r\n\r\n private _currentDate = (): Date => {\r\n const fraction = this.state.currentDuration / this.state.totalDuration;\r\n if (this.props.endDate && this.props.startDate) {\r\n const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;\r\n return new Date(this.props.startDate.getTime() + timeElapsed);\r\n }\r\n return new Date();\r\n };\r\n\r\n private _onSetTotalDuration = (milliseconds: number) => {\r\n this.setState(\r\n { totalDuration: milliseconds, isSettingsOpen: false },\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ duration: milliseconds });\r\n }\r\n });\r\n };\r\n private _createMenuItemNodes(itemList: TimelineMenuItemProps[], currentTimelineDuration: number): React.ReactNode[] {\r\n const itemNodes: React.ReactNode[] = [];\r\n\r\n itemList.forEach((item: TimelineMenuItemProps, index: number) => {\r\n const reactItem = this._createMenuItemNode(item, index, currentTimelineDuration);\r\n // istanbul ignore else\r\n if (reactItem)\r\n itemNodes.push(reactItem);\r\n });\r\n\r\n return itemNodes;\r\n }\r\n\r\n private _createMenuItemNode(item: TimelineMenuItemProps, index: number, currentTimelineDuration: number): React.ReactNode {\r\n let node: React.ReactNode = null;\r\n const label = item.label;\r\n const iconSpec = currentTimelineDuration === item.timelineDuration ? \"icon icon-checkmark\" : undefined;\r\n\r\n node = (\r\n <ContextMenuItem key={index} onSelect={() => this._onSetTotalDuration(item.timelineDuration)} icon={iconSpec} >\r\n {label}\r\n </ContextMenuItem>\r\n );\r\n return node;\r\n }\r\n\r\n private _renderSettings = () => {\r\n const { totalDuration } = this.state;\r\n let contextMenuItems: Array<TimelineMenuItemProps> = [];\r\n\r\n if (!this.props.appMenuItems) {\r\n contextMenuItems = this._standardTimelineMenuItems;\r\n } else {\r\n if (this.props.appMenuItemOption === \"append\") {\r\n contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);\r\n } else if (this.props.appMenuItemOption === \"prefix\") {\r\n contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);\r\n } else {\r\n contextMenuItems = this.props.appMenuItems;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\r\n <span data-testid=\"timeline-settings\" className=\"timeline-settings icon icon-more-vertical-2\" ref={(element) => this._settings = element} onClick={this._onSettingsClick}\r\n role=\"button\" tabIndex={-1} title={UiComponents.translate(\"button.label.settings\")}\r\n ></span>\r\n <ContextMenu opened={this.state.isSettingsOpen} onOutsideClick={this._onCloseSettings} direction={ContextMenuDirection.BottomRight} data-testid=\"timeline-contextmenu-div\">\r\n {this.state.includeRepeat && <ContextMenuItem icon={this.state.repeat && \"icon icon-checkmark\"} onSelect={this._onRepeatChanged}>{this._repeatLabel}</ContextMenuItem>}\r\n {this.state.includeRepeat && <div className=\"separator\" role=\"separator\" />}\r\n {this._createMenuItemNodes(contextMenuItems, totalDuration)}\r\n </ContextMenu>\r\n </>\r\n );\r\n };\r\n\r\n public override render() {\r\n const { startDate, endDate, showDuration, timeZoneOffset } = this.props;\r\n const { currentDuration, totalDuration, minimized } = this.state;\r\n const currentDate = this._currentDate();\r\n const durationString = this._displayTime(currentDuration);\r\n const totalDurationString = this._displayTime(totalDuration);\r\n const hasDates = !!startDate && !!endDate;\r\n\r\n return (\r\n <div data-testid=\"timeline-component\" className={classnames(\"timeline-component\", !!minimized && \"minimized\", hasDates && \"has-dates\")} >\r\n <div className=\"header\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} data-testid=\"timeline-play\" />\r\n <PlayerButton className=\"play-backward\" icon=\"icon-caret-left\" onClick={this._onBackward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <PlayerButton className=\"play-button-step\" icon=\"icon-media-controls-circular-play\"\r\n isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause}\r\n title={UiIModelComponents.translate(\"timeline.step\")} />\r\n <PlayerButton className=\"play-forward\" icon=\"icon-caret-right\" onClick={this._onForward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <span className=\"current-date\">{toDateString(currentDate, timeZoneOffset)}</span>\r\n </div>\r\n <div className=\"scrubber\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} />\r\n <div className=\"start-time-container\">\r\n {hasDates && <span data-testid=\"test-start-date\" className=\"start-date\">{toDateString(startDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span data-testid=\"test-start-time\" className=\"start-time\">{toTimeString(startDate, timeZoneOffset)}</span>}\r\n {showDuration && <span className=\"duration-start-time\">{durationString}</span>}\r\n </div>\r\n <Scrubber\r\n className=\"slider\"\r\n currentDuration={this.state.currentDuration}\r\n totalDuration={totalDuration}\r\n startDate={startDate}\r\n endDate={endDate}\r\n isPlaying={this.state.isPlaying}\r\n inMiniMode={!!minimized}\r\n showTime={!showDuration}\r\n onChange={this._onTimelineChange}\r\n onUpdate={this._onTimelineChange}\r\n timeZoneOffset={this.props.timeZoneOffset}\r\n markDate={this.props.markDate}\r\n />\r\n <div className=\"end-time-container\">\r\n {hasDates && <span className=\"end-date\">{toDateString(endDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span className=\"end-time\">{toTimeString(endDate, timeZoneOffset)}</span>}\r\n {showDuration && <InlineEdit className=\"duration-end-time\" defaultValue={totalDurationString} onChange={this._onTotalDurationChange} />}\r\n </div>\r\n {minimized && this._renderSettings()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"TimelineComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/timeline/TimelineComponent.tsx"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,0BAA0B,CAAC;AAClC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAsB,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAoB,uBAAuB,EAAyB,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE3E,yBAAyB;AAEzB,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5B,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9B,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC;AAyF5B;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK,CAAC,SAAyD;IAYpG,YAAY,KAA6B;QACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QAZP,mBAAc,GAAG,CAAC,CAAC;QACnB,kBAAa,GAAG,CAAC,CAAC;QAClB,eAAU,GAAG,KAAK,CAAC;QAGnB,+BAA0B,GAA4B;YAC5D,EAAE,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE;YACrF,EAAE,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE;YACzF,EAAE,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,gBAAgB,EAAE,SAAS,EAAE;SACtF,CAAC;QA2DM,kCAA6B,GAAG,CAAC,IAAwB,EAAQ,EAAE;YACzE,MAAM,YAAY,GAAG,IAA6B,CAAC;YACnD,uBAAuB;YACvB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,KAAK,YAAY,CAAC,aAAa,IAAI,YAAY,CAAC,cAAc,KAAK,SAAS;gBACrH,OAAO;YAET,IAAI,YAAqB,CAAC;YAC1B,QAAQ,YAAY,CAAC,cAAc,EAAE;gBACnC,KAAK,uBAAuB,CAAC,IAAI;oBAC/B,YAAY,GAAG,IAAI,CAAC;oBACpB,MAAM;gBACR,KAAK,uBAAuB,CAAC,KAAK;oBAChC,YAAY,GAAG,KAAK,CAAC;oBACrB,MAAM;gBACR,KAAK,uBAAuB,CAAC,MAAM;oBACjC,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACrC,MAAM;gBACR,uBAAuB;gBACvB;oBACE,OAAO,CAAC,eAAe;aAC1B;YACD,IAAI,YAAY;gBACd,IAAI,CAAC,OAAO,EAAE,CAAC;;gBAEf,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,+BAA+B;QACvB,gBAAW,GAAG,GAAG,EAAE;YACzB,uBAAuB;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,8BAA8B;QACtB,eAAU,GAAG,GAAG,EAAE;YACxB,uBAAuB;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;gBACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,2BAA2B;QACnB,YAAO,GAAG,GAAG,EAAE;YACrB,qBAAqB;YACrB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;gBACtB,OAAO;YAET,oDAAoD;YACpD,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;gBAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;aAChB;;gBACC,IAAI,CAAC,KAAK,EAAE,CAAC;YAEf,uBAAuB;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW;gBACxB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,4BAA4B;QACpB,aAAQ,GAAG,GAAG,EAAE;YACtB,qBAAqB;YACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;gBACvB,OAAO;YAET,yBAAyB;YACzB,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAEhD,eAAe;YACf,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAEpC,uBAAuB;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW;gBACxB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,2DAA2D;QACnD,sBAAiB,GAAG,CAAC,MAA6B,EAAE,EAAE;YAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACrC,CAAC,CAAC;QAEF,kEAAkE;QAC1D,iBAAY,GAAG,CAAC,eAAuB,EAAE,EAAE;YACjD,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC3C,uBAAuB;YACvB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;YACrC,uBAAuB;YACvB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;gBACvB,MAAM,QAAQ,GAAG,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC5D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aAC/B;QACH,CAAC,CAAC;QAEF,uFAAuF;QAC/E,qBAAgB,GAAG,CAAC,UAAkB,EAAE,EAAE;YAChD,uBAAuB;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBAC7C,OAAO;aACR;YAED,kBAAkB;YAClB,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,mBAAmB,GAAG,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC;YAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,mBAAmB,CAAC;YAClE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YAE5B,sBAAsB;YACtB,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;gBACxC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;oBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;qBACZ;oBACH,uBAAuB;oBACvB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW;wBACxB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;iBACjC;gBAED,OAAO;aACR;YAED,kDAAkD;YAClD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3E,CAAC,CAAC;QAWM,YAAO,GAAG,GAAG,EAAE;YACrB,oDAAoD;YACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;QAuBF,kCAAkC;QAC1B,2BAAsB,GAAG,CAAC,KAAa,EAAE,EAAE;YACjD,kDAAkD;YAClD,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC,CAAC;QAEM,yBAAoB,GAAG,CAAC,QAAkB,EAAE,EAAE;YACpD,uBAAuB;YACvB,IAAI,QAAQ,KAAK,SAAS,EAAE;gBAC1B,IAAI,CAAC,QAAQ,CACX,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAC,CAAC,EAC3B,GAAG,EAAE;oBACH,uBAAuB;oBACvB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;wBAC/B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;qBAC1D;gBACH,CAAC,CAAC,CAAC;aACN;QACH,CAAC,CAAC;QAEM,qBAAgB,GAAG,GAAG,EAAE;YAC9B,IAAI,CAAC,QAAQ,CACX,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,EAAC,CAAC,EAC7C,GAAG,EAAE;gBACH,uBAAuB;gBACvB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;oBAC/B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;iBAC1D;YACH,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEM,iBAAY,GAAG,GAAS,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YACvE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;gBAC9C,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC;gBAC/F,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,CAAC;aAC/D;YACD,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,CAAC,CAAC;QAEM,wBAAmB,GAAG,CAAC,YAAoB,EAAE,EAAE;YACrD,IAAI,CAAC,QAAQ,CACX,EAAE,aAAa,EAAE,YAAY,EAAC,EAC9B,GAAG,EAAE;gBACH,uBAAuB;gBACvB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;oBAC/B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;iBACzD;YACH,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAcM,oBAAe,GAAG,GAAG,EAAE;YAC7B,MAAM,mBAAmB,GAAG,CAAC,KAAiB,EAAiB,EAAE;gBAE/D,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;gBACrC,IAAI,gBAAgB,GAAiC,EAAE,CAAC;gBAExD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;oBAC5B,gBAAgB,GAAG,IAAI,CAAC,0BAA0B,CAAC;iBACpD;qBAAM;oBACL,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,QAAQ,EAAE;wBAC7C,gBAAgB,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;qBACpF;yBAAM,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,KAAK,QAAQ,EAAE;wBACpD,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;qBACpF;yBAAM;wBACL,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;qBAC5C;iBACF;gBAED,MAAM,SAAS,GAAkB,EAAE,CAAC;gBACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;gBACjB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;oBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBAClC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,qBAAqB,GAAG,CAAA,CAAC,CAAA,iCAAQ,CAAC;oBACzE,SAAS,CAAC,IAAI,CAAE,oBAAC,QAAQ,IAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAE,EAAE,GAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,EAAE,IAAI,EAAE,IAAI,IACpG,IAAI,CAAC,YAAY,CACT,CAAC,CAAC;oBACb,SAAS,CAAC,IAAI,CAAE,oBAAC,WAAW,IAAC,GAAG,EAAE,EAAE,QAAQ,GAAI,CAAC,CAAC;iBACnD;gBAED,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAA2B,EAAE,KAAa,EAAE,EAAE;oBACtE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,GAAC,QAAQ,GAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;gBACzF,CAAC,CAAC,CAAC;gBAEH,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;YAEF,OAAO,CACL,oBAAC,YAAY,IAAC,SAAS,EAAE,mBAAmB;gBAC1C,6CAAkB,mBAAmB,EAAC,SAAS,EAAC,6CAA6C,EAC3F,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAC5E,CACK,CAChB,CAAC;QACJ,CAAC,CAAC;QAlUA,IAAI,CAAC,KAAK,GAAG;YACX,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC7F,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;YACvC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;YACxC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;SACjG,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACpE,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,yCAAyC;YACrE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;SACjG;IACH,CAAC;IAEe,oBAAoB;QAClC,IAAI,IAAI,CAAC,eAAe;YACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEe,qBAAqB,CAAC,SAAiC,EAAE,SAAiC;QACxG,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,uBAAuB;QACvB,IAAI,SAAS,KAAK,IAAI,CAAC,KAAK,IAAI,SAAS,KAAK,IAAI,CAAC,KAAK;YACtD,SAAS,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS;YAC5C,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO;YACxC,SAAS,CAAC,eAAe,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe;YACxD,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;YAEtC,MAAM,GAAG,IAAI,CAAC;QAEhB,OAAO,MAAM,CAAC;IAChB,CAAC;IAEe,kBAAkB,CAAC,SAAiC;QAClE,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,eAAe,EAAE;YAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;SAC3G;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,EAAE;YAC1C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC9C;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,aAAa,EAAE;YACxD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;SACpD;IACH,CAAC;IA+HO,KAAK;QACX,gBAAgB;QAChB,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;YACtC,yBAAyB;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC;IAOO,YAAY,CAAC,QAAgB;QACnC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;YAC5B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,oCAAoC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACnD,CAAC;IAEO,gBAAgB,CAAC,IAAY;QACnC,6BAA6B;QAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SAC9E;aAAM;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;SAC5B;IACH,CAAC;IAsDO,mBAAmB,CAAC,IAA2B,EAAE,KAAa,EAAE,uBAA+B,EAAE,KAAiB;QACxH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,OAAO,GAAG,uBAAuB,KAAK,IAAI,CAAC,gBAAgB,CAAC;QAClE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,8BAAM,SAAS,EAAC,qBAAqB,GAAG,CAAA,CAAC,CAAA,iCAAQ,CAAC;QACzE,OAAO,CACL,oBAAC,QAAQ,IAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAC9B,OAAO,EAAE,GAAG,EAAE,GAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA,CAAC,IACzE,KAAK,CACG,CACZ,CAAC;IACJ,CAAC;IA+Ce,MAAM;QACpB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACxE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC;QAE1C,OAAO,CACL,4CAAiB,oBAAoB,EAAC,SAAS,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC,SAAS,IAAI,WAAW,EAAE,QAAQ,IAAI,WAAW,CAAC;YACpI,6BAAK,SAAS,EAAC,QAAQ;gBACrB,oBAAC,UAAU,IAAC,SAAS,EAAC,aAAa,EAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,iBAAc,eAAe,GAAG;gBACjJ,oBAAC,YAAY,IAAC,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,iBAAiB,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EACtF,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAI;gBAC9D,oBAAC,YAAY,IAAC,SAAS,EAAC,kBAAkB,EAAC,IAAI,EAAC,mCAAmC,EACjF,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAC7E,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,eAAe,CAAC,GAAI;gBAC1D,oBAAC,YAAY,IAAC,SAAS,EAAC,cAAc,EAAC,IAAI,EAAC,kBAAkB,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EACrF,KAAK,EAAE,kBAAkB,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAI;gBAC9D,8BAAM,SAAS,EAAC,cAAc,IAAE,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAQ,CAC7E;YACN,6BAAK,SAAS,EAAC,UAAU;gBACvB,oBAAC,UAAU,IAAC,SAAS,EAAC,aAAa,EAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAI;gBACrH,6BAAK,SAAS,EAAC,sBAAsB;oBAClC,QAAQ,IAAI,6CAAkB,iBAAiB,EAAC,SAAS,EAAC,YAAY,IAAE,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAQ;oBACvH,QAAQ,IAAI,CAAC,YAAY,IAAI,6CAAkB,iBAAiB,EAAC,SAAS,EAAC,YAAY,IAAE,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAQ;oBACxI,YAAY,IAAI,8BAAM,SAAS,EAAC,qBAAqB,IAAE,cAAc,CAAQ,CAC1E;gBACN,oBAAC,QAAQ,IACP,SAAS,EAAC,QAAQ,EAClB,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAC3C,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAC/B,UAAU,EAAE,CAAC,CAAC,SAAS,EACvB,QAAQ,EAAE,CAAC,YAAY,EACvB,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAChC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAChC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EACzC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAC7B;gBACF,6BAAK,SAAS,EAAC,oBAAoB;oBAChC,QAAQ,IAAI,8BAAM,SAAS,EAAC,UAAU,IAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAQ;oBACrF,QAAQ,IAAI,CAAC,YAAY,IAAI,8BAAM,SAAS,EAAC,UAAU,IAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAQ;oBACtG,YAAY,IAAI,oBAAC,UAAU,IAAC,SAAS,EAAC,mBAAmB,EAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,CAAC,sBAAsB,GAAI,CACnI;gBACL,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAChC,CACF,CACP,CAAC;IACJ,CAAC;CACF","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 Timeline\r\n */\r\n\r\nimport \"./TimelineComponent.scss\";\r\nimport classnames from \"classnames\";\r\nimport * as React from \"react\";\r\nimport { GenericUiEventArgs, UiAdmin } from \"@itwin/appui-abstract\";\r\nimport { toDateString, toTimeString, UiComponents } from \"@itwin/components-react\";\r\nimport { UiIModelComponents } from \"../UiIModelComponents\";\r\nimport { InlineEdit } from \"./InlineEdit\";\r\nimport { PlaybackSettings, TimelinePausePlayAction, TimelinePausePlayArgs } from \"./interfaces\";\r\nimport { PlayButton, PlayerButton } from \"./PlayerButton\";\r\nimport { Scrubber } from \"./Scrubber\";\r\nimport { DropdownMenu, MenuDivider, MenuItem } from \"@itwin/itwinui-react\";\r\n\r\n// cspell:ignore millisec\r\n\r\nconst slowSpeed = 60 * 1000;\r\nconst mediumSpeed = 20 * 1000;\r\nconst fastSpeed = 10 * 1000;\r\n/**\r\n * [[TimelineMenuItemOption]]: specifies how the app wants the timeline speeds to be installed on the TimelineComponent's ContextMenu\r\n * \"replace\" : use the app-supplied items in place of the standard items\r\n * \"append\" : add the app-supplied items following the standard items\r\n * \"prefix\" : add the app-supplied items before the standard items\r\n *\r\n * @public\r\n */\r\nexport type TimelineMenuItemOption = \"replace\" | \"append\" | \"prefix\";\r\n/**\r\n * [[TimelineMenuItemProps]] specifies playback speed entries in the Timeline's ContextMenu\r\n * @public\r\n */\r\nexport interface TimelineMenuItemProps {\r\n /** localized label for menu item */\r\n label: string;\r\n\r\n /** duration for the entire timeline to play */\r\n timelineDuration: number;\r\n}\r\n/** TimelineDateMarkerProps: Mark a date on the timeline with an indicator\r\n * @public\r\n */\r\nexport interface TimelineDateMarkerProps {\r\n /** Date to mark. If undefined, today's date will be used. */\r\n date?: Date;\r\n /** ReactNode to use as the marker on the timeline. If undefined, a short vertical bar will mark the date. */\r\n dateMarker?: React.ReactNode;\r\n}\r\n/**\r\n * [[TimelineComponentProps]] configure the timeline\r\n * @public\r\n */\r\nexport interface TimelineComponentProps {\r\n /** Start date: beginning of the date range of a date-based timeline. */\r\n startDate?: Date;\r\n /** End date: end of the date range of a date-based timeline. */\r\n endDate?: Date;\r\n /** Total duration: range of the timeline in milliseconds. */\r\n totalDuration: number;\r\n /** Initial value for the current duration (the location of the thumb) in milliseconds */\r\n initialDuration?: number;\r\n /** Show in minimized mode (For future use. This prop will always be treated as true.) */\r\n minimized?: boolean;\r\n /** When playing, repeat indefinitely */\r\n repeat?: boolean;\r\n /** Show duration instead of time */\r\n showDuration?: boolean;\r\n /** Callback with current duration value (as a fraction) */\r\n onChange?: (duration: number) => void;\r\n /** Callback triggered when play/pause button is pressed */\r\n onPlayPause?: (playing: boolean) => void;\r\n /** Callback triggered when backward/forward buttons are pressed */\r\n onJump?: (forward: boolean) => void;\r\n /** Callback triggered when a setting is changed */\r\n onSettingsChange?: (arg: PlaybackSettings) => void;\r\n /** Always display in miniMode with no expand menu (For future use. This prop will always be treated as true) */\r\n alwaysMinimized?: boolean;\r\n /** ComponentId -- must be set to use TimelineComponentEvents */\r\n componentId?: string;\r\n /** Include the repeat option on the Timeline Context Menu */\r\n includeRepeat?: boolean;\r\n /** App-supplied speed entries in the Timeline Context Menu */\r\n appMenuItems?: TimelineMenuItemProps[];\r\n /** How to include the supplied app menu items in the Timeline Context Menu (prefix, append, replace)*/\r\n appMenuItemOption?: TimelineMenuItemOption;\r\n /** Display date and time offset by the number of minutes specified. When undefined - local timezone will be used */\r\n timeZoneOffset?: number;\r\n /** Display a marker on the timeline rail to indicate current date - will only work if starDate and endDate are defined */\r\n markDate?: TimelineDateMarkerProps;\r\n\r\n}\r\n/** @internal */\r\ninterface TimelineComponentState {\r\n /** True if timeline is currently playing, false if paused */\r\n isPlaying: boolean;\r\n /** Minimized mode (For future use. This will always be true) */\r\n minimized?: boolean;\r\n /** Current duration in milliseconds */\r\n currentDuration: number;\r\n /** Total duration in milliseconds */\r\n totalDuration: number;\r\n /** If true, automatically restart when the timeline is finished playing */\r\n repeat: boolean;\r\n /** If true, include the repeat option in the timeline context menu */\r\n includeRepeat: boolean;\r\n}\r\n\r\n/**\r\n * [[TimelineComponent]] is used to playback timeline data\r\n * @public\r\n */\r\nexport class TimelineComponent extends React.Component<TimelineComponentProps, TimelineComponentState> {\r\n private _timeLastCycle = 0;\r\n private _requestFrame = 0;\r\n private _unmounted = false;\r\n private _repeatLabel: string;\r\n private _removeListener?: () => void;\r\n private _standardTimelineMenuItems: TimelineMenuItemProps[] = [\r\n { label: UiIModelComponents.translate(\"timeline.slow\"), timelineDuration: slowSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.medium\"), timelineDuration: mediumSpeed },\r\n { label: UiIModelComponents.translate(\"timeline.fast\"), timelineDuration: fastSpeed },\r\n ];\r\n\r\n constructor(props: TimelineComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isPlaying: false,\r\n minimized: true,\r\n currentDuration: props.initialDuration ? props.initialDuration : /* istanbul ignore next */ 0,\r\n totalDuration: this.props.totalDuration,\r\n repeat: this.props.repeat ? true : false,\r\n includeRepeat: this.props.includeRepeat || this.props.includeRepeat === undefined ? true : false,\r\n };\r\n\r\n this._repeatLabel = UiIModelComponents.translate(\"timeline.repeat\");\r\n // istanbul ignore else\r\n if (this.props.componentId) { // can't handle an event if we have no id\r\n this._removeListener = UiAdmin.onGenericUiEvent.addListener(this._handleTimelinePausePlayEvent);\r\n }\r\n }\r\n\r\n public override componentWillUnmount() {\r\n if (this._removeListener)\r\n this._removeListener();\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this._unmounted = true;\r\n }\r\n\r\n public override shouldComponentUpdate(nextProps: TimelineComponentProps, nextState: TimelineComponentState) {\r\n let result = false;\r\n\r\n // istanbul ignore next\r\n if (nextState !== this.state || nextProps !== this.props ||\r\n nextProps.startDate !== this.props.startDate ||\r\n nextProps.endDate !== this.props.endDate ||\r\n nextProps.initialDuration !== this.props.initialDuration ||\r\n nextProps.repeat !== this.props.repeat\r\n )\r\n result = true;\r\n\r\n return result;\r\n }\r\n\r\n public override componentDidUpdate(prevProps: TimelineComponentProps) {\r\n // istanbul ignore else\r\n if (this.props.initialDuration !== prevProps.initialDuration) {\r\n this._setDuration(this.props.initialDuration ? this.props.initialDuration : /* istanbul ignore next */ 0);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.repeat !== prevProps.repeat) {\r\n this._changeRepeatSetting(this.props.repeat);\r\n }\r\n\r\n // istanbul ignore else\r\n if (this.props.totalDuration !== prevProps.totalDuration) {\r\n this._onSetTotalDuration(this.props.totalDuration);\r\n }\r\n }\r\n private _handleTimelinePausePlayEvent = (args: GenericUiEventArgs): void => {\r\n const timelineArgs = args as TimelinePausePlayArgs;\r\n // istanbul ignore else\r\n if (!timelineArgs || this.props.componentId !== timelineArgs.uiComponentId || timelineArgs.timelineAction === undefined)\r\n return;\r\n\r\n let startPlaying: boolean;\r\n switch (timelineArgs.timelineAction) {\r\n case TimelinePausePlayAction.Play:\r\n startPlaying = true;\r\n break;\r\n case TimelinePausePlayAction.Pause:\r\n startPlaying = false;\r\n break;\r\n case TimelinePausePlayAction.Toggle:\r\n startPlaying = !this.state.isPlaying;\r\n break;\r\n // istanbul ignore next\r\n default:\r\n return; // throw error?\r\n }\r\n if (startPlaying)\r\n this._onPlay();\r\n else\r\n this._onPause();\r\n };\r\n\r\n // user clicked backward button\r\n private _onBackward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(false);\r\n };\r\n\r\n // user clicked forward button\r\n private _onForward = () => {\r\n // istanbul ignore else\r\n if (this.props.onJump)\r\n this.props.onJump(true);\r\n };\r\n\r\n // user clicked play button\r\n private _onPlay = () => {\r\n // istanbul ignore if\r\n if (this.state.isPlaying)\r\n return;\r\n\r\n // timeline was complete, restart from the beginning\r\n if (this.state.currentDuration >= this.state.totalDuration) {\r\n this._replay();\r\n } else\r\n this._play();\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(true);\r\n };\r\n\r\n // user clicked pause button\r\n private _onPause = () => {\r\n // istanbul ignore if\r\n if (!this.state.isPlaying)\r\n return;\r\n\r\n // stop requesting frames\r\n window.cancelAnimationFrame(this._requestFrame);\r\n\r\n // stop playing\r\n this.setState({ isPlaying: false });\r\n\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n };\r\n\r\n // user clicked on timeline rail or dragged scrubber handle\r\n private _onTimelineChange = (values: ReadonlyArray<number>) => {\r\n const currentDuration = values[0];\r\n this._setDuration(currentDuration);\r\n };\r\n\r\n // set the current duration, which will call the OnChange callback\r\n private _setDuration = (currentDuration: number) => {\r\n this._timeLastCycle = new Date().getTime();\r\n // istanbul ignore else\r\n if (!this._unmounted)\r\n this.setState({ currentDuration });\r\n // istanbul ignore else\r\n if (this.props.onChange) {\r\n const fraction = currentDuration / this.state.totalDuration;\r\n this.props.onChange(fraction);\r\n }\r\n };\r\n\r\n // recursively update the animation until we hit the end or the pause button is clicked\r\n private _updateAnimation = (_timestamp: number) => {\r\n // istanbul ignore else\r\n if (!this.state.isPlaying && !this._unmounted) {\r\n return;\r\n }\r\n\r\n // update duration\r\n const currentTime = new Date().getTime();\r\n const millisecondsElapsed = currentTime - this._timeLastCycle;\r\n const duration = this.state.currentDuration + millisecondsElapsed;\r\n this._setDuration(duration);\r\n\r\n // stop the animation!\r\n if (duration >= this.state.totalDuration) {\r\n window.cancelAnimationFrame(this._requestFrame);\r\n this.setState({ isPlaying: false });\r\n if (this.state.repeat)\r\n this._replay();\r\n else {\r\n // istanbul ignore else\r\n if (this.props.onPlayPause)\r\n this.props.onPlayPause(false);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // continue the animation - request the next frame\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n };\r\n\r\n private _play() {\r\n // start playing\r\n this.setState({ isPlaying: true }, () => {\r\n // request the next frame\r\n this._timeLastCycle = new Date().getTime();\r\n this._requestFrame = window.requestAnimationFrame(this._updateAnimation);\r\n });\r\n }\r\n\r\n private _replay = () => {\r\n // timeline was complete, restart from the beginning\r\n this.setState({ currentDuration: 0 }, (() => this._play()));\r\n };\r\n\r\n private _displayTime(millisec: number) {\r\n const addZero = (i: number) => {\r\n return (i < 10) ? `0${i}` : i;\r\n };\r\n\r\n const date = new Date(millisec);\r\n // const hours = date.getUTCHours();\r\n const minutes = date.getUTCMinutes();\r\n const seconds = date.getUTCSeconds();\r\n return `${addZero(minutes)}:${addZero(seconds)}`;\r\n }\r\n\r\n private _getMilliseconds(time: string) {\r\n // istanbul ignore else - WIP\r\n if (time.indexOf(\":\") !== -1) {\r\n return (Number(time.split(\":\")[0]) * 60 + Number(time.split(\":\")[1])) * 1000;\r\n } else {\r\n return Number(time) * 1000;\r\n }\r\n }\r\n\r\n // user changed the total duration\r\n private _onTotalDurationChange = (value: string) => {\r\n // NOTE: we should reset the current duration to 0\r\n const milliseconds = this._getMilliseconds(value);\r\n this._onSetTotalDuration(milliseconds);\r\n };\r\n\r\n private _changeRepeatSetting = (newValue?: boolean) => {\r\n // istanbul ignore else\r\n if (newValue !== undefined) {\r\n this.setState(\r\n () => ({ repeat: newValue}),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n }\r\n };\r\n\r\n private _onRepeatChanged = () => {\r\n this.setState(\r\n (prevState) => ({ repeat: !prevState.repeat}),\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ loop: this.state.repeat });\r\n }\r\n });\r\n };\r\n\r\n private _currentDate = (): Date => {\r\n const fraction = this.state.currentDuration / this.state.totalDuration;\r\n if (this.props.endDate && this.props.startDate) {\r\n const timeElapsed = (this.props.endDate.getTime() - this.props.startDate.getTime()) * fraction;\r\n return new Date(this.props.startDate.getTime() + timeElapsed);\r\n }\r\n return new Date();\r\n };\r\n\r\n private _onSetTotalDuration = (milliseconds: number) => {\r\n this.setState(\r\n { totalDuration: milliseconds},\r\n () => {\r\n // istanbul ignore else\r\n if (this.props.onSettingsChange) {\r\n this.props.onSettingsChange({ duration: milliseconds });\r\n }\r\n });\r\n };\r\n\r\n private _createMenuItemNode(item: TimelineMenuItemProps, index: number, currentTimelineDuration: number, close: () => void): JSX.Element {\r\n const label = item.label;\r\n const checked = currentTimelineDuration === item.timelineDuration;\r\n const icon = checked ? <span className=\"icon icon-checkmark\" />:<span />;\r\n return (\r\n <MenuItem key={index} icon={icon}\r\n onClick={() => {this._onSetTotalDuration(item.timelineDuration); close();}} >\r\n {label}\r\n </MenuItem>\r\n );\r\n }\r\n\r\n private _renderSettings = () => {\r\n const createMenuItemNodes = (close: () => void): JSX.Element[] => {\r\n\r\n const { totalDuration } = this.state;\r\n let contextMenuItems: Array<TimelineMenuItemProps> = [];\r\n\r\n if (!this.props.appMenuItems) {\r\n contextMenuItems = this._standardTimelineMenuItems;\r\n } else {\r\n if (this.props.appMenuItemOption === \"append\") {\r\n contextMenuItems = this._standardTimelineMenuItems.concat(this.props.appMenuItems);\r\n } else if (this.props.appMenuItemOption === \"prefix\") {\r\n contextMenuItems = this.props.appMenuItems.concat(this._standardTimelineMenuItems);\r\n } else {\r\n contextMenuItems = this.props.appMenuItems;\r\n }\r\n }\r\n\r\n const itemNodes: JSX.Element[] = [];\r\n let keyIndex = 0;\r\n if (this.state.includeRepeat) {\r\n const checked = this.state.repeat;\r\n const icon = checked ? <span className=\"icon icon-checkmark\" />:<span />;\r\n itemNodes.push (<MenuItem key={++keyIndex} onClick={()=>{this._onRepeatChanged(); close();}} icon={icon}>\r\n {this._repeatLabel}\r\n </MenuItem>);\r\n itemNodes.push (<MenuDivider key={++keyIndex} />);\r\n }\r\n\r\n contextMenuItems.forEach((item: TimelineMenuItemProps, index: number) => {\r\n itemNodes.push(this._createMenuItemNode(item, index+keyIndex+1, totalDuration, close));\r\n });\r\n\r\n return itemNodes;\r\n };\r\n\r\n return (\r\n <DropdownMenu menuItems={createMenuItemNodes}>\r\n <span data-testid=\"timeline-settings\" className=\"timeline-settings icon icon-more-vertical-2\"\r\n role=\"button\" tabIndex={-1} title={UiComponents.translate(\"button.label.settings\")}\r\n ></span>\r\n </DropdownMenu>\r\n );\r\n };\r\n\r\n public override render() {\r\n const { startDate, endDate, showDuration, timeZoneOffset } = this.props;\r\n const { currentDuration, totalDuration, minimized } = this.state;\r\n const currentDate = this._currentDate();\r\n const durationString = this._displayTime(currentDuration);\r\n const totalDurationString = this._displayTime(totalDuration);\r\n const hasDates = !!startDate && !!endDate;\r\n\r\n return (\r\n <div data-testid=\"timeline-component\" className={classnames(\"timeline-component\", !!minimized && \"minimized\", hasDates && \"has-dates\")} >\r\n <div className=\"header\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} data-testid=\"timeline-play\" />\r\n <PlayerButton className=\"play-backward\" icon=\"icon-caret-left\" onClick={this._onBackward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <PlayerButton className=\"play-button-step\" icon=\"icon-media-controls-circular-play\"\r\n isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause}\r\n title={UiIModelComponents.translate(\"timeline.step\")} />\r\n <PlayerButton className=\"play-forward\" icon=\"icon-caret-right\" onClick={this._onForward}\r\n title={UiIModelComponents.translate(\"timeline.backward\")} />\r\n <span className=\"current-date\">{toDateString(currentDate, timeZoneOffset)}</span>\r\n </div>\r\n <div className=\"scrubber\">\r\n <PlayButton className=\"play-button\" isPlaying={this.state.isPlaying} onPlay={this._onPlay} onPause={this._onPause} />\r\n <div className=\"start-time-container\">\r\n {hasDates && <span data-testid=\"test-start-date\" className=\"start-date\">{toDateString(startDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span data-testid=\"test-start-time\" className=\"start-time\">{toTimeString(startDate, timeZoneOffset)}</span>}\r\n {showDuration && <span className=\"duration-start-time\">{durationString}</span>}\r\n </div>\r\n <Scrubber\r\n className=\"slider\"\r\n currentDuration={this.state.currentDuration}\r\n totalDuration={totalDuration}\r\n startDate={startDate}\r\n endDate={endDate}\r\n isPlaying={this.state.isPlaying}\r\n inMiniMode={!!minimized}\r\n showTime={!showDuration}\r\n onChange={this._onTimelineChange}\r\n onUpdate={this._onTimelineChange}\r\n timeZoneOffset={this.props.timeZoneOffset}\r\n markDate={this.props.markDate}\r\n />\r\n <div className=\"end-time-container\">\r\n {hasDates && <span className=\"end-date\">{toDateString(endDate, timeZoneOffset)}</span>}\r\n {hasDates && !showDuration && <span className=\"end-time\">{toTimeString(endDate, timeZoneOffset)}</span>}\r\n {showDuration && <InlineEdit className=\"duration-end-time\" defaultValue={totalDurationString} onChange={this._onTotalDurationChange} />}\r\n </div>\r\n {minimized && this._renderSettings()}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportComponent.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EACM,gBAAgB,EAAE,cAAc,EAC3C,cAAc,EAAgB,WAAW,EAC/B,SAAS,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,oBAAY,aAAa,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC;IACjD,gBAAgB;IAChB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/D,sCAAsC;IACtC,mBAAmB,CAAC,EAAE,WAAW,CAAC;IAClC,sCAAsC;IACtC,sBAAsB,CAAC,EAAE,OAAO,cAAc,CAAC;IAC/C,sCAAsC;IACtC,sBAAsB,CAAC,EAAE,cAAc,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,eA2PrD"}
1
+ {"version":3,"file":"ViewportComponent.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.tsx"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAU,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EACM,gBAAgB,EAAE,cAAc,EAC3C,cAAc,EAAgB,WAAW,EAC/B,SAAS,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,oBAAY,aAAa,GAAG,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,wBAAwB;IACxB,MAAM,EAAE,gBAAgB,CAAC;IACzB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,2CAA2C;IAC3C,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC;IACjD,gBAAgB;IAChB,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/D,sCAAsC;IACtC,mBAAmB,CAAC,EAAE,WAAW,CAAC;IAClC,sCAAsC;IACtC,sBAAsB,CAAC,EAAE,OAAO,cAAc,CAAC;IAC/C,sCAAsC;IACtC,sBAAsB,CAAC,EAAE,cAAc,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,eA6PrD"}
@@ -26,16 +26,18 @@ export function ViewportComponent(props) {
26
26
  const isMounted = React.useRef(false);
27
27
  const viewClassFullName = React.useRef("");
28
28
  const viewId = React.useRef("0");
29
+ // istanbul ignore next
29
30
  const handleViewChanged = (vp) => {
31
+ // istanbul ignore next
32
+ if (!(vp.iModel.isOpen || vp.iModel.isBlank))
33
+ return;
30
34
  ViewportComponentEvents.setViewMatrix(vp);
31
- // istanbul ignore else
32
35
  if (viewClassFullName.current !== vp.view.classFullName) {
33
36
  setTimeout(() => {
34
37
  ViewportComponentEvents.onViewClassFullNameChangedEvent.emit({ viewport: vp, oldName: viewClassFullName.current, newName: vp.view.classFullName });
35
38
  viewClassFullName.current = vp.view.classFullName;
36
39
  });
37
40
  }
38
- // istanbul ignore else
39
41
  if (viewId.current !== vp.view.id) {
40
42
  setTimeout(() => {
41
43
  ViewportComponentEvents.onViewIdChangedEvent.emit({ viewport: vp, oldId: viewId.current, newId: vp.view.id });
@@ -115,13 +117,13 @@ export function ViewportComponent(props) {
115
117
  const screenViewport = screenViewportRef.current;
116
118
  if (screenViewport) {
117
119
  const viewManager = IModelApp.viewManager;
118
- viewManager.dropViewport(screenViewport, true);
119
120
  screenViewport.onViewChanged.removeListener(handleViewChanged);
120
121
  screenViewportRef.current = null;
121
122
  screenViewportCreated.current = false;
122
123
  ViewportComponentEvents.onDrawingViewportChangeEvent.removeListener(handleDrawingViewportChangeEvent);
123
124
  ViewportComponentEvents.onCubeRotationChangeEvent.removeListener(handleCubeRotationChangeEvent);
124
125
  ViewportComponentEvents.onStandardRotationChangeEvent.removeListener(handleStandardRotationChangeEvent);
126
+ viewManager.dropViewport(screenViewport, true);
125
127
  }
126
128
  };
127
129
  const getScreenViewport = (parentDiv, inViewState) => {
@@ -187,9 +189,10 @@ export function ViewportComponent(props) {
187
189
  else {
188
190
  Logger.logError("ViewportComponent", `A Viewstate or a viewId and imodel must be provided`);
189
191
  }
190
- // istanbul ignore else
191
- if (isMounted.current)
192
+ // istanbul ignore next
193
+ if (isMounted.current && ((currentViewState === null || currentViewState === void 0 ? void 0 : currentViewState.iModel.isOpen) || (currentViewState === null || currentViewState === void 0 ? void 0 : currentViewState.iModel.isBlank))) {
192
194
  setInitialViewState(currentViewState === null || currentViewState === void 0 ? void 0 : currentViewState.clone());
195
+ }
193
196
  }
194
197
  if (undefined === initialViewState)
195
198
  fetchInitialViewstate(); // eslint-disable-line @typescript-eslint/no-floating-promises
@@ -200,7 +203,8 @@ export function ViewportComponent(props) {
200
203
  var _a;
201
204
  const parentDiv = viewportDiv.current;
202
205
  const viewManager = viewManagerRef.current;
203
- if (parentDiv && initialViewState) {
206
+ // istanbul ignore next
207
+ if (parentDiv && initialViewState && ((initialViewState === null || initialViewState === void 0 ? void 0 : initialViewState.iModel.isOpen) || (initialViewState === null || initialViewState === void 0 ? void 0 : initialViewState.iModel.isBlank))) {
204
208
  if (!screenViewportCreated.current) {
205
209
  const screenViewport = getScreenViewport(parentDiv, initialViewState);
206
210
  screenViewportRef.current = screenViewport;
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.tsx"],"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 Viewport\r\n */\r\n\r\nimport * as React from \"react\";\r\nimport { Id64String, Logger } from \"@itwin/core-bentley\";\r\nimport { Point3d, Transform } from \"@itwin/core-geometry\";\r\nimport { NpcCenter } from \"@itwin/core-common\";\r\nimport {\r\n IModelApp, IModelConnection, ScreenViewport,\r\n TentativePoint, ToolSettings, ViewManager,\r\n Viewport, ViewState,\r\n} from \"@itwin/core-frontend\";\r\n\r\nimport { CommonProps } from \"@itwin/core-react\";\r\nimport {\r\n CubeRotationChangeEventArgs, DrawingViewportChangeEventArgs, StandardRotationChangeEventArgs, ViewportComponentEvents,\r\n} from \"./ViewportComponentEvents\";\r\n\r\n/** Type for a ViewState prop\r\n * @public\r\n */\r\nexport type ViewStateProp = ViewState | (() => ViewState);\r\n\r\n/**\r\n * Properties for [[ViewportComponent]] component.\r\n * @public\r\n */\r\nexport interface ViewportProps extends CommonProps {\r\n /** IModel to display */\r\n imodel: IModelConnection;\r\n /** Id of a default view definition to load as a starting point */\r\n viewDefinitionId?: Id64String;\r\n /** ViewState to use as a starting point */\r\n viewState?: ViewStateProp;\r\n /** Function to get a reference to the ScreenViewport */\r\n viewportRef?: (v: ScreenViewport) => void;\r\n /** controlId for this content component @internal */\r\n controlId?: string;\r\n /** @internal */\r\n onContextMenu?: (e: React.MouseEvent) => boolean;\r\n /** @internal */\r\n getViewOverlay?: (viewport: ScreenViewport) => React.ReactNode;\r\n /** @internal used only for testing */\r\n viewManagerOverride?: ViewManager;\r\n /** @internal used only for testing */\r\n screenViewportOverride?: typeof ScreenViewport;\r\n /** @internal used only for testing */\r\n tentativePointOverride?: TentativePoint;\r\n}\r\n\r\n/**\r\n * A viewport React component that creates a ScreenViewport.\r\n * @public\r\n */\r\nexport function ViewportComponent(props: ViewportProps) {\r\n const { viewState, imodel, viewDefinitionId, getViewOverlay, viewManagerOverride,\r\n tentativePointOverride, onContextMenu, style, className, screenViewportOverride, controlId, viewportRef } = props;\r\n // istanbul ignore next\r\n const viewManagerRef = React.useRef(viewManagerOverride ?? IModelApp.viewManager);\r\n const tentativePointOverrideRef = React.useRef(tentativePointOverride);\r\n const screenViewportCreated = React.useRef(false);\r\n const viewportDiv = React.useRef<HTMLDivElement>(null);\r\n const screenViewportRef = React.useRef<ScreenViewport | null>(null);\r\n const isMounted = React.useRef(false);\r\n const viewClassFullName = React.useRef(\"\");\r\n const viewId = React.useRef(\"0\");\r\n\r\n const handleViewChanged = (vp: Viewport) => {\r\n ViewportComponentEvents.setViewMatrix(vp);\r\n // istanbul ignore else\r\n if (viewClassFullName.current !== vp.view.classFullName) {\r\n setTimeout(() => {\r\n ViewportComponentEvents.onViewClassFullNameChangedEvent.emit({ viewport: vp, oldName: viewClassFullName.current, newName: vp.view.classFullName });\r\n viewClassFullName.current = vp.view.classFullName;\r\n });\r\n }\r\n // istanbul ignore else\r\n if (viewId.current !== vp.view.id) {\r\n setTimeout(() => {\r\n ViewportComponentEvents.onViewIdChangedEvent.emit({ viewport: vp, oldId: viewId.current, newId: vp.view.id });\r\n viewId.current = vp.view.id;\r\n });\r\n }\r\n };\r\n\r\n const handleStandardRotationChangeEvent = (args: StandardRotationChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n currentScreenViewport.view.setRotationAboutPoint(ViewState.getStandardViewMatrix(args.standardRotation));\r\n currentScreenViewport.synchWithView();\r\n }\r\n };\r\n\r\n const handleDrawingViewportChangeEvent = (args: DrawingViewportChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n currentScreenViewport.view.setOrigin(args.origin);\r\n currentScreenViewport.view.setRotation(args.rotation);\r\n currentScreenViewport.synchWithView({ noSaveInUndo: args.complete !== true });\r\n }\r\n };\r\n\r\n const targetPoint = React.useRef<Point3d | null>(null);\r\n\r\n const getRotatePoint = (vp: ScreenViewport): Point3d => {\r\n const lastTargetPoint = targetPoint.current;\r\n // istanbul ignore next\r\n const tentativePoint = tentativePointOverrideRef.current ?? IModelApp.tentativePoint;\r\n // istanbul ignore else\r\n if (tentativePoint.isActive)\r\n return tentativePoint.getPoint();\r\n\r\n // istanbul ignore else\r\n if (undefined !== vp.viewCmdTargetCenter) {\r\n const testPt = vp.worldToView(vp.viewCmdTargetCenter);\r\n const viewRect = vp.viewRect;\r\n if (viewRect.containsPoint(testPt))\r\n return vp.viewCmdTargetCenter;\r\n vp.viewCmdTargetCenter = undefined;\r\n }\r\n\r\n // istanbul ignore else\r\n if (null !== lastTargetPoint) {\r\n const testPt = vp.worldToView(lastTargetPoint);\r\n const viewRect = vp.viewRect.clone();\r\n viewRect.scaleAboutCenter(0.25, 0.25);\r\n // istanbul ignore next hard to reach because of mocks\r\n if (viewRect.containsPoint(testPt))\r\n return lastTargetPoint;\r\n targetPoint.current = null;\r\n }\r\n\r\n const visiblePoint = vp.pickNearestVisibleGeometry(vp.npcToWorld(NpcCenter), vp.pixelsFromInches(ToolSettings.viewToolPickRadiusInches));\r\n targetPoint.current = (undefined !== visiblePoint ? visiblePoint : vp.view.getTargetPoint());\r\n // istanbul ignore next\r\n return targetPoint.current ?? vp.view.getCenter();\r\n };\r\n\r\n const handleCubeRotationChangeEvent = (args: CubeRotationChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n // istanbul ignore else\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n const rotMatrix = args.rotMatrix;\r\n // istanbul ignore else\r\n if (currentScreenViewport.rotation !== rotMatrix) {\r\n const inverse = rotMatrix.transpose(); // rotation is from current nav cube state...\r\n const center = getRotatePoint(currentScreenViewport);\r\n const targetMatrix = inverse.multiplyMatrixMatrix(currentScreenViewport.view.getRotation());\r\n const worldTransform = Transform.createFixedPointAndMatrix(center, targetMatrix);\r\n const frustum = currentScreenViewport.getWorldFrustum();\r\n frustum.multiply(worldTransform);\r\n currentScreenViewport.view.setupFromFrustum(frustum);\r\n currentScreenViewport.synchWithView({ noSaveInUndo: !args.complete });\r\n }\r\n }\r\n };\r\n\r\n const handleDisconnectFromViewManager = () => {\r\n const screenViewport = screenViewportRef.current;\r\n if (screenViewport) {\r\n const viewManager = IModelApp.viewManager;\r\n viewManager.dropViewport(screenViewport, true);\r\n screenViewport.onViewChanged.removeListener(handleViewChanged);\r\n screenViewportRef.current = null;\r\n screenViewportCreated.current = false;\r\n\r\n ViewportComponentEvents.onDrawingViewportChangeEvent.removeListener(handleDrawingViewportChangeEvent);\r\n ViewportComponentEvents.onCubeRotationChangeEvent.removeListener(handleCubeRotationChangeEvent);\r\n ViewportComponentEvents.onStandardRotationChangeEvent.removeListener(handleStandardRotationChangeEvent);\r\n }\r\n };\r\n\r\n const getScreenViewport = (parentDiv: HTMLDivElement, inViewState: ViewState) => {\r\n // istanbul ignore next\r\n const screenViewportFactory = screenViewportOverride ? screenViewportOverride : ScreenViewport;\r\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\r\n parentWindow.addEventListener(\"beforeunload\", handleDisconnectFromViewManager, true); // listener clear after being called\r\n ViewportComponentEvents.initialize();\r\n ViewportComponentEvents.onDrawingViewportChangeEvent.addListener(handleDrawingViewportChangeEvent);\r\n ViewportComponentEvents.onCubeRotationChangeEvent.addListener(handleCubeRotationChangeEvent);\r\n ViewportComponentEvents.onStandardRotationChangeEvent.addListener(handleStandardRotationChangeEvent);\r\n const screenViewport = screenViewportFactory.create(parentDiv, inViewState);\r\n screenViewportCreated.current = true;\r\n viewClassFullName.current = screenViewport.view.classFullName;\r\n viewId.current = screenViewport.view.id;\r\n screenViewport.onViewChanged.addListener(handleViewChanged);\r\n return screenViewport;\r\n };\r\n\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n Logger.logInfo(\"ViewportComponent\", `mounting ViewportComponent for controlId=${controlId}`);\r\n\r\n return () => {\r\n isMounted.current = false;\r\n Logger.logInfo(\"ViewportComponent\", `un-mounting ViewportComponent for controlId=${controlId}`);\r\n handleDisconnectFromViewManager();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const [initialViewState, setInitialViewState] = React.useState<ViewState | undefined>(() => {\r\n if (viewState) {\r\n if (typeof viewState === \"function\")\r\n return viewState().clone();\r\n else\r\n return viewState.clone();\r\n }\r\n return undefined;\r\n });\r\n\r\n React.useEffect(() => {\r\n setInitialViewState(undefined);\r\n }, [viewDefinitionId, viewState]);\r\n\r\n React.useEffect(() => {\r\n async function fetchInitialViewstate() {\r\n let currentViewState: ViewState | undefined;\r\n if (viewState) {\r\n if (typeof viewState === \"function\")\r\n currentViewState = viewState();\r\n else\r\n currentViewState = viewState;\r\n } else if (viewDefinitionId && imodel) {\r\n try {\r\n currentViewState = await imodel.views.load(viewDefinitionId);\r\n // istanbul ignore next\r\n if (!currentViewState) {\r\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\r\n }\r\n } catch (_e) {\r\n // istanbul ignore next\r\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\r\n }\r\n } else {\r\n Logger.logError(\"ViewportComponent\", `A Viewstate or a viewId and imodel must be provided`);\r\n }\r\n // istanbul ignore else\r\n if (isMounted.current)\r\n setInitialViewState(currentViewState?.clone());\r\n }\r\n if (undefined === initialViewState)\r\n fetchInitialViewstate(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }, [imodel, initialViewState, viewDefinitionId, viewState]);\r\n\r\n const [viewOverlay, setViewOverlay] = React.useState<React.ReactNode>(null);\r\n\r\n // This useEffect connects to ViewManger as soon as initialViewState is available once component is mounted.\r\n React.useEffect(() => {\r\n const parentDiv = viewportDiv.current;\r\n const viewManager = viewManagerRef.current;\r\n if (parentDiv && initialViewState) {\r\n if (!screenViewportCreated.current) {\r\n const screenViewport = getScreenViewport(parentDiv, initialViewState);\r\n screenViewportRef.current = screenViewport;\r\n\r\n if (viewportRef)\r\n viewportRef(screenViewport);\r\n\r\n Logger.logInfo(\"ViewportComponent\", `processing viewManager.addViewport for controlId=${controlId}`);\r\n viewManager.addViewport(screenViewport);\r\n\r\n // overlay component is set up once a ScreenViewport is available. The overlay component must handle any view changes itself.\r\n setViewOverlay(getViewOverlay ? getViewOverlay(screenViewport) : null);\r\n } else {\r\n // istanbul ignore next\r\n screenViewportRef.current?.changeView(initialViewState);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [controlId, initialViewState, viewportRef]);\r\n\r\n const handleContextMenu = React.useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n if (onContextMenu)\r\n onContextMenu(e);\r\n }, [onContextMenu]);\r\n\r\n const parentDivStyle: React.CSSProperties = {\r\n height: \"100%\", width: \"100%\", position: \"relative\",\r\n };\r\n\r\n const viewportDivStyle: React.CSSProperties = {\r\n ...style,\r\n height: \"100%\", width: \"100%\",\r\n };\r\n\r\n return (\r\n <div style={parentDivStyle} data-item-id={controlId}\r\n >\r\n <>\r\n <div\r\n ref={viewportDiv}\r\n data-testid=\"viewport-component\"\r\n className={className}\r\n style={viewportDivStyle}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {viewOverlay}\r\n </>\r\n </div>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"ViewportComponent.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponent.tsx"],"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 Viewport\r\n */\r\n\r\nimport * as React from \"react\";\r\nimport { Id64String, Logger } from \"@itwin/core-bentley\";\r\nimport { Point3d, Transform } from \"@itwin/core-geometry\";\r\nimport { NpcCenter } from \"@itwin/core-common\";\r\nimport {\r\n IModelApp, IModelConnection, ScreenViewport,\r\n TentativePoint, ToolSettings, ViewManager,\r\n Viewport, ViewState,\r\n} from \"@itwin/core-frontend\";\r\n\r\nimport { CommonProps } from \"@itwin/core-react\";\r\nimport {\r\n CubeRotationChangeEventArgs, DrawingViewportChangeEventArgs, StandardRotationChangeEventArgs, ViewportComponentEvents,\r\n} from \"./ViewportComponentEvents\";\r\n\r\n/** Type for a ViewState prop\r\n * @public\r\n */\r\nexport type ViewStateProp = ViewState | (() => ViewState);\r\n\r\n/**\r\n * Properties for [[ViewportComponent]] component.\r\n * @public\r\n */\r\nexport interface ViewportProps extends CommonProps {\r\n /** IModel to display */\r\n imodel: IModelConnection;\r\n /** Id of a default view definition to load as a starting point */\r\n viewDefinitionId?: Id64String;\r\n /** ViewState to use as a starting point */\r\n viewState?: ViewStateProp;\r\n /** Function to get a reference to the ScreenViewport */\r\n viewportRef?: (v: ScreenViewport) => void;\r\n /** controlId for this content component @internal */\r\n controlId?: string;\r\n /** @internal */\r\n onContextMenu?: (e: React.MouseEvent) => boolean;\r\n /** @internal */\r\n getViewOverlay?: (viewport: ScreenViewport) => React.ReactNode;\r\n /** @internal used only for testing */\r\n viewManagerOverride?: ViewManager;\r\n /** @internal used only for testing */\r\n screenViewportOverride?: typeof ScreenViewport;\r\n /** @internal used only for testing */\r\n tentativePointOverride?: TentativePoint;\r\n}\r\n\r\n/**\r\n * A viewport React component that creates a ScreenViewport.\r\n * @public\r\n */\r\nexport function ViewportComponent(props: ViewportProps) {\r\n const { viewState, imodel, viewDefinitionId, getViewOverlay, viewManagerOverride,\r\n tentativePointOverride, onContextMenu, style, className, screenViewportOverride, controlId, viewportRef } = props;\r\n // istanbul ignore next\r\n const viewManagerRef = React.useRef(viewManagerOverride ?? IModelApp.viewManager);\r\n const tentativePointOverrideRef = React.useRef(tentativePointOverride);\r\n const screenViewportCreated = React.useRef(false);\r\n const viewportDiv = React.useRef<HTMLDivElement>(null);\r\n const screenViewportRef = React.useRef<ScreenViewport | null>(null);\r\n const isMounted = React.useRef(false);\r\n const viewClassFullName = React.useRef(\"\");\r\n const viewId = React.useRef(\"0\");\r\n\r\n // istanbul ignore next\r\n const handleViewChanged = (vp: Viewport) => {\r\n // istanbul ignore next\r\n if (!(vp.iModel.isOpen || vp.iModel.isBlank))\r\n return;\r\n ViewportComponentEvents.setViewMatrix(vp);\r\n if (viewClassFullName.current !== vp.view.classFullName) {\r\n setTimeout(() => {\r\n ViewportComponentEvents.onViewClassFullNameChangedEvent.emit({ viewport: vp, oldName: viewClassFullName.current, newName: vp.view.classFullName });\r\n viewClassFullName.current = vp.view.classFullName;\r\n });\r\n }\r\n if (viewId.current !== vp.view.id) {\r\n setTimeout(() => {\r\n ViewportComponentEvents.onViewIdChangedEvent.emit({ viewport: vp, oldId: viewId.current, newId: vp.view.id });\r\n viewId.current = vp.view.id;\r\n });\r\n }\r\n };\r\n\r\n const handleStandardRotationChangeEvent = (args: StandardRotationChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n currentScreenViewport.view.setRotationAboutPoint(ViewState.getStandardViewMatrix(args.standardRotation));\r\n currentScreenViewport.synchWithView();\r\n }\r\n };\r\n\r\n const handleDrawingViewportChangeEvent = (args: DrawingViewportChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n currentScreenViewport.view.setOrigin(args.origin);\r\n currentScreenViewport.view.setRotation(args.rotation);\r\n currentScreenViewport.synchWithView({ noSaveInUndo: args.complete !== true });\r\n }\r\n };\r\n\r\n const targetPoint = React.useRef<Point3d | null>(null);\r\n\r\n const getRotatePoint = (vp: ScreenViewport): Point3d => {\r\n const lastTargetPoint = targetPoint.current;\r\n // istanbul ignore next\r\n const tentativePoint = tentativePointOverrideRef.current ?? IModelApp.tentativePoint;\r\n // istanbul ignore else\r\n if (tentativePoint.isActive)\r\n return tentativePoint.getPoint();\r\n\r\n // istanbul ignore else\r\n if (undefined !== vp.viewCmdTargetCenter) {\r\n const testPt = vp.worldToView(vp.viewCmdTargetCenter);\r\n const viewRect = vp.viewRect;\r\n if (viewRect.containsPoint(testPt))\r\n return vp.viewCmdTargetCenter;\r\n vp.viewCmdTargetCenter = undefined;\r\n }\r\n\r\n // istanbul ignore else\r\n if (null !== lastTargetPoint) {\r\n const testPt = vp.worldToView(lastTargetPoint);\r\n const viewRect = vp.viewRect.clone();\r\n viewRect.scaleAboutCenter(0.25, 0.25);\r\n // istanbul ignore next hard to reach because of mocks\r\n if (viewRect.containsPoint(testPt))\r\n return lastTargetPoint;\r\n targetPoint.current = null;\r\n }\r\n\r\n const visiblePoint = vp.pickNearestVisibleGeometry(vp.npcToWorld(NpcCenter), vp.pixelsFromInches(ToolSettings.viewToolPickRadiusInches));\r\n targetPoint.current = (undefined !== visiblePoint ? visiblePoint : vp.view.getTargetPoint());\r\n // istanbul ignore next\r\n return targetPoint.current ?? vp.view.getCenter();\r\n };\r\n\r\n const handleCubeRotationChangeEvent = (args: CubeRotationChangeEventArgs) => {\r\n const viewManager = viewManagerRef.current;\r\n const currentScreenViewport = screenViewportRef.current;\r\n // istanbul ignore else\r\n if (currentScreenViewport && viewManager.selectedView === currentScreenViewport) {\r\n const rotMatrix = args.rotMatrix;\r\n // istanbul ignore else\r\n if (currentScreenViewport.rotation !== rotMatrix) {\r\n const inverse = rotMatrix.transpose(); // rotation is from current nav cube state...\r\n const center = getRotatePoint(currentScreenViewport);\r\n const targetMatrix = inverse.multiplyMatrixMatrix(currentScreenViewport.view.getRotation());\r\n const worldTransform = Transform.createFixedPointAndMatrix(center, targetMatrix);\r\n const frustum = currentScreenViewport.getWorldFrustum();\r\n frustum.multiply(worldTransform);\r\n currentScreenViewport.view.setupFromFrustum(frustum);\r\n currentScreenViewport.synchWithView({ noSaveInUndo: !args.complete });\r\n }\r\n }\r\n };\r\n\r\n const handleDisconnectFromViewManager = () => {\r\n const screenViewport = screenViewportRef.current;\r\n if (screenViewport) {\r\n const viewManager = IModelApp.viewManager;\r\n screenViewport.onViewChanged.removeListener(handleViewChanged);\r\n screenViewportRef.current = null;\r\n screenViewportCreated.current = false;\r\n ViewportComponentEvents.onDrawingViewportChangeEvent.removeListener(handleDrawingViewportChangeEvent);\r\n ViewportComponentEvents.onCubeRotationChangeEvent.removeListener(handleCubeRotationChangeEvent);\r\n ViewportComponentEvents.onStandardRotationChangeEvent.removeListener(handleStandardRotationChangeEvent);\r\n viewManager.dropViewport(screenViewport, true);\r\n }\r\n };\r\n\r\n const getScreenViewport = (parentDiv: HTMLDivElement, inViewState: ViewState) => {\r\n // istanbul ignore next\r\n const screenViewportFactory = screenViewportOverride ? screenViewportOverride : ScreenViewport;\r\n const parentWindow = parentDiv.ownerDocument.defaultView as Window;\r\n parentWindow.addEventListener(\"beforeunload\", handleDisconnectFromViewManager, true); // listener clear after being called\r\n ViewportComponentEvents.initialize();\r\n ViewportComponentEvents.onDrawingViewportChangeEvent.addListener(handleDrawingViewportChangeEvent);\r\n ViewportComponentEvents.onCubeRotationChangeEvent.addListener(handleCubeRotationChangeEvent);\r\n ViewportComponentEvents.onStandardRotationChangeEvent.addListener(handleStandardRotationChangeEvent);\r\n const screenViewport = screenViewportFactory.create(parentDiv, inViewState);\r\n screenViewportCreated.current = true;\r\n viewClassFullName.current = screenViewport.view.classFullName;\r\n viewId.current = screenViewport.view.id;\r\n screenViewport.onViewChanged.addListener(handleViewChanged);\r\n return screenViewport;\r\n };\r\n\r\n React.useEffect(() => {\r\n isMounted.current = true;\r\n Logger.logInfo(\"ViewportComponent\", `mounting ViewportComponent for controlId=${controlId}`);\r\n\r\n return () => {\r\n isMounted.current = false;\r\n Logger.logInfo(\"ViewportComponent\", `un-mounting ViewportComponent for controlId=${controlId}`);\r\n handleDisconnectFromViewManager();\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const [initialViewState, setInitialViewState] = React.useState<ViewState | undefined>(() => {\r\n if (viewState) {\r\n if (typeof viewState === \"function\")\r\n return viewState().clone();\r\n else\r\n return viewState.clone();\r\n }\r\n return undefined;\r\n });\r\n\r\n React.useEffect(() => {\r\n setInitialViewState(undefined);\r\n }, [viewDefinitionId, viewState]);\r\n React.useEffect(() => {\r\n async function fetchInitialViewstate() {\r\n let currentViewState: ViewState | undefined;\r\n if (viewState) {\r\n if (typeof viewState === \"function\")\r\n currentViewState = viewState();\r\n else\r\n currentViewState = viewState;\r\n } else if (viewDefinitionId && imodel) {\r\n try {\r\n currentViewState = await imodel.views.load(viewDefinitionId);\r\n // istanbul ignore next\r\n if (!currentViewState) {\r\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\r\n }\r\n } catch (_e) {\r\n // istanbul ignore next\r\n Logger.logError(\"ViewportComponent\", `Viewstate failed to load`);\r\n }\r\n } else {\r\n Logger.logError(\"ViewportComponent\", `A Viewstate or a viewId and imodel must be provided`);\r\n }\r\n // istanbul ignore next\r\n if (isMounted.current && (currentViewState?.iModel.isOpen || currentViewState?.iModel.isBlank)) {\r\n setInitialViewState(currentViewState?.clone());\r\n }\r\n }\r\n if (undefined === initialViewState)\r\n fetchInitialViewstate(); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }, [imodel, initialViewState, viewDefinitionId, viewState]);\r\n\r\n const [viewOverlay, setViewOverlay] = React.useState<React.ReactNode>(null);\r\n\r\n // This useEffect connects to ViewManger as soon as initialViewState is available once component is mounted.\r\n React.useEffect(() => {\r\n const parentDiv = viewportDiv.current;\r\n const viewManager = viewManagerRef.current;\r\n // istanbul ignore next\r\n if (parentDiv && initialViewState && (initialViewState?.iModel.isOpen || initialViewState?.iModel.isBlank) ) {\r\n if (!screenViewportCreated.current) {\r\n const screenViewport = getScreenViewport(parentDiv, initialViewState);\r\n screenViewportRef.current = screenViewport;\r\n\r\n if (viewportRef)\r\n viewportRef(screenViewport);\r\n\r\n Logger.logInfo(\"ViewportComponent\", `processing viewManager.addViewport for controlId=${controlId}`);\r\n viewManager.addViewport(screenViewport);\r\n\r\n // overlay component is set up once a ScreenViewport is available. The overlay component must handle any view changes itself.\r\n setViewOverlay(getViewOverlay ? getViewOverlay(screenViewport) : null);\r\n } else {\r\n // istanbul ignore next\r\n screenViewportRef.current?.changeView(initialViewState);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [controlId, initialViewState, viewportRef]);\r\n\r\n const handleContextMenu = React.useCallback((e: React.MouseEvent) => {\r\n e.preventDefault();\r\n if (onContextMenu)\r\n onContextMenu(e);\r\n }, [onContextMenu]);\r\n\r\n const parentDivStyle: React.CSSProperties = {\r\n height: \"100%\", width: \"100%\", position: \"relative\",\r\n };\r\n\r\n const viewportDivStyle: React.CSSProperties = {\r\n ...style,\r\n height: \"100%\", width: \"100%\",\r\n };\r\n\r\n return (\r\n <div style={parentDivStyle} data-item-id={controlId}\r\n >\r\n <>\r\n <div\r\n ref={viewportDiv}\r\n data-testid=\"viewport-component\"\r\n className={className}\r\n style={viewportDivStyle}\r\n onContextMenu={handleContextMenu}\r\n />\r\n {viewOverlay}\r\n </>\r\n </div>\r\n );\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportComponentEvents.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponentEvents.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAA0C,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,OAAO,CAAC,8BAA8B,CAAC;CAAI;AAE3F;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,OAAO,CAAC,2BAA2B,CAAC;CAAI;AAErF;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,gBAAgB,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,OAAO,CAAC,+BAA+B,CAAC;CAAI;AAE7F;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,OAAO,CAAC,2BAA2B,CAAC;CAAI;AAErF;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,OAAO,CAAC,iCAAiC,CAAC;CAAI;AAEjG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,OAAO,CAAC,sBAAsB,CAAC;CAAI;AAE3E;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAa;WAE9B,UAAU;IAOxB,mCAAmC;WACrB,SAAS;IAOvB,OAAc,IAAI,OAAa;IAC/B,gBAAuB,MAAM,UAAwB;IACrD,gBAAuB,OAAO,WAAyB;IACvD,gBAAuB,cAAc,WAA6B;IAClE,gBAAuB,4BAA4B,6BAAoC;IACvF,gBAAuB,yBAAyB,0BAAiC;IACjF,gBAAuB,6BAA6B,8BAAqC;IACzF,gBAAuB,yBAAyB,0BAAiC;IACjF,gBAAuB,+BAA+B,gCAAuC;IAC7F,gBAAuB,oBAAoB,qBAA4B;IAEvE,OAAO,CAAC,MAAM,CAAC,6BAA6B;WAK9B,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,OAAY,EAAE,QAAQ,GAAE,OAAe,GAAG,IAAI;WAMrF,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAE,OAAe,GAAG,IAAI;WAI7F,mBAAmB,CAAC,gBAAgB,EAAE,cAAc,GAAG,IAAI;WAI3D,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;CAY9E"}
1
+ {"version":3,"file":"ViewportComponentEvents.d.ts","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponentEvents.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAA0C,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,OAAO,CAAC,8BAA8B,CAAC;CAAI;AAE3F;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,OAAO,CAAC,2BAA2B,CAAC;CAAI;AAErF;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,gBAAgB,EAAE,cAAc,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,OAAO,CAAC,+BAA+B,CAAC;CAAI;AAE7F;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,OAAO,CAAC,2BAA2B,CAAC;CAAI;AAErF;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,OAAO,CAAC,iCAAiC,CAAC;CAAI;AAEjG;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,OAAO,CAAC,sBAAsB,CAAC;CAAI;AAE3E;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAa;WAE9B,UAAU;IAOxB,mCAAmC;WACrB,SAAS;IAOvB,OAAc,IAAI,OAAa;IAC/B,gBAAuB,MAAM,UAAwB;IACrD,gBAAuB,OAAO,WAAyB;IACvD,gBAAuB,cAAc,WAA6B;IAClE,gBAAuB,4BAA4B,6BAAoC;IACvF,gBAAuB,yBAAyB,0BAAiC;IACjF,gBAAuB,6BAA6B,8BAAqC;IACzF,gBAAuB,yBAAyB,0BAAiC;IACjF,gBAAuB,+BAA+B,gCAAuC;IAC7F,gBAAuB,oBAAoB,qBAA4B;IAEvE,OAAO,CAAC,MAAM,CAAC,6BAA6B;WAK9B,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,OAAY,EAAE,QAAQ,GAAE,OAAe,GAAG,IAAI;WAMrF,uBAAuB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAE,OAAe,GAAG,IAAI;WAI7F,mBAAmB,CAAC,gBAAgB,EAAE,cAAc,GAAG,IAAI;WAI3D,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;CAa9E"}
@@ -73,6 +73,7 @@ export class ViewportComponentEvents {
73
73
  static setViewMatrix(viewport, animationTime) {
74
74
  // When handling onViewChanged, use setTimeout
75
75
  setTimeout(() => {
76
+ // istanbul ignore next
76
77
  if (viewport.view) {
77
78
  this.origin.setFrom(viewport.view.getOrigin());
78
79
  this.extents.setFrom(viewport.view.getExtents());
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportComponentEvents.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponentEvents.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 Viewport\r\n */\r\n\r\nimport { Matrix3d, Point3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { IModelApp, SelectedViewportChangedArgs, StandardViewId, Viewport } from \"@itwin/core-frontend\";\r\nimport { UiEvent } from \"@itwin/appui-abstract\";\r\nimport { Face } from \"../navigationaids/Cube\";\r\n\r\n/** Arguments for [[DrawingViewportChangeEvent]]\r\n * @public\r\n */\r\nexport interface DrawingViewportChangeEventArgs {\r\n rotation: Matrix3d;\r\n origin: Point3d;\r\n complete: boolean;\r\n}\r\n\r\n/** Drawing View Change event\r\n * @public\r\n */\r\nexport class DrawingViewportChangeEvent extends UiEvent<DrawingViewportChangeEventArgs> { }\r\n\r\n/** Arguments for [[CubeRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface CubeRotationChangeEventArgs {\r\n rotMatrix: Matrix3d;\r\n face: Face;\r\n complete?: boolean;\r\n}\r\n\r\n/** 3d Cube Rotation Change event\r\n * @public\r\n */\r\nexport class CubeRotationChangeEvent extends UiEvent<CubeRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[StandardRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface StandardRotationChangeEventArgs {\r\n standardRotation: StandardViewId;\r\n}\r\n\r\n/** Standard Rotation Change event\r\n * @public\r\n */\r\nexport class StandardRotationChangeEvent extends UiEvent<StandardRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[ViewRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface ViewRotationChangeEventArgs {\r\n viewport: Viewport;\r\n animationTime?: number;\r\n}\r\n\r\n/** View Rotation Change event\r\n * @public\r\n */\r\nexport class ViewRotationChangeEvent extends UiEvent<ViewRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[ViewClassFullNameChangedEvent]]\r\n * @public\r\n */\r\nexport interface ViewClassFullNameChangedEventArgs {\r\n viewport: Viewport;\r\n oldName: string;\r\n newName: string;\r\n}\r\n\r\n/** View Class Full Name Change event\r\n * @public\r\n */\r\nexport class ViewClassFullNameChangedEvent extends UiEvent<ViewClassFullNameChangedEventArgs> { }\r\n\r\n/** Arguments for [[ViewIdChangedEvent]]\r\n * @public\r\n */\r\nexport interface ViewIdChangedEventArgs {\r\n viewport: Viewport;\r\n oldId: string;\r\n newId: string;\r\n}\r\n\r\n/** View Id Change event\r\n * @public\r\n */\r\nexport class ViewIdChangedEvent extends UiEvent<ViewIdChangedEventArgs> { }\r\n\r\n/** Viewport Rotation events and methods\r\n * @public\r\n */\r\nexport class ViewportComponentEvents {\r\n private static _removeListener?: () => void;\r\n\r\n public static initialize() {\r\n if (undefined !== this._removeListener)\r\n return;\r\n\r\n this._removeListener = IModelApp.viewManager.onSelectedViewportChanged.addListener(ViewportComponentEvents.handleSelectedViewportChanged);\r\n }\r\n\r\n /** @internal - for unit testing */\r\n public static terminate() {\r\n if (this._removeListener) {\r\n this._removeListener();\r\n this._removeListener = undefined;\r\n }\r\n }\r\n\r\n public static face = Face.None;\r\n public static readonly origin = Point3d.createZero();\r\n public static readonly extents = Vector3d.createZero();\r\n public static readonly rotationMatrix = Matrix3d.createIdentity();\r\n public static readonly onDrawingViewportChangeEvent = new DrawingViewportChangeEvent();\r\n public static readonly onCubeRotationChangeEvent = new CubeRotationChangeEvent();\r\n public static readonly onStandardRotationChangeEvent = new StandardRotationChangeEvent();\r\n public static readonly onViewRotationChangeEvent = new ViewRotationChangeEvent();\r\n public static readonly onViewClassFullNameChangedEvent = new ViewClassFullNameChangedEvent();\r\n public static readonly onViewIdChangedEvent = new ViewIdChangedEvent();\r\n\r\n private static handleSelectedViewportChanged(args: SelectedViewportChangedArgs): void {\r\n if (args.current)\r\n ViewportComponentEvents.setViewMatrix(args.current);\r\n }\r\n\r\n public static setCubeMatrix(rotMatrix: Matrix3d, face = Face.None, complete: boolean = false): void {\r\n this.rotationMatrix.setFrom(rotMatrix);\r\n this.face = face;\r\n this.onCubeRotationChangeEvent.emit({ rotMatrix, complete, face });\r\n }\r\n\r\n public static setDrawingViewportState(origin: Point3d, rotation: Matrix3d, complete: boolean = false): void {\r\n this.onDrawingViewportChangeEvent.emit({ origin, rotation, complete });\r\n }\r\n\r\n public static setStandardRotation(standardRotation: StandardViewId): void {\r\n this.onStandardRotationChangeEvent.emit({ standardRotation });\r\n }\r\n\r\n public static setViewMatrix(viewport: Viewport, animationTime?: number): void {\r\n // When handling onViewChanged, use setTimeout\r\n setTimeout(() => {\r\n if (viewport.view) {\r\n this.origin.setFrom(viewport.view.getOrigin());\r\n this.extents.setFrom(viewport.view.getExtents());\r\n }\r\n this.rotationMatrix.setFrom(viewport.rotation);\r\n\r\n this.onViewRotationChangeEvent.emit({ viewport, animationTime });\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ViewportComponentEvents.js","sourceRoot":"","sources":["../../../../src/imodel-components-react/viewport/ViewportComponentEvents.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 Viewport\r\n */\r\n\r\nimport { Matrix3d, Point3d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { IModelApp, SelectedViewportChangedArgs, StandardViewId, Viewport } from \"@itwin/core-frontend\";\r\nimport { UiEvent } from \"@itwin/appui-abstract\";\r\nimport { Face } from \"../navigationaids/Cube\";\r\n\r\n/** Arguments for [[DrawingViewportChangeEvent]]\r\n * @public\r\n */\r\nexport interface DrawingViewportChangeEventArgs {\r\n rotation: Matrix3d;\r\n origin: Point3d;\r\n complete: boolean;\r\n}\r\n\r\n/** Drawing View Change event\r\n * @public\r\n */\r\nexport class DrawingViewportChangeEvent extends UiEvent<DrawingViewportChangeEventArgs> { }\r\n\r\n/** Arguments for [[CubeRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface CubeRotationChangeEventArgs {\r\n rotMatrix: Matrix3d;\r\n face: Face;\r\n complete?: boolean;\r\n}\r\n\r\n/** 3d Cube Rotation Change event\r\n * @public\r\n */\r\nexport class CubeRotationChangeEvent extends UiEvent<CubeRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[StandardRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface StandardRotationChangeEventArgs {\r\n standardRotation: StandardViewId;\r\n}\r\n\r\n/** Standard Rotation Change event\r\n * @public\r\n */\r\nexport class StandardRotationChangeEvent extends UiEvent<StandardRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[ViewRotationChangeEvent]]\r\n * @public\r\n */\r\nexport interface ViewRotationChangeEventArgs {\r\n viewport: Viewport;\r\n animationTime?: number;\r\n}\r\n\r\n/** View Rotation Change event\r\n * @public\r\n */\r\nexport class ViewRotationChangeEvent extends UiEvent<ViewRotationChangeEventArgs> { }\r\n\r\n/** Arguments for [[ViewClassFullNameChangedEvent]]\r\n * @public\r\n */\r\nexport interface ViewClassFullNameChangedEventArgs {\r\n viewport: Viewport;\r\n oldName: string;\r\n newName: string;\r\n}\r\n\r\n/** View Class Full Name Change event\r\n * @public\r\n */\r\nexport class ViewClassFullNameChangedEvent extends UiEvent<ViewClassFullNameChangedEventArgs> { }\r\n\r\n/** Arguments for [[ViewIdChangedEvent]]\r\n * @public\r\n */\r\nexport interface ViewIdChangedEventArgs {\r\n viewport: Viewport;\r\n oldId: string;\r\n newId: string;\r\n}\r\n\r\n/** View Id Change event\r\n * @public\r\n */\r\nexport class ViewIdChangedEvent extends UiEvent<ViewIdChangedEventArgs> { }\r\n\r\n/** Viewport Rotation events and methods\r\n * @public\r\n */\r\nexport class ViewportComponentEvents {\r\n private static _removeListener?: () => void;\r\n\r\n public static initialize() {\r\n if (undefined !== this._removeListener)\r\n return;\r\n\r\n this._removeListener = IModelApp.viewManager.onSelectedViewportChanged.addListener(ViewportComponentEvents.handleSelectedViewportChanged);\r\n }\r\n\r\n /** @internal - for unit testing */\r\n public static terminate() {\r\n if (this._removeListener) {\r\n this._removeListener();\r\n this._removeListener = undefined;\r\n }\r\n }\r\n\r\n public static face = Face.None;\r\n public static readonly origin = Point3d.createZero();\r\n public static readonly extents = Vector3d.createZero();\r\n public static readonly rotationMatrix = Matrix3d.createIdentity();\r\n public static readonly onDrawingViewportChangeEvent = new DrawingViewportChangeEvent();\r\n public static readonly onCubeRotationChangeEvent = new CubeRotationChangeEvent();\r\n public static readonly onStandardRotationChangeEvent = new StandardRotationChangeEvent();\r\n public static readonly onViewRotationChangeEvent = new ViewRotationChangeEvent();\r\n public static readonly onViewClassFullNameChangedEvent = new ViewClassFullNameChangedEvent();\r\n public static readonly onViewIdChangedEvent = new ViewIdChangedEvent();\r\n\r\n private static handleSelectedViewportChanged(args: SelectedViewportChangedArgs): void {\r\n if (args.current)\r\n ViewportComponentEvents.setViewMatrix(args.current);\r\n }\r\n\r\n public static setCubeMatrix(rotMatrix: Matrix3d, face = Face.None, complete: boolean = false): void {\r\n this.rotationMatrix.setFrom(rotMatrix);\r\n this.face = face;\r\n this.onCubeRotationChangeEvent.emit({ rotMatrix, complete, face });\r\n }\r\n\r\n public static setDrawingViewportState(origin: Point3d, rotation: Matrix3d, complete: boolean = false): void {\r\n this.onDrawingViewportChangeEvent.emit({ origin, rotation, complete });\r\n }\r\n\r\n public static setStandardRotation(standardRotation: StandardViewId): void {\r\n this.onStandardRotationChangeEvent.emit({ standardRotation });\r\n }\r\n\r\n public static setViewMatrix(viewport: Viewport, animationTime?: number): void {\r\n // When handling onViewChanged, use setTimeout\r\n setTimeout(() => {\r\n // istanbul ignore next\r\n if (viewport.view) {\r\n this.origin.setFrom(viewport.view.getOrigin());\r\n this.extents.setFrom(viewport.view.getExtents());\r\n }\r\n this.rotationMatrix.setFrom(viewport.rotation);\r\n\r\n this.onViewRotationChangeEvent.emit({ viewport, animationTime });\r\n });\r\n }\r\n}\r\n"]}
@@ -27,7 +27,6 @@ export * from "./imodel-components-react/quantityformat/MiscFormatOptions";
27
27
  export * from "./imodel-components-react/quantityformat/QuantityFormatPanel";
28
28
  export * from "./imodel-components-react/timeline/interfaces";
29
29
  export * from "./imodel-components-react/timeline/BaseTimelineDataProvider";
30
- export * from "./imodel-components-react/timeline/ContextMenu";
31
30
  export * from "./imodel-components-react/timeline/InlineEdit";
32
31
  export * from "./imodel-components-react/timeline/PlayerButton";
33
32
  export * from "./imodel-components-react/timeline/Scrubber";
@@ -1 +1 @@
1
- {"version":3,"file":"imodel-components-react.d.ts","sourceRoot":"","sources":["../../src/imodel-components-react.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAElF,cAAc,6CAA6C,CAAC;AAC5D,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,kDAAkD,CAAC;AACjE,cAAc,kDAAkD,CAAC;AACjE,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAE/D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sDAAsD,CAAC;AAErE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yDAAyD,CAAC;AAExE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4DAA4D,CAAC;AAC3E,cAAc,+DAA+D,CAAC;AAE9E,cAAc,sDAAsD,CAAC;AACrE,cAAc,0DAA0D,CAAC;AACzE,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,0DAA0D,CAAC;AACzE,cAAc,sDAAsD,CAAC;AACrE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,8DAA8D,CAAC;AAE7E,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6DAA6D,CAAC;AAC5E,cAAc,gDAAgD,CAAC;AAC/D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sDAAsD,CAAC;AACrE,cAAc,kDAAkD,CAAC;AACjE,cAAc,0DAA0D,CAAC;AAEzE,cAAc,sDAAsD,CAAC;AACrE,cAAc,4DAA4D,CAAC;AAE3E;;;;GAIG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG"}
1
+ {"version":3,"file":"imodel-components-react.d.ts","sourceRoot":"","sources":["../../src/imodel-components-react.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAElF,cAAc,6CAA6C,CAAC;AAC5D,cAAc,mDAAmD,CAAC;AAClE,cAAc,mDAAmD,CAAC;AAClE,cAAc,kDAAkD,CAAC;AACjE,cAAc,kDAAkD,CAAC;AACjE,cAAc,oDAAoD,CAAC;AACnE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,kDAAkD,CAAC;AACjE,cAAc,wCAAwC,CAAC;AAEvD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAE/D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sDAAsD,CAAC;AAErE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yDAAyD,CAAC;AAExE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,4DAA4D,CAAC;AAC3E,cAAc,+DAA+D,CAAC;AAE9E,cAAc,sDAAsD,CAAC;AACrE,cAAc,0DAA0D,CAAC;AACzE,cAAc,uDAAuD,CAAC;AACtE,cAAc,qDAAqD,CAAC;AACpE,cAAc,0DAA0D,CAAC;AACzE,cAAc,sDAAsD,CAAC;AACrE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,8DAA8D,CAAC;AAE7E,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6DAA6D,CAAC;AAC5E,cAAc,+CAA+C,CAAC;AAC9D,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sDAAsD,CAAC;AACrE,cAAc,kDAAkD,CAAC;AACjE,cAAc,0DAA0D,CAAC;AAEzE,cAAc,sDAAsD,CAAC;AACrE,cAAc,4DAA4D,CAAC;AAE3E;;;;GAIG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG;AACH;;;GAGG"}
@@ -32,7 +32,6 @@ export * from "./imodel-components-react/quantityformat/MiscFormatOptions";
32
32
  export * from "./imodel-components-react/quantityformat/QuantityFormatPanel";
33
33
  export * from "./imodel-components-react/timeline/interfaces";
34
34
  export * from "./imodel-components-react/timeline/BaseTimelineDataProvider";
35
- export * from "./imodel-components-react/timeline/ContextMenu";
36
35
  export * from "./imodel-components-react/timeline/InlineEdit";
37
36
  export * from "./imodel-components-react/timeline/PlayerButton";
38
37
  export * from "./imodel-components-react/timeline/Scrubber";