@babylonjs/shared-ui-components 8.4.2 → 8.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/components/layout/utils.js +4 -0
  2. package/components/layout/utils.js.map +1 -1
  3. package/components/lines/ColorLineComponent.js +5 -4
  4. package/components/lines/ColorLineComponent.js.map +1 -1
  5. package/components/lines/FileButtonLineComponent.d.ts +1 -1
  6. package/components/lines/FileButtonLineComponent.js +2 -2
  7. package/components/lines/FileButtonLineComponent.js.map +1 -1
  8. package/components/lines/OptionsLineComponent.js +3 -3
  9. package/components/lines/OptionsLineComponent.js.map +1 -1
  10. package/components/reactGraphSystem/GraphLinesContainer.js +1 -0
  11. package/components/reactGraphSystem/GraphLinesContainer.js.map +1 -1
  12. package/components/reactGraphSystem/NodeRenderer.js +2 -2
  13. package/components/reactGraphSystem/NodeRenderer.js.map +1 -1
  14. package/components/reactGraphSystem/useGraphContext.js +1 -0
  15. package/components/reactGraphSystem/useGraphContext.js.map +1 -1
  16. package/constToOptionsMaps.d.ts +3 -3
  17. package/constToOptionsMaps.js +5 -5
  18. package/constToOptionsMaps.js.map +1 -1
  19. package/copyCommandToClipboard.js +8 -6
  20. package/copyCommandToClipboard.js.map +1 -1
  21. package/historyStack.js +2 -1
  22. package/historyStack.js.map +1 -1
  23. package/lines/checkBoxLineComponent.js.map +1 -1
  24. package/lines/colorLineComponent.js +6 -5
  25. package/lines/colorLineComponent.js.map +1 -1
  26. package/lines/fileButtonLineComponent.d.ts +1 -1
  27. package/lines/fileButtonLineComponent.js +2 -2
  28. package/lines/fileButtonLineComponent.js.map +1 -1
  29. package/lines/fileMultipleButtonLineComponent.d.ts +1 -1
  30. package/lines/fileMultipleButtonLineComponent.js +2 -2
  31. package/lines/fileMultipleButtonLineComponent.js.map +1 -1
  32. package/lines/floatLineComponent.js.map +1 -1
  33. package/lines/optionsLineComponent.js.map +1 -1
  34. package/lines/sliderLineComponent.js +2 -1
  35. package/lines/sliderLineComponent.js.map +1 -1
  36. package/lines/targetsProxy.js +6 -2
  37. package/lines/targetsProxy.js.map +1 -1
  38. package/lines/textInputLineComponent.js +4 -4
  39. package/lines/textInputLineComponent.js.map +1 -1
  40. package/lines/textureButtonLineComponent.d.ts +1 -1
  41. package/lines/textureButtonLineComponent.js +2 -2
  42. package/lines/textureButtonLineComponent.js.map +1 -1
  43. package/lines/unitButton.js +2 -1
  44. package/lines/unitButton.js.map +1 -1
  45. package/nodeGraphSystem/frameNodePort.js.map +1 -1
  46. package/nodeGraphSystem/graphCanvas.js.map +1 -1
  47. package/nodeGraphSystem/graphFrame.js +6 -5
  48. package/nodeGraphSystem/graphFrame.js.map +1 -1
  49. package/nodeGraphSystem/graphNode.js.map +1 -1
  50. package/nodeGraphSystem/interfaces/displayManager.js.map +1 -1
  51. package/nodeGraphSystem/nodeLink.js.map +1 -1
  52. package/nodeGraphSystem/nodePort.js.map +1 -1
  53. package/nodeGraphSystem/searchBox.js.map +1 -1
  54. package/nodeGraphSystem/tools.js +3 -3
  55. package/nodeGraphSystem/tools.js.map +1 -1
  56. package/package.json +1 -1
  57. package/popupHelper.js.map +1 -1
  58. package/stringTools.js +6 -6
  59. package/stringTools.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"searchBox.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/searchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport \"./searchBox.scss\";\r\nimport { NodeLedger } from \"./nodeLedger\";\r\n\r\nexport interface ISearchBoxComponentProps {\r\n stateManager: StateManager;\r\n}\r\n\r\n/**\r\n * The search box component.\r\n */\r\nexport class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, { isVisible: boolean; filter: string; selectedIndex: number }> {\r\n private _handleEscKey: (evt: KeyboardEvent) => void;\r\n private _targetX: number;\r\n private _targetY: number;\r\n private _nodes: string[];\r\n\r\n constructor(props: ISearchBoxComponentProps) {\r\n super(props);\r\n\r\n this.state = { isVisible: false, filter: \"\", selectedIndex: 0 };\r\n\r\n this._handleEscKey = (evt: KeyboardEvent) => {\r\n if (evt.key === \"Escape\") {\r\n this.hide();\r\n }\r\n };\r\n\r\n this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {\r\n this._targetX = loc.x;\r\n this._targetY = loc.y;\r\n this.setState({ isVisible: true, filter: \"\", selectedIndex: 0 });\r\n this.props.stateManager.hostDocument!.addEventListener(\"keydown\", this._handleEscKey);\r\n });\r\n }\r\n\r\n hide() {\r\n this.setState({ isVisible: false });\r\n this.props.stateManager.modalIsDisplayed = false;\r\n this.props.stateManager.hostDocument!.removeEventListener(\"keydown\", this._handleEscKey);\r\n }\r\n\r\n onFilterChange(evt: React.ChangeEvent<HTMLInputElement>) {\r\n this.setState({ filter: evt.target.value });\r\n }\r\n\r\n onNewNodeRequested(name: string) {\r\n this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: name,\r\n targetX: this._targetX,\r\n targetY: this._targetY,\r\n needRepositioning: true,\r\n smartAdd: true,\r\n });\r\n\r\n this.hide();\r\n }\r\n\r\n onKeyDown(evt: React.KeyboardEvent) {\r\n if (evt.code === \"Enter\" && this._nodes.length > 0) {\r\n this.onNewNodeRequested(this._nodes[this.state.selectedIndex]);\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowDown\" && this._nodes.length > 0) {\r\n this.setState({ selectedIndex: Math.min(this.state.selectedIndex + 1, this._nodes.length - 1) });\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowUp\" && this._nodes.length > 0) {\r\n this.setState({ selectedIndex: Math.max(this.state.selectedIndex - 1, 0) });\r\n return;\r\n }\r\n }\r\n\r\n override render() {\r\n if (!this.state.isVisible) {\r\n return null;\r\n }\r\n\r\n const expectedWidth = 300;\r\n const expectedHeight = 400;\r\n\r\n // Sort and deduplicate the node names.\r\n this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));\r\n\r\n if (this.state.filter) {\r\n const filter = this.state.filter.toLowerCase().trim();\r\n this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));\r\n }\r\n\r\n const containerRect = this.props.stateManager.hostDocument.getElementById(\"graph-canvas\")!.getBoundingClientRect();\r\n const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);\r\n const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);\r\n const locStyle = {\r\n left: targetX + \"px\",\r\n top: targetY + \"px\",\r\n };\r\n\r\n if (targetX + expectedWidth > containerRect.width) {\r\n locStyle.left = containerRect.width - expectedWidth - 10 + \"px\";\r\n } else if (targetX < 10) {\r\n locStyle.left = \"10px\";\r\n }\r\n\r\n if (targetY + expectedHeight > containerRect.height) {\r\n locStyle.top = containerRect.height - expectedHeight - 10 + \"px\";\r\n } else if (targetY < 10) {\r\n locStyle.top = \"10px\";\r\n }\r\n\r\n return (\r\n <div id=\"graph-search-container\">\r\n <div id=\"graph-search-picking-blocker\" onClick={() => this.hide()}></div>\r\n <div id=\"graph-search-box\" style={locStyle}>\r\n <div className=\"graph-search-box-title\">Add a node</div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n onChange={(evt) => this.onFilterChange(evt)}\r\n onKeyDown={(evt) => this.onKeyDown(evt)}\r\n value={this.state.filter}\r\n className=\"graph-search-box-filter\"\r\n autoFocus={true}\r\n tabIndex={0}\r\n />\r\n <div className=\"graph-search-box-list\">\r\n {this._nodes.map((name, i) => {\r\n return (\r\n <div\r\n className={\"graph-search-box-list-item \" + (this.state.selectedIndex === i ? \"selected \" : \"\")}\r\n onClick={() => this.onNewNodeRequested(name)}\r\n key={name}\r\n >\r\n {NodeLedger.NameFormatter(name)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"searchBox.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/searchBox.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\r\nimport type { StateManager } from \"./stateManager\";\r\nimport \"./searchBox.scss\";\r\nimport { NodeLedger } from \"./nodeLedger\";\r\n\r\nexport interface ISearchBoxComponentProps {\r\n stateManager: StateManager;\r\n}\r\n\r\n/**\r\n * The search box component.\r\n */\r\nexport class SearchBoxComponent extends React.Component<ISearchBoxComponentProps, { isVisible: boolean; filter: string; selectedIndex: number }> {\r\n private _handleEscKey: (evt: KeyboardEvent) => void;\r\n private _targetX: number;\r\n private _targetY: number;\r\n private _nodes: string[];\r\n\r\n constructor(props: ISearchBoxComponentProps) {\r\n super(props);\r\n\r\n this.state = { isVisible: false, filter: \"\", selectedIndex: 0 };\r\n\r\n this._handleEscKey = (evt: KeyboardEvent) => {\r\n if (evt.key === \"Escape\") {\r\n this.hide();\r\n }\r\n };\r\n\r\n this.props.stateManager.onSearchBoxRequiredObservable.add((loc) => {\r\n this._targetX = loc.x;\r\n this._targetY = loc.y;\r\n this.setState({ isVisible: true, filter: \"\", selectedIndex: 0 });\r\n this.props.stateManager.hostDocument.addEventListener(\"keydown\", this._handleEscKey);\r\n });\r\n }\r\n\r\n hide() {\r\n this.setState({ isVisible: false });\r\n this.props.stateManager.modalIsDisplayed = false;\r\n this.props.stateManager.hostDocument.removeEventListener(\"keydown\", this._handleEscKey);\r\n }\r\n\r\n onFilterChange(evt: React.ChangeEvent<HTMLInputElement>) {\r\n this.setState({ filter: evt.target.value });\r\n }\r\n\r\n onNewNodeRequested(name: string) {\r\n this.props.stateManager.onNewBlockRequiredObservable.notifyObservers({\r\n type: name,\r\n targetX: this._targetX,\r\n targetY: this._targetY,\r\n needRepositioning: true,\r\n smartAdd: true,\r\n });\r\n\r\n this.hide();\r\n }\r\n\r\n onKeyDown(evt: React.KeyboardEvent) {\r\n if (evt.code === \"Enter\" && this._nodes.length > 0) {\r\n this.onNewNodeRequested(this._nodes[this.state.selectedIndex]);\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowDown\" && this._nodes.length > 0) {\r\n this.setState({ selectedIndex: Math.min(this.state.selectedIndex + 1, this._nodes.length - 1) });\r\n return;\r\n }\r\n\r\n if (evt.code === \"ArrowUp\" && this._nodes.length > 0) {\r\n this.setState({ selectedIndex: Math.max(this.state.selectedIndex - 1, 0) });\r\n return;\r\n }\r\n }\r\n\r\n override render() {\r\n if (!this.state.isVisible) {\r\n return null;\r\n }\r\n\r\n const expectedWidth = 300;\r\n const expectedHeight = 400;\r\n\r\n // Sort and deduplicate the node names.\r\n this._nodes = Array.from(new Set(NodeLedger.RegisteredNodeNames.sort()));\r\n\r\n if (this.state.filter) {\r\n const filter = this.state.filter.toLowerCase().trim();\r\n this._nodes = this._nodes.filter((name) => NodeLedger.NameFormatter(name).toLowerCase().includes(filter));\r\n }\r\n\r\n const containerRect = this.props.stateManager.hostDocument.getElementById(\"graph-canvas\")!.getBoundingClientRect();\r\n const targetX = this._targetX - (expectedWidth / 2 + containerRect.x);\r\n const targetY = this._targetY - (expectedHeight / 2 + containerRect.y);\r\n const locStyle = {\r\n left: targetX + \"px\",\r\n top: targetY + \"px\",\r\n };\r\n\r\n if (targetX + expectedWidth > containerRect.width) {\r\n locStyle.left = containerRect.width - expectedWidth - 10 + \"px\";\r\n } else if (targetX < 10) {\r\n locStyle.left = \"10px\";\r\n }\r\n\r\n if (targetY + expectedHeight > containerRect.height) {\r\n locStyle.top = containerRect.height - expectedHeight - 10 + \"px\";\r\n } else if (targetY < 10) {\r\n locStyle.top = \"10px\";\r\n }\r\n\r\n return (\r\n <div id=\"graph-search-container\">\r\n <div id=\"graph-search-picking-blocker\" onClick={() => this.hide()}></div>\r\n <div id=\"graph-search-box\" style={locStyle}>\r\n <div className=\"graph-search-box-title\">Add a node</div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search...\"\r\n onChange={(evt) => this.onFilterChange(evt)}\r\n onKeyDown={(evt) => this.onKeyDown(evt)}\r\n value={this.state.filter}\r\n className=\"graph-search-box-filter\"\r\n autoFocus={true}\r\n tabIndex={0}\r\n />\r\n <div className=\"graph-search-box-list\">\r\n {this._nodes.map((name, i) => {\r\n return (\r\n <div\r\n className={\"graph-search-box-list-item \" + (this.state.selectedIndex === i ? \"selected \" : \"\")}\r\n onClick={() => this.onNewNodeRequested(name)}\r\n key={name}\r\n >\r\n {NodeLedger.NameFormatter(name)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
