@vertexvis/viewer 0.17.5-testing.4 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.template.md +3 -3
  2. package/dist/cjs/{controller-4e9ef328.js → controller-c7c4f333.js} +6 -6
  3. package/dist/cjs/controller-c7c4f333.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +2 -2
  5. package/dist/cjs/{scene-9762fef8.js → scene-4425281f.js} +6 -3
  6. package/dist/cjs/scene-4425281f.js.map +1 -0
  7. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js +1 -3
  8. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js.map +1 -1
  9. package/dist/cjs/vertex-scene-tree.cjs.entry.js +1 -1
  10. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
  11. package/dist/cjs/vertex-viewer.cjs.entry.js +13 -10
  12. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  13. package/dist/collection/components/scene-tree/lib/controller.js +5 -5
  14. package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
  15. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +1 -3
  16. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  17. package/dist/collection/components/viewer/viewer.js +3 -3
  18. package/dist/collection/components/viewer/viewer.js.map +1 -1
  19. package/dist/collection/lib/interactions/interactionApiOrthographic.js +5 -4
  20. package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
  21. package/dist/collection/lib/interactions/interactionApiPerspective.js +4 -3
  22. package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
  23. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js +3 -2
  24. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
  25. package/dist/collection/lib/types/loadableResource.js +5 -2
  26. package/dist/collection/lib/types/loadableResource.js.map +1 -1
  27. package/dist/collection/testing/viewer.js +2 -2
  28. package/dist/collection/testing/viewer.js.map +1 -1
  29. package/dist/custom-elements/index.js +23 -19
  30. package/dist/custom-elements/index.js.map +1 -1
  31. package/dist/esm/{controller-53f803d9.js → controller-bbcc1700.js} +6 -6
  32. package/dist/esm/controller-bbcc1700.js.map +1 -0
  33. package/dist/esm/index.js +2 -2
  34. package/dist/esm/index.mjs +2 -2
  35. package/dist/esm/{scene-1bd307f3.js → scene-31d88655.js} +6 -3
  36. package/dist/esm/scene-31d88655.js.map +1 -0
  37. package/dist/esm/vertex-scene-tree-search_3.entry.js +1 -3
  38. package/dist/esm/vertex-scene-tree-search_3.entry.js.map +1 -1
  39. package/dist/esm/vertex-scene-tree.entry.js +1 -1
  40. package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
  41. package/dist/esm/vertex-viewer.entry.js +13 -10
  42. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  43. package/dist/types/components/viewer/viewer.d.ts +2 -2
  44. package/dist/types/components.d.ts +3 -3
  45. package/dist/types/testing/viewer.d.ts +2 -2
  46. package/dist/viewer/index.esm.js +1 -1
  47. package/dist/viewer/{p-921ec41b.js → p-3d19b37e.js} +2 -2
  48. package/dist/viewer/p-3d19b37e.js.map +1 -0
  49. package/dist/viewer/p-43eb668e.js +5 -0
  50. package/dist/viewer/p-43eb668e.js.map +1 -0
  51. package/dist/viewer/{p-951a2e08.entry.js → p-5ce0269a.entry.js} +2 -2
  52. package/dist/viewer/p-5ce0269a.entry.js.map +1 -0
  53. package/dist/viewer/{p-1815d19b.entry.js → p-6114701c.entry.js} +2 -2
  54. package/dist/viewer/p-8f16e792.entry.js +5 -0
  55. package/dist/viewer/p-8f16e792.entry.js.map +1 -0
  56. package/dist/viewer/{p-9b8dae4a.entry.js → p-d256624d.entry.js} +2 -2
  57. package/dist/viewer/viewer.esm.js +1 -1
  58. package/package.json +7 -7
  59. package/readme.md +7 -7
  60. package/dist/cjs/controller-4e9ef328.js.map +0 -1
  61. package/dist/cjs/scene-9762fef8.js.map +0 -1
  62. package/dist/esm/controller-53f803d9.js.map +0 -1
  63. package/dist/esm/scene-1bd307f3.js.map +0 -1
  64. package/dist/viewer/p-27a5034e.entry.js +0 -5
  65. package/dist/viewer/p-27a5034e.entry.js.map +0 -1
  66. package/dist/viewer/p-921ec41b.js.map +0 -1
  67. package/dist/viewer/p-951a2e08.entry.js.map +0 -1
  68. package/dist/viewer/p-c3be5b4d.js +0 -5
  69. package/dist/viewer/p-c3be5b4d.js.map +0 -1
  70. /package/dist/viewer/{p-1815d19b.entry.js.map → p-6114701c.entry.js.map} +0 -0
  71. /package/dist/viewer/{p-9b8dae4a.entry.js.map → p-d256624d.entry.js.map} +0 -0
