From ada20a35b9c02f035e332b001877b8ac1d9a7b70 Mon Sep 17 00:00:00 2001 From: Matthew Runyon Date: Fri, 30 Aug 2024 16:17:00 -0500 Subject: [PATCH] feat: UI Table databars (#736) Fixes #441 ```py from deephaven import time_table, empty_table from deephaven import ui from deephaven.plot import express as dx _stocks = dx.data.stocks() _t = time_table("PT1S").update(["X=ii", "Y=X", "Z=X", "A=X", "B=X", "C=X", "HalfX=X/2", "LogX=X > 0 ? log(X) : 0", "X2=X*2"]) t = ui.table(_t, databars=[ { "column": "X", "color": 'negative', "opacity": 0.4, "markers": [{ "value": "HalfX", "color": "limegreen" }, { "value": 1000, "color": "accent" }] }, { "column": "Y", "value_column": "LogX", "color": 'positive' }, { "column": "Z", "max": 10, "color": ['notice', 'positive', 'dodgerblue'] }, { "column": "A", "max": "X2", "color": ['info', 'magenta-600'] }, { "column": "B", "color": ['#f3cd5b', '#9edc6f'] }, { "column": "C", "color": ['#f3cd5b', '#9edc6f'] }, ]) t2 = ui.table(_stocks, databars=[ { "column": "random", "value_placement": "hide" }, { "column": "SPet500", "color": 'info', "value_placement": "overlap" }, { "column": "size", "max": 1000, "direction": "RTL", "color": ['notice', 'positive'] }, { "column": "sym", "value_column": "price", "color": ['magenta-200', 'magenta-800'] }, ]) ``` --- package-lock.json | 2594 ++++------------- .../ui/src/deephaven/ui/components/table.py | 2 + plugins/ui/src/deephaven/ui/types/types.py | 70 +- plugins/ui/src/js/package.json | 32 +- .../js/src/elements/UITable/JsTableProxy.ts | 106 +- .../src/js/src/elements/UITable/UITable.tsx | 100 +- .../js/src/elements/UITable/UITableModel.ts | 335 +++ .../js/src/elements/UITable/UITableUtils.tsx | 19 + 8 files changed, 1270 insertions(+), 1988 deletions(-) create mode 100644 plugins/ui/src/js/src/elements/UITable/UITableModel.ts diff --git a/package-lock.json b/package-lock.json index f9db3f76f..f0a9136c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31877,23 +31877,23 @@ "version": "0.20.0", "license": "Apache-2.0", "dependencies": { - "@deephaven/chart": "^0.87.0", - "@deephaven/components": "^0.87.0", - "@deephaven/dashboard": "^0.86.0", - "@deephaven/dashboard-core-plugins": "^0.86.1", - "@deephaven/golden-layout": "^0.87.0", - "@deephaven/grid": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/iris-grid": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-components": "^0.87.0", + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/dashboard": "^0.91.0", + "@deephaven/dashboard-core-plugins": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.35.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/plugin": "^0.86.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "@internationalized/date": "^3.5.5", "classnames": "^2.5.1", @@ -31915,17 +31915,17 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/chart": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.87.0.tgz", - "integrity": "sha512-pjNnmkGhTMm+cXZyNgSxGMS8gEIegjRHNhuHLn38x56Gw4+OA5kRCoIEJa7QnNUodwdLwIcmZ+beuDGEWfO3kg==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.91.0.tgz", + "integrity": "sha512-UfZY3tPn+RrCYyNfH0DWnmUmvL0LRO0QuALT56GQTTZoWrGlZbsYUsk91sZW2u+KMLxHXkvKQTfLsuJmxP2y+w==", "dependencies": { - "@deephaven/components": "^0.87.0", - "@deephaven/icons": "^0.87.0", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", "buffer": "^6.0.3", "fast-deep-equal": "^3.1.3", "lodash.debounce": "^4.0.8", @@ -31944,17 +31944,18 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/components": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.87.0.tgz", - "integrity": "sha512-X/I7qkkZie0UKKf9T9CvVkEu5l2BzvoURx3+mIOvYXf5yRwUdSrPgI5GCnZepNWfyY1f6kzwtUiSt8J7OHPj9Q==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.91.0.tgz", + "integrity": "sha512-GmEmOqw/njgPtHnC7i09c2q9Og7qFFKqfqklJvoha6kOZwiVjAPaign2ifmy388vvWMRhtwF8pK3mzjegj1xrQ==", "dependencies": { "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", + "@internationalized/date": "^3.5.5", "@react-spectrum/theme-default": "^3.5.1", "@react-spectrum/utils": "^3.11.5", "@react-types/radio": "^3.8.1", @@ -31985,16 +31986,16 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/dashboard": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.86.0.tgz", - "integrity": "sha512-zhWC7xTS+lxOJTEjhvjAI3JSFhU1BKz1SsjkzbJklaiBLa8yQNQmwM4WViMCyjApNhJMcmo3RdCMrF9aDLI/QA==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.91.0.tgz", + "integrity": "sha512-A8L2emY3o2qYmUdh0O3j7y5Za/gF912+bP0gVxDnGG5ayMuWUVJAl8Mtluj5Coz/MxP48VdyEGQGuNNh2ggnvw==", + "dependencies": { + "@deephaven/components": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/utils": "^0.91.0", "fast-deep-equal": "^3.1.3", "lodash.ismatch": "^4.1.1", "lodash.throttle": "^4.1.1", @@ -32011,30 +32012,30 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins": { - "version": "0.86.1", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.86.1.tgz", - "integrity": "sha512-/E14Cl6rssmo5xueAo6CmSG9LlqiyU93aXf0mhSFL73UipBaXZiEO/roxBNrWuo/0Z24fsmTgravrL50nV6t3w==", - "dependencies": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/dashboard": "^0.86.0", - "@deephaven/file-explorer": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/iris-grid": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.91.0.tgz", + "integrity": "sha512-Y7mBd5feexOi5Q6Os/3YNXTSShIEzmw2TMdvDnup+6WEHx29xuw0RVRXI0Ru52MKTB7mdkNAwHXerYGGXy3zrg==", + "dependencies": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/console": "^0.91.0", + "@deephaven/dashboard": "^0.91.0", + "@deephaven/file-explorer": "^0.91.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/plugin": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "fast-deep-equal": "^3.1.3", @@ -32061,90 +32062,20 @@ "react-redux": "^7.2.4" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/chart": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.86.0.tgz", - "integrity": "sha512-e9Fk2KCsKjGiNlNPJbBUilhdVCp61wTNkWCC4JA7o3zSO1DFO75e9fWvfNQTr4AVCIDTLSbqv2AoRLXnmvD86w==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "buffer": "^6.0.3", - "fast-deep-equal": "^3.1.3", - "lodash.debounce": "^4.0.8", - "lodash.set": "^4.3.2", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "plotly.js": "^2.29.1", - "prop-types": "^15.7.2", - "react-plotly.js": "^2.6.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "react-is": ">=16.8.0" - } - }, "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/console": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.86.0.tgz", - "integrity": "sha512-BLCi1o9oNXAY/cdHnXQURASnCznXwFQUScQwe0wUpXt/9MYrqJkblP96Iv1Egs+TW3O8XHsO3e5/g6dw9juTBQ==", - "dependencies": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.91.0.tgz", + "integrity": "sha512-9jdvLDiygaJKf4dC6O5Zg5gZ7SVg2Y+hhhmwdALCfFU3oP56d8/ABCpzOqQ/EFpUw9u9M5o+scKKfD4knHjYZg==", + "dependencies": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "linkifyjs": "^4.1.0", @@ -32168,15 +32099,15 @@ } }, "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/file-explorer": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.86.0.tgz", - "integrity": "sha512-yCKJGsLDYBUH+eU8fNBj1i7d6P9dKZja3psLHcriV8UtxsbeAsq+aeQdH9gePQoi1e856d9lkFLhmkzPAXk2hw==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.91.0.tgz", + "integrity": "sha512-nj9xk1Sc4q9MPbUSnFcOylgPTdhIhY8nopoaV9kKcqP1F7GfS86B83DSeILVc59OQDHeB9/+CLIb5kdhVrJglA==", + "dependencies": { + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", @@ -32190,12 +32121,36 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", + "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/storage": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.91.0.tgz", + "integrity": "sha512-eEEj0UAJOSosad8kxuENbP2ByIyr1IBMHtWvu8sJ4TX2s3VphNunFnHgwP5ekA3UpjvwtxhoUvCRXc2iaNVxEQ==", "dependencies": { - "@deephaven/components": "^0.86.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/log": "^0.91.0", + "lodash.throttle": "^4.1.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "plugins/ui/src/js/node_modules/@deephaven/filters": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.91.0.tgz", + "integrity": "sha512-ELWgt6m98+OGoRdvjhhTXUUSzo1ry/h9RTVDnmRK9qwGoT3rnqYvrqyFaOzaVLhsrK/3iYZoM2yLQkq0dPikVA==", + "engines": { + "node": ">=16" + } + }, + "plugins/ui/src/js/node_modules/@deephaven/golden-layout": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.91.0.tgz", + "integrity": "sha512-WzoIhOp1aENZJrVagE8W4M1zEc76rkTm0MxYIduBO1RtqRjpunoAR+RWUmMwfPaOIp8dxX+RfJz+YFlKdZEs6A==", + "dependencies": { + "@deephaven/components": "^0.91.0", "jquery": "^3.6.0", "nanoid": "^5.0.7" }, @@ -32204,12 +32159,12 @@ "react-dom": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.86.0.tgz", - "integrity": "sha512-lRCn4Cjd05jU58vfeZN8QTm9MRwWtUBdXfpGrkIBBHJytG/I9D8+abNyG3TQ1z4NPTzqf+51IGnr/E8Fgim8Ew==", + "plugins/ui/src/js/node_modules/@deephaven/grid": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.91.0.tgz", + "integrity": "sha512-fOv2RrXKWIpwH4G+6pypFE1WIbYYjz8K4PcRvwPdob8RRI2C83HpIWQS/XSot0WqzITu2rqOYwWxfHu7+BGcyg==", "dependencies": { - "@deephaven/utils": "^0.86.0", + "@deephaven/utils": "^0.91.0", "classnames": "^2.3.1", "color-convert": "^2.0.1", "event-target-shim": "^6.0.2", @@ -32226,10 +32181,10 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", + "plugins/ui/src/js/node_modules/@deephaven/icons": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.91.0.tgz", + "integrity": "sha512-b+b//+gk8ZJz+JXURCw99FSQlExN89V3+F+LWVHJc+L3bzMa7pR2vhMVTKG0hG2tqF9ZDU8cYWGIS6o+6uiv2w==", "dependencies": { "@fortawesome/fontawesome-common-types": "^6.1.1" }, @@ -32238,23 +32193,23 @@ "@fortawesome/react-fontawesome": "^0.2.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/iris-grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.86.0.tgz", - "integrity": "sha512-g5M5YoWZGe6MCr8ltnTDEtK7QvlHnd1d5cXwZkpLOfEYsFOf6mcmJVK/p7XmjcyElsdLe9dT93YQiTfVzNnQrQ==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", + "plugins/ui/src/js/node_modules/@deephaven/iris-grid": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.91.0.tgz", + "integrity": "sha512-OgJvZg9z0KBbVoAXgPQiuJDScOrtfn8CouWd7G2WkJtVxK3OC3Rdeg5QLv8n54Lg2nwtrhuow6DV4oxybAv8gA==", + "dependencies": { + "@deephaven/components": "^0.91.0", + "@deephaven/console": "^0.91.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.2", @@ -32280,16 +32235,68 @@ "react-dom": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", + "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/console": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.91.0.tgz", + "integrity": "sha512-9jdvLDiygaJKf4dC6O5Zg5gZ7SVg2Y+hhhmwdALCfFU3oP56d8/ABCpzOqQ/EFpUw9u9M5o+scKKfD4knHjYZg==", + "dependencies": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "classnames": "^2.3.1", + "linkifyjs": "^4.1.0", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "memoize-one": "^5.1.1", + "memoizee": "^0.4.15", + "monaco-editor": "^0.41.0", + "nanoid": "^5.0.7", + "papaparse": "5.3.2", + "popper.js": "^1.16.1", + "prop-types": "^15.7.2", + "shell-quote": "^1.7.2" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/storage": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.91.0.tgz", + "integrity": "sha512-eEEj0UAJOSosad8kxuENbP2ByIyr1IBMHtWvu8sJ4TX2s3VphNunFnHgwP5ekA3UpjvwtxhoUvCRXc2iaNVxEQ==", "dependencies": { - "@deephaven/components": "^0.86.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/log": "^0.91.0", + "lodash.throttle": "^4.1.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "plugins/ui/src/js/node_modules/@deephaven/jsapi-bootstrap": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.91.0.tgz", + "integrity": "sha512-00irzZyhEIqRn000ZH38+zk1tOjBsaWhn35/weg5HNL4gbBtW4sg5+hsDHRzYhbEqbJDErvgNUPml23Rll732g==", + "dependencies": { + "@deephaven/components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0" }, "engines": { "node": ">=16" @@ -32298,18 +32305,18 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.86.0.tgz", - "integrity": "sha512-hWRk6JFC3MxSG8UP9FdCt5OK8Q9lPbIVGB/bDMChS9w/qQcrD87ry+KmGJqnggyKouUoMj2ljdL99xhwhurF8g==", + "plugins/ui/src/js/node_modules/@deephaven/jsapi-components": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.91.0.tgz", + "integrity": "sha512-h5pgltU/S5+NoaYKdOJbCyLvx+6zmakiXIVS4GXo5P+mnOHyALvylxDT29jkGcgbPjNLLejWwjaIGHSSWWGG8w==", "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", + "@deephaven/components": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@types/js-cookie": "^3.0.3", "classnames": "^2.3.2", "js-cookie": "^3.0.5", @@ -32323,15 +32330,20 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", + "plugins/ui/src/js/node_modules/@deephaven/jsapi-types": { + "version": "1.0.0-dev0.35.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.35.0.tgz", + "integrity": "sha512-X35g2ktmXbiTwjMNF20IkuNawJJ6Tlvrv23VuUVIjWHkpWcmyCYWIBle2zo7QAF6nnJpkccwFKJiC+TIkWl7hg==" + }, + "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.91.0.tgz", + "integrity": "sha512-7+52u4fGeCU5Zy+bUi+uqv/tNujq1fdaBw4XjEcC+KSW3ojPo+xzpdl8E0L7IPYgD2ep/IPosaq/kbLp6JU3+g==", "dependencies": { - "@deephaven/filters": "^0.86.0", + "@deephaven/filters": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/log": "^0.91.0", + "@deephaven/utils": "^0.91.0", "lodash.clamp": "^4.0.3", "nanoid": "^5.0.7" }, @@ -32339,10 +32351,10 @@ "node": ">=16" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", + "plugins/ui/src/js/node_modules/@deephaven/log": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.91.0.tgz", + "integrity": "sha512-IXT6+0XiR+5bhm5+3XELZFMTKPMZBmdckhswdJibrID0l79wgGiqKiqSnBjn1mFOGuOO+JYqU4KzoaIRJXZdyA==", "dependencies": { "event-target-shim": "^6.0.2" }, @@ -32350,17 +32362,21 @@ "node": ">=16" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" + "plugins/ui/src/js/node_modules/@deephaven/plugin": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.91.0.tgz", + "integrity": "sha512-ip2b2VG8wus88ySOUaKg4XfrCtgLd7eH6f8CswuFnSNbYVcg+UurbGJRvBAvX1F8JYgwJeWIzyiEHkYKYT1i4g==", + "dependencies": { + "@deephaven/components": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@fortawesome/fontawesome-common-types": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0" }, "engines": { "node": ">=16" @@ -32369,14 +32385,17 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/storage": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.86.0.tgz", - "integrity": "sha512-YN1q47KVVgyY8UXmZgF9nIZYBVZZLHv01VyRWMViwVMT7obEw0HInYq6JTg4DbzFcJOiTtwy7hQq9V7kreIPNQ==", + "plugins/ui/src/js/node_modules/@deephaven/react-hooks": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.91.0.tgz", + "integrity": "sha512-G08G2RBPREpQIEYJ0FelvwqzsSqaq5/uG36kFspyxa8pkxQ5Lf9Bxqsnx/McR4sRYzVlbr1ADcL7r2Ecl19Ddg==", "dependencies": { - "@deephaven/filters": "^0.86.0", - "@deephaven/log": "^0.86.0", - "lodash.throttle": "^4.1.1" + "@adobe/react-spectrum": "3.35.1", + "@deephaven/log": "^0.91.0", + "@deephaven/utils": "^0.91.0", + "lodash.debounce": "^4.0.8", + "lodash.throttle": "^4.1.1", + "nanoid": "^5.0.7" }, "engines": { "node": ">=16" @@ -32385,931 +32404,174 @@ "react": ">=16.8.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard-core-plugins/node_modules/@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", + "plugins/ui/src/js/node_modules/@deephaven/redux": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.91.0.tgz", + "integrity": "sha512-1JnXcBUpxQDLT65S2SPA4hkoKc0tCkThzTV28zKQy+4pqGP5oD5QmlcgtUkeTqQPsNqEf8ZO9XZjkZHpQ0xqVQ==", "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "fast-deep-equal": "^3.1.3", + "proxy-memoize": "^3.0.0", + "redux-thunk": "2.4.1" }, "engines": { - "node": ">=10" + "node": ">=16" }, "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "react-is": ">=16.8.0" + "redux": "^4.2.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/components/node_modules/@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0" + "plugins/ui/src/js/node_modules/@deephaven/utils": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.91.0.tgz", + "integrity": "sha512-MQAnLvJux9N6ZeCdxWle6NEJ8dqrpxVtkMd9oVqqa0mjmRVPjz6UuT8Hl10VagrYJya1TjKHizW3BrDyhYPQ1w==", + "engines": { + "node": ">=16" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", + "plugins/ui/src/js/node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "@deephaven/components": "^0.86.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", + "plugins/ui/src/js/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "event-target-shim": "^6.0.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16" + "node": ">=7.0.0" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" - }, + "plugins/ui/src/js/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "plugins/ui/src/js/node_modules/event-target-shim": { + "version": "6.0.2", + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=10.13.0" }, - "peerDependencies": { - "react": ">=16.8.0" + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "plugins/ui/src/js/node_modules/@deephaven/dashboard/node_modules/@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==", + "plugins/ui/src/js/node_modules/typescript": { + "version": "4.9.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=16" + "node": ">=4.2.0" } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true }, - "plugins/ui/src/js/node_modules/@deephaven/filters": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.86.0.tgz", - "integrity": "sha512-iAjO1hcuE9m73YyzWnZJLSyDJfgcOluFljMDLop6IRI3ie7bFwCoLnnPEeJdP3wkDNVGH3sUtfrkFE3uLfxiUw==", - "engines": { - "node": ">=16" + "@adobe/css-tools": { + "version": "4.3.1", + "dev": true + }, + "@adobe/react-spectrum": { + "version": "3.35.1", + "requires": { + "@internationalized/string": "^3.2.3", + "@react-aria/i18n": "^3.11.1", + "@react-aria/ssr": "^3.9.4", + "@react-aria/utils": "^3.24.1", + "@react-aria/visually-hidden": "^3.8.12", + "@react-spectrum/actionbar": "^3.4.5", + "@react-spectrum/actiongroup": "^3.10.5", + "@react-spectrum/avatar": "^3.0.12", + "@react-spectrum/badge": "^3.1.13", + "@react-spectrum/breadcrumbs": "^3.9.7", + "@react-spectrum/button": "^3.16.4", + "@react-spectrum/buttongroup": "^3.6.13", + "@react-spectrum/calendar": "^3.4.9", + "@react-spectrum/checkbox": "^3.9.6", + "@react-spectrum/combobox": "^3.12.5", + "@react-spectrum/contextualhelp": "^3.6.11", + "@react-spectrum/datepicker": "^3.9.6", + "@react-spectrum/dialog": "^3.8.11", + "@react-spectrum/divider": "^3.5.13", + "@react-spectrum/dnd": "^3.3.10", + "@react-spectrum/dropzone": "^3.0.1", + "@react-spectrum/filetrigger": "^3.0.1", + "@react-spectrum/form": "^3.7.6", + "@react-spectrum/icon": "^3.7.13", + "@react-spectrum/illustratedmessage": "^3.5.1", + "@react-spectrum/image": "^3.5.1", + "@react-spectrum/inlinealert": "^3.2.5", + "@react-spectrum/labeledvalue": "^3.1.14", + "@react-spectrum/layout": "^3.6.5", + "@react-spectrum/link": "^3.6.7", + "@react-spectrum/list": "^3.7.10", + "@react-spectrum/listbox": "^3.12.9", + "@react-spectrum/menu": "^3.19.1", + "@react-spectrum/meter": "^3.5.1", + "@react-spectrum/numberfield": "^3.9.3", + "@react-spectrum/overlays": "^5.6.1", + "@react-spectrum/picker": "^3.14.5", + "@react-spectrum/progress": "^3.7.7", + "@react-spectrum/provider": "^3.9.7", + "@react-spectrum/radio": "^3.7.6", + "@react-spectrum/searchfield": "^3.8.6", + "@react-spectrum/slider": "^3.6.9", + "@react-spectrum/statuslight": "^3.5.13", + "@react-spectrum/switch": "^3.5.5", + "@react-spectrum/table": "^3.12.10", + "@react-spectrum/tabs": "^3.8.10", + "@react-spectrum/tag": "^3.2.6", + "@react-spectrum/text": "^3.5.5", + "@react-spectrum/textfield": "^3.12.1", + "@react-spectrum/theme-dark": "^3.5.10", + "@react-spectrum/theme-default": "^3.5.10", + "@react-spectrum/theme-light": "^3.4.10", + "@react-spectrum/tooltip": "^3.6.7", + "@react-spectrum/view": "^3.6.10", + "@react-spectrum/well": "^3.4.13", + "@react-stately/collections": "^3.10.7", + "@react-stately/data": "^3.11.4", + "@react-types/shared": "^3.23.1", + "client-only": "^0.0.1" } }, - "plugins/ui/src/js/node_modules/@deephaven/golden-layout": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.87.0.tgz", - "integrity": "sha512-RurrXcbO/WH/pB0O0yxDGFIGqvM0Q/2jYS3HjK2fe/DJGNh2gvxw7kOT8KJCcc1tSH4O3lfNd00vFksHNrQwiA==", - "dependencies": { - "@deephaven/components": "^0.87.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/grid": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.87.0.tgz", - "integrity": "sha512-g1DcAQ9Wm+sg+7EyHXZxCZ7iuAx7SJkFwPD9JBVxeyMY9akrK0MD6evtSIcPrZ7oda2tuW/K8omXIe+1+Fd8cA==", - "dependencies": { - "@deephaven/utils": "^0.87.0", - "classnames": "^2.3.1", - "color-convert": "^2.0.1", - "event-target-shim": "^6.0.2", - "linkifyjs": "^4.1.0", - "lodash.clamp": "^4.0.3", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/icons": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.87.0.tgz", - "integrity": "sha512-2q+HUkW9pByPG81LLqRo/reem6EcZhgC/NKISOR9roeL2rASq8E+Xq4Yg2gW2zlXy6fSGi8e5q887Ynby4TGgQ==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/iris-grid": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.87.0.tgz", - "integrity": "sha512-yPL4cF+7hqEosGAegxHIl7w2rzjg4KJaqKCcMigQlTQFhMMM/BHRO2Ol2+6Tjiw4DUwnkNzyRpB3qQGnpAdXiQ==", - "dependencies": { - "@deephaven/components": "^0.87.0", - "@deephaven/console": "^0.87.0", - "@deephaven/filters": "^0.87.0", - "@deephaven/grid": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/jsapi-components": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/storage": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.2", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "fast-deep-equal": "^3.1.3", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/console": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.87.0.tgz", - "integrity": "sha512-6x65XHd/46bytHNOVlbkgiltclNs4/cF2BmItup2xS4QtAgX0K0pOScuPv2vZGDHuimX+q6tJ9YH0bxx8gNbpA==", - "dependencies": { - "@deephaven/chart": "^0.87.0", - "@deephaven/components": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/storage": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "linkifyjs": "^4.1.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "papaparse": "5.3.2", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "shell-quote": "^1.7.2" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/filters": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.87.0.tgz", - "integrity": "sha512-MtbNlLGFrRUdHElf41jhcMAsDJjNv3lZBNTroGYGDYrSk/Sm0diwdtbUWL02pN7QiQetftE/ddhr/SheAIR1hw==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/iris-grid/node_modules/@deephaven/storage": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.87.0.tgz", - "integrity": "sha512-OD8JRseiZX4Y/roNzP5AOw+k+EITfOAW/hap7sUiFbq6utkRx/u6HqSQk6lqjABh0npdg6B3r06vMxQR2hpl7g==", - "dependencies": { - "@deephaven/filters": "^0.87.0", - "@deephaven/log": "^0.87.0", - "lodash.throttle": "^4.1.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/jsapi-bootstrap": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.87.0.tgz", - "integrity": "sha512-rsrrPe5JzMlOZV3JmeDGv0V12NkEVtmggzRauA28brBatiEd+TRE0iBbjcmavinhtXB/4NAQ5Xcl6FcvX67Pfg==", - "dependencies": { - "@deephaven/components": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/jsapi-components": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.87.0.tgz", - "integrity": "sha512-X6oCqqZ5SHxY5M5g+FpBUmRweIJUKyk1ec5whZGL6IQ8c1FrROcfs3IjRHCfnDh6Z3G27vdpgGdlVXx5FllMlw==", - "dependencies": { - "@deephaven/components": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "@types/js-cookie": "^3.0.3", - "classnames": "^2.3.2", - "js-cookie": "^3.0.5", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/jsapi-types": { - "version": "1.0.0-dev0.35.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.35.0.tgz", - "integrity": "sha512-X35g2ktmXbiTwjMNF20IkuNawJJ6Tlvrv23VuUVIjWHkpWcmyCYWIBle2zo7QAF6nnJpkccwFKJiC+TIkWl7hg==" - }, - "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.87.0.tgz", - "integrity": "sha512-W8Aq0IiVTGWlXQde+F9exrDt1jwmH458Zq8pXblcfgvyOkhXU0yAAaGGIA9gqam4jW8hyHnyx5zYWFgs647Cxw==", - "dependencies": { - "@deephaven/filters": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/jsapi-utils/node_modules/@deephaven/filters": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.87.0.tgz", - "integrity": "sha512-MtbNlLGFrRUdHElf41jhcMAsDJjNv3lZBNTroGYGDYrSk/Sm0diwdtbUWL02pN7QiQetftE/ddhr/SheAIR1hw==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/log": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.87.0.tgz", - "integrity": "sha512-hq2szL3DRBVPuv5OrIfEiFIg4MYHwICiALWFNCPNkX7isESOv/6LBxpFXOgnUAtzFsL7X1Cv3bbUtMacxw9uvA==", - "dependencies": { - "event-target-shim": "^6.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.86.0.tgz", - "integrity": "sha512-oXwidAEE3QMycEjzxturHnG00i0zEli7d4AlDKZ/Yu14vBNcN/uB00Duyrw2AvEXTKspFrtRSKKIGXUJUpWqxA==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/iris-grid": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@fortawesome/fontawesome-common-types": "^6.1.1", - "@fortawesome/react-fontawesome": "^0.2.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "react-is": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.86.0.tgz", - "integrity": "sha512-g5M5YoWZGe6MCr8ltnTDEtK7QvlHnd1d5cXwZkpLOfEYsFOf6mcmJVK/p7XmjcyElsdLe9dT93YQiTfVzNnQrQ==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.2", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "fast-deep-equal": "^3.1.3", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/console": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.86.0.tgz", - "integrity": "sha512-BLCi1o9oNXAY/cdHnXQURASnCznXwFQUScQwe0wUpXt/9MYrqJkblP96Iv1Egs+TW3O8XHsO3e5/g6dw9juTBQ==", - "dependencies": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "linkifyjs": "^4.1.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "papaparse": "5.3.2", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "shell-quote": "^1.7.2" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/console/node_modules/@deephaven/chart": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.86.0.tgz", - "integrity": "sha512-e9Fk2KCsKjGiNlNPJbBUilhdVCp61wTNkWCC4JA7o3zSO1DFO75e9fWvfNQTr4AVCIDTLSbqv2AoRLXnmvD86w==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "buffer": "^6.0.3", - "fast-deep-equal": "^3.1.3", - "lodash.debounce": "^4.0.8", - "lodash.set": "^4.3.2", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "plotly.js": "^2.29.1", - "prop-types": "^15.7.2", - "react-plotly.js": "^2.6.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/console/node_modules/@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.86.0.tgz", - "integrity": "sha512-lRCn4Cjd05jU58vfeZN8QTm9MRwWtUBdXfpGrkIBBHJytG/I9D8+abNyG3TQ1z4NPTzqf+51IGnr/E8Fgim8Ew==", - "dependencies": { - "@deephaven/utils": "^0.86.0", - "classnames": "^2.3.1", - "color-convert": "^2.0.1", - "event-target-shim": "^6.0.2", - "linkifyjs": "^4.1.0", - "lodash.clamp": "^4.0.3", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.86.0.tgz", - "integrity": "sha512-hWRk6JFC3MxSG8UP9FdCt5OK8Q9lPbIVGB/bDMChS9w/qQcrD87ry+KmGJqnggyKouUoMj2ljdL99xhwhurF8g==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@types/js-cookie": "^3.0.3", - "classnames": "^2.3.2", - "js-cookie": "^3.0.5", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/jsapi-components/node_modules/@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", - "dependencies": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/iris-grid/node_modules/@deephaven/storage": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.86.0.tgz", - "integrity": "sha512-YN1q47KVVgyY8UXmZgF9nIZYBVZZLHv01VyRWMViwVMT7obEw0HInYq6JTg4DbzFcJOiTtwy7hQq9V7kreIPNQ==", - "dependencies": { - "@deephaven/filters": "^0.86.0", - "@deephaven/log": "^0.86.0", - "lodash.throttle": "^4.1.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", - "dependencies": { - "@deephaven/filters": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "dependencies": { - "event-target-shim": "^6.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/plugin/node_modules/@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/react-hooks": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.87.0.tgz", - "integrity": "sha512-5PMDsHAAGawF53Th4vEqsyImJdioqIbw0+1o2X0pnQSOfhIda/OqCoq1a16cCHxwcpjWaMvI5BvTRe45HMZHIw==", - "dependencies": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/redux": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.86.0.tgz", - "integrity": "sha512-3EcgwYyXzkzQTmWa5DB57b4wfVfWO4tZefXf2VdQnfyJEhiD25/QJ9kAS6SHdR4vEjmK5MZA+hxLa9/2so47Mw==", - "dependencies": { - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/plugin": "^0.86.0", - "fast-deep-equal": "^3.1.3", - "proxy-memoize": "^3.0.0", - "redux-thunk": "2.4.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "redux": "^4.2.0" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/redux/node_modules/@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", - "dependencies": { - "@deephaven/filters": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/redux/node_modules/@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "dependencies": { - "event-target-shim": "^6.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/redux/node_modules/@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/@deephaven/utils": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.87.0.tgz", - "integrity": "sha512-hgvOZQfOMznKX4YeyfBJFjck0IbzAOcPhr9uQO5EDgPvuFQF3b0XKqurqs8plWmSHDv+wDYaubu83dW++EYRcw==", - "engines": { - "node": ">=16" - } - }, - "plugins/ui/src/js/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "plugins/ui/src/js/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "plugins/ui/src/js/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "plugins/ui/src/js/node_modules/event-target-shim": { - "version": "6.0.2", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "plugins/ui/src/js/node_modules/typescript": { - "version": "4.9.5", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true - }, - "@adobe/css-tools": { - "version": "4.3.1", - "dev": true - }, - "@adobe/react-spectrum": { - "version": "3.35.1", - "requires": { - "@internationalized/string": "^3.2.3", - "@react-aria/i18n": "^3.11.1", - "@react-aria/ssr": "^3.9.4", - "@react-aria/utils": "^3.24.1", - "@react-aria/visually-hidden": "^3.8.12", - "@react-spectrum/actionbar": "^3.4.5", - "@react-spectrum/actiongroup": "^3.10.5", - "@react-spectrum/avatar": "^3.0.12", - "@react-spectrum/badge": "^3.1.13", - "@react-spectrum/breadcrumbs": "^3.9.7", - "@react-spectrum/button": "^3.16.4", - "@react-spectrum/buttongroup": "^3.6.13", - "@react-spectrum/calendar": "^3.4.9", - "@react-spectrum/checkbox": "^3.9.6", - "@react-spectrum/combobox": "^3.12.5", - "@react-spectrum/contextualhelp": "^3.6.11", - "@react-spectrum/datepicker": "^3.9.6", - "@react-spectrum/dialog": "^3.8.11", - "@react-spectrum/divider": "^3.5.13", - "@react-spectrum/dnd": "^3.3.10", - "@react-spectrum/dropzone": "^3.0.1", - "@react-spectrum/filetrigger": "^3.0.1", - "@react-spectrum/form": "^3.7.6", - "@react-spectrum/icon": "^3.7.13", - "@react-spectrum/illustratedmessage": "^3.5.1", - "@react-spectrum/image": "^3.5.1", - "@react-spectrum/inlinealert": "^3.2.5", - "@react-spectrum/labeledvalue": "^3.1.14", - "@react-spectrum/layout": "^3.6.5", - "@react-spectrum/link": "^3.6.7", - "@react-spectrum/list": "^3.7.10", - "@react-spectrum/listbox": "^3.12.9", - "@react-spectrum/menu": "^3.19.1", - "@react-spectrum/meter": "^3.5.1", - "@react-spectrum/numberfield": "^3.9.3", - "@react-spectrum/overlays": "^5.6.1", - "@react-spectrum/picker": "^3.14.5", - "@react-spectrum/progress": "^3.7.7", - "@react-spectrum/provider": "^3.9.7", - "@react-spectrum/radio": "^3.7.6", - "@react-spectrum/searchfield": "^3.8.6", - "@react-spectrum/slider": "^3.6.9", - "@react-spectrum/statuslight": "^3.5.13", - "@react-spectrum/switch": "^3.5.5", - "@react-spectrum/table": "^3.12.10", - "@react-spectrum/tabs": "^3.8.10", - "@react-spectrum/tag": "^3.2.6", - "@react-spectrum/text": "^3.5.5", - "@react-spectrum/textfield": "^3.12.1", - "@react-spectrum/theme-dark": "^3.5.10", - "@react-spectrum/theme-default": "^3.5.10", - "@react-spectrum/theme-light": "^3.4.10", - "@react-spectrum/tooltip": "^3.6.7", - "@react-spectrum/view": "^3.6.10", - "@react-spectrum/well": "^3.4.13", - "@react-stately/collections": "^3.10.7", - "@react-stately/data": "^3.11.4", - "@react-types/shared": "^3.23.1", - "client-only": "^0.0.1" - } - }, - "@ampproject/remapping": { - "version": "2.2.1", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@ampproject/remapping": { + "version": "2.2.1", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { @@ -36486,23 +35748,23 @@ "@deephaven/js-plugin-ui": { "version": "file:plugins/ui/src/js", "requires": { - "@deephaven/chart": "^0.87.0", - "@deephaven/components": "^0.87.0", - "@deephaven/dashboard": "^0.86.0", - "@deephaven/dashboard-core-plugins": "^0.86.1", - "@deephaven/golden-layout": "^0.87.0", - "@deephaven/grid": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/iris-grid": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-components": "^0.87.0", + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/dashboard": "^0.91.0", + "@deephaven/dashboard-core-plugins": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.35.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/plugin": "^0.86.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "@internationalized/date": "^3.5.5", "@types/react": "^17.0.2", @@ -36518,17 +35780,17 @@ }, "dependencies": { "@deephaven/chart": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.87.0.tgz", - "integrity": "sha512-pjNnmkGhTMm+cXZyNgSxGMS8gEIegjRHNhuHLn38x56Gw4+OA5kRCoIEJa7QnNUodwdLwIcmZ+beuDGEWfO3kg==", - "requires": { - "@deephaven/components": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.91.0.tgz", + "integrity": "sha512-UfZY3tPn+RrCYyNfH0DWnmUmvL0LRO0QuALT56GQTTZoWrGlZbsYUsk91sZW2u+KMLxHXkvKQTfLsuJmxP2y+w==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", "buffer": "^6.0.3", "fast-deep-equal": "^3.1.3", "lodash.debounce": "^4.0.8", @@ -36541,17 +35803,18 @@ } }, "@deephaven/components": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.87.0.tgz", - "integrity": "sha512-X/I7qkkZie0UKKf9T9CvVkEu5l2BzvoURx3+mIOvYXf5yRwUdSrPgI5GCnZepNWfyY1f6kzwtUiSt8J7OHPj9Q==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.91.0.tgz", + "integrity": "sha512-GmEmOqw/njgPtHnC7i09c2q9Og7qFFKqfqklJvoha6kOZwiVjAPaign2ifmy388vvWMRhtwF8pK3mzjegj1xrQ==", "requires": { "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/fontawesome-svg-core": "^6.2.1", "@fortawesome/react-fontawesome": "^0.2.0", + "@internationalized/date": "^3.5.5", "@react-spectrum/theme-default": "^3.5.1", "@react-spectrum/utils": "^3.11.5", "@react-types/radio": "^3.8.1", @@ -36574,129 +35837,48 @@ } }, "@deephaven/dashboard": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.86.0.tgz", - "integrity": "sha512-zhWC7xTS+lxOJTEjhvjAI3JSFhU1BKz1SsjkzbJklaiBLa8yQNQmwM4WViMCyjApNhJMcmo3RdCMrF9aDLI/QA==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard/-/dashboard-0.91.0.tgz", + "integrity": "sha512-A8L2emY3o2qYmUdh0O3j7y5Za/gF912+bP0gVxDnGG5ayMuWUVJAl8Mtluj5Coz/MxP48VdyEGQGuNNh2ggnvw==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/utils": "^0.91.0", "fast-deep-equal": "^3.1.3", "lodash.ismatch": "^4.1.1", "lodash.throttle": "^4.1.1", "nanoid": "^5.0.7", "prop-types": "^15.7.2" - }, - "dependencies": { - "@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", - "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" - }, - "dependencies": { - "@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", - "requires": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - } - } - } - }, - "@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", - "requires": { - "@deephaven/components": "^0.86.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - } - }, - "@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "requires": { - "event-target-shim": "^6.0.2" - } - }, - "@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", - "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" - } - }, - "@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==" - } } }, "@deephaven/dashboard-core-plugins": { - "version": "0.86.1", - "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.86.1.tgz", - "integrity": "sha512-/E14Cl6rssmo5xueAo6CmSG9LlqiyU93aXf0mhSFL73UipBaXZiEO/roxBNrWuo/0Z24fsmTgravrL50nV6t3w==", - "requires": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/dashboard": "^0.86.0", - "@deephaven/file-explorer": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/iris-grid": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/dashboard-core-plugins/-/dashboard-core-plugins-0.91.0.tgz", + "integrity": "sha512-Y7mBd5feexOi5Q6Os/3YNXTSShIEzmw2TMdvDnup+6WEHx29xuw0RVRXI0Ru52MKTB7mdkNAwHXerYGGXy3zrg==", + "requires": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/console": "^0.91.0", + "@deephaven/dashboard": "^0.91.0", + "@deephaven/file-explorer": "^0.91.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/plugin": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", "fast-deep-equal": "^3.1.3", @@ -36711,284 +35893,89 @@ "redux": "^4.2.0", "redux-thunk": "^2.4.1", "rehype-mathjax": "^4.0.3", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1" - }, - "dependencies": { - "@deephaven/chart": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.86.0.tgz", - "integrity": "sha512-e9Fk2KCsKjGiNlNPJbBUilhdVCp61wTNkWCC4JA7o3zSO1DFO75e9fWvfNQTr4AVCIDTLSbqv2AoRLXnmvD86w==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "buffer": "^6.0.3", - "fast-deep-equal": "^3.1.3", - "lodash.debounce": "^4.0.8", - "lodash.set": "^4.3.2", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "plotly.js": "^2.29.1", - "prop-types": "^15.7.2", - "react-plotly.js": "^2.6.0" - } - }, - "@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", - "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" - } - }, - "@deephaven/console": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.86.0.tgz", - "integrity": "sha512-BLCi1o9oNXAY/cdHnXQURASnCznXwFQUScQwe0wUpXt/9MYrqJkblP96Iv1Egs+TW3O8XHsO3e5/g6dw9juTBQ==", - "requires": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "linkifyjs": "^4.1.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "papaparse": "5.3.2", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "shell-quote": "^1.7.2" - } - }, - "@deephaven/file-explorer": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.86.0.tgz", - "integrity": "sha512-yCKJGsLDYBUH+eU8fNBj1i7d6P9dKZja3psLHcriV8UtxsbeAsq+aeQdH9gePQoi1e856d9lkFLhmkzPAXk2hw==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "lodash.throttle": "^4.1.1", - "prop-types": "^15.7.2" - } - }, - "@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", - "requires": { - "@deephaven/components": "^0.86.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - } - }, - "@deephaven/grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.86.0.tgz", - "integrity": "sha512-lRCn4Cjd05jU58vfeZN8QTm9MRwWtUBdXfpGrkIBBHJytG/I9D8+abNyG3TQ1z4NPTzqf+51IGnr/E8Fgim8Ew==", - "requires": { - "@deephaven/utils": "^0.86.0", - "classnames": "^2.3.1", - "color-convert": "^2.0.1", - "event-target-shim": "^6.0.2", - "linkifyjs": "^4.1.0", - "lodash.clamp": "^4.0.3", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "prop-types": "^15.7.2" - } - }, - "@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", - "requires": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - } - }, - "@deephaven/iris-grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.86.0.tgz", - "integrity": "sha512-g5M5YoWZGe6MCr8ltnTDEtK7QvlHnd1d5cXwZkpLOfEYsFOf6mcmJVK/p7XmjcyElsdLe9dT93YQiTfVzNnQrQ==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.2", + "remark-gfm": "^3.0.1", + "remark-math": "^5.1.1" + }, + "dependencies": { + "@deephaven/console": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.91.0.tgz", + "integrity": "sha512-9jdvLDiygaJKf4dC6O5Zg5gZ7SVg2Y+hhhmwdALCfFU3oP56d8/ABCpzOqQ/EFpUw9u9M5o+scKKfD4knHjYZg==", + "requires": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", - "fast-deep-equal": "^3.1.3", - "lodash.clamp": "^4.0.3", + "linkifyjs": "^4.1.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "memoize-one": "^5.1.1", "memoizee": "^0.4.15", "monaco-editor": "^0.41.0", "nanoid": "^5.0.7", + "papaparse": "5.3.2", + "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2" - } - }, - "@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" - } - }, - "@deephaven/jsapi-components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.86.0.tgz", - "integrity": "sha512-hWRk6JFC3MxSG8UP9FdCt5OK8Q9lPbIVGB/bDMChS9w/qQcrD87ry+KmGJqnggyKouUoMj2ljdL99xhwhurF8g==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@types/js-cookie": "^3.0.3", - "classnames": "^2.3.2", - "js-cookie": "^3.0.5", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - } - }, - "@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", - "requires": { - "@deephaven/filters": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - } - }, - "@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "requires": { - "event-target-shim": "^6.0.2" + "shell-quote": "^1.7.2" } }, - "@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", + "@deephaven/file-explorer": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/file-explorer/-/file-explorer-0.91.0.tgz", + "integrity": "sha512-nj9xk1Sc4q9MPbUSnFcOylgPTdhIhY8nopoaV9kKcqP1F7GfS86B83DSeILVc59OQDHeB9/+CLIb5kdhVrJglA==", "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", + "@fortawesome/fontawesome-svg-core": "^6.2.1", + "@fortawesome/react-fontawesome": "^0.2.0", + "classnames": "^2.3.1", "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" + "prop-types": "^15.7.2" } }, "@deephaven/storage": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.86.0.tgz", - "integrity": "sha512-YN1q47KVVgyY8UXmZgF9nIZYBVZZLHv01VyRWMViwVMT7obEw0HInYq6JTg4DbzFcJOiTtwy7hQq9V7kreIPNQ==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.91.0.tgz", + "integrity": "sha512-eEEj0UAJOSosad8kxuENbP2ByIyr1IBMHtWvu8sJ4TX2s3VphNunFnHgwP5ekA3UpjvwtxhoUvCRXc2iaNVxEQ==", "requires": { - "@deephaven/filters": "^0.86.0", - "@deephaven/log": "^0.86.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/log": "^0.91.0", "lodash.throttle": "^4.1.1" } - }, - "@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==" } } }, "@deephaven/filters": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.86.0.tgz", - "integrity": "sha512-iAjO1hcuE9m73YyzWnZJLSyDJfgcOluFljMDLop6IRI3ie7bFwCoLnnPEeJdP3wkDNVGH3sUtfrkFE3uLfxiUw==" + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.91.0.tgz", + "integrity": "sha512-ELWgt6m98+OGoRdvjhhTXUUSzo1ry/h9RTVDnmRK9qwGoT3rnqYvrqyFaOzaVLhsrK/3iYZoM2yLQkq0dPikVA==" }, "@deephaven/golden-layout": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.87.0.tgz", - "integrity": "sha512-RurrXcbO/WH/pB0O0yxDGFIGqvM0Q/2jYS3HjK2fe/DJGNh2gvxw7kOT8KJCcc1tSH4O3lfNd00vFksHNrQwiA==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.91.0.tgz", + "integrity": "sha512-WzoIhOp1aENZJrVagE8W4M1zEc76rkTm0MxYIduBO1RtqRjpunoAR+RWUmMwfPaOIp8dxX+RfJz+YFlKdZEs6A==", "requires": { - "@deephaven/components": "^0.87.0", + "@deephaven/components": "^0.91.0", "jquery": "^3.6.0", "nanoid": "^5.0.7" } }, "@deephaven/grid": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.87.0.tgz", - "integrity": "sha512-g1DcAQ9Wm+sg+7EyHXZxCZ7iuAx7SJkFwPD9JBVxeyMY9akrK0MD6evtSIcPrZ7oda2tuW/K8omXIe+1+Fd8cA==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.91.0.tgz", + "integrity": "sha512-fOv2RrXKWIpwH4G+6pypFE1WIbYYjz8K4PcRvwPdob8RRI2C83HpIWQS/XSot0WqzITu2rqOYwWxfHu7+BGcyg==", "requires": { - "@deephaven/utils": "^0.87.0", + "@deephaven/utils": "^0.91.0", "classnames": "^2.3.1", "color-convert": "^2.0.1", "event-target-shim": "^6.0.2", @@ -37000,30 +35987,30 @@ } }, "@deephaven/icons": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.87.0.tgz", - "integrity": "sha512-2q+HUkW9pByPG81LLqRo/reem6EcZhgC/NKISOR9roeL2rASq8E+Xq4Yg2gW2zlXy6fSGi8e5q887Ynby4TGgQ==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.91.0.tgz", + "integrity": "sha512-b+b//+gk8ZJz+JXURCw99FSQlExN89V3+F+LWVHJc+L3bzMa7pR2vhMVTKG0hG2tqF9ZDU8cYWGIS6o+6uiv2w==", "requires": { "@fortawesome/fontawesome-common-types": "^6.1.1" } }, "@deephaven/iris-grid": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.87.0.tgz", - "integrity": "sha512-yPL4cF+7hqEosGAegxHIl7w2rzjg4KJaqKCcMigQlTQFhMMM/BHRO2Ol2+6Tjiw4DUwnkNzyRpB3qQGnpAdXiQ==", - "requires": { - "@deephaven/components": "^0.87.0", - "@deephaven/console": "^0.87.0", - "@deephaven/filters": "^0.87.0", - "@deephaven/grid": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/jsapi-components": "^0.87.0", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.91.0.tgz", + "integrity": "sha512-OgJvZg9z0KBbVoAXgPQiuJDScOrtfn8CouWd7G2WkJtVxK3OC3Rdeg5QLv8n54Lg2nwtrhuow6DV4oxybAv8gA==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/console": "^0.91.0", + "@deephaven/filters": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/storage": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^7.0.2", "@dnd-kit/utilities": "^3.2.2", @@ -37041,446 +36028,153 @@ "react-beautiful-dnd": "^13.1.0", "react-transition-group": "^4.4.2" }, - "dependencies": { - "@deephaven/console": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.87.0.tgz", - "integrity": "sha512-6x65XHd/46bytHNOVlbkgiltclNs4/cF2BmItup2xS4QtAgX0K0pOScuPv2vZGDHuimX+q6tJ9YH0bxx8gNbpA==", - "requires": { - "@deephaven/chart": "^0.87.0", - "@deephaven/components": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/storage": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "linkifyjs": "^4.1.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "papaparse": "5.3.2", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "shell-quote": "^1.7.2" - } - }, - "@deephaven/filters": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.87.0.tgz", - "integrity": "sha512-MtbNlLGFrRUdHElf41jhcMAsDJjNv3lZBNTroGYGDYrSk/Sm0diwdtbUWL02pN7QiQetftE/ddhr/SheAIR1hw==" - }, - "@deephaven/storage": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.87.0.tgz", - "integrity": "sha512-OD8JRseiZX4Y/roNzP5AOw+k+EITfOAW/hap7sUiFbq6utkRx/u6HqSQk6lqjABh0npdg6B3r06vMxQR2hpl7g==", - "requires": { - "@deephaven/filters": "^0.87.0", - "@deephaven/log": "^0.87.0", - "lodash.throttle": "^4.1.1" - } - } - } - }, - "@deephaven/jsapi-bootstrap": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.87.0.tgz", - "integrity": "sha512-rsrrPe5JzMlOZV3JmeDGv0V12NkEVtmggzRauA28brBatiEd+TRE0iBbjcmavinhtXB/4NAQ5Xcl6FcvX67Pfg==", - "requires": { - "@deephaven/components": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0" - } - }, - "@deephaven/jsapi-components": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.87.0.tgz", - "integrity": "sha512-X6oCqqZ5SHxY5M5g+FpBUmRweIJUKyk1ec5whZGL6IQ8c1FrROcfs3IjRHCfnDh6Z3G27vdpgGdlVXx5FllMlw==", - "requires": { - "@deephaven/components": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "@types/js-cookie": "^3.0.3", - "classnames": "^2.3.2", - "js-cookie": "^3.0.5", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - } - }, - "@deephaven/jsapi-types": { - "version": "1.0.0-dev0.35.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.35.0.tgz", - "integrity": "sha512-X35g2ktmXbiTwjMNF20IkuNawJJ6Tlvrv23VuUVIjWHkpWcmyCYWIBle2zo7QAF6nnJpkccwFKJiC+TIkWl7hg==" - }, - "@deephaven/jsapi-utils": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.87.0.tgz", - "integrity": "sha512-W8Aq0IiVTGWlXQde+F9exrDt1jwmH458Zq8pXblcfgvyOkhXU0yAAaGGIA9gqam4jW8hyHnyx5zYWFgs647Cxw==", - "requires": { - "@deephaven/filters": "^0.87.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.87.0", - "@deephaven/utils": "^0.87.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - }, - "dependencies": { - "@deephaven/filters": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/filters/-/filters-0.87.0.tgz", - "integrity": "sha512-MtbNlLGFrRUdHElf41jhcMAsDJjNv3lZBNTroGYGDYrSk/Sm0diwdtbUWL02pN7QiQetftE/ddhr/SheAIR1hw==" - } - } - }, - "@deephaven/log": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.87.0.tgz", - "integrity": "sha512-hq2szL3DRBVPuv5OrIfEiFIg4MYHwICiALWFNCPNkX7isESOv/6LBxpFXOgnUAtzFsL7X1Cv3bbUtMacxw9uvA==", - "requires": { - "event-target-shim": "^6.0.2" - } - }, - "@deephaven/plugin": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.86.0.tgz", - "integrity": "sha512-oXwidAEE3QMycEjzxturHnG00i0zEli7d4AlDKZ/Yu14vBNcN/uB00Duyrw2AvEXTKspFrtRSKKIGXUJUpWqxA==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/golden-layout": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/iris-grid": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@fortawesome/fontawesome-common-types": "^6.1.1", - "@fortawesome/react-fontawesome": "^0.2.0" - }, - "dependencies": { - "@deephaven/components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/components/-/components-0.86.0.tgz", - "integrity": "sha512-DZslAyK5SDI8bV/u8eIrIcILY7rX53lkAIBepRgbbONV/e9uJYvEcB3m81ggmHB0j5hlGioomY9SmTSpwMwlmQ==", - "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/icons": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/react-fontawesome": "^0.2.0", - "@react-spectrum/theme-default": "^3.5.1", - "@react-spectrum/utils": "^3.11.5", - "@react-types/radio": "^3.8.1", - "@react-types/shared": "^3.22.1", - "@react-types/textfield": "^3.9.1", - "bootstrap": "4.6.2", - "classnames": "^2.3.1", - "event-target-shim": "^6.0.2", - "lodash.clamp": "^4.0.3", - "lodash.debounce": "^4.0.8", - "lodash.flatten": "^4.4.0", - "memoizee": "^0.4.15", - "nanoid": "^5.0.7", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2", - "react-virtualized-auto-sizer": "1.0.6", - "react-window": "^1.8.6" - } - }, - "@deephaven/golden-layout": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/golden-layout/-/golden-layout-0.86.0.tgz", - "integrity": "sha512-S9lckwF482Is3E8+HGx98rvvV9GuOblWNW09UI7kuNNkynnOUIcTW8bVdDWfVGIvXMawkKso2uCtJAXzDiRK2w==", - "requires": { - "@deephaven/components": "^0.86.0", - "jquery": "^3.6.0", - "nanoid": "^5.0.7" - } - }, - "@deephaven/icons": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/icons/-/icons-0.86.0.tgz", - "integrity": "sha512-/sMhQ4eW1J6K/8mppoGkBBV64g9jNINWZAIgu5yl1zBXqdKNysYgvBz+YYjpP752P/fCZhZVpmVbEBwpQvHYwg==", - "requires": { - "@fortawesome/fontawesome-common-types": "^6.1.1" - } - }, - "@deephaven/iris-grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/iris-grid/-/iris-grid-0.86.0.tgz", - "integrity": "sha512-g5M5YoWZGe6MCr8ltnTDEtK7QvlHnd1d5cXwZkpLOfEYsFOf6mcmJVK/p7XmjcyElsdLe9dT93YQiTfVzNnQrQ==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/console": "^0.86.0", - "@deephaven/filters": "^0.86.0", - "@deephaven/grid": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-components": "^0.86.0", + "dependencies": { + "@deephaven/console": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.91.0.tgz", + "integrity": "sha512-9jdvLDiygaJKf4dC6O5Zg5gZ7SVg2Y+hhhmwdALCfFU3oP56d8/ABCpzOqQ/EFpUw9u9M5o+scKKfD4knHjYZg==", + "requires": { + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@dnd-kit/core": "^6.1.0", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.2", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/storage": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "classnames": "^2.3.1", - "fast-deep-equal": "^3.1.3", - "lodash.clamp": "^4.0.3", + "linkifyjs": "^4.1.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "memoize-one": "^5.1.1", "memoizee": "^0.4.15", "monaco-editor": "^0.41.0", "nanoid": "^5.0.7", + "papaparse": "5.3.2", + "popper.js": "^1.16.1", "prop-types": "^15.7.2", - "react-beautiful-dnd": "^13.1.0", - "react-transition-group": "^4.4.2" - }, - "dependencies": { - "@deephaven/console": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/console/-/console-0.86.0.tgz", - "integrity": "sha512-BLCi1o9oNXAY/cdHnXQURASnCznXwFQUScQwe0wUpXt/9MYrqJkblP96Iv1Egs+TW3O8XHsO3e5/g6dw9juTBQ==", - "requires": { - "@deephaven/chart": "^0.86.0", - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/storage": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "classnames": "^2.3.1", - "linkifyjs": "^4.1.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "monaco-editor": "^0.41.0", - "nanoid": "^5.0.7", - "papaparse": "5.3.2", - "popper.js": "^1.16.1", - "prop-types": "^15.7.2", - "shell-quote": "^1.7.2" - }, - "dependencies": { - "@deephaven/chart": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/chart/-/chart-0.86.0.tgz", - "integrity": "sha512-e9Fk2KCsKjGiNlNPJbBUilhdVCp61wTNkWCC4JA7o3zSO1DFO75e9fWvfNQTr4AVCIDTLSbqv2AoRLXnmvD86w==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/icons": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "buffer": "^6.0.3", - "fast-deep-equal": "^3.1.3", - "lodash.debounce": "^4.0.8", - "lodash.set": "^4.3.2", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "plotly.js": "^2.29.1", - "prop-types": "^15.7.2", - "react-plotly.js": "^2.6.0" - } - }, - "@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" - } - } - } - }, - "@deephaven/grid": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/grid/-/grid-0.86.0.tgz", - "integrity": "sha512-lRCn4Cjd05jU58vfeZN8QTm9MRwWtUBdXfpGrkIBBHJytG/I9D8+abNyG3TQ1z4NPTzqf+51IGnr/E8Fgim8Ew==", - "requires": { - "@deephaven/utils": "^0.86.0", - "classnames": "^2.3.1", - "color-convert": "^2.0.1", - "event-target-shim": "^6.0.2", - "linkifyjs": "^4.1.0", - "lodash.clamp": "^4.0.3", - "memoize-one": "^5.1.1", - "memoizee": "^0.4.15", - "prop-types": "^15.7.2" - } - }, - "@deephaven/jsapi-components": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.86.0.tgz", - "integrity": "sha512-hWRk6JFC3MxSG8UP9FdCt5OK8Q9lPbIVGB/bDMChS9w/qQcrD87ry+KmGJqnggyKouUoMj2ljdL99xhwhurF8g==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-bootstrap": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "@types/js-cookie": "^3.0.3", - "classnames": "^2.3.2", - "js-cookie": "^3.0.5", - "lodash.debounce": "^4.0.8", - "prop-types": "^15.8.1" - }, - "dependencies": { - "@deephaven/jsapi-bootstrap": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.86.0.tgz", - "integrity": "sha512-pVlPxcEsIwAv7rvBlAhmVeqFdWRwfXpoAbJC6AgdFM8v/CNbTnlBOyocaifE99dnQTGtJTrjheCNrEpJgm372g==", - "requires": { - "@deephaven/components": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/react-hooks": "^0.86.0", - "@deephaven/utils": "^0.86.0" - } - } - } - }, - "@deephaven/storage": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.86.0.tgz", - "integrity": "sha512-YN1q47KVVgyY8UXmZgF9nIZYBVZZLHv01VyRWMViwVMT7obEw0HInYq6JTg4DbzFcJOiTtwy7hQq9V7kreIPNQ==", - "requires": { - "@deephaven/filters": "^0.86.0", - "@deephaven/log": "^0.86.0", - "lodash.throttle": "^4.1.1" - } - } - } - }, - "@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", - "requires": { - "@deephaven/filters": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - } - }, - "@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "requires": { - "event-target-shim": "^6.0.2" + "shell-quote": "^1.7.2" } }, - "@deephaven/react-hooks": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.86.0.tgz", - "integrity": "sha512-wm3GRJvf6k2+6Uf3fVotf2BeD0DGW0rwIz7etPtlyi1AxTvJcFN6mKLz0iV27Z36i0GG5QkiCPpiou5meML0Rg==", + "@deephaven/storage": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/storage/-/storage-0.91.0.tgz", + "integrity": "sha512-eEEj0UAJOSosad8kxuENbP2ByIyr1IBMHtWvu8sJ4TX2s3VphNunFnHgwP5ekA3UpjvwtxhoUvCRXc2iaNVxEQ==", "requires": { - "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.debounce": "^4.0.8", - "lodash.throttle": "^4.1.1", - "nanoid": "^5.0.7" + "@deephaven/filters": "^0.91.0", + "@deephaven/log": "^0.91.0", + "lodash.throttle": "^4.1.1" } - }, - "@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==" } } }, + "@deephaven/jsapi-bootstrap": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-bootstrap/-/jsapi-bootstrap-0.91.0.tgz", + "integrity": "sha512-00irzZyhEIqRn000ZH38+zk1tOjBsaWhn35/weg5HNL4gbBtW4sg5+hsDHRzYhbEqbJDErvgNUPml23Rll732g==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0" + } + }, + "@deephaven/jsapi-components": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-components/-/jsapi-components-0.91.0.tgz", + "integrity": "sha512-h5pgltU/S5+NoaYKdOJbCyLvx+6zmakiXIVS4GXo5P+mnOHyALvylxDT29jkGcgbPjNLLejWwjaIGHSSWWGG8w==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/utils": "^0.91.0", + "@types/js-cookie": "^3.0.3", + "classnames": "^2.3.2", + "js-cookie": "^3.0.5", + "lodash.debounce": "^4.0.8", + "prop-types": "^15.8.1" + } + }, + "@deephaven/jsapi-types": { + "version": "1.0.0-dev0.35.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-types/-/jsapi-types-1.0.0-dev0.35.0.tgz", + "integrity": "sha512-X35g2ktmXbiTwjMNF20IkuNawJJ6Tlvrv23VuUVIjWHkpWcmyCYWIBle2zo7QAF6nnJpkccwFKJiC+TIkWl7hg==" + }, + "@deephaven/jsapi-utils": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.91.0.tgz", + "integrity": "sha512-7+52u4fGeCU5Zy+bUi+uqv/tNujq1fdaBw4XjEcC+KSW3ojPo+xzpdl8E0L7IPYgD2ep/IPosaq/kbLp6JU3+g==", + "requires": { + "@deephaven/filters": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/utils": "^0.91.0", + "lodash.clamp": "^4.0.3", + "nanoid": "^5.0.7" + } + }, + "@deephaven/log": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.91.0.tgz", + "integrity": "sha512-IXT6+0XiR+5bhm5+3XELZFMTKPMZBmdckhswdJibrID0l79wgGiqKiqSnBjn1mFOGuOO+JYqU4KzoaIRJXZdyA==", + "requires": { + "event-target-shim": "^6.0.2" + } + }, + "@deephaven/plugin": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/plugin/-/plugin-0.91.0.tgz", + "integrity": "sha512-ip2b2VG8wus88ySOUaKg4XfrCtgLd7eH6f8CswuFnSNbYVcg+UurbGJRvBAvX1F8JYgwJeWIzyiEHkYKYT1i4g==", + "requires": { + "@deephaven/components": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", + "@deephaven/log": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@fortawesome/fontawesome-common-types": "^6.1.1", + "@fortawesome/react-fontawesome": "^0.2.0" + } + }, "@deephaven/react-hooks": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.87.0.tgz", - "integrity": "sha512-5PMDsHAAGawF53Th4vEqsyImJdioqIbw0+1o2X0pnQSOfhIda/OqCoq1a16cCHxwcpjWaMvI5BvTRe45HMZHIw==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/react-hooks/-/react-hooks-0.91.0.tgz", + "integrity": "sha512-G08G2RBPREpQIEYJ0FelvwqzsSqaq5/uG36kFspyxa8pkxQ5Lf9Bxqsnx/McR4sRYzVlbr1ADcL7r2Ecl19Ddg==", "requires": { "@adobe/react-spectrum": "3.35.1", - "@deephaven/log": "^0.87.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/log": "^0.91.0", + "@deephaven/utils": "^0.91.0", "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "nanoid": "^5.0.7" } }, "@deephaven/redux": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.86.0.tgz", - "integrity": "sha512-3EcgwYyXzkzQTmWa5DB57b4wfVfWO4tZefXf2VdQnfyJEhiD25/QJ9kAS6SHdR4vEjmK5MZA+hxLa9/2so47Mw==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/redux/-/redux-0.91.0.tgz", + "integrity": "sha512-1JnXcBUpxQDLT65S2SPA4hkoKc0tCkThzTV28zKQy+4pqGP5oD5QmlcgtUkeTqQPsNqEf8ZO9XZjkZHpQ0xqVQ==", "requires": { "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/jsapi-utils": "^0.86.0", - "@deephaven/log": "^0.86.0", - "@deephaven/plugin": "^0.86.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", "fast-deep-equal": "^3.1.3", "proxy-memoize": "^3.0.0", "redux-thunk": "2.4.1" - }, - "dependencies": { - "@deephaven/jsapi-utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/jsapi-utils/-/jsapi-utils-0.86.0.tgz", - "integrity": "sha512-HnKAEWLwZuF7KRt5sU6CIdS2P+NSIj9UfV2SLRoFB+eN70dLm6+E+Rsw2Q1msPRC9SYa4sdtoF6qKp7Djf/7iw==", - "requires": { - "@deephaven/filters": "^0.86.0", - "@deephaven/jsapi-types": "^1.0.0-dev0.34.0", - "@deephaven/log": "^0.86.0", - "@deephaven/utils": "^0.86.0", - "lodash.clamp": "^4.0.3", - "nanoid": "^5.0.7" - } - }, - "@deephaven/log": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/log/-/log-0.86.0.tgz", - "integrity": "sha512-VgldfD7weCUhtsSFy2KLBRGcgfmIVepZ0rSkyCVVwNLxtu+7BwsJ68uKxOtsUvD+HXHpJkzJZ0MBA8K29lTH6g==", - "requires": { - "event-target-shim": "^6.0.2" - } - }, - "@deephaven/utils": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.86.0.tgz", - "integrity": "sha512-zZdxoHxhuSSxQpCZWlJFo1jEoNThIyyGosMUvFyaMiwgsQbvR+4LxBFXXkXBfqNrUPqYWXhgcSIOcdr/+pL1Gg==" - } } }, "@deephaven/utils": { - "version": "0.87.0", - "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.87.0.tgz", - "integrity": "sha512-hgvOZQfOMznKX4YeyfBJFjck0IbzAOcPhr9uQO5EDgPvuFQF3b0XKqurqs8plWmSHDv+wDYaubu83dW++EYRcw==" + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@deephaven/utils/-/utils-0.91.0.tgz", + "integrity": "sha512-MQAnLvJux9N6ZeCdxWle6NEJ8dqrpxVtkMd9oVqqa0mjmRVPjz6UuT8Hl10VagrYJya1TjKHizW3BrDyhYPQ1w==" }, "buffer": { "version": "6.0.3", diff --git a/plugins/ui/src/deephaven/ui/components/table.py b/plugins/ui/src/deephaven/ui/components/table.py index 190451cb1..2014f0de6 100644 --- a/plugins/ui/src/deephaven/ui/components/table.py +++ b/plugins/ui/src/deephaven/ui/components/table.py @@ -8,6 +8,7 @@ ColumnGroup, ColumnName, ColumnPressCallback, + DatabarConfig, QuickFilterExpression, RowPressCallback, ResolvableContextMenuItem, @@ -39,6 +40,7 @@ def table( context_header_menu: ( ResolvableContextMenuItem | list[ResolvableContextMenuItem] | None ) = None, + databars: list[DatabarConfig] | None = None, ) -> UITable: """ Customization to how a table is displayed, how it behaves, and listen to UI events. diff --git a/plugins/ui/src/deephaven/ui/types/types.py b/plugins/ui/src/deephaven/ui/types/types.py index d88a7595d..fcca8aaa9 100644 --- a/plugins/ui/src/deephaven/ui/types/types.py +++ b/plugins/ui/src/deephaven/ui/types/types.py @@ -455,9 +455,6 @@ class SliderChange(TypedDict): ] ContextMenuModeOption = Literal["CELL", "ROW_HEADER", "COLUMN_HEADER"] ContextMenuMode = Union[ContextMenuModeOption, List[ContextMenuModeOption], None] -DataBarAxis = Literal["PROPORTIONAL", "MIDDLE", "DIRECTIONAL"] -DataBarDirection = Literal["LTR", "RTL"] -DataBarValuePlacement = Literal["BESIDE", "OVERLAP", "HIDE"] # TODO: Fill in the list of Deephaven Colors we allow LockType = Literal["shared", "exclusive"] QuickFilterExpression = str @@ -509,3 +506,70 @@ class SliderChange(TypedDict): TabDensity = Literal["compact", "regular"] Dependencies = Union[Tuple[Any], List[Any]] Selection = Sequence[Key] + +DataBarAxis = Literal["PROPORTIONAL", "MIDDLE", "DIRECTIONAL"] +DataBarDirection = Literal["LTR", "RTL"] +DataBarValuePlacement = Literal["BESIDE", "OVERLAP", "HIDE"] + + +class DatabarConfig(TypedDict): + """ + Configuration for displaying a databar. + """ + + column: ColumnName + """ + Name of the column to display as a databar. + """ + + value_column: NotRequired[ColumnName] + """ + Name of the column to use as the value for the databar. + If not provided, the databar will use the column value. + + This can be useful if you want to display a databar with + a log scale, but display the actual value in the cell. + In this case, the value_column would be the log of the actual value. + """ + + min: NotRequired[Union[ColumnName, float]] + """ + Minimum value for the databar. Defaults to the minimum value in the column. + + If a column name is provided, the minimum value will be the value in that column. + If a constant is providded, the minimum value will be that constant. + """ + + max: NotRequired[Union[ColumnName, float]] + """ + Maximum value for the databar. Defaults to the maximum value in the column. + + If a column name is provided, the maximum value will be the value in that column. + If a constant is providded, the maximum value will be that constant. + """ + + axis: NotRequired[DataBarAxis] + """ + Whether the databar 0 value should be proportional to the min and max values, + in the middle of the cell, or on one side of the databar based on direction. + """ + + direction: NotRequired[DataBarDirection] + """ + Direction of the databar. + """ + + value_placement: NotRequired[DataBarValuePlacement] + """ + Placement of the value relative to the databar. + """ + + color: NotRequired[Color] + """ + Color of the databar. + """ + + opacity: NotRequired[float] + """ + Opacity of the databar fill. + """ diff --git a/plugins/ui/src/js/package.json b/plugins/ui/src/js/package.json index 1f6879ad7..8b61e00ac 100644 --- a/plugins/ui/src/js/package.json +++ b/plugins/ui/src/js/package.json @@ -41,23 +41,23 @@ "react-dom": "^17.0.2" }, "dependencies": { - "@deephaven/chart": "^0.87.0", - "@deephaven/components": "^0.87.0", - "@deephaven/dashboard": "^0.86.0", - "@deephaven/dashboard-core-plugins": "^0.86.1", - "@deephaven/golden-layout": "^0.87.0", - "@deephaven/grid": "^0.87.0", - "@deephaven/icons": "^0.87.0", - "@deephaven/iris-grid": "^0.87.0", - "@deephaven/jsapi-bootstrap": "^0.87.0", - "@deephaven/jsapi-components": "^0.87.0", + "@deephaven/chart": "^0.91.0", + "@deephaven/components": "^0.91.0", + "@deephaven/dashboard": "^0.91.0", + "@deephaven/dashboard-core-plugins": "^0.91.0", + "@deephaven/golden-layout": "^0.91.0", + "@deephaven/grid": "^0.91.0", + "@deephaven/icons": "^0.91.0", + "@deephaven/iris-grid": "^0.91.0", + "@deephaven/jsapi-bootstrap": "^0.91.0", + "@deephaven/jsapi-components": "^0.91.0", "@deephaven/jsapi-types": "^1.0.0-dev0.35.0", - "@deephaven/jsapi-utils": "^0.87.0", - "@deephaven/log": "^0.87.0", - "@deephaven/plugin": "^0.86.0", - "@deephaven/react-hooks": "^0.87.0", - "@deephaven/redux": "^0.86.0", - "@deephaven/utils": "^0.87.0", + "@deephaven/jsapi-utils": "^0.91.0", + "@deephaven/log": "^0.91.0", + "@deephaven/plugin": "^0.91.0", + "@deephaven/react-hooks": "^0.91.0", + "@deephaven/redux": "^0.91.0", + "@deephaven/utils": "^0.91.0", "@fortawesome/react-fontawesome": "^0.2.0", "@internationalized/date": "^3.5.5", "classnames": "^2.5.1", diff --git a/plugins/ui/src/js/src/elements/UITable/JsTableProxy.ts b/plugins/ui/src/js/src/elements/UITable/JsTableProxy.ts index db1b5cfa9..8bc2c3126 100644 --- a/plugins/ui/src/js/src/elements/UITable/JsTableProxy.ts +++ b/plugins/ui/src/js/src/elements/UITable/JsTableProxy.ts @@ -18,9 +18,23 @@ interface JsTableProxy extends dh.Table {} * Any methods implemented in this class will be utilized over the underlying JsTable methods. * Any methods not implemented in this class will be proxied to the table. */ -class JsTableProxy { +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +class JsTableProxy implements dh.Table { + static HIDDEN_COLUMN_SUFFIXES = ['__DATABAR_Min', '__DATABAR_Max']; + private table: dh.Table; + /** + * Keep a stable reference to all, visible, and hidden columns. + * Only update when needed. + */ + private stableColumns: { + allColumns: dh.Column[]; + visibleColumns: dh.Column[]; + hiddenColumns: dh.Column[]; + }; + layoutHints: dh.LayoutHints | null = null; constructor({ @@ -32,6 +46,12 @@ class JsTableProxy { }) { this.table = table; + this.stableColumns = { + allColumns: [], + visibleColumns: [], + hiddenColumns: [], + }; + const { frontColumns = null, frozenColumns = null, @@ -87,7 +107,9 @@ class JsTableProxy { Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), prop) ?.set != null; - if (proxyHasSetter) { + const proxyHasProp = Object.prototype.hasOwnProperty.call(target, prop); + + if (proxyHasSetter || proxyHasProp) { return Reflect.set(target, prop, value, target); } @@ -95,6 +117,86 @@ class JsTableProxy { }, }); } + + /** + * Update the stable columns object if needed. + * This lets us keep a stable array for columns unless the underlying table changes. + */ + private updateDisplayedColumns(): void { + if (this.stableColumns.allColumns !== this.table.columns) { + this.stableColumns.allColumns = this.table.columns; + + this.stableColumns.visibleColumns = this.table.columns.filter( + column => + !JsTableProxy.HIDDEN_COLUMN_SUFFIXES.some(suffix => + column.name.endsWith(suffix) + ) + ); + + this.stableColumns.hiddenColumns = this.table.columns.filter(column => + JsTableProxy.HIDDEN_COLUMN_SUFFIXES.some(suffix => + column.name.endsWith(suffix) + ) + ); + } + } + + get columns(): dh.Column[] { + this.updateDisplayedColumns(); + return this.stableColumns.visibleColumns; + } + + get hiddenColumns(): dh.Column[] { + this.updateDisplayedColumns(); + return this.stableColumns.hiddenColumns; + } + + setViewport( + firstRow: number, + lastRow: number, + columns?: Array | undefined | null, + updateIntervalMs?: number | undefined | null + ): dh.TableViewportSubscription { + if (columns == null) { + return this.table.setViewport( + firstRow, + lastRow, + columns, + updateIntervalMs + ); + } + + const allColumns = columns.concat(this.hiddenColumns); + const viewportSubscription = this.table.setViewport( + firstRow, + lastRow, + allColumns, + updateIntervalMs + ); + return new Proxy(viewportSubscription, { + get: (target, prop, receiver) => { + // Need to proxy setViewport on the subscription in case it is changed + // without creating an entirely new subscription + if (prop === 'setViewport') { + return ( + first: number, + last: number, + cols?: dh.Column[] | null, + interval?: number | null + ) => { + if (cols == null) { + return target.setViewport(first, last, cols, interval); + } + + const proxyAllColumns = cols.concat(this.hiddenColumns); + + return target.setViewport(first, last, proxyAllColumns, interval); + }; + } + return Reflect.get(target, prop, receiver); + }, + }); + } } export default JsTableProxy; diff --git a/plugins/ui/src/js/src/elements/UITable/UITable.tsx b/plugins/ui/src/js/src/elements/UITable/UITable.tsx index 5bf353c3d..98d4b1331 100644 --- a/plugins/ui/src/js/src/elements/UITable/UITable.tsx +++ b/plugins/ui/src/js/src/elements/UITable/UITable.tsx @@ -5,11 +5,14 @@ import { IrisGrid, type IrisGridType, type IrisGridContextMenuData, - IrisGridModel, - IrisGridModelFactory, IrisGridProps, IrisGridUtils, } from '@deephaven/iris-grid'; +import { + colorValueStyle, + resolveCssVariablesInRecord, + useTheme, +} from '@deephaven/components'; import { useApi } from '@deephaven/jsapi-bootstrap'; import { TableUtils } from '@deephaven/jsapi-utils'; import type { dh } from '@deephaven/jsapi-types'; @@ -18,8 +21,8 @@ import { getSettings, RootState } from '@deephaven/redux'; import { GridMouseHandler } from '@deephaven/grid'; import { UITableProps, wrapContextActions } from './UITableUtils'; import UITableMouseHandler from './UITableMouseHandler'; -import JsTableProxy from './JsTableProxy'; import UITableContextMenuHandler from './UITableContextMenuHandler'; +import UITableModel, { makeUiTableModel } from './UITableModel'; const log = Log.module('@deephaven/js-plugin-ui/UITable'); @@ -45,10 +48,19 @@ export function UITable({ density, contextMenu, contextHeaderMenu, + databars: databarsProp, }: UITableProps): JSX.Element | null { + const [error, setError] = useState(null); + + if (error != null) { + // Re-throw the error so that the error boundary can catch it + throw error; + } + const dh = useApi(); + const theme = useTheme(); const [irisGrid, setIrisGrid] = useState(null); - const [model, setModel] = useState(); + const [model, setModel] = useState(); const [columns, setColumns] = useState(); const utils = useMemo(() => new IrisGridUtils(dh), [dh]); const settings = useSelector(getSettings); @@ -59,6 +71,50 @@ export function UITable({ hiddenColumns, columnGroups, }); + const [databars] = useState(databarsProp ?? []); + + const databarColorMap = useMemo(() => { + log.debug('Theme changed, updating databar color map', theme); + const colorSet = new Set(); + databars?.forEach(databar => { + const { color, markers } = databar; + if (color != null) { + if (typeof color === 'string' || Array.isArray(color)) { + [color].flat().forEach(c => colorSet.add(c)); + } else { + if (color.positive != null) { + [color.positive].flat().forEach(c => colorSet.add(c)); + } + + if (color.negative != null) { + [color.negative].flat().forEach(c => colorSet.add(c)); + } + } + } + + markers?.forEach(marker => { + if (marker.color != null) { + colorSet.add(marker.color); + } + }); + }); + + const colorRecord: Record = {}; + colorSet.forEach(c => { + colorRecord[c] = colorValueStyle(c); + }); + + const resolvedColors = resolveCssVariablesInRecord(colorRecord); + const colorMap = new Map(); + Object.entries(resolvedColors).forEach(([key, value]) => { + colorMap.set(key, value); + }); + return colorMap; + }, [databars, theme]); + + if (model) { + model.setDatabarColorMap(databarColorMap); + } const hydratedSorts = useMemo(() => { if (sorts !== undefined && columns !== undefined) { @@ -95,25 +151,35 @@ export function UITable({ useEffect(() => { let isCancelled = false; async function loadModel() { - const reexportedTable = await exportedTable.reexport(); - const table = await reexportedTable.fetch(); - const newTable = new JsTableProxy({ - table: table as dh.Table, - layoutHints, - }); - const newModel = await IrisGridModelFactory.makeModel(dh, newTable); - if (!isCancelled) { - setColumns(newTable.columns); - setModel(newModel); - } else { - newModel.close(); + try { + const reexportedTable = await exportedTable.reexport(); + const table = (await reexportedTable.fetch()) as dh.Table; + const newModel = await makeUiTableModel( + dh, + table, + databars, + layoutHints + ); + if (!isCancelled) { + setError(null); + setColumns(newModel.table.columns); + setModel(newModel); + } else { + newModel.close(); + } + } catch (e) { + if (!isCancelled) { + // Errors thrown from an async useEffect are not caught + // by the component's error boundary + setError(e); + } } } loadModel(); return () => { isCancelled = true; }; - }, [dh, exportedTable, layoutHints]); + }, [databars, dh, exportedTable, layoutHints]); const mouseHandlers = useMemo( () => diff --git a/plugins/ui/src/js/src/elements/UITable/UITableModel.ts b/plugins/ui/src/js/src/elements/UITable/UITableModel.ts new file mode 100644 index 000000000..1c5e2af5b --- /dev/null +++ b/plugins/ui/src/js/src/elements/UITable/UITableModel.ts @@ -0,0 +1,335 @@ +import { + GridThemeType, + DataBarOptions, + CellRenderType, + ModelIndex, +} from '@deephaven/grid'; +import { + ColumnName, + IrisGridModel, + IrisGridModelFactory, + isIrisGridTableModelTemplate, + UIRow, +} from '@deephaven/iris-grid'; +import { TableUtils } from '@deephaven/jsapi-utils'; +import { type dh as DhType } from '@deephaven/jsapi-types'; +import { ColorGradient, DatabarConfig } from './UITableUtils'; +import JsTableProxy, { UITableLayoutHints } from './JsTableProxy'; + +export async function makeUiTableModel( + dh: typeof DhType, + table: DhType.Table, + databars: DatabarConfig[], + layoutHints: UITableLayoutHints +): Promise { + const joinColumns: string[] = []; + const totalsOperationMap: Record = {}; + databars.forEach(config => { + const { column, value_column: valueColumn = column, min, max } = config; + + try { + table.findColumn(column); + } catch { + throw new Error(`Can't find databar column ${column}`); + } + + try { + table.findColumn(valueColumn); + } catch { + throw new Error(`Can't find databar value column ${valueColumn}`); + } + + if (min == null && max == null) { + totalsOperationMap[valueColumn] = ['Min', 'Max']; + joinColumns.push( + `${valueColumn}__DATABAR_Min=${valueColumn}__Min`, + `${valueColumn}__DATABAR_Max=${valueColumn}__Max` + ); + } else if (min == null) { + totalsOperationMap[valueColumn] = ['Min']; + joinColumns.push(`${valueColumn}__DATABAR_Min=${valueColumn}`); + } else if (max == null) { + totalsOperationMap[valueColumn] = ['Max']; + joinColumns.push(`${valueColumn}__DATABAR_Max=${valueColumn}`); + } + }); + + let baseTable = table; + + if (joinColumns.length > 0) { + const totalsTable = await table.getTotalsTable({ + operationMap: totalsOperationMap, + defaultOperation: 'Skip', + showGrandTotalsByDefault: false, + showTotalsByDefault: false, + groupBy: [], + }); + + baseTable = await table.naturalJoin(totalsTable, [], joinColumns); + } + + const uiTableProxy = new JsTableProxy({ + table: baseTable, + layoutHints, + }); + + const baseModel = await IrisGridModelFactory.makeModel(dh, uiTableProxy); + + return new UITableModel({ + dh, + model: baseModel, + table: uiTableProxy, + databars, + }); +} + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +// eslint-disable-next-line @typescript-eslint/no-empty-interface +interface UITableModel extends IrisGridModel {} + +type NumericValue = + | number + | DhType.LongWrapper + | DhType.BigIntegerWrapper + | DhType.BigDecimalWrapper; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +class UITableModel extends IrisGridModel { + table: DhType.Table; + + private model: IrisGridModel; + + private databars: Map; + + private databarColorMap: Map = new Map(); + + constructor({ + dh, + model, + table, + databars, + }: { + dh: typeof DhType; + model: IrisGridModel; + table: DhType.Table; + databars: DatabarConfig[]; + }) { + super(dh); + + this.model = model; + this.table = table; + + this.databars = new Map(); + databars.forEach(databar => { + this.databars.set(databar.column, databar); + }); + + // eslint-disable-next-line no-constructor-return + return new Proxy(this, { + // We want to use any properties on the proxy model if defined + // If not, then proxy to the underlying model + get(target, prop, receiver) { + // Does this class have a getter for the prop + // Getter functions are on the prototype + const proxyHasGetter = + Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), prop) + ?.get != null; + + if (proxyHasGetter) { + return Reflect.get(target, prop, receiver); + } + + // Does this class implement the property + const proxyHasProp = Object.prototype.hasOwnProperty.call(target, prop); + + // Does the class implement a function for the property + const proxyHasFn = Object.prototype.hasOwnProperty.call( + Object.getPrototypeOf(target), + prop + ); + + const trueTarget = proxyHasProp || proxyHasFn ? target : target.model; + return Reflect.get(trueTarget, prop); + }, + set(target, prop, value) { + const proxyHasSetter = + Object.getOwnPropertyDescriptor(Object.getPrototypeOf(target), prop) + ?.set != null; + + const proxyHasProp = Object.prototype.hasOwnProperty.call(target, prop); + + if (proxyHasSetter || proxyHasProp) { + return Reflect.set(target, prop, value, target); + } + + return Reflect.set(target.model, prop, value, target.model); + }, + }); + } + + setDatabarColorMap(colorMap: Map): void { + this.databarColorMap = colorMap; + } + + // eslint-disable-next-line class-methods-use-this + override renderTypeForCell( + column: ModelIndex, + row: ModelIndex + ): CellRenderType { + if ( + !isIrisGridTableModelTemplate(this.model) || + this.model.isTotalsRow(row) + ) { + return this.model.renderTypeForCell(column, row); + } + const columnName = this.columns[column].name; + return this.databars.has(columnName) + ? 'dataBar' + : this.model.renderTypeForCell(column, row); + } + + /** + * Gets the value as a number for a databar column. + * This will unwrap the value if it's a numeric wrapper. + * If the value is null, it will default to 0 as this indiates the value has not been fetched. + * @param row The UIRow to get the value from + * @param columnName The column name associated with the value + * @param valueType The type of value to get. This is used for error messages. E.g. 'minimum' or 'maximum' + * @returns Numeric value for the databar column + */ + getDatabarValueFromRow( + row: UIRow | null, + columnName: ColumnName, + valueType: string + ): number { + if (row != null) { + let column; + + try { + column = this.table.findColumn(columnName); + } catch { + throw new Error(`Can't find databar ${valueType} column ${columnName}`); + } + + if (!TableUtils.isNumberType(column.type)) { + throw new Error( + `Can't use non-numeric column as databar ${valueType}: ${columnName} is of type ${column.type}` + ); + } + + const valueColumnIndex = this.getColumnIndexByName(columnName); + const rowDataKey = valueColumnIndex ?? columnName; + + const value = (row.data.get(rowDataKey)?.value ?? 0) as NumericValue; + return typeof value === 'number' ? value : value.asNumber(); + } + return 0; + } + + override dataBarOptionsForCell( + columnIndex: number, + rowIndex: number, + theme: GridThemeType + ): DataBarOptions { + if (!isIrisGridTableModelTemplate(this.model)) { + throw new Error('Cannot use databars on this table type'); + } + + const columnName = this.columns[columnIndex].name; + + const config = this.databars.get(columnName); + if (config == null) { + throw new Error(`No databar config for column ${columnName}`); + } + + const { + column, + value_column: valueColumnName = column, + min = `${valueColumnName}__DATABAR_Min`, + max = `${valueColumnName}__DATABAR_Max`, + axis = 'proportional', + color: userColor, + value_placement: valuePlacement = 'beside', + opacity = valuePlacement === 'overlap' ? 0.35 : 1, + markers: markersProp = [], + direction = 'LTR', + } = config; + + const valueColumnIndex = this.getColumnIndexByName(valueColumnName); + + if (valueColumnIndex == null) { + throw new Error(`Can't find column ${valueColumnName}`); + } + + const row = this.model.row(rowIndex); + + const value = this.getDatabarValueFromRow(row, valueColumnName, 'value'); + + const minRowValue = + typeof min === 'string' + ? this.getDatabarValueFromRow(row, min, 'minimum') + : min; + + const maxRowValue = + typeof max === 'string' + ? this.getDatabarValueFromRow(row, max, 'maximum') + : max; + + const markers = markersProp.map(marker => { + const { value: markerValue, color: markerColor = theme.markerBarColor } = + marker; + return { + value: + typeof markerValue === 'string' + ? this.getDatabarValueFromRow(row, markerValue, 'marker') + : markerValue, + color: this.databarColorMap.get(markerColor) ?? markerColor, + }; + }); + + let positiveColor: string | ColorGradient = theme.positiveBarColor; + let negativeColor: string | ColorGradient = theme.negativeBarColor; + + if (userColor != null) { + if (typeof userColor === 'string' || Array.isArray(userColor)) { + positiveColor = userColor; + negativeColor = userColor; + } else { + positiveColor = userColor.positive ?? positiveColor; + negativeColor = userColor.negative ?? negativeColor; + } + } + + if (Array.isArray(positiveColor)) { + positiveColor = positiveColor.map( + color => this.databarColorMap.get(color) ?? color + ); + } else { + positiveColor = this.databarColorMap.get(positiveColor) ?? positiveColor; + } + + if (Array.isArray(negativeColor)) { + negativeColor = negativeColor.map( + color => this.databarColorMap.get(color) ?? color + ); + } else { + negativeColor = this.databarColorMap.get(negativeColor) ?? negativeColor; + } + + return { + columnMin: minRowValue, + columnMax: maxRowValue, + axis, + color: value >= 0 ? positiveColor : negativeColor, + valuePlacement, + opacity, + markers, + direction, + value, + }; + } +} + +export default UITableModel; diff --git a/plugins/ui/src/js/src/elements/UITable/UITableUtils.tsx b/plugins/ui/src/js/src/elements/UITable/UITableUtils.tsx index a8cf0b250..22d40d20d 100644 --- a/plugins/ui/src/js/src/elements/UITable/UITableUtils.tsx +++ b/plugins/ui/src/js/src/elements/UITable/UITableUtils.tsx @@ -54,6 +54,24 @@ type ResolvableUIContextItem = params: UIContextItemParams ) => Promise); +export type ColorGradient = string[]; + +export type DatabarConfig = { + column: ColumnName; + value_column?: ColumnName; + min?: number | ColumnName; + max?: number | ColumnName; + axis?: 'proportional' | 'middle' | 'directional'; + direction?: 'LTR' | 'RTL'; + value_placement?: 'beside' | 'overlap' | 'hide'; + color?: + | string + | ColorGradient + | { positive?: string | ColorGradient; negative?: string | ColorGradient }; + opacity?: number; + markers?: { value: number | string; color?: string }[]; +}; + export type UITableProps = { table: dh.WidgetExportedObject; onCellPress?: (data: CellData) => void; @@ -76,6 +94,7 @@ export type UITableProps = { density?: 'compact' | 'regular' | 'spacious'; contextMenu?: ResolvableUIContextItem | ResolvableUIContextItem[]; contextHeaderMenu?: ResolvableUIContextItem | ResolvableUIContextItem[]; + databars?: DatabarConfig[]; }; export type UITableNode = Required<