@@ -48,14 +48,14 @@ export const RefreshNode = (node, visitedNodes, visitedLinks, canvas) => {
48
48
  }
49
49
  }
50
50
  };
51
- let idGenerator = 0;
51
+ let IdGenerator = 0;
52
52
  export const BuildFloatUI = (container, document, displayName, isInteger, source, propertyName, onChange, min, max, visualPropertiesRefresh, additionalClassName) => {
53
53
  const cantDisplaySlider = min === undefined || max === undefined || isNaN(min) || isNaN(max) || min === max;
54
54
  if (cantDisplaySlider) {
55
55
  container.classList.add(localStyles.floatContainer);
56
56
  const numberInput = document.createElement("input");
57
57
  numberInput.type = "number";
58
- numberInput.id = `number-${idGenerator++}`;
58
+ numberInput.id = `number-${IdGenerator++}`;
59
59
  if (additionalClassName) {
60
60
  numberInput.classList.add(additionalClassName);
61
61
  }
@@ -118,7 +118,7 @@ export const BuildFloatUI = (container, document, displayName, isInteger, source
118
118
  container.appendChild(value);
119
119
  const slider = document.createElement("input");
120
120
  slider.type = "range";
121
- slider.id = `slider-${idGenerator++}`;
121
+ slider.id = `slider-${IdGenerator++}`;
122
122
  slider.step = isInteger ? "1" : (Math.abs(max - min) / 100.0).toString();
123
123
  slider.min = min.toString();
124
124
  slider.max = max.toString();
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { NodeLink } from \"./nodeLink\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport * as localStyles from \"./graphNode.module.scss\";\r\n\r\nexport const IsFramePortData = (variableToCheck: any): variableToCheck is FramePortData => {\r\n if (variableToCheck) {\r\n return (variableToCheck as FramePortData).port !== undefined;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nexport const RefreshNode = (node: GraphNode, visitedNodes?: Set<GraphNode>, visitedLinks?: Set<NodeLink>, canvas?: GraphCanvasComponent) => {\r\n node.refresh();\r\n\r\n const links = node.links;\r\n\r\n if (visitedNodes) {\r\n // refresh first the nodes so that the right types are assigned to the auto-detect ports\r\n for (const link of links) {\r\n const nodeA = link.nodeA,\r\n nodeB = link.nodeB;\r\n\r\n if (!visitedNodes.has(nodeA)) {\r\n visitedNodes.add(nodeA);\r\n RefreshNode(nodeA, visitedNodes, visitedLinks);\r\n }\r\n\r\n if (nodeB && !visitedNodes.has(nodeB)) {\r\n visitedNodes.add(nodeB);\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n }\r\n }\r\n\r\n // Invisible endpoints (for teleport nodes)\r\n const invisibleEndpoints = node.content.invisibleEndpoints;\r\n if (invisibleEndpoints && invisibleEndpoints.length) {\r\n for (const endpoint of invisibleEndpoints) {\r\n const graphNode = canvas?.findNodeFromData(endpoint);\r\n if (graphNode) {\r\n if (visitedNodes) {\r\n visitedNodes.add(graphNode);\r\n }\r\n RefreshNode(graphNode, visitedNodes, visitedLinks);\r\n }\r\n }\r\n }\r\n\r\n if (!visitedLinks) {\r\n return;\r\n }\r\n\r\n // then refresh the links to display the right color between ports\r\n for (const link of links) {\r\n if (!visitedLinks.has(link)) {\r\n visitedLinks.add(link);\r\n link.update();\r\n }\r\n }\r\n};\r\n\r\nlet idGenerator = 0;\r\nexport const BuildFloatUI = (\r\n container: HTMLDivElement,\r\n document: Document,\r\n displayName: string,\r\n isInteger: boolean,\r\n source: any,\r\n propertyName: string,\r\n onChange: () => void,\r\n min?: number,\r\n max?: number,\r\n visualPropertiesRefresh?: Array<() => void>,\r\n additionalClassName?: string\r\n) => {\r\n const cantDisplaySlider = min === undefined || max === undefined || isNaN(min) || isNaN(max) || min === max;\r\n if (cantDisplaySlider) {\r\n container.classList.add(localStyles.floatContainer);\r\n const numberInput = document.createElement(\"input\");\r\n numberInput.type = \"number\";\r\n numberInput.id = `number-${idGenerator++}`;\r\n if (additionalClassName) {\r\n numberInput.classList.add(additionalClassName);\r\n }\r\n\r\n if (visualPropertiesRefresh) {\r\n visualPropertiesRefresh.push(() => {\r\n numberInput.value = source[propertyName];\r\n });\r\n } else {\r\n numberInput.value = source[propertyName];\r\n }\r\n numberInput.onchange = () => {\r\n source[propertyName] = parseFloat(numberInput.value);\r\n onChange();\r\n };\r\n\r\n if (isInteger) {\r\n numberInput.step = \"1\";\r\n }\r\n\r\n container.appendChild(numberInput);\r\n const label = document.createElement(\"div\");\r\n label.innerText = displayName;\r\n if (additionalClassName) {\r\n label.classList.add(additionalClassName);\r\n }\r\n container.appendChild(label);\r\n\r\n let shouldCapture = false;\r\n numberInput.onpointerdown = (evt) => {\r\n shouldCapture = true;\r\n evt.preventDefault();\r\n };\r\n numberInput.onpointerup = (evt) => {\r\n if (numberInput.hasPointerCapture(evt.pointerId)) {\r\n numberInput.releasePointerCapture(evt.pointerId);\r\n shouldCapture = false;\r\n evt.preventDefault();\r\n } else {\r\n numberInput.focus();\r\n numberInput.select();\r\n }\r\n };\r\n numberInput.onpointermove = (evt) => {\r\n if (shouldCapture) {\r\n numberInput.setPointerCapture(evt.pointerId);\r\n }\r\n\r\n if (numberInput.hasPointerCapture(evt.pointerId)) {\r\n const delta = isInteger ? Math.sign(evt.movementX) : evt.movementX * 0.01;\r\n numberInput.value = (parseFloat(numberInput.value) + delta).toFixed(isInteger ? 0 : 2);\r\n\r\n source[propertyName] = isInteger ? parseInt(numberInput.value) : parseFloat(numberInput.value);\r\n onChange();\r\n evt.preventDefault();\r\n }\r\n };\r\n } else {\r\n container.classList.add(localStyles.sliderContainer);\r\n const label = document.createElement(\"label\");\r\n container.appendChild(label);\r\n const value = document.createElement(\"div\");\r\n container.appendChild(value);\r\n const slider = document.createElement(\"input\");\r\n slider.type = \"range\";\r\n slider.id = `slider-${idGenerator++}`;\r\n slider.step = isInteger ? \"1\" : (Math.abs(max - min) / 100.0).toString();\r\n slider.min = min.toString();\r\n slider.max = max.toString();\r\n container.appendChild(slider);\r\n label.innerText = displayName;\r\n label.htmlFor = slider.id;\r\n if (visualPropertiesRefresh) {\r\n visualPropertiesRefresh.push(() => {\r\n slider.value = source[propertyName];\r\n value.innerText = source[propertyName];\r\n });\r\n } else {\r\n slider.value = source[propertyName];\r\n value.innerText = source[propertyName];\r\n }\r\n slider.oninput = () => {\r\n source[propertyName] = parseFloat(slider.value);\r\n value.innerText = source[propertyName];\r\n onChange();\r\n };\r\n }\r\n};\r\n\r\nexport function GetListOfAcceptedTypes<T extends Record<string, string | number>>(\r\n types: T,\r\n allValue: number,\r\n autoDetectValue: number,\r\n port: { acceptedConnectionPointTypes: number[]; excludedConnectionPointTypes: number[]; type: number },\r\n skips: number[] = []\r\n) {\r\n let acceptedTypes: string[] = [];\r\n\r\n if (port.type !== autoDetectValue) {\r\n acceptedTypes = [types[port.type] as string];\r\n }\r\n\r\n if (port.acceptedConnectionPointTypes.length !== 0) {\r\n acceptedTypes = port.acceptedConnectionPointTypes.filter((t) => t && t !== port.type).map((t) => types[t as number] as string);\r\n }\r\n\r\n if (skips.indexOf(autoDetectValue) === -1) {\r\n skips.push(autoDetectValue);\r\n }\r\n\r\n if (port.excludedConnectionPointTypes.length !== 0) {\r\n let bitmask = 0;\r\n let val = 2 ** bitmask;\r\n const candidates: number[] = [];\r\n while (val < allValue) {\r\n if (port.excludedConnectionPointTypes.indexOf(val) === -1 && skips.indexOf(val) === -1) {\r\n if (candidates.indexOf(val) === -1) {\r\n candidates.push(val);\r\n }\r\n }\r\n bitmask++;\r\n val = 2 ** bitmask;\r\n }\r\n acceptedTypes = (Object.values(types) as T[keyof T][])\r\n .filter((t) => candidates.indexOf(t as number) !== -1 && t !== port.type)\r\n .map((t) => types[t as number] as string)\r\n .filter((t) => t);\r\n }\r\n return acceptedTypes;\r\n}\r\n\r\nexport function GetConnectionErrorMessage<T extends Record<string, string | number>>(\r\n sourceType: number,\r\n types: T,\r\n allValue: number,\r\n autoDetectValue: number,\r\n port: { acceptedConnectionPointTypes: number[]; excludedConnectionPointTypes: number[]; type: number },\r\n skips: number[] = []\r\n) {\r\n const list = GetListOfAcceptedTypes(types, allValue, autoDetectValue, port, skips).join(\", \");\r\n\r\n return `Cannot connect two different connection types:\\nSource is ${types[sourceType]} but destination only accepts ${list}`;\r\n}\r\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../../dev/sharedUiComponents/src/nodeGraphSystem/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GraphCanvasComponent } from \"./graphCanvas\";\r\nimport type { GraphNode } from \"./graphNode\";\r\nimport type { NodeLink } from \"./nodeLink\";\r\nimport type { FramePortData } from \"./types/framePortData\";\r\nimport * as localStyles from \"./graphNode.module.scss\";\r\n\r\nexport const IsFramePortData = (variableToCheck: any): variableToCheck is FramePortData => {\r\n if (variableToCheck) {\r\n return (variableToCheck as FramePortData).port !== undefined;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nexport const RefreshNode = (node: GraphNode, visitedNodes?: Set<GraphNode>, visitedLinks?: Set<NodeLink>, canvas?: GraphCanvasComponent) => {\r\n node.refresh();\r\n\r\n const links = node.links;\r\n\r\n if (visitedNodes) {\r\n // refresh first the nodes so that the right types are assigned to the auto-detect ports\r\n for (const link of links) {\r\n const nodeA = link.nodeA,\r\n nodeB = link.nodeB;\r\n\r\n if (!visitedNodes.has(nodeA)) {\r\n visitedNodes.add(nodeA);\r\n RefreshNode(nodeA, visitedNodes, visitedLinks);\r\n }\r\n\r\n if (nodeB && !visitedNodes.has(nodeB)) {\r\n visitedNodes.add(nodeB);\r\n RefreshNode(nodeB, visitedNodes, visitedLinks);\r\n }\r\n }\r\n }\r\n\r\n // Invisible endpoints (for teleport nodes)\r\n const invisibleEndpoints = node.content.invisibleEndpoints;\r\n if (invisibleEndpoints && invisibleEndpoints.length) {\r\n for (const endpoint of invisibleEndpoints) {\r\n const graphNode = canvas?.findNodeFromData(endpoint);\r\n if (graphNode) {\r\n if (visitedNodes) {\r\n visitedNodes.add(graphNode);\r\n }\r\n RefreshNode(graphNode, visitedNodes, visitedLinks);\r\n }\r\n }\r\n }\r\n\r\n if (!visitedLinks) {\r\n return;\r\n }\r\n\r\n // then refresh the links to display the right color between ports\r\n for (const link of links) {\r\n if (!visitedLinks.has(link)) {\r\n visitedLinks.add(link);\r\n link.update();\r\n }\r\n }\r\n};\r\n\r\nlet IdGenerator = 0;\r\nexport const BuildFloatUI = (\r\n container: HTMLDivElement,\r\n document: Document,\r\n displayName: string,\r\n isInteger: boolean,\r\n source: any,\r\n propertyName: string,\r\n onChange: () => void,\r\n min?: number,\r\n max?: number,\r\n visualPropertiesRefresh?: Array<() => void>,\r\n additionalClassName?: string\r\n) => {\r\n const cantDisplaySlider = min === undefined || max === undefined || isNaN(min) || isNaN(max) || min === max;\r\n if (cantDisplaySlider) {\r\n container.classList.add(localStyles.floatContainer);\r\n const numberInput = document.createElement(\"input\");\r\n numberInput.type = \"number\";\r\n numberInput.id = `number-${IdGenerator++}`;\r\n if (additionalClassName) {\r\n numberInput.classList.add(additionalClassName);\r\n }\r\n\r\n if (visualPropertiesRefresh) {\r\n visualPropertiesRefresh.push(() => {\r\n numberInput.value = source[propertyName];\r\n });\r\n } else {\r\n numberInput.value = source[propertyName];\r\n }\r\n numberInput.onchange = () => {\r\n source[propertyName] = parseFloat(numberInput.value);\r\n onChange();\r\n };\r\n\r\n if (isInteger) {\r\n numberInput.step = \"1\";\r\n }\r\n\r\n container.appendChild(numberInput);\r\n const label = document.createElement(\"div\");\r\n label.innerText = displayName;\r\n if (additionalClassName) {\r\n label.classList.add(additionalClassName);\r\n }\r\n container.appendChild(label);\r\n\r\n let shouldCapture = false;\r\n numberInput.onpointerdown = (evt) => {\r\n shouldCapture = true;\r\n evt.preventDefault();\r\n };\r\n numberInput.onpointerup = (evt) => {\r\n if (numberInput.hasPointerCapture(evt.pointerId)) {\r\n numberInput.releasePointerCapture(evt.pointerId);\r\n shouldCapture = false;\r\n evt.preventDefault();\r\n } else {\r\n numberInput.focus();\r\n numberInput.select();\r\n }\r\n };\r\n numberInput.onpointermove = (evt) => {\r\n if (shouldCapture) {\r\n numberInput.setPointerCapture(evt.pointerId);\r\n }\r\n\r\n if (numberInput.hasPointerCapture(evt.pointerId)) {\r\n const delta = isInteger ? Math.sign(evt.movementX) : evt.movementX * 0.01;\r\n numberInput.value = (parseFloat(numberInput.value) + delta).toFixed(isInteger ? 0 : 2);\r\n\r\n source[propertyName] = isInteger ? parseInt(numberInput.value) : parseFloat(numberInput.value);\r\n onChange();\r\n evt.preventDefault();\r\n }\r\n };\r\n } else {\r\n container.classList.add(localStyles.sliderContainer);\r\n const label = document.createElement(\"label\");\r\n container.appendChild(label);\r\n const value = document.createElement(\"div\");\r\n container.appendChild(value);\r\n const slider = document.createElement(\"input\");\r\n slider.type = \"range\";\r\n slider.id = `slider-${IdGenerator++}`;\r\n slider.step = isInteger ? \"1\" : (Math.abs(max - min) / 100.0).toString();\r\n slider.min = min.toString();\r\n slider.max = max.toString();\r\n container.appendChild(slider);\r\n label.innerText = displayName;\r\n label.htmlFor = slider.id;\r\n if (visualPropertiesRefresh) {\r\n visualPropertiesRefresh.push(() => {\r\n slider.value = source[propertyName];\r\n value.innerText = source[propertyName];\r\n });\r\n } else {\r\n slider.value = source[propertyName];\r\n value.innerText = source[propertyName];\r\n }\r\n slider.oninput = () => {\r\n source[propertyName] = parseFloat(slider.value);\r\n value.innerText = source[propertyName];\r\n onChange();\r\n };\r\n }\r\n};\r\n\r\nexport function GetListOfAcceptedTypes<T extends Record<string, string | number>>(\r\n types: T,\r\n allValue: number,\r\n autoDetectValue: number,\r\n port: { acceptedConnectionPointTypes: number[]; excludedConnectionPointTypes: number[]; type: number },\r\n skips: number[] = []\r\n) {\r\n let acceptedTypes: string[] = [];\r\n\r\n if (port.type !== autoDetectValue) {\r\n acceptedTypes = [types[port.type] as string];\r\n }\r\n\r\n if (port.acceptedConnectionPointTypes.length !== 0) {\r\n acceptedTypes = port.acceptedConnectionPointTypes.filter((t) => t && t !== port.type).map((t) => types[t] as string);\r\n }\r\n\r\n if (skips.indexOf(autoDetectValue) === -1) {\r\n skips.push(autoDetectValue);\r\n }\r\n\r\n if (port.excludedConnectionPointTypes.length !== 0) {\r\n let bitmask = 0;\r\n let val = 2 ** bitmask;\r\n const candidates: number[] = [];\r\n while (val < allValue) {\r\n if (port.excludedConnectionPointTypes.indexOf(val) === -1 && skips.indexOf(val) === -1) {\r\n if (candidates.indexOf(val) === -1) {\r\n candidates.push(val);\r\n }\r\n }\r\n bitmask++;\r\n val = 2 ** bitmask;\r\n }\r\n acceptedTypes = (Object.values(types) as T[keyof T][])\r\n .filter((t) => candidates.indexOf(t as number) !== -1 && t !== port.type)\r\n .map((t) => types[t as number] as string)\r\n .filter((t) => t);\r\n }\r\n return acceptedTypes;\r\n}\r\n\r\nexport function GetConnectionErrorMessage<T extends Record<string, string | number>>(\r\n sourceType: number,\r\n types: T,\r\n allValue: number,\r\n autoDetectValue: number,\r\n port: { acceptedConnectionPointTypes: number[]; excludedConnectionPointTypes: number[]; type: number },\r\n skips: number[] = []\r\n) {\r\n const list = GetListOfAcceptedTypes(types, allValue, autoDetectValue, port, skips).join(\", \");\r\n\r\n return `Cannot connect two different connection types:\\nSource is ${types[sourceType]} but destination only accepts ${list}`;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/shared-ui-components",
3
- "version": "8.4.2",
3
+ "version": "8.6.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"popupHelper.js","sourceRoot":"","sources":["../../../dev/sharedUiComponents/src/popupHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACvB,KAAa,EACb,OAKE;IAEF,MAAM,YAAY,GAAG;QACjB,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,GAAG,OAAO;KACb,CAAC;IAEF,MAAM,yBAAyB,GAAG;QAC9B,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO;QACnE,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO;KACvE,CAAC;IAEF,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC;SAC/D,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAI,yBAAiC,CAAC,GAAG,CAAC,CAAC;SACjE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;IAE5C,OAAO;IACP,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,GAAG,YAAY,CAAC;IAC7B,SAAS,CAAC,IAAI,GAAG,qCAAqC,CAAC;IACvD,cAAc,CAAC,IAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAE5C,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IACzC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1C,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACvC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IAExC,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IACnC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACjC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IAElC,IAAI,YAAY,CAAC,6BAA6B,EAAE,CAAC;QAC7C,YAAY,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACrD,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,EAAE;QACZ,8BAA8B;QAC9B,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAChD,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,IAAI,YAAY,CAAC,sBAAsB,EAAE,CAAC;QACtC,YAAY,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC","sourcesContent":["import { CopyStyles } from \"./styleHelper\";\r\n\r\n/**\r\n * Create a popup window\r\n * @param title default title for the popup\r\n * @param options options for the popup\r\n * @returns the parent control of the popup\r\n */\r\nexport function CreatePopup(\r\n title: string,\r\n options: Partial<{\r\n onParentControlCreateCallback?: (parentControl: HTMLDivElement) => void;\r\n onWindowCreateCallback?: (newWindow: Window) => void;\r\n width?: number;\r\n height?: number;\r\n }>\r\n) {\r\n const localOptions = {\r\n width: 300,\r\n height: 800,\r\n ...options,\r\n };\r\n\r\n const windowCreationOptionsList = {\r\n width: localOptions.width,\r\n height: localOptions.height,\r\n top: (window.innerHeight - localOptions.width) / 2 + window.screenY,\r\n left: (window.innerWidth - localOptions.height) / 2 + window.screenX,\r\n };\r\n\r\n const windowCreationOptions = Object.keys(windowCreationOptionsList)\r\n .map((key) => key + \"=\" + (windowCreationOptionsList as any)[key])\r\n .join(\",\");\r\n\r\n const popupWindow = window.open(\"\", title, windowCreationOptions);\r\n if (!popupWindow) {\r\n return null;\r\n }\r\n\r\n const parentDocument = popupWindow.document;\r\n\r\n // Font\r\n const newLinkEl = parentDocument.createElement(\"link\");\r\n\r\n newLinkEl.rel = \"stylesheet\";\r\n newLinkEl.href = \"https://use.typekit.net/cta4xsb.css\";\r\n parentDocument.head!.appendChild(newLinkEl);\r\n\r\n parentDocument.title = title;\r\n parentDocument.body.style.width = \"100%\";\r\n parentDocument.body.style.height = \"100%\";\r\n parentDocument.body.style.margin = \"0\";\r\n parentDocument.body.style.padding = \"0\";\r\n\r\n const parentControl = parentDocument.createElement(\"div\");\r\n parentControl.style.width = \"100%\";\r\n parentControl.style.height = \"100%\";\r\n parentControl.style.margin = \"0\";\r\n parentControl.style.padding = \"0\";\r\n\r\n if (localOptions.onParentControlCreateCallback) {\r\n localOptions.onParentControlCreateCallback(parentControl);\r\n }\r\n\r\n popupWindow.document.body.appendChild(parentControl);\r\n CopyStyles(window.document, parentDocument);\r\n setTimeout(() => {\r\n // need this for late bindings\r\n CopyStyles(window.document, parentDocument);\r\n }, 0);\r\n\r\n if (localOptions.onWindowCreateCallback) {\r\n localOptions.onWindowCreateCallback(popupWindow);\r\n }\r\n\r\n return parentControl;\r\n}\r\n"]}
1
+ {"version":3,"file":"popupHelper.js","sourceRoot":"","sources":["../../../dev/sharedUiComponents/src/popupHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACvB,KAAa,EACb,OAKE;IAEF,MAAM,YAAY,GAAG;QACjB,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,GAAG,OAAO;KACb,CAAC;IAEF,MAAM,yBAAyB,GAAG;QAC9B,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO;QACnE,IAAI,EAAE,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO;KACvE,CAAC;IAEF,MAAM,qBAAqB,GAAG,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC;SAC/D,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAI,yBAAiC,CAAC,GAAG,CAAC,CAAC;SACjE,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;IAE5C,OAAO;IACP,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,GAAG,YAAY,CAAC;IAC7B,SAAS,CAAC,IAAI,GAAG,qCAAqC,CAAC;IACvD,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAE3C,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IACzC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IAC1C,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACvC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IAExC,MAAM,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1D,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;IACnC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IACjC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IAElC,IAAI,YAAY,CAAC,6BAA6B,EAAE,CAAC;QAC7C,YAAY,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACrD,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,EAAE;QACZ,8BAA8B;QAC9B,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAChD,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,IAAI,YAAY,CAAC,sBAAsB,EAAE,CAAC;QACtC,YAAY,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC","sourcesContent":["import { CopyStyles } from \"./styleHelper\";\r\n\r\n/**\r\n * Create a popup window\r\n * @param title default title for the popup\r\n * @param options options for the popup\r\n * @returns the parent control of the popup\r\n */\r\nexport function CreatePopup(\r\n title: string,\r\n options: Partial<{\r\n onParentControlCreateCallback?: (parentControl: HTMLDivElement) => void;\r\n onWindowCreateCallback?: (newWindow: Window) => void;\r\n width?: number;\r\n height?: number;\r\n }>\r\n) {\r\n const localOptions = {\r\n width: 300,\r\n height: 800,\r\n ...options,\r\n };\r\n\r\n const windowCreationOptionsList = {\r\n width: localOptions.width,\r\n height: localOptions.height,\r\n top: (window.innerHeight - localOptions.width) / 2 + window.screenY,\r\n left: (window.innerWidth - localOptions.height) / 2 + window.screenX,\r\n };\r\n\r\n const windowCreationOptions = Object.keys(windowCreationOptionsList)\r\n .map((key) => key + \"=\" + (windowCreationOptionsList as any)[key])\r\n .join(\",\");\r\n\r\n const popupWindow = window.open(\"\", title, windowCreationOptions);\r\n if (!popupWindow) {\r\n return null;\r\n }\r\n\r\n const parentDocument = popupWindow.document;\r\n\r\n // Font\r\n const newLinkEl = parentDocument.createElement(\"link\");\r\n\r\n newLinkEl.rel = \"stylesheet\";\r\n newLinkEl.href = \"https://use.typekit.net/cta4xsb.css\";\r\n parentDocument.head.appendChild(newLinkEl);\r\n\r\n parentDocument.title = title;\r\n parentDocument.body.style.width = \"100%\";\r\n parentDocument.body.style.height = \"100%\";\r\n parentDocument.body.style.margin = \"0\";\r\n parentDocument.body.style.padding = \"0\";\r\n\r\n const parentControl = parentDocument.createElement(\"div\");\r\n parentControl.style.width = \"100%\";\r\n parentControl.style.height = \"100%\";\r\n parentControl.style.margin = \"0\";\r\n parentControl.style.padding = \"0\";\r\n\r\n if (localOptions.onParentControlCreateCallback) {\r\n localOptions.onParentControlCreateCallback(parentControl);\r\n }\r\n\r\n popupWindow.document.body.appendChild(parentControl);\r\n CopyStyles(window.document, parentDocument);\r\n setTimeout(() => {\r\n // need this for late bindings\r\n CopyStyles(window.document, parentDocument);\r\n }, 0);\r\n\r\n if (localOptions.onWindowCreateCallback) {\r\n localOptions.onWindowCreateCallback(popupWindow);\r\n }\r\n\r\n return parentControl;\r\n}\r\n"]}
package/stringTools.js CHANGED
@@ -10,13 +10,13 @@ export class StringTools {
10
10
  */
11
11
  static _SaveAs(blob, name, document) {
12
12
  if ("download" in HTMLAnchorElement.prototype) {
13
- const URL = window.URL || window.webkitURL;
13
+ const url = window.URL || window.webkitURL;
14
14
  const a = document.createElement("a");
15
15
  a.download = name;
16
16
  a.rel = "noopener"; // tabnabbing
17
- a.href = URL.createObjectURL(blob);
17
+ a.href = url.createObjectURL(blob);
18
18
  setTimeout(() => {
19
- URL.revokeObjectURL(a.href);
19
+ url.revokeObjectURL(a.href);
20
20
  }, 4e4); // 40s
21
21
  setTimeout(() => {
22
22
  this._Click(a, document);
@@ -49,8 +49,8 @@ export class StringTools {
49
49
  reader.readAsDataURL(blob);
50
50
  }
51
51
  else {
52
- const URL = window.URL || window.webkitURL;
53
- const url = URL.createObjectURL(blob);
52
+ const windowUrl = window.URL || window.webkitURL;
53
+ const url = windowUrl.createObjectURL(blob);
54
54
  if (popup) {
55
55
  popup.location.href = url;
56
56
  }
@@ -59,7 +59,7 @@ export class StringTools {
59
59
  }
60
60
  popup = null;
61
61
  setTimeout(function () {
62
- URL.revokeObjectURL(url);
62
+ windowUrl.revokeObjectURL(url);
63
63
  }, 4e4);
64
64
  }
65
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stringTools.js","sourceRoot":"","sources":["../../../dev/sharedUiComponents/src/stringTools.ts"],"names":[],"mappings":"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","sourcesContent":["export class StringTools {\r\n /*\r\n * Based on FileSaver.js\r\n * A saveAs() FileSaver implementation.\r\n *\r\n * By Eli Grey, http://eligrey.com\r\n *\r\n * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\r\n * source : http://purl.eligrey.com/github/FileSaver.js\r\n */\r\n private static _SaveAs(blob: Blob, name: string, document: HTMLDocument) {\r\n if (\"download\" in HTMLAnchorElement.prototype) {\r\n const URL = window.URL || window.webkitURL;\r\n const a = document.createElement(\"a\");\r\n\r\n a.download = name;\r\n a.rel = \"noopener\"; // tabnabbing\r\n\r\n a.href = URL.createObjectURL(blob);\r\n setTimeout(() => {\r\n URL.revokeObjectURL(a.href);\r\n }, 4e4); // 40s\r\n setTimeout(() => {\r\n this._Click(a, document);\r\n }, 0);\r\n return;\r\n }\r\n\r\n // Open a popup immediately do go around popup blocker\r\n // Mostly only available on user interaction and the fileReader is async so...\r\n let popup = open(\"\", \"_blank\");\r\n if (popup) {\r\n popup.document.title = popup.document.body.innerText = \"downloading...\";\r\n }\r\n\r\n const force = blob.type === \"application/octet-stream\";\r\n const isSafari = /constructor/i.test((window as any).HTMLElement) || (window as any).safari;\r\n const isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\r\n\r\n if ((isChromeIOS || (force && isSafari)) && typeof FileReader !== \"undefined\") {\r\n // Safari doesn't allow downloading of blob URLs\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n let url: any = reader.result;\r\n url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, \"data:attachment/file;\");\r\n if (popup) {\r\n popup.location.href = url;\r\n } else {\r\n location.href = url;\r\n }\r\n popup = null;\r\n };\r\n reader.readAsDataURL(blob);\r\n } else {\r\n const URL = window.URL || window.webkitURL;\r\n const url = URL.createObjectURL(blob);\r\n if (popup) {\r\n popup.location.href = url;\r\n } else {\r\n location.href = url;\r\n }\r\n popup = null;\r\n setTimeout(function () {\r\n URL.revokeObjectURL(url);\r\n }, 4e4);\r\n }\r\n }\r\n\r\n private static _Click(node: HTMLElement, document: HTMLDocument) {\r\n try {\r\n node.dispatchEvent(new MouseEvent(\"click\"));\r\n } catch (e) {\r\n const evt = document.createEvent(\"MouseEvents\");\r\n evt.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\r\n node.dispatchEvent(evt);\r\n }\r\n }\r\n\r\n /**\r\n * Download a string into a file that will be saved locally by the browser\r\n * @param document\r\n * @param content defines the string to download locally as a file\r\n * @param filename\r\n */\r\n public static DownloadAsFile(document: HTMLDocument, content: string, filename: string) {\r\n const blob = new Blob([content], {\r\n type: \"application/octet-stream\",\r\n });\r\n\r\n this._SaveAs(blob, filename, document);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"stringTools.js","sourceRoot":"","sources":["../../../dev/sharedUiComponents/src/stringTools.ts"],"names":[],"mappings":"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","sourcesContent":["export class StringTools {\r\n /*\r\n * Based on FileSaver.js\r\n * A saveAs() FileSaver implementation.\r\n *\r\n * By Eli Grey, http://eligrey.com\r\n *\r\n * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)\r\n * source : http://purl.eligrey.com/github/FileSaver.js\r\n */\r\n private static _SaveAs(blob: Blob, name: string, document: HTMLDocument) {\r\n if (\"download\" in HTMLAnchorElement.prototype) {\r\n const url = window.URL || window.webkitURL;\r\n const a = document.createElement(\"a\");\r\n\r\n a.download = name;\r\n a.rel = \"noopener\"; // tabnabbing\r\n\r\n a.href = url.createObjectURL(blob);\r\n setTimeout(() => {\r\n url.revokeObjectURL(a.href);\r\n }, 4e4); // 40s\r\n setTimeout(() => {\r\n this._Click(a, document);\r\n }, 0);\r\n return;\r\n }\r\n\r\n // Open a popup immediately do go around popup blocker\r\n // Mostly only available on user interaction and the fileReader is async so...\r\n let popup = open(\"\", \"_blank\");\r\n if (popup) {\r\n popup.document.title = popup.document.body.innerText = \"downloading...\";\r\n }\r\n\r\n const force = blob.type === \"application/octet-stream\";\r\n const isSafari = /constructor/i.test((window as any).HTMLElement) || (window as any).safari;\r\n const isChromeIOS = /CriOS\\/[\\d]+/.test(navigator.userAgent);\r\n\r\n if ((isChromeIOS || (force && isSafari)) && typeof FileReader !== \"undefined\") {\r\n // Safari doesn't allow downloading of blob URLs\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n let url: any = reader.result;\r\n url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, \"data:attachment/file;\");\r\n if (popup) {\r\n popup.location.href = url;\r\n } else {\r\n location.href = url;\r\n }\r\n popup = null;\r\n };\r\n reader.readAsDataURL(blob);\r\n } else {\r\n const windowUrl = window.URL || window.webkitURL;\r\n const url = windowUrl.createObjectURL(blob);\r\n if (popup) {\r\n popup.location.href = url;\r\n } else {\r\n location.href = url;\r\n }\r\n popup = null;\r\n setTimeout(function () {\r\n windowUrl.revokeObjectURL(url);\r\n }, 4e4);\r\n }\r\n }\r\n\r\n private static _Click(node: HTMLElement, document: HTMLDocument) {\r\n try {\r\n node.dispatchEvent(new MouseEvent(\"click\"));\r\n } catch (e) {\r\n const evt = document.createEvent(\"MouseEvents\");\r\n evt.initMouseEvent(\"click\", true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null);\r\n node.dispatchEvent(evt);\r\n }\r\n }\r\n\r\n /**\r\n * Download a string into a file that will be saved locally by the browser\r\n * @param document\r\n * @param content defines the string to download locally as a file\r\n * @param filename\r\n */\r\n public static DownloadAsFile(document: HTMLDocument, content: string, filename: string) {\r\n const blob = new Blob([content], {\r\n type: \"application/octet-stream\",\r\n });\r\n\r\n this._SaveAs(blob, filename, document);\r\n }\r\n}\r\n"]}