@@ -118,10 +118,10 @@ export class SceneTreeController {
118
118
  this.updateState(Object.assign(Object.assign({}, this.state), { connection: connecting }));
119
119
  try {
120
120
  this.log('Scene tree controller connecting.');
121
- const [, stream] = await Promise.all([
122
- this.fetchPage(0),
123
- this.subscribe(),
124
- ]);
121
+ // Ensure we have a subscription prior to attempting to get the first page
122
+ // to make sure we receive any ListChange that comes through
123
+ const stream = await this.subscribe();
124
+ await this.fetchPage(0);
125
125
  if (this.state.connection.type !== 'cancelled') {
126
126
  this.updateState(Object.assign(Object.assign({}, this.state), { connection: {
127
127
  jwtProvider,
@@ -789,7 +789,7 @@ export class SceneTreeController {
789
789
  return connection.type === 'connected';
790
790
  }
791
791
  }
792
- SceneTreeController.IDLE_RECONNECT_IN_SECONDS = 4 * 1;
792
+ SceneTreeController.IDLE_RECONNECT_IN_SECONDS = 4 * 60;
793
793
  SceneTreeController.LOST_CONNECTION_RECONNECT_IN_SECONDS = 2;
794
794
  SceneTreeController.MAX_SUBSCRIPTION_RETRY_COUNT = 2;
795
795
  //# sourceMappingURL=controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/components/scene-tree/lib/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\nimport { OffsetPager } from '@vertexvis/scene-tree-protos/core/protos/paging_pb';\nimport { Uuid } from '@vertexvis/scene-tree-protos/core/protos/uuid_pb';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport {\n CollapseAllRequest,\n CollapseNodeRequest,\n ExpandAllRequest,\n ExpandNodeRequest,\n FilterRequest,\n FilterResponse,\n GetAvailableColumnsRequest,\n GetAvailableColumnsResponse,\n GetNodeAncestorsRequest,\n GetNodeAncestorsResponse,\n GetTreeRequest,\n GetTreeResponse,\n LocateItemRequest,\n LocateItemResponse,\n SubscribeRequest,\n SubscribeResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb';\nimport {\n ResponseStream,\n SceneTreeAPIClient,\n ServiceError,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { MetadataKey } from '../types';\nimport {\n SceneTreeConnectionCancelledError,\n SceneTreeError,\n SceneTreeErrorCode,\n SceneTreeErrorDetails,\n SceneTreeOperationFailedError,\n SceneTreeUnauthorizedError,\n} from './errors';\nimport { isGrpcServiceError } from './grpc';\nimport { decodeSceneTreeJwt } from './jwt';\nimport { fromNodeProto, isLoadedRow, Row } from './row';\n\nexport interface ConnectOptions {\n spinnerDelay: number;\n idleReconnectInSeconds?: number;\n lostConnectionReconnectInSeconds?: number;\n subscriptionHandshakeGracePeriodInMs?: number;\n}\n\nexport type JwtProvider = () => string | undefined;\n\nexport interface SceneTreeState {\n totalRows: number;\n totalFilteredRows?: number;\n rows: Row[];\n connection: ConnectionState;\n isSearching: boolean;\n shouldShowLoading?: boolean;\n shouldShowEmptyResults?: boolean;\n filterTerm?: string;\n}\n\ninterface Page {\n id: number;\n index: number;\n metadataKeys: MetadataKey[];\n res: Promise<GetTreeResponse>;\n}\n\nexport interface DisconnectedState {\n type: 'disconnected';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\nexport interface ConnectingState {\n type: 'connecting';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface SubscriptionStatusState {\n attempt: number;\n stream: ResponseStream<SubscribeResponse>;\n}\n\nexport interface ConnectedState {\n type: 'connected';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n subscription: Disposable;\n subscriptionStatusState?: SubscriptionStatusState;\n}\n\nexport interface ConnectionFailedState {\n type: 'failure';\n details: SceneTreeErrorDetails;\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface ConnectionCancelledState {\n type: 'cancelled';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\n/**\n * A set of options to configure tree filtering behavior.\n */\nexport interface FilterTreeOptions {\n /**\n * Indicates if the filter should include nodes that within collapsed parent\n * nodes.\n */\n includeCollapsed?: boolean;\n\n /**\n * Indicates if the filter should be an exact match with the results.\n */\n exactMatch?: boolean;\n\n /**\n * The metadata keys to filter the tree on.\n */\n columns?: MetadataKey[];\n}\n\ntype ConnectionState =\n | DisconnectedState\n | ConnectingState\n | ConnectedState\n | ConnectionFailedState\n | ConnectionCancelledState;\n\n/**\n * The `SceneTreeController` is responsible for coordinating interactions of the\n * view, fetching and mutating tree data on the server, maintaining state and\n * notifying the view about state changes.\n */\nexport class SceneTreeController {\n private static IDLE_RECONNECT_IN_SECONDS = 4 * 1;\n private static LOST_CONNECTION_RECONNECT_IN_SECONDS = 2;\n private static MAX_SUBSCRIPTION_RETRY_COUNT = 2;\n\n private nextPageId = 0;\n private pages = new Map<number, Page>();\n private activeRowRange = [0, 0];\n private metadataKeys: MetadataKey[] = [];\n private debugLogs = false;\n\n private reconnectTimer?: number;\n private loadingTimer?: number;\n private subscriptionHandshakeTimer?: number;\n\n /**\n * A dispatcher that emits an event whenever the internal state has changed.\n */\n public onStateChange = new EventDispatcher<SceneTreeState>();\n\n private state: SceneTreeState = {\n totalRows: 0,\n isSearching: false,\n rows: [],\n connection: { type: 'disconnected' },\n };\n\n /**\n * The number of pages that have been fetched.\n */\n public get fetchedPageCount(): number {\n return this.pages.size;\n }\n\n /**\n * Indicates if the controller is connected to the tree backend, and can make\n * requests.\n */\n public get isConnected(): boolean {\n return this.state.connection.type === 'connected';\n }\n\n public constructor(\n private client: SceneTreeAPIClient,\n private rowLimit: number,\n private connectOptions: ConnectOptions = {\n spinnerDelay: 2000,\n subscriptionHandshakeGracePeriodInMs: 5000,\n }\n ) {}\n\n /**\n * Registers an event listener that will be invoked when the state changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public stateChanged(\n listener: Listener<SceneTreeState | undefined>\n ): Disposable {\n return this.onStateChange.on(listener);\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private async handleSubscriptionHandshakeTimeout(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): Promise<void> {\n const connection = this.getState().connection;\n if (\n this.isConnectedState(connection) &&\n connection.subscriptionStatusState?.attempt != null &&\n connection.subscriptionStatusState.attempt <\n SceneTreeController.MAX_SUBSCRIPTION_RETRY_COUNT\n ) {\n const newAttempt = connection.subscriptionStatusState.attempt + 1;\n console.warn(\n `Failed to subscribe within the allotted timeout. Retry attempt={${newAttempt}}`\n );\n connection.subscriptionStatusState.stream.cancel();\n this.clearHandshakeTimer();\n\n const stream = await this.subscribe();\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n\n this.updateState({\n ...this.state,\n connection: {\n ...connection,\n type: 'connected',\n subscription: {\n dispose: () => stream.cancel(),\n },\n subscriptionStatusState: {\n attempt: newAttempt,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n } else {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: new SceneTreeErrorDetails(\n 'SUBSCRIPTION_FAILURE',\n SceneTreeErrorCode.SUBSCRIPTION_FAILURE\n ),\n },\n });\n }\n }\n\n public async connect(jwtProvider: JwtProvider): Promise<void> {\n const { connection } = this.state;\n const jwt = jwtProvider();\n\n if (jwt == null) {\n throw new SceneTreeUnauthorizedError(\n 'Cannot connect scene tree. JWT is undefined'\n );\n }\n\n const { view: sceneViewId } = decodeSceneTreeJwt(jwt);\n\n if (connection.sceneViewId !== sceneViewId) {\n this.disconnect(true);\n } else {\n this.disconnect(false);\n }\n\n const connecting: ConnectingState = {\n type: 'connecting',\n jwtProvider,\n sceneViewId,\n };\n this.updateState({ ...this.state, connection: connecting });\n\n try {\n this.log('Scene tree controller connecting.');\n\n const [, stream] = await Promise.all([\n this.fetchPage(0),\n this.subscribe(),\n ]);\n\n if (this.state.connection.type !== 'cancelled') {\n this.updateState({\n ...this.state,\n connection: {\n jwtProvider,\n sceneViewId,\n type: 'connected',\n subscription: { dispose: () => stream.cancel() },\n subscriptionStatusState: {\n attempt: 0,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n }\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: this.getConnectionError(e),\n },\n });\n this.clearHandshakeTimer();\n throw e;\n });\n }\n\n this.startIdleReconnectTimer();\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer != null) {\n window.clearTimeout(this.reconnectTimer);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (this.subscriptionHandshakeTimer != null) {\n window.clearTimeout(this.subscriptionHandshakeTimer);\n }\n }\n\n private startIdleReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.idleReconnectInSeconds ||\n SceneTreeController.IDLE_RECONNECT_IN_SECONDS\n );\n }\n\n private startConnectionLostReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.lostConnectionReconnectInSeconds ||\n SceneTreeController.LOST_CONNECTION_RECONNECT_IN_SECONDS\n );\n }\n\n private startReconnectTimer(delayInSeconds: number): void {\n this.clearReconnectTimer();\n\n this.reconnectTimer = window.setTimeout(() => {\n if (this.state.connection.type === 'connected') {\n this.connect(this.state.connection.jwtProvider);\n }\n }, delayInSeconds * 1000);\n }\n\n public connectToViewer(viewer: HTMLVertexViewerElement): Disposable {\n const connectWithViewerJwt = async (): Promise<void> => {\n if (viewer.token != null) {\n this.log(\n 'Scene tree controller found viewer JWT. Attempting connection.'\n );\n\n try {\n await this.connect(() => viewer.token);\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n console.error('Scene tree controller errored connecting.', e);\n });\n }\n }\n };\n\n const handleSceneReady = (): void => {\n this.log('Scene tree controller received scene ready');\n connectWithViewerJwt();\n };\n\n connectWithViewerJwt();\n\n viewer.addEventListener('sceneReady', handleSceneReady);\n return {\n dispose: () => {\n viewer.removeEventListener('sceneReady', handleSceneReady);\n this.disconnect();\n },\n };\n }\n\n public disconnect(reset = false): void {\n this.log(`Scene tree controller disconnecting [reset=${reset}]`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n if (reset) {\n this.pages.clear();\n this.activeRowRange = [];\n }\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'disconnected',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: reset ? 0 : this.state.totalRows,\n rows: reset ? [] : this.state.rows,\n filterTerm: reset ? undefined : this.state.filterTerm,\n totalFilteredRows: reset ? undefined : this.state.totalFilteredRows,\n shouldShowEmptyResults: reset\n ? undefined\n : this.state.shouldShowEmptyResults,\n });\n }\n\n public cancel(): void {\n this.log(`Scene tree controller cancelled`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n this.pages.clear();\n this.activeRowRange = [];\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'cancelled',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: 0,\n rows: [],\n });\n }\n\n /**\n * Collapses a node with the given node ID.\n *\n * @param id A node ID to collapse.\n */\n public async collapseNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new CollapseNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Expands a node with the given node ID.\n *\n * @param id A node ID to expand.\n */\n public async expandNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new ExpandNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Collapses all nodes in the tree.\n */\n public async collapseAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseAll(new CollapseAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Expands all nodes in the tree.\n */\n public async expandAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandAll(new ExpandAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Invokes a network request that will expand all the parent nodes for the\n * node mapped to the given ID.\n *\n * @param id An ID of an item.\n * @returns A promise that resolves with the index of the node after\n * expansion.\n */\n public async expandParentNodes(id: string): Promise<number> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new LocateItemRequest();\n req.setNodeId(nodeId);\n\n const res = await this.requestUnary<LocateItemResponse>(\n jwt,\n (metadata, handler) => this.client.locateItem(req, metadata, handler)\n );\n const { requiresReload, locatedIndex } = res.toObject();\n\n if (requiresReload) {\n this.invalidateAfterOffset(0);\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n if (locatedIndex == null) {\n throw new SceneTreeOperationFailedError(\n 'Cannot locate node. Location index is undefined.'\n );\n }\n\n return locatedIndex.value;\n });\n }\n\n public async fetchNodeAncestors(nodeId: string): Promise<Node.AsObject[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeUuid = new Uuid();\n nodeUuid.setHex(nodeId);\n const req = new GetNodeAncestorsRequest();\n req.setNodeId(nodeUuid);\n\n const res = await this.requestUnary<GetNodeAncestorsResponse>(\n jwt,\n (metadata, handler) =>\n this.client.getNodeAncestors(req, metadata, handler)\n );\n\n return res.toObject().itemsList;\n });\n }\n\n /**\n * Fetches a page at the given index. Once the data has been fetched, the\n * controller will emit an `onStateChange` event that contains rows with the\n * fetched page. If a page is invalidated before the request completes, the\n * response is ignored.\n *\n * If the index is out of range, returns without fetching any data.\n *\n * @param index A 0 based index to fetch.\n */\n public async fetchPage(index: number): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n if (index < 0 || index > this.maxPages - 1) {\n return;\n }\n\n if (!this.pages.has(index)) {\n const offset = index * this.rowLimit;\n this.log('Scene tree fetching page', index, offset);\n const res = this.fetchTree(offset, this.rowLimit, jwt);\n const id = this.nextPageId++;\n const page = { id, res, index, metadataKeys: this.metadataKeys };\n this.pages.set(index, page);\n this.handlePageResult(page);\n }\n\n await this.pages.get(index)?.res;\n });\n }\n\n /**\n * Fetches a page that contains the given row offset.\n *\n * @param offset The row offset of the page to fetch.\n */\n public fetchPageAtOffset(offset: number): Promise<void> {\n const page = Math.floor(offset / this.rowLimit);\n return this.fetchPage(page);\n }\n\n /**\n * Fetches pages that contain the given row ranges.\n *\n * @param startOffset A start offset, inclusive.\n * @param endOffset The end offset, inclusive.\n */\n public async fetchRange(\n startOffset: number,\n endOffset: number\n ): Promise<void> {\n const startPage = Math.floor(startOffset / this.rowLimit);\n const endPage = Math.floor(endOffset / this.rowLimit);\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const pageCount = boundedEnd - boundedStart + 1;\n await Promise.all(\n Array.from({ length: pageCount }).map((_, page) => this.fetchPage(page))\n );\n }\n\n /**\n * Fetches the metadata keys for the current scene view.\n */\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const res = await this.requestUnary<GetAvailableColumnsResponse>(\n jwt,\n (meta, handler) => {\n const req = new GetAvailableColumnsRequest();\n this.client.getAvailableColumns(req, meta, handler);\n }\n );\n\n return res.getKeysList().map((value) => value.getValue());\n });\n }\n\n /**\n * Performs a network request that will filter the nodes in the tree that\n * match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n */\n public async filter(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n this.updateState({\n ...this.state,\n isSearching: true,\n filterTerm: term !== '' ? term : undefined,\n });\n try {\n const res = await this.requestUnary<FilterResponse>(\n jwt,\n (metadata, handler) => {\n const req = new FilterRequest();\n req.setFilter(term);\n req.setFullTree(options.includeCollapsed ?? true);\n req.setExactMatch(!!options.exactMatch);\n if (options.columns) req.setColumnsKeysList(options.columns);\n\n this.client.filter(req, metadata, handler);\n }\n );\n\n const { numberOfResults } = res.toObject();\n\n this.updateState({\n ...this.state,\n totalFilteredRows: numberOfResults,\n isSearching: false,\n });\n } catch (e) {\n console.error('Failed to filter search ', e);\n this.updateState({\n ...this.state,\n isSearching: false,\n });\n }\n });\n }\n\n /**\n * Checks if the page at the given index is loaded.\n *\n * @param index A page index.\n * @returns `true` if the page is loaded. `false` otherwise.\n */\n public isPageLoaded(index: number): boolean {\n return this.pages.has(index);\n }\n\n /**\n * Returns a list of page indices within a range that have not been loaded.\n *\n * @param start The start page index, inclusive.\n * @param end The end page index, inclusive.\n * @returns A list of pages indices that have not been loaded.\n */\n public getNonLoadedPageIndexes(start: number, end: number): number[] {\n const [boundedStart, boundedEnd] = this.constrainPageRange(start, end);\n const pageCount = boundedEnd - boundedStart + 1;\n return Array.from({ length: pageCount })\n .map((_, i) => boundedStart + i)\n .filter((page) => !this.isPageLoaded(page));\n }\n\n /**\n * Returns the page at the given index, or `undefined` if one doesn't exist.\n *\n * @param index The index to return.\n * @returns A `Page` if found, otherwise `undefined`.\n */\n public getPage(index: number): Page | undefined {\n return this.pages.get(index);\n }\n\n /**\n * Clears page data that is outside a given range. Uses a distance algorithm\n * to removes pages that are furthest from either end of the range. This\n * method is useful for clearing out data that is not needed anymore to keep\n * memory pressure in the client low.\n *\n * @param startPage The index of the starting page in the range.\n * @param endPage The index of the ending page in the range.\n * @param threshold A minimum number of pages to keep. No cleanup is performed\n * if the number of fetched pages doesn't meet this threshold.\n */\n public invalidatePagesOutsideRange(\n startPage: number,\n endPage: number,\n threshold = 0\n ): void {\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const boundedThreshold = Math.max(boundedEnd - boundedStart, threshold);\n if (this.fetchedPageCount > boundedThreshold) {\n const pages = Array.from(this.pages.keys()).map((index) => {\n const distance =\n index < boundedStart ? boundedStart - index : index - boundedEnd;\n return { index, distance };\n });\n const sortedDesc = pages.sort((a, b) => b.distance - a.distance);\n\n sortedDesc\n .slice(0, pages.length - threshold)\n .forEach(({ index }) => this.invalidatePage(index));\n\n this.log(\n `Scene tree dropped ${pages.length - this.fetchedPageCount} pages`,\n this.pages\n );\n }\n }\n\n public setMetadataKeys(keys: MetadataKey[]): Promise<void> {\n this.metadataKeys = keys;\n\n if (this.state.connection.type === 'connected') {\n const [start, end] = this.activeRowRange;\n this.invalidateAfterOffset(0);\n return this.updateActiveRowRange(start, end);\n } else {\n return Promise.resolve();\n }\n }\n\n /**\n * Sets the active rows. Active rows dictate which pages will be refetched\n * when the tree changes.\n *\n * @param start The starting row index.\n * @param end The ending row index.\n * @returns A promise that resolves when the first page of data has been\n * loaded.\n */\n public async updateActiveRowRange(start: number, end: number): Promise<void> {\n this.activeRowRange = this.constrainRowOffsets(start, end);\n\n this.tryClearLoadingTimer(this.state);\n\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n /**\n * Performs a network request that will listen to server-side changes of the\n * scene tree's data.\n */\n private subscribe(): Promise<ResponseStream<SubscribeResponse>> {\n return this.ifConnectionHasJwt((jwt) => {\n const stream = this.requestServerStream(jwt, (metadata) => {\n const sub = this.client.subscribe(new SubscribeRequest(), metadata);\n return sub;\n });\n\n stream.on('data', (msg: SubscribeResponse) => {\n if (msg.hasHandshake()) {\n this.clearHandshakeTimer();\n }\n\n this.startIdleReconnectTimer();\n\n const { change } = msg.toObject();\n\n if (change?.listChange != null) {\n this.log('Received list change', change.listChange.start);\n this.invalidateAfterOffset(change.listChange.start);\n this.fetchUnloadedPagesInActiveRows();\n }\n\n const {\n hiddenList = [],\n shownList = [],\n partiallyVisibleList = [],\n deselectedList = [],\n selectedList = [],\n } = change?.ranges || {};\n\n if (partiallyVisibleList.length > 0) {\n this.log(\n 'Received partial visibility list change',\n partiallyVisibleList\n );\n\n partiallyVisibleList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n partiallyVisible: true,\n }))\n );\n }\n\n if (hiddenList.length > 0) {\n this.log('Received hidden list change', hiddenList);\n\n hiddenList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: false,\n partiallyVisible: false,\n }))\n );\n }\n\n if (shownList.length > 0) {\n this.log('Received shown list change', shownList);\n\n shownList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: true,\n partiallyVisible: false,\n }))\n );\n }\n\n if (deselectedList.length > 0) {\n this.log('Received deselected list change', deselectedList);\n\n deselectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: false }))\n );\n }\n\n if (selectedList.length > 0) {\n this.log('Received selected list change', selectedList);\n\n selectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: true }))\n );\n }\n });\n\n stream.on('status', (s) => {\n if (s.code !== 0) {\n console.error(\n `Failed to subscribe to scene tree with code=${s.code}, details=${s.details}`\n );\n this.invalidateAfterOffset(0);\n }\n });\n\n stream.on('end', () => {\n this.invalidateAfterOffset(0);\n\n if (this.state.connection.type === 'connected') {\n this.startConnectionLostReconnectTimer();\n }\n });\n\n return stream;\n });\n }\n\n private async fetchUnloadedPagesInActiveRows(): Promise<void> {\n const [startPage, endPage] = this.getPageIndexesForRange(\n this.activeRowRange[0],\n this.activeRowRange[1]\n );\n\n const pages = this.getNonLoadedPageIndexes(startPage - 1, endPage + 1);\n await Promise.all(pages.map((page) => this.fetchPage(page)));\n }\n\n private patchNodesInRange(\n start: number,\n end: number,\n transform: (node: Node.AsObject) => Partial<Node.AsObject>\n ): void {\n const updatedRows = this.state.rows\n .slice(start, end + 1)\n .map((row) =>\n isLoadedRow(row)\n ? { ...row, node: { ...row.node, ...transform(row.node) } }\n : row\n );\n\n const startRows = this.state.rows.slice(0, start);\n const endRows = this.state.rows.slice(end + 1);\n const rows = [...startRows, ...updatedRows, ...endRows];\n\n this.updateState({ ...this.state, rows });\n }\n\n private async handlePageResult(page: Page): Promise<void> {\n try {\n const res = await page.res;\n\n const currentPage = this.getPage(page.index);\n\n // Only handle the result if the page has not been invalidated.\n if (currentPage?.id === page.id) {\n const cursor = res.getCursor();\n const itemsList = res.getItemsList();\n\n const totalRows = cursor?.getTotal() ?? 0;\n const offset = page.index * this.rowLimit;\n const fetchedRows = fromNodeProto(\n offset,\n itemsList,\n currentPage.metadataKeys\n );\n\n const start = this.state.rows.slice(0, offset);\n const end = this.state.rows.slice(\n start.length + fetchedRows.length,\n totalRows\n );\n const fill = new Array(\n Math.max(\n 0,\n totalRows - start.length - fetchedRows.length - end.length\n )\n );\n const rows = [...start, ...fetchedRows, ...end, ...fill];\n\n if (this.isViewLoading(rows) && this.loadingTimer == null) {\n this.restartLoadingTimer();\n\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n } else {\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n }\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.toString() : 'Unknown';\n console.error(\n `Request error fetching page at index ${page.index} (${errorMessage})`\n );\n\n const currentPage = this.getPage(page.index);\n if (currentPage?.id === page.id) {\n this.invalidatePage(page.index);\n }\n }\n }\n\n private invalidatePage(index: number): void {\n if (this.isPageLoaded(index)) {\n this.pages.delete(index);\n }\n }\n\n private invalidateAfterOffset(offset: number): void {\n const pageIndex = Math.floor(offset / this.rowLimit);\n\n for (const index of this.pages.keys()) {\n if (index >= pageIndex) {\n this.invalidatePage(index);\n }\n }\n }\n\n private getState(): SceneTreeState {\n return this.state;\n }\n\n private isViewLoading(rows: Row[]): boolean {\n return (\n this.state.filterTerm == null &&\n rows[this.activeRowRange[0]] == null &&\n rows[this.activeRowRange[1]] == null\n );\n }\n\n private restartLoadingTimer(): void {\n if (this.loadingTimer != null) {\n this.clearLoadingTimer();\n }\n\n this.loadingTimer = window.setTimeout(() => {\n this.loadingTimer = undefined;\n this.updateState({\n ...this.getState(),\n shouldShowLoading: true,\n });\n }, this.connectOptions.spinnerDelay);\n }\n\n private clearLoadingTimer(): void {\n if (this.loadingTimer != null) {\n clearTimeout(this.loadingTimer);\n this.loadingTimer = undefined;\n }\n }\n\n private tryClearLoadingTimer(state: SceneTreeState): boolean {\n const loadingShowingOrTimerStarted =\n this.state.shouldShowLoading || this.loadingTimer != null;\n const updateLoadingTimer =\n loadingShowingOrTimerStarted && !this.isViewLoading(state.rows);\n if (updateLoadingTimer) {\n this.clearLoadingTimer();\n return true;\n }\n return false;\n }\n\n private updateState(newState: SceneTreeState): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(newState);\n\n this.state = {\n ...newState,\n shouldShowLoading: didClearLoadingTimer\n ? false\n : newState.shouldShowLoading,\n };\n\n this.onStateChange.emit(this.state);\n }\n\n public getPageForOffset(offset: number): number {\n const index = Math.floor(offset / this.rowLimit);\n return this.constrainPageIndex(index);\n }\n\n public getPageIndexesForRange(start: number, end: number): [number, number] {\n const pageStart = this.getPageForOffset(start);\n const pageEnd = this.getPageForOffset(end);\n return [pageStart, pageEnd];\n }\n\n private async fetchTree(\n offset: number,\n limit: number,\n jwt: string\n ): Promise<GetTreeResponse> {\n return this.requestUnary(jwt, (metadata, handler) => {\n const pager = new OffsetPager();\n pager.setOffset(offset);\n pager.setLimit(limit);\n\n const req = new GetTreeRequest();\n req.setPager(pager);\n req.setAdditionalColumnKeysList(this.metadataKeys);\n\n this.client.getTree(req, metadata, handler);\n });\n }\n\n private requestUnary<R>(\n jwt: string,\n req: (\n metadata: grpc.Metadata,\n handler: (err: ServiceError | null, res: R | null) => void\n ) => void\n ): Promise<R> {\n return new Promise((resolve, reject) => {\n const metadata = this.createJwtMetadata(jwt);\n\n req(metadata, (err, res) => {\n if (err != null) {\n reject(err);\n } else if (res != null) {\n resolve(res);\n } else {\n reject(\n new SceneTreeError(\n 'Invalid response. Both error and result are null'\n )\n );\n }\n });\n });\n }\n\n private requestServerStream<R>(\n jwt: string,\n req: (metadata: grpc.Metadata) => ResponseStream<R>\n ): ResponseStream<R> {\n const metadata = this.createJwtMetadata(jwt);\n return req(metadata);\n }\n\n private createJwtMetadata(jwt: string): grpc.Metadata {\n return new grpc.Metadata({\n 'jwt-context': JSON.stringify({ jwt }),\n });\n }\n\n private async ifConnectionHasJwt<T>(then: (jwt: string) => T): Promise<T> {\n const { connection } = this.state;\n if (connection.type === 'connecting' || connection.type === 'connected') {\n const jwt = await connection.jwtProvider();\n if (jwt != null) {\n return then(jwt);\n } else {\n throw new SceneTreeUnauthorizedError(\n 'SceneTreeController cannot perform request. Viewer JWT is undefined.'\n );\n }\n } else if (connection.type === 'cancelled') {\n throw new SceneTreeConnectionCancelledError(\n `Request attempted, but controller was cancelled`\n );\n } else {\n throw new SceneTreeError('SceneTreeController is not in connected state');\n }\n }\n\n private ifErrorIsFatal(error: unknown, then: VoidFunction): void {\n if (!(error instanceof SceneTreeConnectionCancelledError)) {\n then();\n }\n }\n\n private getConnectionError(\n e: ServiceError | Error | unknown\n ): SceneTreeErrorDetails {\n if (isGrpcServiceError(e)) {\n if (e.code === grpc.Code.FailedPrecondition) {\n return new SceneTreeErrorDetails(\n 'SCENE_TREE_DISABLED',\n SceneTreeErrorCode.SCENE_TREE_DISABLED\n );\n } else if (e.code === grpc.Code.Unauthenticated) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else if (e.code === grpc.Code.Aborted) {\n return new SceneTreeErrorDetails('ABORTED', SceneTreeErrorCode.ABORTED);\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n } else if (e instanceof SceneTreeUnauthorizedError) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n }\n\n private constrainPageRange(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.maxPages - 1, end)];\n }\n\n private constrainPageIndex(index: number): number {\n return Math.max(0, Math.min(index, this.maxPages - 1));\n }\n\n private constrainRowOffsets(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.state.totalRows - 1, end)];\n }\n\n private get maxPages(): number {\n return Math.max(1, Math.ceil(this.state.totalRows / this.rowLimit));\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n\n private isConnectedState(\n connection: ConnectionState\n ): connection is ConnectedState {\n return connection.type === 'connected';\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/components/scene-tree/lib/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\nimport { OffsetPager } from '@vertexvis/scene-tree-protos/core/protos/paging_pb';\nimport { Uuid } from '@vertexvis/scene-tree-protos/core/protos/uuid_pb';\nimport { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';\nimport {\n CollapseAllRequest,\n CollapseNodeRequest,\n ExpandAllRequest,\n ExpandNodeRequest,\n FilterRequest,\n FilterResponse,\n GetAvailableColumnsRequest,\n GetAvailableColumnsResponse,\n GetNodeAncestorsRequest,\n GetNodeAncestorsResponse,\n GetTreeRequest,\n GetTreeResponse,\n LocateItemRequest,\n LocateItemResponse,\n SubscribeRequest,\n SubscribeResponse,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb';\nimport {\n ResponseStream,\n SceneTreeAPIClient,\n ServiceError,\n} from '@vertexvis/scene-tree-protos/scenetree/protos/scene_tree_api_pb_service';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { MetadataKey } from '../types';\nimport {\n SceneTreeConnectionCancelledError,\n SceneTreeError,\n SceneTreeErrorCode,\n SceneTreeErrorDetails,\n SceneTreeOperationFailedError,\n SceneTreeUnauthorizedError,\n} from './errors';\nimport { isGrpcServiceError } from './grpc';\nimport { decodeSceneTreeJwt } from './jwt';\nimport { fromNodeProto, isLoadedRow, Row } from './row';\n\nexport interface ConnectOptions {\n spinnerDelay: number;\n idleReconnectInSeconds?: number;\n lostConnectionReconnectInSeconds?: number;\n subscriptionHandshakeGracePeriodInMs?: number;\n}\n\nexport type JwtProvider = () => string | undefined;\n\nexport interface SceneTreeState {\n totalRows: number;\n totalFilteredRows?: number;\n rows: Row[];\n connection: ConnectionState;\n isSearching: boolean;\n shouldShowLoading?: boolean;\n shouldShowEmptyResults?: boolean;\n filterTerm?: string;\n}\n\ninterface Page {\n id: number;\n index: number;\n metadataKeys: MetadataKey[];\n res: Promise<GetTreeResponse>;\n}\n\nexport interface DisconnectedState {\n type: 'disconnected';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\nexport interface ConnectingState {\n type: 'connecting';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface SubscriptionStatusState {\n attempt: number;\n stream: ResponseStream<SubscribeResponse>;\n}\n\nexport interface ConnectedState {\n type: 'connected';\n jwtProvider: JwtProvider;\n sceneViewId: string;\n subscription: Disposable;\n subscriptionStatusState?: SubscriptionStatusState;\n}\n\nexport interface ConnectionFailedState {\n type: 'failure';\n details: SceneTreeErrorDetails;\n jwtProvider: JwtProvider;\n sceneViewId: string;\n}\n\nexport interface ConnectionCancelledState {\n type: 'cancelled';\n jwtProvider?: JwtProvider;\n sceneViewId?: string;\n}\n\n/**\n * A set of options to configure tree filtering behavior.\n */\nexport interface FilterTreeOptions {\n /**\n * Indicates if the filter should include nodes that within collapsed parent\n * nodes.\n */\n includeCollapsed?: boolean;\n\n /**\n * Indicates if the filter should be an exact match with the results.\n */\n exactMatch?: boolean;\n\n /**\n * The metadata keys to filter the tree on.\n */\n columns?: MetadataKey[];\n}\n\ntype ConnectionState =\n | DisconnectedState\n | ConnectingState\n | ConnectedState\n | ConnectionFailedState\n | ConnectionCancelledState;\n\n/**\n * The `SceneTreeController` is responsible for coordinating interactions of the\n * view, fetching and mutating tree data on the server, maintaining state and\n * notifying the view about state changes.\n */\nexport class SceneTreeController {\n private static IDLE_RECONNECT_IN_SECONDS = 4 * 60;\n private static LOST_CONNECTION_RECONNECT_IN_SECONDS = 2;\n private static MAX_SUBSCRIPTION_RETRY_COUNT = 2;\n\n private nextPageId = 0;\n private pages = new Map<number, Page>();\n private activeRowRange = [0, 0];\n private metadataKeys: MetadataKey[] = [];\n private debugLogs = false;\n\n private reconnectTimer?: number;\n private loadingTimer?: number;\n private subscriptionHandshakeTimer?: number;\n\n /**\n * A dispatcher that emits an event whenever the internal state has changed.\n */\n public onStateChange = new EventDispatcher<SceneTreeState>();\n\n private state: SceneTreeState = {\n totalRows: 0,\n isSearching: false,\n rows: [],\n connection: { type: 'disconnected' },\n };\n\n /**\n * The number of pages that have been fetched.\n */\n public get fetchedPageCount(): number {\n return this.pages.size;\n }\n\n /**\n * Indicates if the controller is connected to the tree backend, and can make\n * requests.\n */\n public get isConnected(): boolean {\n return this.state.connection.type === 'connected';\n }\n\n public constructor(\n private client: SceneTreeAPIClient,\n private rowLimit: number,\n private connectOptions: ConnectOptions = {\n spinnerDelay: 2000,\n subscriptionHandshakeGracePeriodInMs: 5000,\n }\n ) {}\n\n /**\n * Registers an event listener that will be invoked when the state changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public stateChanged(\n listener: Listener<SceneTreeState | undefined>\n ): Disposable {\n return this.onStateChange.on(listener);\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private async handleSubscriptionHandshakeTimeout(\n jwtProvider: JwtProvider,\n sceneViewId: string\n ): Promise<void> {\n const connection = this.getState().connection;\n if (\n this.isConnectedState(connection) &&\n connection.subscriptionStatusState?.attempt != null &&\n connection.subscriptionStatusState.attempt <\n SceneTreeController.MAX_SUBSCRIPTION_RETRY_COUNT\n ) {\n const newAttempt = connection.subscriptionStatusState.attempt + 1;\n console.warn(\n `Failed to subscribe within the allotted timeout. Retry attempt={${newAttempt}}`\n );\n connection.subscriptionStatusState.stream.cancel();\n this.clearHandshakeTimer();\n\n const stream = await this.subscribe();\n\n this.invalidateAfterOffset(0);\n this.fetchUnloadedPagesInActiveRows();\n\n this.updateState({\n ...this.state,\n connection: {\n ...connection,\n type: 'connected',\n subscription: {\n dispose: () => stream.cancel(),\n },\n subscriptionStatusState: {\n attempt: newAttempt,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n } else {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: new SceneTreeErrorDetails(\n 'SUBSCRIPTION_FAILURE',\n SceneTreeErrorCode.SUBSCRIPTION_FAILURE\n ),\n },\n });\n }\n }\n\n public async connect(jwtProvider: JwtProvider): Promise<void> {\n const { connection } = this.state;\n const jwt = jwtProvider();\n\n if (jwt == null) {\n throw new SceneTreeUnauthorizedError(\n 'Cannot connect scene tree. JWT is undefined'\n );\n }\n\n const { view: sceneViewId } = decodeSceneTreeJwt(jwt);\n\n if (connection.sceneViewId !== sceneViewId) {\n this.disconnect(true);\n } else {\n this.disconnect(false);\n }\n\n const connecting: ConnectingState = {\n type: 'connecting',\n jwtProvider,\n sceneViewId,\n };\n this.updateState({ ...this.state, connection: connecting });\n\n try {\n this.log('Scene tree controller connecting.');\n\n // Ensure we have a subscription prior to attempting to get the first page\n // to make sure we receive any ListChange that comes through\n const stream = await this.subscribe();\n await this.fetchPage(0);\n\n if (this.state.connection.type !== 'cancelled') {\n this.updateState({\n ...this.state,\n connection: {\n jwtProvider,\n sceneViewId,\n type: 'connected',\n subscription: { dispose: () => stream.cancel() },\n subscriptionStatusState: {\n attempt: 0,\n stream,\n },\n },\n });\n\n this.subscriptionHandshakeTimer = window.setTimeout(() => {\n this.handleSubscriptionHandshakeTimeout(jwtProvider, sceneViewId);\n }, this.connectOptions.subscriptionHandshakeGracePeriodInMs);\n }\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n this.updateState({\n ...this.state,\n connection: {\n type: 'failure',\n jwtProvider,\n sceneViewId,\n details: this.getConnectionError(e),\n },\n });\n this.clearHandshakeTimer();\n throw e;\n });\n }\n\n this.startIdleReconnectTimer();\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer != null) {\n window.clearTimeout(this.reconnectTimer);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (this.subscriptionHandshakeTimer != null) {\n window.clearTimeout(this.subscriptionHandshakeTimer);\n }\n }\n\n private startIdleReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.idleReconnectInSeconds ||\n SceneTreeController.IDLE_RECONNECT_IN_SECONDS\n );\n }\n\n private startConnectionLostReconnectTimer(): void {\n this.startReconnectTimer(\n this.connectOptions.lostConnectionReconnectInSeconds ||\n SceneTreeController.LOST_CONNECTION_RECONNECT_IN_SECONDS\n );\n }\n\n private startReconnectTimer(delayInSeconds: number): void {\n this.clearReconnectTimer();\n\n this.reconnectTimer = window.setTimeout(() => {\n if (this.state.connection.type === 'connected') {\n this.connect(this.state.connection.jwtProvider);\n }\n }, delayInSeconds * 1000);\n }\n\n public connectToViewer(viewer: HTMLVertexViewerElement): Disposable {\n const connectWithViewerJwt = async (): Promise<void> => {\n if (viewer.token != null) {\n this.log(\n 'Scene tree controller found viewer JWT. Attempting connection.'\n );\n\n try {\n await this.connect(() => viewer.token);\n } catch (e) {\n this.ifErrorIsFatal(e, () => {\n console.error('Scene tree controller errored connecting.', e);\n });\n }\n }\n };\n\n const handleSceneReady = (): void => {\n this.log('Scene tree controller received scene ready');\n connectWithViewerJwt();\n };\n\n connectWithViewerJwt();\n\n viewer.addEventListener('sceneReady', handleSceneReady);\n return {\n dispose: () => {\n viewer.removeEventListener('sceneReady', handleSceneReady);\n this.disconnect();\n },\n };\n }\n\n public disconnect(reset = false): void {\n this.log(`Scene tree controller disconnecting [reset=${reset}]`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n if (reset) {\n this.pages.clear();\n this.activeRowRange = [];\n }\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'disconnected',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: reset ? 0 : this.state.totalRows,\n rows: reset ? [] : this.state.rows,\n filterTerm: reset ? undefined : this.state.filterTerm,\n totalFilteredRows: reset ? undefined : this.state.totalFilteredRows,\n shouldShowEmptyResults: reset\n ? undefined\n : this.state.shouldShowEmptyResults,\n });\n }\n\n public cancel(): void {\n this.log(`Scene tree controller cancelled`);\n\n this.clearHandshakeTimer();\n this.clearReconnectTimer();\n\n this.pages.clear();\n this.activeRowRange = [];\n\n const { connection } = this.state;\n if (connection.type === 'connected') {\n connection.subscription.dispose();\n }\n\n this.updateState({\n connection: {\n type: 'cancelled',\n jwtProvider: connection.jwtProvider,\n sceneViewId: connection.sceneViewId,\n },\n isSearching: false,\n totalRows: 0,\n rows: [],\n });\n }\n\n /**\n * Collapses a node with the given node ID.\n *\n * @param id A node ID to collapse.\n */\n public async collapseNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new CollapseNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Expands a node with the given node ID.\n *\n * @param id A node ID to expand.\n */\n public async expandNode(id: string): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new ExpandNodeRequest();\n req.setNodeId(nodeId);\n\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandNode(req, metadata, handler)\n );\n });\n }\n\n /**\n * Collapses all nodes in the tree.\n */\n public async collapseAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.collapseAll(new CollapseAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Expands all nodes in the tree.\n */\n public async expandAll(): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n await this.requestUnary(jwt, (metadata, handler) =>\n this.client.expandAll(new ExpandAllRequest(), metadata, handler)\n );\n });\n }\n\n /**\n * Invokes a network request that will expand all the parent nodes for the\n * node mapped to the given ID.\n *\n * @param id An ID of an item.\n * @returns A promise that resolves with the index of the node after\n * expansion.\n */\n public async expandParentNodes(id: string): Promise<number> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeId = new Uuid();\n nodeId.setHex(id);\n\n const req = new LocateItemRequest();\n req.setNodeId(nodeId);\n\n const res = await this.requestUnary<LocateItemResponse>(\n jwt,\n (metadata, handler) => this.client.locateItem(req, metadata, handler)\n );\n const { requiresReload, locatedIndex } = res.toObject();\n\n if (requiresReload) {\n this.invalidateAfterOffset(0);\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n if (locatedIndex == null) {\n throw new SceneTreeOperationFailedError(\n 'Cannot locate node. Location index is undefined.'\n );\n }\n\n return locatedIndex.value;\n });\n }\n\n public async fetchNodeAncestors(nodeId: string): Promise<Node.AsObject[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const nodeUuid = new Uuid();\n nodeUuid.setHex(nodeId);\n const req = new GetNodeAncestorsRequest();\n req.setNodeId(nodeUuid);\n\n const res = await this.requestUnary<GetNodeAncestorsResponse>(\n jwt,\n (metadata, handler) =>\n this.client.getNodeAncestors(req, metadata, handler)\n );\n\n return res.toObject().itemsList;\n });\n }\n\n /**\n * Fetches a page at the given index. Once the data has been fetched, the\n * controller will emit an `onStateChange` event that contains rows with the\n * fetched page. If a page is invalidated before the request completes, the\n * response is ignored.\n *\n * If the index is out of range, returns without fetching any data.\n *\n * @param index A 0 based index to fetch.\n */\n public async fetchPage(index: number): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n if (index < 0 || index > this.maxPages - 1) {\n return;\n }\n\n if (!this.pages.has(index)) {\n const offset = index * this.rowLimit;\n this.log('Scene tree fetching page', index, offset);\n const res = this.fetchTree(offset, this.rowLimit, jwt);\n const id = this.nextPageId++;\n const page = { id, res, index, metadataKeys: this.metadataKeys };\n this.pages.set(index, page);\n this.handlePageResult(page);\n }\n\n await this.pages.get(index)?.res;\n });\n }\n\n /**\n * Fetches a page that contains the given row offset.\n *\n * @param offset The row offset of the page to fetch.\n */\n public fetchPageAtOffset(offset: number): Promise<void> {\n const page = Math.floor(offset / this.rowLimit);\n return this.fetchPage(page);\n }\n\n /**\n * Fetches pages that contain the given row ranges.\n *\n * @param startOffset A start offset, inclusive.\n * @param endOffset The end offset, inclusive.\n */\n public async fetchRange(\n startOffset: number,\n endOffset: number\n ): Promise<void> {\n const startPage = Math.floor(startOffset / this.rowLimit);\n const endPage = Math.floor(endOffset / this.rowLimit);\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const pageCount = boundedEnd - boundedStart + 1;\n await Promise.all(\n Array.from({ length: pageCount }).map((_, page) => this.fetchPage(page))\n );\n }\n\n /**\n * Fetches the metadata keys for the current scene view.\n */\n public async fetchMetadataKeys(): Promise<MetadataKey[]> {\n return this.ifConnectionHasJwt(async (jwt) => {\n const res = await this.requestUnary<GetAvailableColumnsResponse>(\n jwt,\n (meta, handler) => {\n const req = new GetAvailableColumnsRequest();\n this.client.getAvailableColumns(req, meta, handler);\n }\n );\n\n return res.getKeysList().map((value) => value.getValue());\n });\n }\n\n /**\n * Performs a network request that will filter the nodes in the tree that\n * match the given term and options.\n *\n * @param term The filter term.\n * @param options The options to apply to the filter.\n */\n public async filter(\n term: string,\n options: FilterTreeOptions = {}\n ): Promise<void> {\n return this.ifConnectionHasJwt(async (jwt) => {\n this.updateState({\n ...this.state,\n isSearching: true,\n filterTerm: term !== '' ? term : undefined,\n });\n try {\n const res = await this.requestUnary<FilterResponse>(\n jwt,\n (metadata, handler) => {\n const req = new FilterRequest();\n req.setFilter(term);\n req.setFullTree(options.includeCollapsed ?? true);\n req.setExactMatch(!!options.exactMatch);\n if (options.columns) req.setColumnsKeysList(options.columns);\n\n this.client.filter(req, metadata, handler);\n }\n );\n\n const { numberOfResults } = res.toObject();\n\n this.updateState({\n ...this.state,\n totalFilteredRows: numberOfResults,\n isSearching: false,\n });\n } catch (e) {\n console.error('Failed to filter search ', e);\n this.updateState({\n ...this.state,\n isSearching: false,\n });\n }\n });\n }\n\n /**\n * Checks if the page at the given index is loaded.\n *\n * @param index A page index.\n * @returns `true` if the page is loaded. `false` otherwise.\n */\n public isPageLoaded(index: number): boolean {\n return this.pages.has(index);\n }\n\n /**\n * Returns a list of page indices within a range that have not been loaded.\n *\n * @param start The start page index, inclusive.\n * @param end The end page index, inclusive.\n * @returns A list of pages indices that have not been loaded.\n */\n public getNonLoadedPageIndexes(start: number, end: number): number[] {\n const [boundedStart, boundedEnd] = this.constrainPageRange(start, end);\n const pageCount = boundedEnd - boundedStart + 1;\n return Array.from({ length: pageCount })\n .map((_, i) => boundedStart + i)\n .filter((page) => !this.isPageLoaded(page));\n }\n\n /**\n * Returns the page at the given index, or `undefined` if one doesn't exist.\n *\n * @param index The index to return.\n * @returns A `Page` if found, otherwise `undefined`.\n */\n public getPage(index: number): Page | undefined {\n return this.pages.get(index);\n }\n\n /**\n * Clears page data that is outside a given range. Uses a distance algorithm\n * to removes pages that are furthest from either end of the range. This\n * method is useful for clearing out data that is not needed anymore to keep\n * memory pressure in the client low.\n *\n * @param startPage The index of the starting page in the range.\n * @param endPage The index of the ending page in the range.\n * @param threshold A minimum number of pages to keep. No cleanup is performed\n * if the number of fetched pages doesn't meet this threshold.\n */\n public invalidatePagesOutsideRange(\n startPage: number,\n endPage: number,\n threshold = 0\n ): void {\n const [boundedStart, boundedEnd] = this.constrainPageRange(\n startPage,\n endPage\n );\n const boundedThreshold = Math.max(boundedEnd - boundedStart, threshold);\n if (this.fetchedPageCount > boundedThreshold) {\n const pages = Array.from(this.pages.keys()).map((index) => {\n const distance =\n index < boundedStart ? boundedStart - index : index - boundedEnd;\n return { index, distance };\n });\n const sortedDesc = pages.sort((a, b) => b.distance - a.distance);\n\n sortedDesc\n .slice(0, pages.length - threshold)\n .forEach(({ index }) => this.invalidatePage(index));\n\n this.log(\n `Scene tree dropped ${pages.length - this.fetchedPageCount} pages`,\n this.pages\n );\n }\n }\n\n public setMetadataKeys(keys: MetadataKey[]): Promise<void> {\n this.metadataKeys = keys;\n\n if (this.state.connection.type === 'connected') {\n const [start, end] = this.activeRowRange;\n this.invalidateAfterOffset(0);\n return this.updateActiveRowRange(start, end);\n } else {\n return Promise.resolve();\n }\n }\n\n /**\n * Sets the active rows. Active rows dictate which pages will be refetched\n * when the tree changes.\n *\n * @param start The starting row index.\n * @param end The ending row index.\n * @returns A promise that resolves when the first page of data has been\n * loaded.\n */\n public async updateActiveRowRange(start: number, end: number): Promise<void> {\n this.activeRowRange = this.constrainRowOffsets(start, end);\n\n this.tryClearLoadingTimer(this.state);\n\n await this.fetchUnloadedPagesInActiveRows();\n }\n\n /**\n * Performs a network request that will listen to server-side changes of the\n * scene tree's data.\n */\n private subscribe(): Promise<ResponseStream<SubscribeResponse>> {\n return this.ifConnectionHasJwt((jwt) => {\n const stream = this.requestServerStream(jwt, (metadata) => {\n const sub = this.client.subscribe(new SubscribeRequest(), metadata);\n return sub;\n });\n\n stream.on('data', (msg: SubscribeResponse) => {\n if (msg.hasHandshake()) {\n this.clearHandshakeTimer();\n }\n\n this.startIdleReconnectTimer();\n\n const { change } = msg.toObject();\n\n if (change?.listChange != null) {\n this.log('Received list change', change.listChange.start);\n this.invalidateAfterOffset(change.listChange.start);\n this.fetchUnloadedPagesInActiveRows();\n }\n\n const {\n hiddenList = [],\n shownList = [],\n partiallyVisibleList = [],\n deselectedList = [],\n selectedList = [],\n } = change?.ranges || {};\n\n if (partiallyVisibleList.length > 0) {\n this.log(\n 'Received partial visibility list change',\n partiallyVisibleList\n );\n\n partiallyVisibleList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n partiallyVisible: true,\n }))\n );\n }\n\n if (hiddenList.length > 0) {\n this.log('Received hidden list change', hiddenList);\n\n hiddenList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: false,\n partiallyVisible: false,\n }))\n );\n }\n\n if (shownList.length > 0) {\n this.log('Received shown list change', shownList);\n\n shownList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({\n visible: true,\n partiallyVisible: false,\n }))\n );\n }\n\n if (deselectedList.length > 0) {\n this.log('Received deselected list change', deselectedList);\n\n deselectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: false }))\n );\n }\n\n if (selectedList.length > 0) {\n this.log('Received selected list change', selectedList);\n\n selectedList.forEach(({ start, end }) =>\n this.patchNodesInRange(start, end, () => ({ selected: true }))\n );\n }\n });\n\n stream.on('status', (s) => {\n if (s.code !== 0) {\n console.error(\n `Failed to subscribe to scene tree with code=${s.code}, details=${s.details}`\n );\n this.invalidateAfterOffset(0);\n }\n });\n\n stream.on('end', () => {\n this.invalidateAfterOffset(0);\n\n if (this.state.connection.type === 'connected') {\n this.startConnectionLostReconnectTimer();\n }\n });\n\n return stream;\n });\n }\n\n private async fetchUnloadedPagesInActiveRows(): Promise<void> {\n const [startPage, endPage] = this.getPageIndexesForRange(\n this.activeRowRange[0],\n this.activeRowRange[1]\n );\n\n const pages = this.getNonLoadedPageIndexes(startPage - 1, endPage + 1);\n await Promise.all(pages.map((page) => this.fetchPage(page)));\n }\n\n private patchNodesInRange(\n start: number,\n end: number,\n transform: (node: Node.AsObject) => Partial<Node.AsObject>\n ): void {\n const updatedRows = this.state.rows\n .slice(start, end + 1)\n .map((row) =>\n isLoadedRow(row)\n ? { ...row, node: { ...row.node, ...transform(row.node) } }\n : row\n );\n\n const startRows = this.state.rows.slice(0, start);\n const endRows = this.state.rows.slice(end + 1);\n const rows = [...startRows, ...updatedRows, ...endRows];\n\n this.updateState({ ...this.state, rows });\n }\n\n private async handlePageResult(page: Page): Promise<void> {\n try {\n const res = await page.res;\n\n const currentPage = this.getPage(page.index);\n\n // Only handle the result if the page has not been invalidated.\n if (currentPage?.id === page.id) {\n const cursor = res.getCursor();\n const itemsList = res.getItemsList();\n\n const totalRows = cursor?.getTotal() ?? 0;\n const offset = page.index * this.rowLimit;\n const fetchedRows = fromNodeProto(\n offset,\n itemsList,\n currentPage.metadataKeys\n );\n\n const start = this.state.rows.slice(0, offset);\n const end = this.state.rows.slice(\n start.length + fetchedRows.length,\n totalRows\n );\n const fill = new Array(\n Math.max(\n 0,\n totalRows - start.length - fetchedRows.length - end.length\n )\n );\n const rows = [...start, ...fetchedRows, ...end, ...fill];\n\n if (this.isViewLoading(rows) && this.loadingTimer == null) {\n this.restartLoadingTimer();\n\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n } else {\n this.updateState({\n ...this.state,\n totalRows: totalRows,\n rows: rows,\n shouldShowEmptyResults:\n this.state.filterTerm != null &&\n (rows.length === 0 || this.state.totalFilteredRows === 0),\n });\n }\n }\n } catch (e) {\n const errorMessage = e instanceof Error ? e.toString() : 'Unknown';\n console.error(\n `Request error fetching page at index ${page.index} (${errorMessage})`\n );\n\n const currentPage = this.getPage(page.index);\n if (currentPage?.id === page.id) {\n this.invalidatePage(page.index);\n }\n }\n }\n\n private invalidatePage(index: number): void {\n if (this.isPageLoaded(index)) {\n this.pages.delete(index);\n }\n }\n\n private invalidateAfterOffset(offset: number): void {\n const pageIndex = Math.floor(offset / this.rowLimit);\n\n for (const index of this.pages.keys()) {\n if (index >= pageIndex) {\n this.invalidatePage(index);\n }\n }\n }\n\n private getState(): SceneTreeState {\n return this.state;\n }\n\n private isViewLoading(rows: Row[]): boolean {\n return (\n this.state.filterTerm == null &&\n rows[this.activeRowRange[0]] == null &&\n rows[this.activeRowRange[1]] == null\n );\n }\n\n private restartLoadingTimer(): void {\n if (this.loadingTimer != null) {\n this.clearLoadingTimer();\n }\n\n this.loadingTimer = window.setTimeout(() => {\n this.loadingTimer = undefined;\n this.updateState({\n ...this.getState(),\n shouldShowLoading: true,\n });\n }, this.connectOptions.spinnerDelay);\n }\n\n private clearLoadingTimer(): void {\n if (this.loadingTimer != null) {\n clearTimeout(this.loadingTimer);\n this.loadingTimer = undefined;\n }\n }\n\n private tryClearLoadingTimer(state: SceneTreeState): boolean {\n const loadingShowingOrTimerStarted =\n this.state.shouldShowLoading || this.loadingTimer != null;\n const updateLoadingTimer =\n loadingShowingOrTimerStarted && !this.isViewLoading(state.rows);\n if (updateLoadingTimer) {\n this.clearLoadingTimer();\n return true;\n }\n return false;\n }\n\n private updateState(newState: SceneTreeState): void {\n const didClearLoadingTimer = this.tryClearLoadingTimer(newState);\n\n this.state = {\n ...newState,\n shouldShowLoading: didClearLoadingTimer\n ? false\n : newState.shouldShowLoading,\n };\n\n this.onStateChange.emit(this.state);\n }\n\n public getPageForOffset(offset: number): number {\n const index = Math.floor(offset / this.rowLimit);\n return this.constrainPageIndex(index);\n }\n\n public getPageIndexesForRange(start: number, end: number): [number, number] {\n const pageStart = this.getPageForOffset(start);\n const pageEnd = this.getPageForOffset(end);\n return [pageStart, pageEnd];\n }\n\n private async fetchTree(\n offset: number,\n limit: number,\n jwt: string\n ): Promise<GetTreeResponse> {\n return this.requestUnary(jwt, (metadata, handler) => {\n const pager = new OffsetPager();\n pager.setOffset(offset);\n pager.setLimit(limit);\n\n const req = new GetTreeRequest();\n req.setPager(pager);\n req.setAdditionalColumnKeysList(this.metadataKeys);\n\n this.client.getTree(req, metadata, handler);\n });\n }\n\n private requestUnary<R>(\n jwt: string,\n req: (\n metadata: grpc.Metadata,\n handler: (err: ServiceError | null, res: R | null) => void\n ) => void\n ): Promise<R> {\n return new Promise((resolve, reject) => {\n const metadata = this.createJwtMetadata(jwt);\n\n req(metadata, (err, res) => {\n if (err != null) {\n reject(err);\n } else if (res != null) {\n resolve(res);\n } else {\n reject(\n new SceneTreeError(\n 'Invalid response. Both error and result are null'\n )\n );\n }\n });\n });\n }\n\n private requestServerStream<R>(\n jwt: string,\n req: (metadata: grpc.Metadata) => ResponseStream<R>\n ): ResponseStream<R> {\n const metadata = this.createJwtMetadata(jwt);\n return req(metadata);\n }\n\n private createJwtMetadata(jwt: string): grpc.Metadata {\n return new grpc.Metadata({\n 'jwt-context': JSON.stringify({ jwt }),\n });\n }\n\n private async ifConnectionHasJwt<T>(then: (jwt: string) => T): Promise<T> {\n const { connection } = this.state;\n if (connection.type === 'connecting' || connection.type === 'connected') {\n const jwt = await connection.jwtProvider();\n if (jwt != null) {\n return then(jwt);\n } else {\n throw new SceneTreeUnauthorizedError(\n 'SceneTreeController cannot perform request. Viewer JWT is undefined.'\n );\n }\n } else if (connection.type === 'cancelled') {\n throw new SceneTreeConnectionCancelledError(\n `Request attempted, but controller was cancelled`\n );\n } else {\n throw new SceneTreeError('SceneTreeController is not in connected state');\n }\n }\n\n private ifErrorIsFatal(error: unknown, then: VoidFunction): void {\n if (!(error instanceof SceneTreeConnectionCancelledError)) {\n then();\n }\n }\n\n private getConnectionError(\n e: ServiceError | Error | unknown\n ): SceneTreeErrorDetails {\n if (isGrpcServiceError(e)) {\n if (e.code === grpc.Code.FailedPrecondition) {\n return new SceneTreeErrorDetails(\n 'SCENE_TREE_DISABLED',\n SceneTreeErrorCode.SCENE_TREE_DISABLED\n );\n } else if (e.code === grpc.Code.Unauthenticated) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else if (e.code === grpc.Code.Aborted) {\n return new SceneTreeErrorDetails('ABORTED', SceneTreeErrorCode.ABORTED);\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n } else if (e instanceof SceneTreeUnauthorizedError) {\n return new SceneTreeErrorDetails(\n 'UNAUTHORIZED',\n SceneTreeErrorCode.UNAUTHORIZED\n );\n } else {\n return new SceneTreeErrorDetails('UNKNOWN', SceneTreeErrorCode.UNKNOWN);\n }\n }\n\n private constrainPageRange(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.maxPages - 1, end)];\n }\n\n private constrainPageIndex(index: number): number {\n return Math.max(0, Math.min(index, this.maxPages - 1));\n }\n\n private constrainRowOffsets(start: number, end: number): [number, number] {\n return [Math.max(0, start), Math.min(this.state.totalRows - 1, end)];\n }\n\n private get maxPages(): number {\n return Math.max(1, Math.ceil(this.state.totalRows / this.rowLimit));\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n\n private isConnectedState(\n connection: ConnectionState\n ): connection is ConnectedState {\n return connection.type === 'connected';\n }\n}\n"]}
@@ -428,9 +428,7 @@ export class SceneTreeTableLayout {
428
428
  async computeAndUpdateViewportRows() {
429
429
  var _a;
430
430
  this.computeViewportRows();
431
- if (((_a = this.controller) === null || _a === void 0 ? void 0 : _a.isConnected) &&
432
- this.viewportStartIndex >= 0 &&
433
- this.viewportEndIndex >= 0) {
431
+ if (((_a = this.controller) === null || _a === void 0 ? void 0 : _a.isConnected) && this.totalRows > 0) {
434
432
  await this.controller.updateActiveRowRange(this.viewportStartIndex, this.viewportEndIndex);
435
433
  }
436
434
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scene-tree-table-layout.js","sourceRoot":"","sources":["../../../src/components/scene-tree-table-layout/scene-tree-table-layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport {\n Binding,\n ElementPool,\n generateInstanceFromTemplate,\n InstancedTemplate,\n} from '@vertexvis/html-templates';\n\nimport { readDOM } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\nimport { getSceneTreeViewportHeight } from '../scene-tree/lib/dom';\nimport { isLoadedRow, LoadedRow, Row } from '../scene-tree/lib/row';\nimport { RowDataProvider } from '../scene-tree/types';\nimport {\n DomScrollToOptions,\n getSceneTreeTableOffsetTop,\n getSceneTreeTableViewportWidth,\n scrollToTop,\n} from './lib/dom';\nimport { SceneTreeCellHoverController } from './lib/hover-controller';\nimport { restartTimeout } from './lib/window';\n\ninterface StateMap {\n columnElementPools?: WeakMap<\n HTMLVertexSceneTreeTableColumnElement,\n ElementPool\n >;\n headerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerListeners?: Array<(event: PointerEvent) => void>;\n\n viewportRows: Row[];\n\n headerHeight?: number;\n columnWidths: number[];\n columnWidthPercentages: number[];\n}\n\n@Component({\n tag: 'vertex-scene-tree-table-layout',\n styleUrl: 'scene-tree-table-layout.css',\n shadow: true,\n})\nexport class SceneTreeTableLayout {\n /**\n * A reference to the scene tree to perform operations for interactions. Such\n * as expansion, visibility and selection.\n */\n @Prop()\n public tree?: HTMLVertexSceneTreeElement;\n\n /**\n * @internal\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * @internal\n */\n @Prop()\n public rows: Row[] = [];\n\n /**\n * @internal\n */\n @Prop()\n public totalRows = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public rowHeight = 24;\n\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n *\n * This prop will be automatically populated based on the `overScanCount` prop\n * specified in the parent `<vertex-scene-tree />` element.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * This prop will be automatically populated based on the `rowData` prop\n * specified in the parent `<vertex-scene-tree />` element.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public scrollOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutHeight?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutWidth?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportStartIndex = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportEndIndex = 0;\n\n /**\n * @internal\n */\n @Event()\n public layoutRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private columnGridLayout = '1fr';\n\n @State()\n private columnGridFixedLayout = '';\n\n @State()\n private isComputingCellHeight = true;\n\n @State()\n private lastDividerPointerPosition?: Point.Point;\n\n @State()\n private resizingColumnIndex?: number;\n\n @State()\n private isScrolling = false;\n\n @State()\n private scrollTimer: number | undefined;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n viewportRows: [],\n columnWidths: [],\n columnWidthPercentages: [],\n };\n\n private lastStartIndex = 0;\n private resizeObserver?: ResizeObserver;\n private headerResizeObserver?: ResizeObserver;\n\n private tableElement?: HTMLDivElement;\n private headerElement?: HTMLDivElement;\n private columnElements: HTMLVertexSceneTreeTableColumnElement[] = [];\n\n private cellHoverController = new SceneTreeCellHoverController();\n\n public componentWillLoad(): void {\n this.updateColumnElements();\n this.createPools();\n\n this.headerResizeObserver = new ResizeObserver(() => {\n this.stateMap.headerHeight = undefined;\n this.computeHeaderHeight();\n this.updateLayoutPosition();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateLayoutPosition();\n this.clearLayoutHeight();\n this.clearLayoutWidth();\n this.recomputeColumnWidths();\n this.computeColumnGridLayout();\n });\n }\n\n public componentDidLoad(): void {\n this.computeColumnGridLayout();\n this.ensureDividerTemplateDefined();\n this.computeCellHeight();\n this.computeHeaderHeight();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n\n this.tableElement?.addEventListener('scroll', this.handleScrollChanged, {\n passive: true,\n });\n\n if (this.headerElement != null) {\n this.headerResizeObserver?.observe(this.headerElement);\n }\n\n this.resizeObserver?.observe(this.hostEl);\n }\n\n public async componentWillRender(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n public componentDidRender(): void {\n this.layoutColumns();\n\n this.layoutRendered.emit();\n }\n\n public disconnectedCallback(): void {\n this.tableElement?.removeEventListener('scroll', this.handleScrollChanged);\n this.removeDividerDragListeners();\n this.headerResizeObserver?.disconnect();\n this.resizeObserver?.disconnect();\n this.stateMap.columnWidths = [];\n this.stateMap.columnWidthPercentages = [];\n }\n\n @Watch('rows')\n @Watch('totalRows')\n @Watch('rowHeight')\n protected async handleViewportRowsPropsChanged(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n /**\n * Scrolls the table to the provided top value.\n *\n * @param top The position to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToPosition(\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n ): Promise<void> {\n if (this.tableElement != null) {\n scrollToTop(this.tableElement, top, options);\n }\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"header\"\n ref={(ref) => (this.headerElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n display: this.columnElements.length <= 1 ? 'none' : 'grid',\n }}\n >\n <slot name=\"header\" />\n </div>\n <div\n class=\"table\"\n ref={(ref) => (this.tableElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridLayout,\n }}\n >\n <slot\n onSlotchange={() => {\n this.ensureDividerTemplateDefined();\n this.updateColumnElements();\n this.recreateColumnPools();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n this.computeColumnGridLayout();\n }}\n />\n </div>\n <div\n class=\"divider-overlay\"\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n }}\n >\n <slot name=\"divider\" />\n </div>\n {this.resizingColumnIndex != null && <div class=\"resize-overlay\" />}\n </Host>\n );\n }\n\n private computeViewportRows(): void {\n const viewportHeight = this.getLayoutHeight();\n if (viewportHeight != null) {\n const viewportCount = Math.ceil(viewportHeight / this.rowHeight);\n\n const viewportStartIndex = Math.floor(this.scrollOffset / this.rowHeight);\n const viewportEndIndex = viewportStartIndex + viewportCount;\n\n const startIndex = Math.max(0, viewportStartIndex - this.overScanCount);\n const endIndex = Math.min(\n this.totalRows - 1,\n viewportEndIndex + this.overScanCount\n );\n\n const rows = this.getViewportRows(startIndex, endIndex);\n\n this.viewportStartIndex = startIndex;\n this.viewportEndIndex = endIndex;\n this.stateMap.viewportRows = rows;\n }\n }\n\n private async computeAndUpdateViewportRows(): Promise<void> {\n this.computeViewportRows();\n\n if (\n this.controller?.isConnected &&\n this.viewportStartIndex >= 0 &&\n this.viewportEndIndex >= 0\n ) {\n await this.controller.updateActiveRowRange(\n this.viewportStartIndex,\n this.viewportEndIndex\n );\n }\n }\n\n private layoutColumns = (): void => {\n const visibleRowCount = this.viewportEndIndex - this.viewportStartIndex + 1;\n const diff = this.viewportStartIndex - this.lastStartIndex;\n this.lastStartIndex = this.viewportStartIndex;\n\n this.iterateColumns((col, pool, colIndex) => {\n pool.updateElements(visibleRowCount);\n\n if (diff > 0) {\n pool.swapHeadToTail(diff);\n } else {\n pool.swapTailToHead(-diff);\n }\n\n col.style.minHeight = `${this.rowHeight * this.totalRows}px`;\n\n const cellPaddingLeft =\n colIndex === 0\n ? (depth: number) => `calc(${depth} * 0.5rem)`\n : () => `0`;\n\n pool.iterateElements((el, binding, rowIndex) => {\n const row = this.stateMap.viewportRows[rowIndex];\n\n if (isLoadedRow(row)) {\n this.updateCell(row, el, binding, rowIndex, cellPaddingLeft);\n }\n });\n });\n };\n\n private updateCell = (\n row: LoadedRow,\n cell: HTMLElement,\n binding: Binding,\n rowIndex: number,\n cellPaddingLeft: (depth: number) => string\n ): void => {\n cell.style.position = 'absolute';\n cell.style.top = `${\n (this.viewportStartIndex + rowIndex) * this.rowHeight\n }px`;\n cell.style.boxSizing = 'border-box';\n cell.style.height = `${this.rowHeight}px`;\n cell.style.width = '100%';\n cell.style.paddingLeft = cellPaddingLeft(row.node.depth);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (cell as any).tree = this.tree;\n (cell as any).node = row.node;\n (cell as any).hoverController = this.cellHoverController;\n (cell as any).isScrolling = this.isScrolling;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n binding.bind(row);\n };\n\n private updateLayoutPosition = (): void => {\n readDOM(() => {\n if (this.tableElement != null) {\n this.layoutOffset = getSceneTreeTableOffsetTop(this.tableElement);\n }\n });\n };\n\n private recomputeColumnWidths = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidths = this.stateMap.columnWidthPercentages.map(\n (w) => w * layoutWidth\n );\n }\n };\n\n private recomputeColumnPercentages = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidthPercentages = this.stateMap.columnWidths.map(\n (w) => w / layoutWidth\n );\n }\n };\n\n private computeInitialColumnWidths = (): void => {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n };\n\n private updateColumnElements = (): void => {\n this.columnElements = Array.from(\n this.hostEl.querySelectorAll('vertex-scene-tree-table-column')\n ) as Array<HTMLVertexSceneTreeTableColumnElement>;\n };\n\n private createPools(): void {\n if (this.stateMap.columnElementPools == null) {\n this.stateMap.columnElementPools = this.columnElements.reduce(\n (map, c) =>\n map.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n ),\n new WeakMap()\n );\n }\n }\n\n private recreateColumnPools(): void {\n this.columnElements.forEach((c) => {\n if (this.stateMap.columnElementPools?.get(c) == null) {\n this.stateMap.columnElementPools?.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n );\n } else {\n this.stateMap.columnElementPools\n .get(c)\n ?.updateElementFactory(() => this.createColumnCellInstance(c));\n }\n });\n }\n\n private iterateColumns(\n f: (\n column: HTMLVertexSceneTreeTableColumnElement,\n pool: ElementPool,\n index: number\n ) => void\n ): void {\n this.columnElements.forEach((column, i) => {\n const pool = this.stateMap.columnElementPools?.get(column);\n if (pool != null) {\n f(column, pool, i);\n } else {\n throw new Error('Cannot find pool for column');\n }\n });\n }\n\n private ensureDividerTemplateDefined(): void {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template == null) {\n const defaultDividerTemplate = document.createElement('template');\n defaultDividerTemplate.slot = 'divider';\n defaultDividerTemplate.innerHTML = `\n <vertex-scene-tree-table-resize-divider slot=\"divider\">\n </vertex-scene-tree-table-resize-divider>\n `;\n this.hostEl.appendChild(defaultDividerTemplate);\n }\n }\n\n private createHeaderInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> | undefined {\n const template = column.querySelector(\n 'template[slot=\"header\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n }\n }\n\n private createDividerInstance(): InstancedTemplate<HTMLElement> {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Table is missing divider template element');\n }\n }\n\n private createColumnCellInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> {\n const template = column.querySelector(\n 'template:not([slot=\"header\"])'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Column is missing cell template element');\n }\n }\n\n private computeCellHeight = async (): Promise<void> => {\n if (this.isComputingCellHeight && this.columnElements.length > 0) {\n const dummyData: LoadedRow = {\n index: 0,\n node: {\n id: { hex: '' },\n name: 'Dummy row',\n expanded: false,\n selected: false,\n visible: false,\n partiallyVisible: false,\n isLeaf: false,\n depth: 0,\n columnsList: [],\n filterHit: false,\n phantom: false,\n endItem: false,\n },\n metadata: {},\n data: {},\n };\n const { bindings, element } = this.createColumnCellInstance(\n this.columnElements[0]\n );\n bindings.bind(dummyData);\n element.style.visibility = 'hidden';\n\n this.columnElements[0]?.appendChild(element);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (element as any).componentOnReady === 'function') {\n await (element as any).componentOnReady();\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n let height = element.clientHeight;\n let attempts = 0;\n\n while (height === 0 && attempts < 10) {\n height = await new Promise((resolve) => {\n setTimeout(() => resolve(element.getBoundingClientRect().height), 5);\n });\n attempts = attempts + 1;\n }\n this.rowHeight = height ?? this.rowHeight;\n element.remove();\n this.isComputingCellHeight = false;\n }\n };\n\n private computeHeaderHeight = (): void => {\n if (this.stateMap.headerHeight == null) {\n this.stateMap.headerHeight =\n this.headerElement?.getBoundingClientRect().height;\n this.hostEl.style.setProperty(\n '--header-height',\n `${this.stateMap.headerHeight}px`\n );\n }\n };\n\n private computeColumnGridLayout = (): void => {\n if (this.stateMap.columnWidths.length === 0) {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n }\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n if (this.stateMap.columnWidthPercentages.length === 0) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n }\n\n /**\n * This layout uses `1fr` instead of the final column width to\n * allow the final column to shrink when a scrollbar appears.\n *\n * This flex behavior is not desired for the header and divider\n * elements since they are not scrollable, and `columnGridFixedLayout`\n * should be used instead.\n */\n this.columnGridLayout = `${this.stateMap.columnWidths\n .slice(0, -1)\n .reduce((res, w) => `${res} ${w}px`, '')} 1fr`;\n\n this.columnGridFixedLayout = `${this.stateMap.columnWidths.reduce(\n (res, w) => `${res} ${w}px`,\n ''\n )}`;\n };\n\n private bindHeaderData = (): void => {\n if (this.stateMap.headerInstances == null) {\n this.stateMap.headerInstances = this.columnElements\n .map((c, i) => {\n const instance = this.createHeaderInstance(c);\n\n if (instance != null) {\n instance.element.style.paddingRight =\n i === this.columnElements.length - 1\n ? `0`\n : `var(--scene-tree-table-column-gap)`;\n instance.element.slot = 'header';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n }\n\n return instance;\n })\n .filter((i) => i != null) as Array<InstancedTemplate<HTMLElement>>;\n }\n\n if (this.stateMap.headerDividerInstances == null) {\n this.stateMap.headerDividerInstances = this.columnElements\n .slice(0, -1)\n .map((_, i) => {\n const instance = this.createDividerInstance();\n\n instance.element.slot = 'divider';\n instance.element.style.position = 'absolute';\n instance.element.style.right = '0';\n instance.element.style.pointerEvents = 'auto';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n\n return instance;\n });\n }\n };\n\n private rebindHeaderData = (): void => {\n this.removeDividerDragListeners();\n\n this.stateMap.headerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerDividerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerInstances = undefined;\n this.stateMap.headerDividerInstances = undefined;\n\n this.bindHeaderData();\n this.addDividerDragListeners();\n };\n\n private addDividerDragListeners(): void {\n this.stateMap.headerDividerListeners =\n this.stateMap.headerDividerInstances?.map((d, i) => {\n const listener = this.createDividerPointerDownHandler(i);\n\n d.element.addEventListener('pointerdown', listener);\n\n return listener;\n });\n }\n\n private removeDividerDragListeners(): void {\n if (this.stateMap.headerDividerListeners != null) {\n const listeners = this.stateMap.headerDividerListeners;\n\n this.stateMap.headerDividerInstances?.forEach((d, i) => {\n const listener = listeners[i];\n if (listener != null) {\n d.element.removeEventListener('pointerdown', listener);\n }\n });\n this.stateMap.headerDividerListeners = undefined;\n }\n }\n\n private createDividerPointerDownHandler = (\n index: number\n ): ((event: PointerEvent) => void) => {\n return (event: PointerEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.lastDividerPointerPosition = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n this.resizingColumnIndex = index;\n this.stateMap.headerDividerInstances?.[index]?.element.classList.add(\n 'dragging'\n );\n\n window.addEventListener('pointermove', this.handleDividerPointerMove);\n window.addEventListener('pointerup', this.handleDividerPointerUp);\n };\n };\n\n private handleDividerPointerMove = (event: PointerEvent): void => {\n const current = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n\n if (\n this.lastDividerPointerPosition != null &&\n this.resizingColumnIndex != null\n ) {\n const diff = Point.subtract(this.lastDividerPointerPosition, current);\n\n if (\n Math.abs(diff.x) >= 1 &&\n this.isValidResize(diff, this.resizingColumnIndex)\n ) {\n this.stateMap.columnWidths[this.resizingColumnIndex] -= diff.x;\n\n if (this.resizingColumnIndex + 1 < this.stateMap.columnWidths.length) {\n this.stateMap.columnWidths[this.resizingColumnIndex + 1] += diff.x;\n }\n\n this.lastDividerPointerPosition = current;\n this.computeColumnGridLayout();\n }\n }\n };\n\n private handleDividerPointerUp = (): void => {\n if (this.resizingColumnIndex != null) {\n this.stateMap.headerDividerInstances?.[\n this.resizingColumnIndex\n ]?.element.classList.remove('dragging');\n }\n this.lastDividerPointerPosition = undefined;\n this.resizingColumnIndex = undefined;\n\n this.recomputeColumnPercentages();\n\n window.removeEventListener('pointermove', this.handleDividerPointerMove);\n window.removeEventListener('pointerup', this.handleDividerPointerUp);\n };\n\n private isValidResize = (diff: Point.Point, index: number): boolean => {\n const currentColumn = this.columnElements[index];\n const nextColumn = this.columnElements[index + 1];\n const currentWidth = this.stateMap.columnWidths[index];\n const nextWidth = this.stateMap.columnWidths[index + 1];\n const currentMinWidth = currentColumn.minWidth ?? 0;\n const currentMaxWidth = currentColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n const nextMinWidth = nextColumn.minWidth ?? 0;\n const nextMaxWidth = nextColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n\n const currentIsValid =\n currentWidth - diff.x > currentMinWidth &&\n currentWidth - diff.x < currentMaxWidth;\n const nextIsValid =\n nextColumn != null\n ? nextWidth + diff.x > nextMinWidth && nextWidth + diff.x < nextMaxWidth\n : true;\n\n return currentIsValid && nextIsValid;\n };\n\n private handleScrollChanged = (event: Event): void => {\n this.isScrolling = true;\n\n this.scrollTimer = restartTimeout(() => {\n this.isScrolling = false;\n }, this.scrollTimer);\n\n this.scrollOffset = (event.target as HTMLElement).scrollTop;\n this.computeAndUpdateViewportRows();\n };\n\n private getViewportRows(startIndex: number, endIndex: number): Row[] {\n const rows = this.rows.slice(startIndex, endIndex + 1);\n return rows.map((row) => (row != null ? this.populateRowData(row) : row));\n }\n\n private populateRowData(row: Row): Row {\n if (this.rowData != null && row != null) {\n const data = this.rowData?.(row) || {};\n return { ...row, data };\n } else {\n return row;\n }\n }\n\n private getLayoutHeight(): number | undefined {\n if (this.layoutHeight == null && this.tableElement != null) {\n this.layoutHeight = getSceneTreeViewportHeight(this.tableElement);\n }\n return this.layoutHeight;\n }\n\n private getLayoutWidth(): number | undefined {\n if (this.layoutWidth == null) {\n const computedWidth = getSceneTreeTableViewportWidth(this.hostEl);\n if (computedWidth > 0) {\n this.layoutWidth = computedWidth;\n }\n }\n return this.layoutWidth;\n }\n\n private clearLayoutHeight(): void {\n this.layoutHeight = undefined;\n }\n\n private clearLayoutWidth(): void {\n this.layoutWidth = undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"scene-tree-table-layout.js","sourceRoot":"","sources":["../../../src/components/scene-tree-table-layout/scene-tree-table-layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport {\n Binding,\n ElementPool,\n generateInstanceFromTemplate,\n InstancedTemplate,\n} from '@vertexvis/html-templates';\n\nimport { readDOM } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\nimport { getSceneTreeViewportHeight } from '../scene-tree/lib/dom';\nimport { isLoadedRow, LoadedRow, Row } from '../scene-tree/lib/row';\nimport { RowDataProvider } from '../scene-tree/types';\nimport {\n DomScrollToOptions,\n getSceneTreeTableOffsetTop,\n getSceneTreeTableViewportWidth,\n scrollToTop,\n} from './lib/dom';\nimport { SceneTreeCellHoverController } from './lib/hover-controller';\nimport { restartTimeout } from './lib/window';\n\ninterface StateMap {\n columnElementPools?: WeakMap<\n HTMLVertexSceneTreeTableColumnElement,\n ElementPool\n >;\n headerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerListeners?: Array<(event: PointerEvent) => void>;\n\n viewportRows: Row[];\n\n headerHeight?: number;\n columnWidths: number[];\n columnWidthPercentages: number[];\n}\n\n@Component({\n tag: 'vertex-scene-tree-table-layout',\n styleUrl: 'scene-tree-table-layout.css',\n shadow: true,\n})\nexport class SceneTreeTableLayout {\n /**\n * A reference to the scene tree to perform operations for interactions. Such\n * as expansion, visibility and selection.\n */\n @Prop()\n public tree?: HTMLVertexSceneTreeElement;\n\n /**\n * @internal\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * @internal\n */\n @Prop()\n public rows: Row[] = [];\n\n /**\n * @internal\n */\n @Prop()\n public totalRows = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public rowHeight = 24;\n\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n *\n * This prop will be automatically populated based on the `overScanCount` prop\n * specified in the parent `<vertex-scene-tree />` element.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * This prop will be automatically populated based on the `rowData` prop\n * specified in the parent `<vertex-scene-tree />` element.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public scrollOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutHeight?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutWidth?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportStartIndex = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportEndIndex = 0;\n\n /**\n * @internal\n */\n @Event()\n public layoutRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private columnGridLayout = '1fr';\n\n @State()\n private columnGridFixedLayout = '';\n\n @State()\n private isComputingCellHeight = true;\n\n @State()\n private lastDividerPointerPosition?: Point.Point;\n\n @State()\n private resizingColumnIndex?: number;\n\n @State()\n private isScrolling = false;\n\n @State()\n private scrollTimer: number | undefined;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n viewportRows: [],\n columnWidths: [],\n columnWidthPercentages: [],\n };\n\n private lastStartIndex = 0;\n private resizeObserver?: ResizeObserver;\n private headerResizeObserver?: ResizeObserver;\n\n private tableElement?: HTMLDivElement;\n private headerElement?: HTMLDivElement;\n private columnElements: HTMLVertexSceneTreeTableColumnElement[] = [];\n\n private cellHoverController = new SceneTreeCellHoverController();\n\n public componentWillLoad(): void {\n this.updateColumnElements();\n this.createPools();\n\n this.headerResizeObserver = new ResizeObserver(() => {\n this.stateMap.headerHeight = undefined;\n this.computeHeaderHeight();\n this.updateLayoutPosition();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateLayoutPosition();\n this.clearLayoutHeight();\n this.clearLayoutWidth();\n this.recomputeColumnWidths();\n this.computeColumnGridLayout();\n });\n }\n\n public componentDidLoad(): void {\n this.computeColumnGridLayout();\n this.ensureDividerTemplateDefined();\n this.computeCellHeight();\n this.computeHeaderHeight();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n\n this.tableElement?.addEventListener('scroll', this.handleScrollChanged, {\n passive: true,\n });\n\n if (this.headerElement != null) {\n this.headerResizeObserver?.observe(this.headerElement);\n }\n\n this.resizeObserver?.observe(this.hostEl);\n }\n\n public async componentWillRender(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n public componentDidRender(): void {\n this.layoutColumns();\n\n this.layoutRendered.emit();\n }\n\n public disconnectedCallback(): void {\n this.tableElement?.removeEventListener('scroll', this.handleScrollChanged);\n this.removeDividerDragListeners();\n this.headerResizeObserver?.disconnect();\n this.resizeObserver?.disconnect();\n this.stateMap.columnWidths = [];\n this.stateMap.columnWidthPercentages = [];\n }\n\n @Watch('rows')\n @Watch('totalRows')\n @Watch('rowHeight')\n protected async handleViewportRowsPropsChanged(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n /**\n * Scrolls the table to the provided top value.\n *\n * @param top The position to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToPosition(\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n ): Promise<void> {\n if (this.tableElement != null) {\n scrollToTop(this.tableElement, top, options);\n }\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"header\"\n ref={(ref) => (this.headerElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n display: this.columnElements.length <= 1 ? 'none' : 'grid',\n }}\n >\n <slot name=\"header\" />\n </div>\n <div\n class=\"table\"\n ref={(ref) => (this.tableElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridLayout,\n }}\n >\n <slot\n onSlotchange={() => {\n this.ensureDividerTemplateDefined();\n this.updateColumnElements();\n this.recreateColumnPools();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n this.computeColumnGridLayout();\n }}\n />\n </div>\n <div\n class=\"divider-overlay\"\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n }}\n >\n <slot name=\"divider\" />\n </div>\n {this.resizingColumnIndex != null && <div class=\"resize-overlay\" />}\n </Host>\n );\n }\n\n private computeViewportRows(): void {\n const viewportHeight = this.getLayoutHeight();\n if (viewportHeight != null) {\n const viewportCount = Math.ceil(viewportHeight / this.rowHeight);\n\n const viewportStartIndex = Math.floor(this.scrollOffset / this.rowHeight);\n const viewportEndIndex = viewportStartIndex + viewportCount;\n\n const startIndex = Math.max(0, viewportStartIndex - this.overScanCount);\n const endIndex = Math.min(\n this.totalRows - 1,\n viewportEndIndex + this.overScanCount\n );\n\n const rows = this.getViewportRows(startIndex, endIndex);\n\n this.viewportStartIndex = startIndex;\n this.viewportEndIndex = endIndex;\n this.stateMap.viewportRows = rows;\n }\n }\n\n private async computeAndUpdateViewportRows(): Promise<void> {\n this.computeViewportRows();\n\n if (this.controller?.isConnected && this.totalRows > 0) {\n await this.controller.updateActiveRowRange(\n this.viewportStartIndex,\n this.viewportEndIndex\n );\n }\n }\n\n private layoutColumns = (): void => {\n const visibleRowCount = this.viewportEndIndex - this.viewportStartIndex + 1;\n const diff = this.viewportStartIndex - this.lastStartIndex;\n this.lastStartIndex = this.viewportStartIndex;\n\n this.iterateColumns((col, pool, colIndex) => {\n pool.updateElements(visibleRowCount);\n\n if (diff > 0) {\n pool.swapHeadToTail(diff);\n } else {\n pool.swapTailToHead(-diff);\n }\n\n col.style.minHeight = `${this.rowHeight * this.totalRows}px`;\n\n const cellPaddingLeft =\n colIndex === 0\n ? (depth: number) => `calc(${depth} * 0.5rem)`\n : () => `0`;\n\n pool.iterateElements((el, binding, rowIndex) => {\n const row = this.stateMap.viewportRows[rowIndex];\n\n if (isLoadedRow(row)) {\n this.updateCell(row, el, binding, rowIndex, cellPaddingLeft);\n }\n });\n });\n };\n\n private updateCell = (\n row: LoadedRow,\n cell: HTMLElement,\n binding: Binding,\n rowIndex: number,\n cellPaddingLeft: (depth: number) => string\n ): void => {\n cell.style.position = 'absolute';\n cell.style.top = `${\n (this.viewportStartIndex + rowIndex) * this.rowHeight\n }px`;\n cell.style.boxSizing = 'border-box';\n cell.style.height = `${this.rowHeight}px`;\n cell.style.width = '100%';\n cell.style.paddingLeft = cellPaddingLeft(row.node.depth);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (cell as any).tree = this.tree;\n (cell as any).node = row.node;\n (cell as any).hoverController = this.cellHoverController;\n (cell as any).isScrolling = this.isScrolling;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n binding.bind(row);\n };\n\n private updateLayoutPosition = (): void => {\n readDOM(() => {\n if (this.tableElement != null) {\n this.layoutOffset = getSceneTreeTableOffsetTop(this.tableElement);\n }\n });\n };\n\n private recomputeColumnWidths = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidths = this.stateMap.columnWidthPercentages.map(\n (w) => w * layoutWidth\n );\n }\n };\n\n private recomputeColumnPercentages = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidthPercentages = this.stateMap.columnWidths.map(\n (w) => w / layoutWidth\n );\n }\n };\n\n private computeInitialColumnWidths = (): void => {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n };\n\n private updateColumnElements = (): void => {\n this.columnElements = Array.from(\n this.hostEl.querySelectorAll('vertex-scene-tree-table-column')\n ) as Array<HTMLVertexSceneTreeTableColumnElement>;\n };\n\n private createPools(): void {\n if (this.stateMap.columnElementPools == null) {\n this.stateMap.columnElementPools = this.columnElements.reduce(\n (map, c) =>\n map.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n ),\n new WeakMap()\n );\n }\n }\n\n private recreateColumnPools(): void {\n this.columnElements.forEach((c) => {\n if (this.stateMap.columnElementPools?.get(c) == null) {\n this.stateMap.columnElementPools?.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n );\n } else {\n this.stateMap.columnElementPools\n .get(c)\n ?.updateElementFactory(() => this.createColumnCellInstance(c));\n }\n });\n }\n\n private iterateColumns(\n f: (\n column: HTMLVertexSceneTreeTableColumnElement,\n pool: ElementPool,\n index: number\n ) => void\n ): void {\n this.columnElements.forEach((column, i) => {\n const pool = this.stateMap.columnElementPools?.get(column);\n if (pool != null) {\n f(column, pool, i);\n } else {\n throw new Error('Cannot find pool for column');\n }\n });\n }\n\n private ensureDividerTemplateDefined(): void {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template == null) {\n const defaultDividerTemplate = document.createElement('template');\n defaultDividerTemplate.slot = 'divider';\n defaultDividerTemplate.innerHTML = `\n <vertex-scene-tree-table-resize-divider slot=\"divider\">\n </vertex-scene-tree-table-resize-divider>\n `;\n this.hostEl.appendChild(defaultDividerTemplate);\n }\n }\n\n private createHeaderInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> | undefined {\n const template = column.querySelector(\n 'template[slot=\"header\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n }\n }\n\n private createDividerInstance(): InstancedTemplate<HTMLElement> {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Table is missing divider template element');\n }\n }\n\n private createColumnCellInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> {\n const template = column.querySelector(\n 'template:not([slot=\"header\"])'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Column is missing cell template element');\n }\n }\n\n private computeCellHeight = async (): Promise<void> => {\n if (this.isComputingCellHeight && this.columnElements.length > 0) {\n const dummyData: LoadedRow = {\n index: 0,\n node: {\n id: { hex: '' },\n name: 'Dummy row',\n expanded: false,\n selected: false,\n visible: false,\n partiallyVisible: false,\n isLeaf: false,\n depth: 0,\n columnsList: [],\n filterHit: false,\n phantom: false,\n endItem: false,\n },\n metadata: {},\n data: {},\n };\n const { bindings, element } = this.createColumnCellInstance(\n this.columnElements[0]\n );\n bindings.bind(dummyData);\n element.style.visibility = 'hidden';\n\n this.columnElements[0]?.appendChild(element);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (element as any).componentOnReady === 'function') {\n await (element as any).componentOnReady();\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n let height = element.clientHeight;\n let attempts = 0;\n\n while (height === 0 && attempts < 10) {\n height = await new Promise((resolve) => {\n setTimeout(() => resolve(element.getBoundingClientRect().height), 5);\n });\n attempts = attempts + 1;\n }\n this.rowHeight = height ?? this.rowHeight;\n element.remove();\n this.isComputingCellHeight = false;\n }\n };\n\n private computeHeaderHeight = (): void => {\n if (this.stateMap.headerHeight == null) {\n this.stateMap.headerHeight =\n this.headerElement?.getBoundingClientRect().height;\n this.hostEl.style.setProperty(\n '--header-height',\n `${this.stateMap.headerHeight}px`\n );\n }\n };\n\n private computeColumnGridLayout = (): void => {\n if (this.stateMap.columnWidths.length === 0) {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n }\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n if (this.stateMap.columnWidthPercentages.length === 0) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n }\n\n /**\n * This layout uses `1fr` instead of the final column width to\n * allow the final column to shrink when a scrollbar appears.\n *\n * This flex behavior is not desired for the header and divider\n * elements since they are not scrollable, and `columnGridFixedLayout`\n * should be used instead.\n */\n this.columnGridLayout = `${this.stateMap.columnWidths\n .slice(0, -1)\n .reduce((res, w) => `${res} ${w}px`, '')} 1fr`;\n\n this.columnGridFixedLayout = `${this.stateMap.columnWidths.reduce(\n (res, w) => `${res} ${w}px`,\n ''\n )}`;\n };\n\n private bindHeaderData = (): void => {\n if (this.stateMap.headerInstances == null) {\n this.stateMap.headerInstances = this.columnElements\n .map((c, i) => {\n const instance = this.createHeaderInstance(c);\n\n if (instance != null) {\n instance.element.style.paddingRight =\n i === this.columnElements.length - 1\n ? `0`\n : `var(--scene-tree-table-column-gap)`;\n instance.element.slot = 'header';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n }\n\n return instance;\n })\n .filter((i) => i != null) as Array<InstancedTemplate<HTMLElement>>;\n }\n\n if (this.stateMap.headerDividerInstances == null) {\n this.stateMap.headerDividerInstances = this.columnElements\n .slice(0, -1)\n .map((_, i) => {\n const instance = this.createDividerInstance();\n\n instance.element.slot = 'divider';\n instance.element.style.position = 'absolute';\n instance.element.style.right = '0';\n instance.element.style.pointerEvents = 'auto';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n\n return instance;\n });\n }\n };\n\n private rebindHeaderData = (): void => {\n this.removeDividerDragListeners();\n\n this.stateMap.headerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerDividerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerInstances = undefined;\n this.stateMap.headerDividerInstances = undefined;\n\n this.bindHeaderData();\n this.addDividerDragListeners();\n };\n\n private addDividerDragListeners(): void {\n this.stateMap.headerDividerListeners =\n this.stateMap.headerDividerInstances?.map((d, i) => {\n const listener = this.createDividerPointerDownHandler(i);\n\n d.element.addEventListener('pointerdown', listener);\n\n return listener;\n });\n }\n\n private removeDividerDragListeners(): void {\n if (this.stateMap.headerDividerListeners != null) {\n const listeners = this.stateMap.headerDividerListeners;\n\n this.stateMap.headerDividerInstances?.forEach((d, i) => {\n const listener = listeners[i];\n if (listener != null) {\n d.element.removeEventListener('pointerdown', listener);\n }\n });\n this.stateMap.headerDividerListeners = undefined;\n }\n }\n\n private createDividerPointerDownHandler = (\n index: number\n ): ((event: PointerEvent) => void) => {\n return (event: PointerEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.lastDividerPointerPosition = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n this.resizingColumnIndex = index;\n this.stateMap.headerDividerInstances?.[index]?.element.classList.add(\n 'dragging'\n );\n\n window.addEventListener('pointermove', this.handleDividerPointerMove);\n window.addEventListener('pointerup', this.handleDividerPointerUp);\n };\n };\n\n private handleDividerPointerMove = (event: PointerEvent): void => {\n const current = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n\n if (\n this.lastDividerPointerPosition != null &&\n this.resizingColumnIndex != null\n ) {\n const diff = Point.subtract(this.lastDividerPointerPosition, current);\n\n if (\n Math.abs(diff.x) >= 1 &&\n this.isValidResize(diff, this.resizingColumnIndex)\n ) {\n this.stateMap.columnWidths[this.resizingColumnIndex] -= diff.x;\n\n if (this.resizingColumnIndex + 1 < this.stateMap.columnWidths.length) {\n this.stateMap.columnWidths[this.resizingColumnIndex + 1] += diff.x;\n }\n\n this.lastDividerPointerPosition = current;\n this.computeColumnGridLayout();\n }\n }\n };\n\n private handleDividerPointerUp = (): void => {\n if (this.resizingColumnIndex != null) {\n this.stateMap.headerDividerInstances?.[\n this.resizingColumnIndex\n ]?.element.classList.remove('dragging');\n }\n this.lastDividerPointerPosition = undefined;\n this.resizingColumnIndex = undefined;\n\n this.recomputeColumnPercentages();\n\n window.removeEventListener('pointermove', this.handleDividerPointerMove);\n window.removeEventListener('pointerup', this.handleDividerPointerUp);\n };\n\n private isValidResize = (diff: Point.Point, index: number): boolean => {\n const currentColumn = this.columnElements[index];\n const nextColumn = this.columnElements[index + 1];\n const currentWidth = this.stateMap.columnWidths[index];\n const nextWidth = this.stateMap.columnWidths[index + 1];\n const currentMinWidth = currentColumn.minWidth ?? 0;\n const currentMaxWidth = currentColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n const nextMinWidth = nextColumn.minWidth ?? 0;\n const nextMaxWidth = nextColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n\n const currentIsValid =\n currentWidth - diff.x > currentMinWidth &&\n currentWidth - diff.x < currentMaxWidth;\n const nextIsValid =\n nextColumn != null\n ? nextWidth + diff.x > nextMinWidth && nextWidth + diff.x < nextMaxWidth\n : true;\n\n return currentIsValid && nextIsValid;\n };\n\n private handleScrollChanged = (event: Event): void => {\n this.isScrolling = true;\n\n this.scrollTimer = restartTimeout(() => {\n this.isScrolling = false;\n }, this.scrollTimer);\n\n this.scrollOffset = (event.target as HTMLElement).scrollTop;\n this.computeAndUpdateViewportRows();\n };\n\n private getViewportRows(startIndex: number, endIndex: number): Row[] {\n const rows = this.rows.slice(startIndex, endIndex + 1);\n return rows.map((row) => (row != null ? this.populateRowData(row) : row));\n }\n\n private populateRowData(row: Row): Row {\n if (this.rowData != null && row != null) {\n const data = this.rowData?.(row) || {};\n return { ...row, data };\n } else {\n return row;\n }\n }\n\n private getLayoutHeight(): number | undefined {\n if (this.layoutHeight == null && this.tableElement != null) {\n this.layoutHeight = getSceneTreeViewportHeight(this.tableElement);\n }\n return this.layoutHeight;\n }\n\n private getLayoutWidth(): number | undefined {\n if (this.layoutWidth == null) {\n const computedWidth = getSceneTreeTableViewportWidth(this.hostEl);\n if (computedWidth > 0) {\n this.layoutWidth = computedWidth;\n }\n }\n return this.layoutWidth;\n }\n\n private clearLayoutHeight(): void {\n this.layoutHeight = undefined;\n }\n\n private clearLayoutWidth(): void {\n this.layoutWidth = undefined;\n }\n}\n"]}
@@ -417,7 +417,7 @@ export class Viewer {
417
417
  * resolves when the scene has been loaded. The specified scene is
418
418
  * provided as a URN in the following format:
419
419
  *
420
- * * `urn:vertexvis:scene:<sceneid>`
420
+ * * `urn:vertex:scene:<sceneid>`
421
421
  *
422
422
  * @param urn The URN of the resource to load.
423
423
  */
@@ -921,7 +921,7 @@ export class Viewer {
921
921
  "optional": true,
922
922
  "docs": {
923
923
  "tags": [],
924
- "text": "A URN of the scene resource to load when the component is mounted in the\nDOM tree. The specified resource is a URN in the following format:\n\n * `urn:vertexvis:scene:<sceneid>`"
924
+ "text": "A URN of the scene resource to load when the component is mounted in the\nDOM tree. The specified resource is a URN in the following format:\n\n * `urn:vertex:scene:<sceneid>`"
925
925
  },
926
926
  "attribute": "src",
927
927
  "reflect": false
@@ -1971,7 +1971,7 @@ export class Viewer {
1971
1971
  "return": "Promise<void>"
1972
1972
  },
1973
1973
  "docs": {
1974
- "text": "Loads the given scene into the viewer and return a `Promise` that\nresolves when the scene has been loaded. The specified scene is\nprovided as a URN in the following format:\n\n * `urn:vertexvis:scene:<sceneid>`",
1974
+ "text": "Loads the given scene into the viewer and return a `Promise` that\nresolves when the scene has been loaded. The specified scene is\nprovided as a URN in the following format:\n\n * `urn:vertex:scene:<sceneid>`",
1975
1975
  "tags": [{
1976
1976
  "name": "param",
1977
1977
  "text": "urn The URN of the resource to load."