@deephaven/components 0.46.1-beta.2 → 0.46.1-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AutoCompleteInput.js +40 -34
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/AutoResizeTextarea.js +2 -1
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/BasicModal.js +48 -33
- package/dist/BasicModal.js.map +1 -1
- package/dist/Button.js +19 -8
- package/dist/Button.js.map +1 -1
- package/dist/ButtonGroup.js +5 -3
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/ButtonOld.js +5 -3
- package/dist/ButtonOld.js.map +1 -1
- package/dist/CardFlip.js +14 -9
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.js +23 -19
- package/dist/Checkbox.js.map +1 -1
- package/dist/Collapse.js +12 -9
- package/dist/Collapse.js.map +1 -1
- package/dist/ComboBox.js +61 -51
- package/dist/ComboBox.js.map +1 -1
- package/dist/CopyButton.js +5 -3
- package/dist/CopyButton.js.map +1 -1
- package/dist/CustomTimeSelect.js +92 -84
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DateInput.js +19 -17
- package/dist/DateInput.js.map +1 -1
- package/dist/DateTimeInput.js +20 -18
- package/dist/DateTimeInput.js.map +1 -1
- package/dist/DebouncedSearchInput.js +2 -1
- package/dist/DebouncedSearchInput.js.map +1 -1
- package/dist/DraggableItemList.js +97 -80
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/EditableItemList.js +53 -46
- package/dist/EditableItemList.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +59 -49
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.js +42 -37
- package/dist/ItemList.js.map +1 -1
- package/dist/ItemListItem.js +5 -3
- package/dist/ItemListItem.js.map +1 -1
- package/dist/LoadingOverlay.js +28 -20
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/LoadingSpinner.js +13 -10
- package/dist/LoadingSpinner.js.map +1 -1
- package/dist/MaskedInput.js +2 -1
- package/dist/MaskedInput.js.map +1 -1
- package/dist/Option.js +5 -3
- package/dist/Option.js.map +1 -1
- package/dist/RadioGroup.js +14 -10
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioItem.js +23 -19
- package/dist/RadioItem.js.map +1 -1
- package/dist/RandomAreaPlotAnimation.js +8 -6
- package/dist/RandomAreaPlotAnimation.js.map +1 -1
- package/dist/SearchInput.js +26 -21
- package/dist/SearchInput.js.map +1 -1
- package/dist/Select.js +5 -3
- package/dist/Select.js.map +1 -1
- package/dist/SelectValueList.js +29 -24
- package/dist/SelectValueList.js.map +1 -1
- package/dist/SocketedButton.js +13 -10
- package/dist/SocketedButton.js.map +1 -1
- package/dist/TimeInput.js +2 -1
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.js +123 -106
- package/dist/TimeSlider.js.map +1 -1
- package/dist/ToastNotification.js +35 -27
- package/dist/ToastNotification.js.map +1 -1
- package/dist/UISwitch.js +7 -5
- package/dist/UISwitch.js.map +1 -1
- package/dist/ValidateLabelInput.js +33 -24
- package/dist/ValidateLabelInput.js.map +1 -1
- package/dist/context-actions/ContextActions.js +7 -5
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.js +44 -41
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.js +34 -24
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/ContextMenuRoot.js +6 -4
- package/dist/context-actions/ContextMenuRoot.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.js +3 -3
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.js +19 -16
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.js +8 -9
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/modal/DebouncedModal.js +14 -9
- package/dist/modal/DebouncedModal.js.map +1 -1
- package/dist/modal/InfoModal.js +22 -13
- package/dist/modal/InfoModal.js.map +1 -1
- package/dist/modal/Modal.js +70 -60
- package/dist/modal/Modal.js.map +1 -1
- package/dist/modal/ModalBody.js +5 -3
- package/dist/modal/ModalBody.js.map +1 -1
- package/dist/modal/ModalFooter.js +5 -3
- package/dist/modal/ModalFooter.js.map +1 -1
- package/dist/modal/ModalHeader.js +19 -13
- package/dist/modal/ModalHeader.js.map +1 -1
- package/dist/navigation/Menu.js +15 -12
- package/dist/navigation/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.js +29 -22
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/Page.js +35 -26
- package/dist/navigation/Page.js.map +1 -1
- package/dist/navigation/Stack.js +33 -20
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/popper/Popper.js +31 -25
- package/dist/popper/Popper.js.map +1 -1
- package/dist/popper/Tooltip.js +18 -13
- package/dist/popper/Tooltip.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RandomAreaPlotAnimation.js","names":["React","useEffect","useState","useRef","debounce","assertNotNull","ThemeExport","VOLATILITY","LOW","HIGH","START_Y","FOREGROUND","GRID_SIZE","GRID_COLOR","BACKGROUND","PATTERN","SIZE","DOT_SIZE","FILL_OPACITY","PX_PER_SECOND","RESIZE_DEBOUNCE","INTERACTION_TIMEOUT","RandomAreaPlotAnimation","memo","canvas","container","shade","setShade","scale","window","devicePixelRatio","ctx","pattern","width","height","rAF","lastTimestamp","data","setCanvasSize","current","offsetWidth","offsetHeight","style","createPatternFill","canvasPattern","document","createElement","contextPattern","getContext","fillStyle","fillRect","Math","round","toString","padStart","createPattern","randomWalk","prev","rand","random","change","abs","initData","startingData","y","x","push","setDataSize","length","pop","drawAreaLine","path","context","beginPath","moveTo","lineTo","i","closePath","drawGridLines","drawCanvas","timestamp","lineWidth","strokeStyle","stroke","subPixelMotion","translate","fill","setTransform","numberOfPoints","floor","shift","cancelAnimationFrame","requestAnimationFrame","debouncedHandleResize","leading","pauseAnimation","resetIdleTimeout","startAnimation","handleActivity","hasFocus","handleResize","alpha","addEventListener","removeEventListener","cancel"],"sources":["../src/RandomAreaPlotAnimation.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable react/display-name */\n\nimport React, { useEffect, useState, useRef } from 'react';\nimport debounce from 'lodash.debounce';\nimport { assertNotNull } from '@deephaven/utils';\nimport './RandomAreaPlotAnimation.scss';\nimport ThemeExport from './ThemeExport';\n\nconst VOLATILITY = 0.025; // how spikey the data gets\nconst LOW = 0.9;\nconst HIGH = 0.1;\nconst START_Y = 0.618;\nconst FOREGROUND = ThemeExport['primary-dark'];\nconst GRID_SIZE = 80;\nconst GRID_COLOR = ThemeExport['gray-800'];\nconst BACKGROUND = ThemeExport['gray-900'];\nconst PATTERN = { SIZE: 8, DOT_SIZE: 2, FILL_OPACITY: 0.25 };\nconst PX_PER_SECOND = 18;\nconst RESIZE_DEBOUNCE = 250;\nconst INTERACTION_TIMEOUT = 60 * 1000;\n\n// Draw a background canvas, paint it with a fun chart looking animation\nconst RandomAreaPlotAnimation = React.memo(() => {\n const canvas = useRef<HTMLCanvasElement>(null);\n const container = useRef<HTMLDivElement>(null);\n const [shade, setShade] = useState(false);\n const scale = window.devicePixelRatio;\n\n let ctx: CanvasRenderingContext2D | null | undefined;\n let pattern: CanvasPattern | null | undefined;\n let width: number;\n let height: number;\n let rAF: number | null;\n\n let lastTimestamp: DOMHighResTimeStamp | null | undefined = null;\n let data: number[] = [];\n\n function setCanvasSize() {\n // Set canvas size to fill screen\n if (container.current != null) {\n width = container.current.offsetWidth;\n height = container.current.offsetHeight;\n }\n\n if (canvas.current != null) {\n canvas.current.style.width = `${width}px`;\n canvas.current.style.height = `${height}px`;\n\n canvas.current.width = width * scale;\n canvas.current.height = height * scale;\n }\n\n ctx?.scale(scale, scale);\n }\n\n // Returns the background fill create offscreen as pattern\n function createPatternFill() {\n // create the off-screen canvas\n const canvasPattern = document.createElement('canvas');\n canvasPattern.width = PATTERN.SIZE;\n canvasPattern.height = PATTERN.SIZE;\n const contextPattern = canvasPattern.getContext('2d');\n\n // draw pattern to off-screen context\n if (contextPattern != null) {\n contextPattern.fillStyle = FOREGROUND;\n contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);\n\n // add an overlay fill\n contextPattern.fillStyle =\n FOREGROUND +\n Math.round(255 * PATTERN.FILL_OPACITY)\n .toString(16)\n .padStart(2, '0'); // adds opacity in hex to color\n contextPattern.fillRect(0, 0, PATTERN.SIZE, PATTERN.SIZE);\n }\n return contextPattern?.createPattern(canvasPattern, 'repeat');\n }\n\n /**\n * Generates a step in a random walk between LOW - HIGH given a previous value\n * data is always in 0-1 data space so its scaleable\n * data space is converted to screen space inside draw functions\n * @param prev previous random walk step\n * @return new random walk step\n */\n function randomWalk(prev: number): number {\n const rand = Math.random() - 0.5; // give it directionality\n let change = VOLATILITY * rand; // scale by volatity constant\n\n // ensure directional bounce off approaching edges\n if (prev < HIGH) {\n change = Math.abs(change);\n } else if (prev > LOW) {\n change = -Math.abs(change);\n }\n\n return prev + change;\n }\n\n function initData() {\n const startingData = [];\n let y = START_Y; // always start towards the bottom of the screen\n for (let x = 0; x < width + PX_PER_SECOND; x += 1) {\n y = randomWalk(y);\n startingData.push(y);\n }\n return startingData;\n }\n\n function setDataSize() {\n while (data.length >= width + PX_PER_SECOND) {\n data.pop();\n }\n while (data.length < width + PX_PER_SECOND) {\n data.push(randomWalk(data[data.length - 1]));\n }\n }\n\n function drawAreaLine(path: number[], context: CanvasRenderingContext2D) {\n context.beginPath();\n // start offscreen\n context.moveTo(-1, height + 1);\n context.lineTo(-1, height * path[0]);\n\n // draw the line\n for (let i = 0; i < path.length; i += 1) {\n context.lineTo(i, height * path[i]);\n }\n\n // close offscreen\n context.lineTo(width + PX_PER_SECOND, height * path[path.length - 1]);\n context.lineTo(width + PX_PER_SECOND, height + 1);\n context.closePath();\n }\n\n function drawGridLines(context: CanvasRenderingContext2D) {\n context.beginPath();\n // draw verticals\n for (let x = 1; x < width; x += GRID_SIZE) {\n context.moveTo(x, 0);\n context.lineTo(x, height);\n }\n // draw horizontals\n for (let y = 1; y < height; y += GRID_SIZE) {\n context.moveTo(0, y);\n context.lineTo(width, y);\n }\n }\n\n /**\n * Main draw loop for where the animation happens\n * all the styling happens within drawCanvas from paths generated by other functions\n * @param timestamp passed in callback from requestAnimationFrame\n */\n function drawCanvas(timestamp?: DOMHighResTimeStamp) {\n lastTimestamp = lastTimestamp ?? timestamp;\n\n assertNotNull(ctx);\n // clear the canvas\n ctx.fillStyle = BACKGROUND;\n ctx.fillRect(0, 0, width, height);\n\n drawGridLines(ctx);\n ctx.lineWidth = 1;\n ctx.strokeStyle = GRID_COLOR;\n ctx.stroke();\n\n // for speeds less then 60 px per second, subpixel motion is required to look smooth\n const subPixelMotion =\n ((lastTimestamp ?? 0) - (timestamp ?? 0)) / (1000 / PX_PER_SECOND);\n ctx.translate(subPixelMotion, 0);\n\n drawAreaLine(data, ctx);\n ctx.lineWidth = 2;\n ctx.strokeStyle = FOREGROUND;\n ctx.stroke();\n\n ctx.translate(-subPixelMotion, 0); // we don't pattern to shift however\n if (pattern != null) {\n ctx.fillStyle = pattern;\n }\n ctx.fill();\n ctx.setTransform(scale, 0, 0, scale, 0, 0); // reset the translate matrix to normal\n\n // generate new data points\n if ((timestamp ?? 0) - (lastTimestamp ?? 0) > 1000 / PX_PER_SECOND) {\n // number of points to add since last update\n const numberOfPoints = Math.floor(\n ((timestamp ?? 0) - (lastTimestamp ?? 0)) / (1000 / PX_PER_SECOND)\n );\n for (let i = 0; i < numberOfPoints; i += 1) {\n data.shift();\n data.push(randomWalk(data[data.length - 1]));\n }\n lastTimestamp = timestamp;\n }\n\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = requestAnimationFrame(drawCanvas);\n }\n\n // debounce the resize so its not overly aggresive\n const debouncedHandleResize = debounce(\n () => {\n rAF = requestAnimationFrame(timestamp => {\n setCanvasSize(); // setCanvas can cause lag if not debounced\n\n // fill or remove extra data points\n setDataSize();\n\n // opening devtools triggers a blur then resize,\n // need to reset shade as we are restarting animation\n setShade(false);\n drawCanvas(timestamp);\n });\n },\n RESIZE_DEBOUNCE,\n { leading: true } // resize immediately, once.\n );\n\n function pauseAnimation() {\n // pause animation when browser window is blurred to conserve CPU usage\n setShade(true);\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = null;\n lastTimestamp = null;\n }\n\n // when timeout expires, pause animation\n const resetIdleTimeout = debounce(() => {\n pauseAnimation();\n }, INTERACTION_TIMEOUT);\n\n function startAnimation() {\n // can fire multiple times, check if rAF is null first\n // restart animation loop, and fade back in\n if (rAF == null) {\n setShade(false);\n setCanvasSize();\n setDataSize();\n rAF = requestAnimationFrame(drawCanvas);\n }\n resetIdleTimeout();\n }\n\n function handleActivity() {\n if (document.hasFocus()) {\n // only if document has focus (mousemove can fire on non-focused tabs)\n startAnimation();\n }\n }\n\n function handleResize() {\n // pause and debounce animation during resize for better resizing performance\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n resetIdleTimeout(); // treat resizing as a form of activity\n debouncedHandleResize();\n }\n\n // react mount/unmount hooks\n useEffect(() => {\n ctx = canvas.current?.getContext('2d', { alpha: false });\n setCanvasSize();\n data = initData();\n pattern = createPatternFill();\n\n // start draw loop\n drawCanvas();\n resetIdleTimeout();\n\n window.addEventListener('resize', handleResize);\n\n window.addEventListener('focus', startAnimation);\n window.addEventListener('blur', pauseAnimation);\n\n // don't burn cpu if the user is \"idle\", start a timer that resets\n // on any user activity, and on timeout expiry pause the animation\n window.addEventListener('mousemove', handleActivity);\n window.addEventListener('keydown', handleActivity);\n\n return () => {\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('focus', startAnimation);\n window.removeEventListener('blur', pauseAnimation);\n\n window.removeEventListener('mousemove', handleActivity);\n window.removeEventListener('keydown', handleActivity);\n\n resetIdleTimeout.cancel();\n debouncedHandleResize.cancel();\n };\n }, []);\n\n return (\n <div className=\"random-area-plot-animation-container\" ref={container}>\n <canvas ref={canvas} className={shade ? 'shade' : ''} />\n </div>\n );\n});\n\nexport default RandomAreaPlotAnimation;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RandomAreaPlotAnimation.js","names":["React","useEffect","useState","useRef","debounce","assertNotNull","ThemeExport","VOLATILITY","LOW","HIGH","START_Y","FOREGROUND","GRID_SIZE","GRID_COLOR","BACKGROUND","PATTERN","SIZE","DOT_SIZE","FILL_OPACITY","PX_PER_SECOND","RESIZE_DEBOUNCE","INTERACTION_TIMEOUT","RandomAreaPlotAnimation","memo","canvas","container","shade","setShade","scale","window","devicePixelRatio","ctx","pattern","width","height","rAF","lastTimestamp","data","setCanvasSize","current","offsetWidth","offsetHeight","style","createPatternFill","canvasPattern","document","createElement","contextPattern","getContext","fillStyle","fillRect","Math","round","toString","padStart","createPattern","randomWalk","prev","rand","random","change","abs","initData","startingData","y","x","push","setDataSize","length","pop","drawAreaLine","path","context","beginPath","moveTo","lineTo","i","closePath","drawGridLines","drawCanvas","timestamp","lineWidth","strokeStyle","stroke","subPixelMotion","translate","fill","setTransform","numberOfPoints","floor","shift","cancelAnimationFrame","requestAnimationFrame","debouncedHandleResize","leading","pauseAnimation","resetIdleTimeout","startAnimation","handleActivity","hasFocus","handleResize","alpha","addEventListener","removeEventListener","cancel"],"sources":["../src/RandomAreaPlotAnimation.tsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable react/display-name */\n\nimport React, { useEffect, useState, useRef } from 'react';\nimport debounce from 'lodash.debounce';\nimport { assertNotNull } from '@deephaven/utils';\nimport './RandomAreaPlotAnimation.scss';\nimport ThemeExport from './ThemeExport';\n\nconst VOLATILITY = 0.025; // how spikey the data gets\nconst LOW = 0.9;\nconst HIGH = 0.1;\nconst START_Y = 0.618;\nconst FOREGROUND = ThemeExport['primary-dark'];\nconst GRID_SIZE = 80;\nconst GRID_COLOR = ThemeExport['gray-800'];\nconst BACKGROUND = ThemeExport['gray-900'];\nconst PATTERN = { SIZE: 8, DOT_SIZE: 2, FILL_OPACITY: 0.25 };\nconst PX_PER_SECOND = 18;\nconst RESIZE_DEBOUNCE = 250;\nconst INTERACTION_TIMEOUT = 60 * 1000;\n\n// Draw a background canvas, paint it with a fun chart looking animation\nconst RandomAreaPlotAnimation = React.memo(() => {\n const canvas = useRef<HTMLCanvasElement>(null);\n const container = useRef<HTMLDivElement>(null);\n const [shade, setShade] = useState(false);\n const scale = window.devicePixelRatio;\n\n let ctx: CanvasRenderingContext2D | null | undefined;\n let pattern: CanvasPattern | null | undefined;\n let width: number;\n let height: number;\n let rAF: number | null;\n\n let lastTimestamp: DOMHighResTimeStamp | null | undefined = null;\n let data: number[] = [];\n\n function setCanvasSize() {\n // Set canvas size to fill screen\n if (container.current != null) {\n width = container.current.offsetWidth;\n height = container.current.offsetHeight;\n }\n\n if (canvas.current != null) {\n canvas.current.style.width = `${width}px`;\n canvas.current.style.height = `${height}px`;\n\n canvas.current.width = width * scale;\n canvas.current.height = height * scale;\n }\n\n ctx?.scale(scale, scale);\n }\n\n // Returns the background fill create offscreen as pattern\n function createPatternFill() {\n // create the off-screen canvas\n const canvasPattern = document.createElement('canvas');\n canvasPattern.width = PATTERN.SIZE;\n canvasPattern.height = PATTERN.SIZE;\n const contextPattern = canvasPattern.getContext('2d');\n\n // draw pattern to off-screen context\n if (contextPattern != null) {\n contextPattern.fillStyle = FOREGROUND;\n contextPattern.fillRect(0, 0, PATTERN.DOT_SIZE, PATTERN.DOT_SIZE);\n\n // add an overlay fill\n contextPattern.fillStyle =\n FOREGROUND +\n Math.round(255 * PATTERN.FILL_OPACITY)\n .toString(16)\n .padStart(2, '0'); // adds opacity in hex to color\n contextPattern.fillRect(0, 0, PATTERN.SIZE, PATTERN.SIZE);\n }\n return contextPattern?.createPattern(canvasPattern, 'repeat');\n }\n\n /**\n * Generates a step in a random walk between LOW - HIGH given a previous value\n * data is always in 0-1 data space so its scaleable\n * data space is converted to screen space inside draw functions\n * @param prev previous random walk step\n * @return new random walk step\n */\n function randomWalk(prev: number): number {\n const rand = Math.random() - 0.5; // give it directionality\n let change = VOLATILITY * rand; // scale by volatity constant\n\n // ensure directional bounce off approaching edges\n if (prev < HIGH) {\n change = Math.abs(change);\n } else if (prev > LOW) {\n change = -Math.abs(change);\n }\n\n return prev + change;\n }\n\n function initData() {\n const startingData = [];\n let y = START_Y; // always start towards the bottom of the screen\n for (let x = 0; x < width + PX_PER_SECOND; x += 1) {\n y = randomWalk(y);\n startingData.push(y);\n }\n return startingData;\n }\n\n function setDataSize() {\n while (data.length >= width + PX_PER_SECOND) {\n data.pop();\n }\n while (data.length < width + PX_PER_SECOND) {\n data.push(randomWalk(data[data.length - 1]));\n }\n }\n\n function drawAreaLine(path: number[], context: CanvasRenderingContext2D) {\n context.beginPath();\n // start offscreen\n context.moveTo(-1, height + 1);\n context.lineTo(-1, height * path[0]);\n\n // draw the line\n for (let i = 0; i < path.length; i += 1) {\n context.lineTo(i, height * path[i]);\n }\n\n // close offscreen\n context.lineTo(width + PX_PER_SECOND, height * path[path.length - 1]);\n context.lineTo(width + PX_PER_SECOND, height + 1);\n context.closePath();\n }\n\n function drawGridLines(context: CanvasRenderingContext2D) {\n context.beginPath();\n // draw verticals\n for (let x = 1; x < width; x += GRID_SIZE) {\n context.moveTo(x, 0);\n context.lineTo(x, height);\n }\n // draw horizontals\n for (let y = 1; y < height; y += GRID_SIZE) {\n context.moveTo(0, y);\n context.lineTo(width, y);\n }\n }\n\n /**\n * Main draw loop for where the animation happens\n * all the styling happens within drawCanvas from paths generated by other functions\n * @param timestamp passed in callback from requestAnimationFrame\n */\n function drawCanvas(timestamp?: DOMHighResTimeStamp) {\n lastTimestamp = lastTimestamp ?? timestamp;\n\n assertNotNull(ctx);\n // clear the canvas\n ctx.fillStyle = BACKGROUND;\n ctx.fillRect(0, 0, width, height);\n\n drawGridLines(ctx);\n ctx.lineWidth = 1;\n ctx.strokeStyle = GRID_COLOR;\n ctx.stroke();\n\n // for speeds less then 60 px per second, subpixel motion is required to look smooth\n const subPixelMotion =\n ((lastTimestamp ?? 0) - (timestamp ?? 0)) / (1000 / PX_PER_SECOND);\n ctx.translate(subPixelMotion, 0);\n\n drawAreaLine(data, ctx);\n ctx.lineWidth = 2;\n ctx.strokeStyle = FOREGROUND;\n ctx.stroke();\n\n ctx.translate(-subPixelMotion, 0); // we don't pattern to shift however\n if (pattern != null) {\n ctx.fillStyle = pattern;\n }\n ctx.fill();\n ctx.setTransform(scale, 0, 0, scale, 0, 0); // reset the translate matrix to normal\n\n // generate new data points\n if ((timestamp ?? 0) - (lastTimestamp ?? 0) > 1000 / PX_PER_SECOND) {\n // number of points to add since last update\n const numberOfPoints = Math.floor(\n ((timestamp ?? 0) - (lastTimestamp ?? 0)) / (1000 / PX_PER_SECOND)\n );\n for (let i = 0; i < numberOfPoints; i += 1) {\n data.shift();\n data.push(randomWalk(data[data.length - 1]));\n }\n lastTimestamp = timestamp;\n }\n\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = requestAnimationFrame(drawCanvas);\n }\n\n // debounce the resize so its not overly aggresive\n const debouncedHandleResize = debounce(\n () => {\n rAF = requestAnimationFrame(timestamp => {\n setCanvasSize(); // setCanvas can cause lag if not debounced\n\n // fill or remove extra data points\n setDataSize();\n\n // opening devtools triggers a blur then resize,\n // need to reset shade as we are restarting animation\n setShade(false);\n drawCanvas(timestamp);\n });\n },\n RESIZE_DEBOUNCE,\n { leading: true } // resize immediately, once.\n );\n\n function pauseAnimation() {\n // pause animation when browser window is blurred to conserve CPU usage\n setShade(true);\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n rAF = null;\n lastTimestamp = null;\n }\n\n // when timeout expires, pause animation\n const resetIdleTimeout = debounce(() => {\n pauseAnimation();\n }, INTERACTION_TIMEOUT);\n\n function startAnimation() {\n // can fire multiple times, check if rAF is null first\n // restart animation loop, and fade back in\n if (rAF == null) {\n setShade(false);\n setCanvasSize();\n setDataSize();\n rAF = requestAnimationFrame(drawCanvas);\n }\n resetIdleTimeout();\n }\n\n function handleActivity() {\n if (document.hasFocus()) {\n // only if document has focus (mousemove can fire on non-focused tabs)\n startAnimation();\n }\n }\n\n function handleResize() {\n // pause and debounce animation during resize for better resizing performance\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n resetIdleTimeout(); // treat resizing as a form of activity\n debouncedHandleResize();\n }\n\n // react mount/unmount hooks\n useEffect(() => {\n ctx = canvas.current?.getContext('2d', { alpha: false });\n setCanvasSize();\n data = initData();\n pattern = createPatternFill();\n\n // start draw loop\n drawCanvas();\n resetIdleTimeout();\n\n window.addEventListener('resize', handleResize);\n\n window.addEventListener('focus', startAnimation);\n window.addEventListener('blur', pauseAnimation);\n\n // don't burn cpu if the user is \"idle\", start a timer that resets\n // on any user activity, and on timeout expiry pause the animation\n window.addEventListener('mousemove', handleActivity);\n window.addEventListener('keydown', handleActivity);\n\n return () => {\n if (rAF != null) {\n cancelAnimationFrame(rAF);\n }\n window.removeEventListener('resize', handleResize);\n window.removeEventListener('focus', startAnimation);\n window.removeEventListener('blur', pauseAnimation);\n\n window.removeEventListener('mousemove', handleActivity);\n window.removeEventListener('keydown', handleActivity);\n\n resetIdleTimeout.cancel();\n debouncedHandleResize.cancel();\n };\n }, []);\n\n return (\n <div className=\"random-area-plot-animation-container\" ref={container}>\n <canvas ref={canvas} className={shade ? 'shade' : ''} />\n </div>\n );\n});\n\nexport default RandomAreaPlotAnimation;\n"],"mappings":"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"}
|
package/dist/SearchInput.js
CHANGED
|
@@ -6,6 +6,8 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
|
6
6
|
import { vsSearch } from '@deephaven/icons';
|
|
7
7
|
import classNames from 'classnames';
|
|
8
8
|
import "./SearchInput.css";
|
|
9
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
11
|
class SearchInput extends PureComponent {
|
|
10
12
|
constructor(props) {
|
|
11
13
|
super(props);
|
|
@@ -29,27 +31,30 @@ class SearchInput extends PureComponent {
|
|
|
29
31
|
onKeyDown,
|
|
30
32
|
'data-testid': dataTestId
|
|
31
33
|
} = this.props;
|
|
32
|
-
return /*#__PURE__*/
|
|
33
|
-
className: classNames('search-group', className)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
34
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
35
|
+
className: classNames('search-group', className),
|
|
36
|
+
children: [/*#__PURE__*/_jsx("input", {
|
|
37
|
+
type: "search",
|
|
38
|
+
value: value,
|
|
39
|
+
onBlur: onBlur,
|
|
40
|
+
onChange: onChange,
|
|
41
|
+
onKeyDown: onKeyDown,
|
|
42
|
+
className: "form-control",
|
|
43
|
+
disabled: disabled,
|
|
44
|
+
placeholder: placeholder,
|
|
45
|
+
ref: this.inputField,
|
|
46
|
+
id: id,
|
|
47
|
+
"data-testid": dataTestId
|
|
48
|
+
}), matchCount != null && /*#__PURE__*/_jsx("span", {
|
|
49
|
+
className: "search-match",
|
|
50
|
+
children: matchCount
|
|
51
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
52
|
+
className: "search-icon",
|
|
53
|
+
children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
54
|
+
icon: vsSearch
|
|
55
|
+
})
|
|
56
|
+
})]
|
|
57
|
+
});
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
_defineProperty(SearchInput, "defaultProps", {
|
package/dist/SearchInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchInput.js","names":["React","PureComponent","FontAwesomeIcon","vsSearch","classNames","SearchInput","constructor","props","inputField","createRef","focus","current","render","value","placeholder","onBlur","onChange","className","disabled","matchCount","id","onKeyDown","dataTestId","undefined"],"sources":["../src/SearchInput.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsSearch } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport './SearchInput.scss';\n\ninterface SearchInputProps {\n value: string;\n placeholder: string;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>;\n className: string;\n disabled?: boolean;\n matchCount: number;\n id: string;\n 'data-testid'?: string;\n}\n\nclass SearchInput extends PureComponent<SearchInputProps> {\n static defaultProps = {\n placeholder: 'Search',\n className: '',\n matchCount: null,\n onKeyDown(): void {\n // no-op\n },\n id: '',\n 'data-testid': undefined,\n };\n\n constructor(props: SearchInputProps) {\n super(props);\n this.inputField = React.createRef();\n }\n\n inputField: React.RefObject<HTMLInputElement>;\n\n focus(): void {\n this.inputField.current?.focus();\n }\n\n render(): JSX.Element {\n const {\n value,\n placeholder,\n onBlur,\n onChange,\n className,\n disabled,\n matchCount,\n id,\n onKeyDown,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div className={classNames('search-group', className)}>\n <input\n type=\"search\"\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n className=\"form-control\"\n disabled={disabled}\n placeholder={placeholder}\n ref={this.inputField}\n id={id}\n data-testid={dataTestId}\n />\n {matchCount != null && (\n <span className=\"search-match\">{matchCount}</span>\n )}\n <span className=\"search-icon\">\n <FontAwesomeIcon icon={vsSearch} />\n </span>\n </div>\n );\n }\n}\n\nexport default SearchInput;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,OAAOC,UAAU,MAAM,YAAY;AAAC;AAgBpC,MAAMC,WAAW,SAASJ,aAAa,CAAmB;EAYxDK,WAAW,CAACC,KAAuB,EAAE;IACnC,KAAK,CAACA,KAAK,CAAC;IAAC;IACb,IAAI,CAACC,UAAU,gBAAGR,KAAK,CAACS,SAAS,EAAE;EACrC;EAIAC,KAAK,GAAS;IAAA;IACZ,6BAAI,CAACF,UAAU,CAACG,OAAO,0DAAvB,sBAAyBD,KAAK,EAAE;EAClC;EAEAE,MAAM,GAAgB;IACpB,IAAM;MACJC,KAAK;MACLC,WAAW;MACXC,MAAM;MACNC,QAAQ;MACRC,SAAS;MACTC,QAAQ;MACRC,UAAU;MACVC,EAAE;MACFC,SAAS;MACT,aAAa,EAAEC;IACjB,CAAC,GAAG,IAAI,CAACf,KAAK;IACd,oBACE;MAAK,SAAS,EAAEH,UAAU,CAAC,cAAc,EAAEa,SAAS;
|
|
1
|
+
{"version":3,"file":"SearchInput.js","names":["React","PureComponent","FontAwesomeIcon","vsSearch","classNames","SearchInput","constructor","props","inputField","createRef","focus","current","render","value","placeholder","onBlur","onChange","className","disabled","matchCount","id","onKeyDown","dataTestId","undefined"],"sources":["../src/SearchInput.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsSearch } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport './SearchInput.scss';\n\ninterface SearchInputProps {\n value: string;\n placeholder: string;\n onBlur?: React.FocusEventHandler<HTMLInputElement>;\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n onKeyDown: React.KeyboardEventHandler<HTMLInputElement>;\n className: string;\n disabled?: boolean;\n matchCount: number;\n id: string;\n 'data-testid'?: string;\n}\n\nclass SearchInput extends PureComponent<SearchInputProps> {\n static defaultProps = {\n placeholder: 'Search',\n className: '',\n matchCount: null,\n onKeyDown(): void {\n // no-op\n },\n id: '',\n 'data-testid': undefined,\n };\n\n constructor(props: SearchInputProps) {\n super(props);\n this.inputField = React.createRef();\n }\n\n inputField: React.RefObject<HTMLInputElement>;\n\n focus(): void {\n this.inputField.current?.focus();\n }\n\n render(): JSX.Element {\n const {\n value,\n placeholder,\n onBlur,\n onChange,\n className,\n disabled,\n matchCount,\n id,\n onKeyDown,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div className={classNames('search-group', className)}>\n <input\n type=\"search\"\n value={value}\n onBlur={onBlur}\n onChange={onChange}\n onKeyDown={onKeyDown}\n className=\"form-control\"\n disabled={disabled}\n placeholder={placeholder}\n ref={this.inputField}\n id={id}\n data-testid={dataTestId}\n />\n {matchCount != null && (\n <span className=\"search-match\">{matchCount}</span>\n )}\n <span className=\"search-icon\">\n <FontAwesomeIcon icon={vsSearch} />\n </span>\n </div>\n );\n }\n}\n\nexport default SearchInput;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,OAAOC,UAAU,MAAM,YAAY;AAAC;AAAA;AAAA;AAgBpC,MAAMC,WAAW,SAASJ,aAAa,CAAmB;EAYxDK,WAAW,CAACC,KAAuB,EAAE;IACnC,KAAK,CAACA,KAAK,CAAC;IAAC;IACb,IAAI,CAACC,UAAU,gBAAGR,KAAK,CAACS,SAAS,EAAE;EACrC;EAIAC,KAAK,GAAS;IAAA;IACZ,6BAAI,CAACF,UAAU,CAACG,OAAO,0DAAvB,sBAAyBD,KAAK,EAAE;EAClC;EAEAE,MAAM,GAAgB;IACpB,IAAM;MACJC,KAAK;MACLC,WAAW;MACXC,MAAM;MACNC,QAAQ;MACRC,SAAS;MACTC,QAAQ;MACRC,UAAU;MACVC,EAAE;MACFC,SAAS;MACT,aAAa,EAAEC;IACjB,CAAC,GAAG,IAAI,CAACf,KAAK;IACd,oBACE;MAAK,SAAS,EAAEH,UAAU,CAAC,cAAc,EAAEa,SAAS,CAAE;MAAA,wBACpD;QACE,IAAI,EAAC,QAAQ;QACb,KAAK,EAAEJ,KAAM;QACb,MAAM,EAAEE,MAAO;QACf,QAAQ,EAAEC,QAAS;QACnB,SAAS,EAAEK,SAAU;QACrB,SAAS,EAAC,cAAc;QACxB,QAAQ,EAAEH,QAAS;QACnB,WAAW,EAAEJ,WAAY;QACzB,GAAG,EAAE,IAAI,CAACN,UAAW;QACrB,EAAE,EAAEY,EAAG;QACP,eAAaE;MAAW,EACxB,EACDH,UAAU,IAAI,IAAI,iBACjB;QAAM,SAAS,EAAC,cAAc;QAAA,UAAEA;MAAU,EAC3C,eACD;QAAM,SAAS,EAAC,aAAa;QAAA,uBAC3B,KAAC,eAAe;UAAC,IAAI,EAAEhB;QAAS;MAAG,EAC9B;IAAA,EACH;EAEV;AACF;AAAC,gBA5DKE,WAAW,kBACO;EACpBS,WAAW,EAAE,QAAQ;EACrBG,SAAS,EAAE,EAAE;EACbE,UAAU,EAAE,IAAI;EAChBE,SAAS,GAAS;IAChB;EAAA,CACD;EACDD,EAAE,EAAE,EAAE;EACN,aAAa,EAAEG;AACjB,CAAC;AAoDH,eAAelB,WAAW"}
|
package/dist/Select.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
4
|
function Select(_ref) {
|
|
4
5
|
var {
|
|
5
6
|
children,
|
|
@@ -15,7 +16,7 @@ function Select(_ref) {
|
|
|
15
16
|
var handleChange = useCallback(event => {
|
|
16
17
|
onChange(event.target.value);
|
|
17
18
|
}, [onChange]);
|
|
18
|
-
return /*#__PURE__*/
|
|
19
|
+
return /*#__PURE__*/_jsx("select", {
|
|
19
20
|
className: classNames('custom-select', className),
|
|
20
21
|
onBlur: onBlur,
|
|
21
22
|
onChange: handleChange,
|
|
@@ -23,8 +24,9 @@ function Select(_ref) {
|
|
|
23
24
|
value: value,
|
|
24
25
|
name: name,
|
|
25
26
|
disabled: disabled,
|
|
26
|
-
"data-testid": dataTestId
|
|
27
|
-
|
|
27
|
+
"data-testid": dataTestId,
|
|
28
|
+
children: children
|
|
29
|
+
});
|
|
28
30
|
}
|
|
29
31
|
export default Select;
|
|
30
32
|
//# sourceMappingURL=Select.js.map
|
package/dist/Select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.js","names":["React","useCallback","classNames","Select","children","onBlur","onChange","className","defaultValue","name","value","disabled","dataTestId","handleChange","event","target"],"sources":["../src/Select.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport type SelectProps = {\n children: React.ReactNode;\n onBlur?: React.FocusEventHandler<HTMLSelectElement>;\n onChange: (value: string) => void;\n className?: string;\n defaultValue?: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nfunction Select({\n children,\n onBlur,\n onChange,\n className,\n defaultValue,\n name,\n value,\n disabled,\n 'data-testid': dataTestId,\n}: SelectProps): JSX.Element {\n const handleChange = useCallback(\n event => {\n onChange(event.target.value);\n },\n [onChange]\n );\n\n return (\n <select\n className={classNames('custom-select', className)}\n onBlur={onBlur}\n onChange={handleChange}\n defaultValue={defaultValue}\n value={value}\n name={name}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n </select>\n );\n}\n\nexport default Select;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,OAAOC,UAAU,MAAM,YAAY;
|
|
1
|
+
{"version":3,"file":"Select.js","names":["React","useCallback","classNames","Select","children","onBlur","onChange","className","defaultValue","name","value","disabled","dataTestId","handleChange","event","target"],"sources":["../src/Select.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport classNames from 'classnames';\n\nexport type SelectProps = {\n children: React.ReactNode;\n onBlur?: React.FocusEventHandler<HTMLSelectElement>;\n onChange: (value: string) => void;\n className?: string;\n defaultValue?: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nfunction Select({\n children,\n onBlur,\n onChange,\n className,\n defaultValue,\n name,\n value,\n disabled,\n 'data-testid': dataTestId,\n}: SelectProps): JSX.Element {\n const handleChange = useCallback(\n event => {\n onChange(event.target.value);\n },\n [onChange]\n );\n\n return (\n <select\n className={classNames('custom-select', className)}\n onBlur={onBlur}\n onChange={handleChange}\n defaultValue={defaultValue}\n value={value}\n name={name}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n </select>\n );\n}\n\nexport default Select;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,OAAOC,UAAU,MAAM,YAAY;AAAC;AAcpC,SAASC,MAAM,OAUc;EAAA,IAVb;IACdC,QAAQ;IACRC,MAAM;IACNC,QAAQ;IACRC,SAAS;IACTC,YAAY;IACZC,IAAI;IACJC,KAAK;IACLC,QAAQ;IACR,aAAa,EAAEC;EACJ,CAAC;EACZ,IAAMC,YAAY,GAAGZ,WAAW,CAC9Ba,KAAK,IAAI;IACPR,QAAQ,CAACQ,KAAK,CAACC,MAAM,CAACL,KAAK,CAAC;EAC9B,CAAC,EACD,CAACJ,QAAQ,CAAC,CACX;EAED,oBACE;IACE,SAAS,EAAEJ,UAAU,CAAC,eAAe,EAAEK,SAAS,CAAE;IAClD,MAAM,EAAEF,MAAO;IACf,QAAQ,EAAEQ,YAAa;IACvB,YAAY,EAAEL,YAAa;IAC3B,KAAK,EAAEE,KAAM;IACb,IAAI,EAAED,IAAK;IACX,QAAQ,EAAEE,QAAS;IACnB,eAAaC,UAAW;IAAA,UAEvBR;EAAQ,EACF;AAEb;AAEA,eAAeD,MAAM"}
|
package/dist/SelectValueList.js
CHANGED
|
@@ -6,6 +6,7 @@ import "./SelectValueList.css";
|
|
|
6
6
|
import classNames from 'classnames';
|
|
7
7
|
import memoize from 'memoizee';
|
|
8
8
|
import Checkbox from "./Checkbox.js";
|
|
9
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
10
|
/**
|
|
10
11
|
* Select values from a long scrollable list.
|
|
11
12
|
* Swaps items in and out for infinite scrolling
|
|
@@ -24,16 +25,17 @@ class SelectValueList extends PureComponent {
|
|
|
24
25
|
return (
|
|
25
26
|
/*#__PURE__*/
|
|
26
27
|
// Tab index is needed so the item could be a related target in the blur event details
|
|
27
|
-
|
|
28
|
+
_jsx("li", {
|
|
28
29
|
className: "value-list-item",
|
|
29
30
|
style: style,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
31
|
+
tabIndex: -1,
|
|
32
|
+
children: /*#__PURE__*/_jsx(Checkbox, {
|
|
33
|
+
checked: isSelected,
|
|
34
|
+
disabled: disabled,
|
|
35
|
+
onChange: () => this.handleSelect(itemIndex),
|
|
36
|
+
children: text
|
|
37
|
+
})
|
|
38
|
+
}, key)
|
|
37
39
|
);
|
|
38
40
|
}, {
|
|
39
41
|
max: 1000
|
|
@@ -141,28 +143,31 @@ class SelectValueList extends PureComponent {
|
|
|
141
143
|
'data-testid': dataTestId
|
|
142
144
|
} = this.props;
|
|
143
145
|
var itemElements = this.getCachedItems(items, rowHeight, offset, disabled);
|
|
144
|
-
return /*#__PURE__*/
|
|
146
|
+
return /*#__PURE__*/_jsx("div", {
|
|
145
147
|
className: classNames('select-value-list-scroll-pane h-100 w-100', {
|
|
146
148
|
'is-invalid': isInvalid
|
|
147
149
|
}, className),
|
|
148
150
|
onBlur: this.handleBlur,
|
|
149
151
|
onScroll: this.handleScroll,
|
|
150
152
|
ref: this.list,
|
|
151
|
-
"data-testid": dataTestId
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
153
|
+
"data-testid": dataTestId,
|
|
154
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
155
|
+
className: "select-value-list",
|
|
156
|
+
style: {
|
|
157
|
+
height: itemCount * rowHeight
|
|
158
|
+
},
|
|
159
|
+
children: /*#__PURE__*/_jsx("ol", {
|
|
160
|
+
className: "select-value-list-content",
|
|
161
|
+
style: {
|
|
162
|
+
position: 'absolute',
|
|
163
|
+
height: items.length * rowHeight,
|
|
164
|
+
top: offset * rowHeight,
|
|
165
|
+
left: 0
|
|
166
|
+
},
|
|
167
|
+
children: itemElements
|
|
168
|
+
})
|
|
169
|
+
})
|
|
170
|
+
});
|
|
166
171
|
}
|
|
167
172
|
}
|
|
168
173
|
_defineProperty(SelectValueList, "defaultProps", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectValueList.js","names":["React","PureComponent","classNames","memoize","Checkbox","SelectValueList","constructor","props","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleBlur","bind","handleScroll","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","e","relatedTarget","current","HTMLElement","contains","onBlur","onSelect","visibleItemIndex","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","getElement","elements","querySelectorAll","scrollIntoView","index","block","render","className","isInvalid","itemCount","dataTestId","getCachedItems","position","left","undefined"],"sources":["../src/SelectValueList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport './SelectValueList.scss';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport Checkbox from './Checkbox';\n\nexport interface SelectItem<T> {\n value: T;\n displayValue?: string | JSX.Element;\n isSelected: boolean;\n}\n\ntype SelectValueListProps<T> = {\n className?: string;\n disabled: boolean;\n isInvalid?: boolean;\n // Total item count\n itemCount: number;\n rowHeight: number;\n\n // Offset of the top item in the items array\n offset: number;\n items: SelectItem<T>[];\n\n onBlur?: React.FocusEventHandler<Element>;\n onSelect(itemIndex: number, value: T | null): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n\n 'data-testid'?: string;\n};\n\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass SelectValueList<T> extends PureComponent<SelectValueListProps<T>> {\n static defaultProps = {\n disabled: false,\n rowHeight: 21,\n onBlur: (): void => undefined,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n\n this.list = React.createRef();\n this.topRow = null;\n this.bottomRow = null;\n }\n\n componentDidMount(): void {\n this.sendViewportUpdate();\n }\n\n componentDidUpdate(): void {\n this.sendViewportUpdate();\n }\n\n list: React.RefObject<HTMLDivElement>;\n\n topRow: number | null;\n\n bottomRow: number | null;\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n value: T,\n displayValue: string | JSX.Element | undefined,\n rowHeight: number,\n isSelected: boolean,\n disabled: boolean\n ): JSX.Element => {\n const style = {\n height: rowHeight,\n };\n const text = displayValue != null ? displayValue : value;\n\n return (\n // Tab index is needed so the item could be a related target in the blur event details\n <li className=\"value-list-item\" style={style} key={key} tabIndex={-1}>\n <Checkbox\n checked={isSelected}\n disabled={disabled}\n onChange={() => this.handleSelect(itemIndex)}\n >\n {text}\n </Checkbox>\n </li>\n );\n },\n { max: 1000 }\n );\n\n getCachedItems = memoize(\n (\n items: SelectItem<T>[],\n rowHeight: number,\n offset: number,\n disabled: boolean\n ): React.ReactNode => {\n const itemElements: JSX.Element[] = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value, displayValue, isSelected } = item;\n const itemIndex = offset + i;\n const key = itemIndex;\n const element = this.getCachedItem(\n itemIndex,\n key,\n value,\n displayValue,\n rowHeight,\n isSelected,\n disabled\n );\n itemElements.push(element);\n }\n return itemElements;\n },\n { max: 1 }\n );\n\n handleBlur(e: React.FocusEvent): void {\n if (\n !e.relatedTarget ||\n (this.list.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.list.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the list\n const { onBlur } = this.props;\n onBlur?.(e);\n }\n }\n\n handleScroll(): void {\n this.sendViewportUpdate();\n }\n\n handleSelect(itemIndex: number): void {\n const { items, offset, onSelect } = this.props;\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n const item = items[visibleItemIndex];\n const { value } = item;\n onSelect(itemIndex, value);\n } else {\n onSelect(itemIndex, null);\n }\n }\n\n sendViewportUpdate(): void {\n if (!this.list.current || this.list.current.clientHeight === 0) {\n return;\n }\n\n const { onViewportChange, rowHeight } = this.props;\n const top = this.list.current.scrollTop;\n const bottom = top + this.list.current.clientHeight;\n\n const topRow = Math.floor(top / rowHeight);\n const bottomRow = Math.ceil(bottom / rowHeight);\n\n if (this.topRow !== topRow || this.bottomRow !== bottomRow) {\n this.topRow = topRow;\n this.bottomRow = bottomRow;\n onViewportChange(topRow, bottomRow);\n }\n }\n\n getElement(itemIndex: number): Element | null {\n if (this.list.current == null) {\n return null;\n }\n const elements = this.list.current.querySelectorAll('.value-list-item');\n return elements[itemIndex];\n }\n\n scrollIntoView(index: number): void {\n const element = this.getElement(index);\n element?.scrollIntoView({ block: 'center' });\n }\n\n render(): JSX.Element {\n const {\n className,\n disabled,\n isInvalid,\n items,\n itemCount,\n offset,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const itemElements = this.getCachedItems(\n items,\n rowHeight,\n offset,\n disabled\n );\n\n return (\n <div\n className={classNames(\n 'select-value-list-scroll-pane h-100 w-100',\n { 'is-invalid': isInvalid },\n className\n )}\n onBlur={this.handleBlur}\n onScroll={this.handleScroll}\n ref={this.list}\n data-testid={dataTestId}\n >\n <div\n className=\"select-value-list\"\n style={{ height: itemCount * rowHeight }}\n >\n <ol\n className=\"select-value-list-content\"\n style={{\n position: 'absolute',\n height: items.length * rowHeight,\n top: offset * rowHeight,\n left: 0,\n }}\n >\n {itemElements}\n </ol>\n </div>\n </div>\n );\n }\n}\n\nexport default SelectValueList;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SelectValueList.js","names":["React","PureComponent","classNames","memoize","Checkbox","SelectValueList","constructor","props","itemIndex","key","value","displayValue","rowHeight","isSelected","disabled","style","height","text","handleSelect","max","items","offset","itemElements","i","length","item","element","getCachedItem","push","handleBlur","bind","handleScroll","list","createRef","topRow","bottomRow","componentDidMount","sendViewportUpdate","componentDidUpdate","e","relatedTarget","current","HTMLElement","contains","onBlur","onSelect","visibleItemIndex","clientHeight","onViewportChange","top","scrollTop","bottom","Math","floor","ceil","getElement","elements","querySelectorAll","scrollIntoView","index","block","render","className","isInvalid","itemCount","dataTestId","getCachedItems","position","left","undefined"],"sources":["../src/SelectValueList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport './SelectValueList.scss';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport Checkbox from './Checkbox';\n\nexport interface SelectItem<T> {\n value: T;\n displayValue?: string | JSX.Element;\n isSelected: boolean;\n}\n\ntype SelectValueListProps<T> = {\n className?: string;\n disabled: boolean;\n isInvalid?: boolean;\n // Total item count\n itemCount: number;\n rowHeight: number;\n\n // Offset of the top item in the items array\n offset: number;\n items: SelectItem<T>[];\n\n onBlur?: React.FocusEventHandler<Element>;\n onSelect(itemIndex: number, value: T | null): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n\n 'data-testid'?: string;\n};\n\n/**\n * Select values from a long scrollable list.\n * Swaps items in and out for infinite scrolling\n */\nclass SelectValueList<T> extends PureComponent<SelectValueListProps<T>> {\n static defaultProps = {\n disabled: false,\n rowHeight: 21,\n onBlur: (): void => undefined,\n 'data-testid': undefined,\n };\n\n constructor(props: SelectValueListProps<T>) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.handleSelect = this.handleSelect.bind(this);\n\n this.list = React.createRef();\n this.topRow = null;\n this.bottomRow = null;\n }\n\n componentDidMount(): void {\n this.sendViewportUpdate();\n }\n\n componentDidUpdate(): void {\n this.sendViewportUpdate();\n }\n\n list: React.RefObject<HTMLDivElement>;\n\n topRow: number | null;\n\n bottomRow: number | null;\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n value: T,\n displayValue: string | JSX.Element | undefined,\n rowHeight: number,\n isSelected: boolean,\n disabled: boolean\n ): JSX.Element => {\n const style = {\n height: rowHeight,\n };\n const text = displayValue != null ? displayValue : value;\n\n return (\n // Tab index is needed so the item could be a related target in the blur event details\n <li className=\"value-list-item\" style={style} key={key} tabIndex={-1}>\n <Checkbox\n checked={isSelected}\n disabled={disabled}\n onChange={() => this.handleSelect(itemIndex)}\n >\n {text}\n </Checkbox>\n </li>\n );\n },\n { max: 1000 }\n );\n\n getCachedItems = memoize(\n (\n items: SelectItem<T>[],\n rowHeight: number,\n offset: number,\n disabled: boolean\n ): React.ReactNode => {\n const itemElements: JSX.Element[] = [];\n for (let i = 0; i < items.length; i += 1) {\n const item = items[i];\n const { value, displayValue, isSelected } = item;\n const itemIndex = offset + i;\n const key = itemIndex;\n const element = this.getCachedItem(\n itemIndex,\n key,\n value,\n displayValue,\n rowHeight,\n isSelected,\n disabled\n );\n itemElements.push(element);\n }\n return itemElements;\n },\n { max: 1 }\n );\n\n handleBlur(e: React.FocusEvent): void {\n if (\n !e.relatedTarget ||\n (this.list.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.list.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the list\n const { onBlur } = this.props;\n onBlur?.(e);\n }\n }\n\n handleScroll(): void {\n this.sendViewportUpdate();\n }\n\n handleSelect(itemIndex: number): void {\n const { items, offset, onSelect } = this.props;\n const visibleItemIndex = itemIndex - offset;\n if (visibleItemIndex >= 0 && visibleItemIndex < items.length) {\n const item = items[visibleItemIndex];\n const { value } = item;\n onSelect(itemIndex, value);\n } else {\n onSelect(itemIndex, null);\n }\n }\n\n sendViewportUpdate(): void {\n if (!this.list.current || this.list.current.clientHeight === 0) {\n return;\n }\n\n const { onViewportChange, rowHeight } = this.props;\n const top = this.list.current.scrollTop;\n const bottom = top + this.list.current.clientHeight;\n\n const topRow = Math.floor(top / rowHeight);\n const bottomRow = Math.ceil(bottom / rowHeight);\n\n if (this.topRow !== topRow || this.bottomRow !== bottomRow) {\n this.topRow = topRow;\n this.bottomRow = bottomRow;\n onViewportChange(topRow, bottomRow);\n }\n }\n\n getElement(itemIndex: number): Element | null {\n if (this.list.current == null) {\n return null;\n }\n const elements = this.list.current.querySelectorAll('.value-list-item');\n return elements[itemIndex];\n }\n\n scrollIntoView(index: number): void {\n const element = this.getElement(index);\n element?.scrollIntoView({ block: 'center' });\n }\n\n render(): JSX.Element {\n const {\n className,\n disabled,\n isInvalid,\n items,\n itemCount,\n offset,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const itemElements = this.getCachedItems(\n items,\n rowHeight,\n offset,\n disabled\n );\n\n return (\n <div\n className={classNames(\n 'select-value-list-scroll-pane h-100 w-100',\n { 'is-invalid': isInvalid },\n className\n )}\n onBlur={this.handleBlur}\n onScroll={this.handleScroll}\n ref={this.list}\n data-testid={dataTestId}\n >\n <div\n className=\"select-value-list\"\n style={{ height: itemCount * rowHeight }}\n >\n <ol\n className=\"select-value-list-content\"\n style={{\n position: 'absolute',\n height: items.length * rowHeight,\n top: offset * rowHeight,\n left: 0,\n }}\n >\n {itemElements}\n </ol>\n </div>\n </div>\n );\n }\n}\n\nexport default SelectValueList;\n"],"mappings":"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"}
|
package/dist/SocketedButton.js
CHANGED
|
@@ -3,6 +3,8 @@ import classNames from 'classnames';
|
|
|
3
3
|
import { dhExclamation, vsLink } from '@deephaven/icons';
|
|
4
4
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
5
5
|
import "./SocketedButton.css";
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
8
|
var SocketedButton = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
7
9
|
var {
|
|
8
10
|
children,
|
|
@@ -18,7 +20,7 @@ var SocketedButton = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
18
20
|
style,
|
|
19
21
|
'data-testid': dataTestId
|
|
20
22
|
} = props;
|
|
21
|
-
return /*#__PURE__*/
|
|
23
|
+
return /*#__PURE__*/_jsxs("button", {
|
|
22
24
|
ref: ref,
|
|
23
25
|
type: "button",
|
|
24
26
|
className: classNames('btn-socketed', {
|
|
@@ -34,15 +36,16 @@ var SocketedButton = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
34
36
|
onMouseLeave: onMouseLeave,
|
|
35
37
|
style: style,
|
|
36
38
|
disabled: disabled,
|
|
37
|
-
"data-testid": dataTestId
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
39
|
+
"data-testid": dataTestId,
|
|
40
|
+
children: [children, /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
41
|
+
icon: vsLink,
|
|
42
|
+
className: "linked btn-socketed-icon",
|
|
43
|
+
transform: "down-1"
|
|
44
|
+
}), /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
45
|
+
icon: dhExclamation,
|
|
46
|
+
className: "is-invalid btn-socketed-icon"
|
|
47
|
+
})]
|
|
48
|
+
});
|
|
46
49
|
});
|
|
47
50
|
SocketedButton.displayName = 'SocketedButton';
|
|
48
51
|
SocketedButton.defaultProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SocketedButton.js","names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","id","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","undefined","displayName","defaultProps"],"sources":["../src/SocketedButton.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { dhExclamation, vsLink } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport './SocketedButton.scss';\n\ntype SocketedButtonProps = {\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n id?: string;\n isLinked?: boolean;\n isLinkedSource?: boolean;\n isInvalid?: boolean;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nconst SocketedButton = React.forwardRef<HTMLButtonElement, SocketedButtonProps>(\n (props: SocketedButtonProps, ref) => {\n const {\n children,\n className,\n disabled,\n id,\n isLinked,\n isLinkedSource,\n isInvalid,\n onClick,\n onMouseEnter,\n onMouseLeave,\n style,\n 'data-testid': dataTestId,\n } = props;\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'btn-socketed',\n {\n 'btn-socketed-linked':\n (isLinked !== undefined && isLinked) || isLinkedSource,\n },\n { 'btn-socketed-linked-source': isLinkedSource },\n { 'is-invalid': isInvalid },\n className\n )}\n id={id}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n <FontAwesomeIcon\n icon={vsLink}\n className=\"linked btn-socketed-icon\"\n transform=\"down-1\"\n />\n <FontAwesomeIcon\n icon={dhExclamation}\n className=\"is-invalid btn-socketed-icon\"\n />\n </button>\n );\n }\n);\n\nSocketedButton.displayName = 'SocketedButton';\n\nSocketedButton.defaultProps = {\n children: undefined,\n className: '',\n disabled: false,\n id: undefined,\n isLinked: false,\n isLinkedSource: false,\n isInvalid: false,\n onClick: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n style: undefined,\n 'data-testid': undefined,\n};\n\nexport default SocketedButton;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,aAAa,EAAEC,MAAM,QAAQ,kBAAkB;AACxD,SAASC,eAAe,QAAQ,gCAAgC;AAAC;AAmBjE,IAAMC,cAAc,gBAAGL,KAAK,CAACM,UAAU,CACrC,CAACC,KAA0B,EAAEC,GAAG,KAAK;EACnC,IAAM;IACJC,QAAQ;IACRC,SAAS;IACTC,QAAQ;IACRC,EAAE;IACFC,QAAQ;IACRC,cAAc;IACdC,SAAS;IACTC,OAAO;IACPC,YAAY;IACZC,YAAY;IACZC,KAAK;IACL,aAAa,EAAEC;EACjB,CAAC,GAAGb,KAAK;EACT,oBACE;IACE,GAAG,EAAEC,GAAI;IACT,IAAI,EAAC,QAAQ;IACb,SAAS,EAAEP,UAAU,CACnB,cAAc,EACd;MACE,qBAAqB,EAClBY,QAAQ,KAAKQ,SAAS,IAAIR,QAAQ,IAAKC;IAC5C,CAAC,EACD;MAAE,4BAA4B,EAAEA;IAAe,CAAC,EAChD;MAAE,YAAY,EAAEC;IAAU,CAAC,EAC3BL,SAAS,CACT;IACF,EAAE,EAAEE,EAAG;IACP,OAAO,EAAEI,OAAQ;IACjB,YAAY,EAAEC,YAAa;IAC3B,YAAY,EAAEC,YAAa;IAC3B,KAAK,EAAEC,KAAM;IACb,QAAQ,EAAER,QAAS;IACnB,eAAaS;
|
|
1
|
+
{"version":3,"file":"SocketedButton.js","names":["React","classNames","dhExclamation","vsLink","FontAwesomeIcon","SocketedButton","forwardRef","props","ref","children","className","disabled","id","isLinked","isLinkedSource","isInvalid","onClick","onMouseEnter","onMouseLeave","style","dataTestId","undefined","displayName","defaultProps"],"sources":["../src/SocketedButton.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { dhExclamation, vsLink } from '@deephaven/icons';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport './SocketedButton.scss';\n\ntype SocketedButtonProps = {\n children?: React.ReactNode;\n className?: string;\n disabled?: boolean;\n id?: string;\n isLinked?: boolean;\n isLinkedSource?: boolean;\n isInvalid?: boolean;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseEnter?: React.MouseEventHandler<HTMLButtonElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLButtonElement>;\n style?: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nconst SocketedButton = React.forwardRef<HTMLButtonElement, SocketedButtonProps>(\n (props: SocketedButtonProps, ref) => {\n const {\n children,\n className,\n disabled,\n id,\n isLinked,\n isLinkedSource,\n isInvalid,\n onClick,\n onMouseEnter,\n onMouseLeave,\n style,\n 'data-testid': dataTestId,\n } = props;\n return (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'btn-socketed',\n {\n 'btn-socketed-linked':\n (isLinked !== undefined && isLinked) || isLinkedSource,\n },\n { 'btn-socketed-linked-source': isLinkedSource },\n { 'is-invalid': isInvalid },\n className\n )}\n id={id}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n style={style}\n disabled={disabled}\n data-testid={dataTestId}\n >\n {children}\n <FontAwesomeIcon\n icon={vsLink}\n className=\"linked btn-socketed-icon\"\n transform=\"down-1\"\n />\n <FontAwesomeIcon\n icon={dhExclamation}\n className=\"is-invalid btn-socketed-icon\"\n />\n </button>\n );\n }\n);\n\nSocketedButton.displayName = 'SocketedButton';\n\nSocketedButton.defaultProps = {\n children: undefined,\n className: '',\n disabled: false,\n id: undefined,\n isLinked: false,\n isLinkedSource: false,\n isInvalid: false,\n onClick: undefined,\n onMouseEnter: undefined,\n onMouseLeave: undefined,\n style: undefined,\n 'data-testid': undefined,\n};\n\nexport default SocketedButton;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,aAAa,EAAEC,MAAM,QAAQ,kBAAkB;AACxD,SAASC,eAAe,QAAQ,gCAAgC;AAAC;AAAA;AAAA;AAmBjE,IAAMC,cAAc,gBAAGL,KAAK,CAACM,UAAU,CACrC,CAACC,KAA0B,EAAEC,GAAG,KAAK;EACnC,IAAM;IACJC,QAAQ;IACRC,SAAS;IACTC,QAAQ;IACRC,EAAE;IACFC,QAAQ;IACRC,cAAc;IACdC,SAAS;IACTC,OAAO;IACPC,YAAY;IACZC,YAAY;IACZC,KAAK;IACL,aAAa,EAAEC;EACjB,CAAC,GAAGb,KAAK;EACT,oBACE;IACE,GAAG,EAAEC,GAAI;IACT,IAAI,EAAC,QAAQ;IACb,SAAS,EAAEP,UAAU,CACnB,cAAc,EACd;MACE,qBAAqB,EAClBY,QAAQ,KAAKQ,SAAS,IAAIR,QAAQ,IAAKC;IAC5C,CAAC,EACD;MAAE,4BAA4B,EAAEA;IAAe,CAAC,EAChD;MAAE,YAAY,EAAEC;IAAU,CAAC,EAC3BL,SAAS,CACT;IACF,EAAE,EAAEE,EAAG;IACP,OAAO,EAAEI,OAAQ;IACjB,YAAY,EAAEC,YAAa;IAC3B,YAAY,EAAEC,YAAa;IAC3B,KAAK,EAAEC,KAAM;IACb,QAAQ,EAAER,QAAS;IACnB,eAAaS,UAAW;IAAA,WAEvBX,QAAQ,eACT,KAAC,eAAe;MACd,IAAI,EAAEN,MAAO;MACb,SAAS,EAAC,0BAA0B;MACpC,SAAS,EAAC;IAAQ,EAClB,eACF,KAAC,eAAe;MACd,IAAI,EAAED,aAAc;MACpB,SAAS,EAAC;IAA8B,EACxC;EAAA,EACK;AAEb,CAAC,CACF;AAEDG,cAAc,CAACiB,WAAW,GAAG,gBAAgB;AAE7CjB,cAAc,CAACkB,YAAY,GAAG;EAC5Bd,QAAQ,EAAEY,SAAS;EACnBX,SAAS,EAAE,EAAE;EACbC,QAAQ,EAAE,KAAK;EACfC,EAAE,EAAES,SAAS;EACbR,QAAQ,EAAE,KAAK;EACfC,cAAc,EAAE,KAAK;EACrBC,SAAS,EAAE,KAAK;EAChBC,OAAO,EAAEK,SAAS;EAClBJ,YAAY,EAAEI,SAAS;EACvBH,YAAY,EAAEG,SAAS;EACvBF,KAAK,EAAEE,SAAS;EAChB,aAAa,EAAEA;AACjB,CAAC;AAED,eAAehB,cAAc"}
|
package/dist/TimeInput.js
CHANGED
|
@@ -3,6 +3,7 @@ import Log from '@deephaven/log';
|
|
|
3
3
|
import { TimeUtils } from '@deephaven/utils';
|
|
4
4
|
import MaskedInput from "./MaskedInput.js";
|
|
5
5
|
import { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from "./MaskedInputUtils.js";
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
7
|
var log = Log.module('TimeInput');
|
|
7
8
|
var TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';
|
|
8
9
|
var EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];
|
|
@@ -71,7 +72,7 @@ var TimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
71
72
|
_setSelection(newSelection);
|
|
72
73
|
onSelect(newSelection);
|
|
73
74
|
}, [onSelect]);
|
|
74
|
-
return /*#__PURE__*/
|
|
75
|
+
return /*#__PURE__*/_jsx(MaskedInput, {
|
|
75
76
|
ref: inputRef,
|
|
76
77
|
className: className,
|
|
77
78
|
example: EXAMPLES,
|
package/dist/TimeInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","current","newSelection","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?(timeInSec: number): void;\n onSelect?(selection: SelectionSegment): void;\n value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ) {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","log","module","TIME_PATTERN","EXAMPLES","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","value","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","selection","setSelection","inputRef","focus","current","newSelection","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","substring","handleChange","newValue","debug","isTimeString","parseTime","handleSelect","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?(timeInSec: number): void;\n onSelect?(selection: SelectionSegment): void;\n value?: number;\n onFocus?(): void;\n onBlur?(): void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n setValue(TimeUtils.formatTime(propsValue));\n },\n [propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ) {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n function handleChange(newValue: string): void {\n log.debug('handleChange', newValue);\n setValue(newValue);\n\n // Only send a change if the value is actually valid\n if (TimeUtils.isTimeString(newValue)) {\n onChange(TimeUtils.parseTime(newValue));\n }\n }\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
|