,
[
mouseHandlers,
@@ -134,6 +158,7 @@ export function UITable({
hydratedSorts,
hydratedQuickFilters,
settings,
+ onContextMenu,
]
);
@@ -142,8 +167,12 @@ export function UITable({
return model ? (
- {/* eslint-disable-next-line react/jsx-props-no-spreading */}
-
+ setIrisGrid(ref)}
+ model={model}
+ // eslint-disable-next-line react/jsx-props-no-spreading
+ {...irisGridProps}
+ />
) : null;
}
diff --git a/plugins/ui/src/js/src/elements/index.ts b/plugins/ui/src/js/src/elements/index.ts
index d05cabf01..8302b4719 100644
--- a/plugins/ui/src/js/src/elements/index.ts
+++ b/plugins/ui/src/js/src/elements/index.ts
@@ -5,6 +5,7 @@ export * from './Form';
export * from './hooks';
export * from './HTMLElementView';
export * from './IconElementView';
+export * from './IllustratedMessage';
export * from './ListView';
export * from './model';
export * from './ObjectView';
diff --git a/plugins/ui/src/js/src/elements/utils/UITableContextMenuHandler.ts b/plugins/ui/src/js/src/elements/utils/UITableContextMenuHandler.ts
new file mode 100644
index 000000000..e0698e5d4
--- /dev/null
+++ b/plugins/ui/src/js/src/elements/utils/UITableContextMenuHandler.ts
@@ -0,0 +1,68 @@
+import { GridPoint, ModelIndex } from '@deephaven/grid';
+import type { ResolvableContextAction } from '@deephaven/components';
+import {
+ IrisGridModel,
+ IrisGridType,
+ IrisGridContextMenuHandler,
+} from '@deephaven/iris-grid';
+import type { dh as DhType } from '@deephaven/jsapi-types';
+import { UITableProps, wrapContextActions } from './UITableUtils';
+
+/**
+ * Context menu handler for UITable.
+ */
+class UITableContextMenuHandler extends IrisGridContextMenuHandler {
+ private model: IrisGridModel;
+
+ private contextMenuItems: UITableProps['contextMenu'];
+
+ private contextColumnHeaderItems: UITableProps['contextHeaderMenu'];
+
+ constructor(
+ dh: typeof DhType,
+ irisGrid: IrisGridType,
+ model: IrisGridModel,
+ contextMenuItems: UITableProps['contextMenu'],
+ contextColumnHeaderItems: UITableProps['contextHeaderMenu']
+ ) {
+ super(irisGrid, dh);
+ this.order -= 1; // Make it just above the default handler priority
+ this.irisGrid = irisGrid;
+ this.model = model;
+ this.contextMenuItems = contextMenuItems;
+ this.contextColumnHeaderItems = contextColumnHeaderItems;
+ }
+
+ getHeaderActions(
+ modelIndex: ModelIndex,
+ gridPoint: GridPoint
+ ): ResolvableContextAction[] {
+ const { irisGrid, contextColumnHeaderItems, model } = this;
+
+ const { column: columnIndex } = gridPoint;
+ const modelColumn = irisGrid.getModelColumn(columnIndex);
+
+ if (!contextColumnHeaderItems || modelColumn == null) {
+ return super.getHeaderActions(modelIndex, gridPoint);
+ }
+
+ const { columns } = model;
+
+ const sourceCell = model.sourceForCell(modelColumn, 0);
+ const { column: sourceColumn } = sourceCell;
+ const column = columns[sourceColumn];
+
+ return [
+ ...super.getHeaderActions(modelIndex, gridPoint),
+ ...wrapContextActions(contextColumnHeaderItems, {
+ value: null,
+ valueText: null,
+ rowIndex: null,
+ columnIndex: sourceColumn,
+ column,
+ }),
+ ];
+ }
+}
+
+export default UITableContextMenuHandler;
diff --git a/plugins/ui/src/js/src/elements/utils/UITableUtils.tsx b/plugins/ui/src/js/src/elements/utils/UITableUtils.tsx
index 1abb6aa1c..45a18095b 100644
--- a/plugins/ui/src/js/src/elements/utils/UITableUtils.tsx
+++ b/plugins/ui/src/js/src/elements/utils/UITableUtils.tsx
@@ -1,7 +1,23 @@
import type { dh } from '@deephaven/jsapi-types';
-import { ColumnName, DehydratedSort, RowIndex } from '@deephaven/iris-grid';
+import type {
+ ColumnName,
+ DehydratedSort,
+ IrisGridContextMenuData,
+ RowIndex,
+} from '@deephaven/iris-grid';
+import type {
+ ContextAction,
+ ResolvableContextAction,
+} from '@deephaven/components';
+import { ensureArray } from '@deephaven/utils';
import { ELEMENT_KEY, ElementNode, isElementNode } from './ElementUtils';
-import { ELEMENT_NAME, ElementName } from '../model/ElementConstants';
+import { getIcon } from './IconElementUtils';
+import {
+ ELEMENT_NAME,
+ ELEMENT_PREFIX,
+ ElementName,
+ ElementPrefix,
+} from '../model/ElementConstants';
export type CellData = {
type: string;
@@ -18,6 +34,26 @@ export type ColumnIndex = number;
export type RowDataMap = Record;
+export interface UIContextItemParams {
+ value: unknown;
+ text_value: string | null;
+ column_name: string;
+ is_column_header: boolean;
+ is_row_header: boolean;
+}
+
+export type UIContextItem = Omit & {
+ action?: (params: UIContextItemParams) => void;
+
+ actions?: ResolvableUIContextItem[];
+};
+
+type ResolvableUIContextItem =
+ | UIContextItem
+ | ((
+ params: UIContextItemParams
+ ) => Promise);
+
export interface UITableProps {
table: dh.WidgetExportedObject;
onCellPress?: (cellIndex: [ColumnIndex, RowIndex], data: CellData) => void;
@@ -34,6 +70,8 @@ export interface UITableProps {
sorts?: DehydratedSort[];
showSearch: boolean;
showQuickFilters: boolean;
+ contextMenu?: ResolvableUIContextItem | ResolvableUIContextItem[];
+ contextHeaderMenu?: ResolvableUIContextItem | ResolvableUIContextItem[];
[key: string]: unknown;
}
@@ -47,3 +85,64 @@ export function isUITable(obj: unknown): obj is UITableNode {
(obj as UITableNode)[ELEMENT_KEY] === ELEMENT_NAME.uiTable
);
}
+
+function wrapUIContextItem(
+ item: UIContextItem,
+ data: Omit
+): ContextAction {
+ return {
+ group: 999999, // Default to the end of the menu
+ ...item,
+ icon: item.icon
+ ? getIcon(`${ELEMENT_PREFIX.icon}${item.icon}` as ElementPrefix['icon'])
+ : undefined,
+ action: item.action
+ ? () => {
+ item.action?.({
+ value: data.value,
+ text_value: data.valueText,
+ column_name: data.column.name,
+ is_column_header: data.rowIndex == null,
+ is_row_header: data.columnIndex == null,
+ });
+ }
+ : undefined,
+ actions: item.actions ? wrapContextActions(item.actions, data) : undefined,
+ } satisfies ContextAction;
+}
+
+function wrapUIContextItems(
+ items: UIContextItem | UIContextItem[],
+ data: Omit
+): ContextAction[] {
+ return ensureArray(items).map(item => wrapUIContextItem(item, data));
+}
+
+/**
+ * Wraps context item actions from the server so they are called with the cell info.
+ * @param items The context items from the server
+ * @param data The context menu data to use for the context items
+ * @returns Context items with the UI actions wrapped so they receive the cell info
+ */
+export function wrapContextActions(
+ items: ResolvableUIContextItem | ResolvableUIContextItem[],
+ data: Omit
+): ResolvableContextAction[] {
+ return ensureArray(items).map(item => {
+ if (typeof item === 'function') {
+ return async () =>
+ wrapUIContextItems(
+ (await item({
+ value: data.value,
+ text_value: data.valueText,
+ column_name: data.column.name,
+ is_column_header: data.rowIndex == null,
+ is_row_header: data.columnIndex == null,
+ })) ?? [],
+ data
+ );
+ }
+
+ return wrapUIContextItem(item, data);
+ });
+}
diff --git a/plugins/ui/src/js/src/layout/ReactPanel.tsx b/plugins/ui/src/js/src/layout/ReactPanel.tsx
index cf3fdebd0..914b7a7a5 100644
--- a/plugins/ui/src/js/src/layout/ReactPanel.tsx
+++ b/plugins/ui/src/js/src/layout/ReactPanel.tsx
@@ -1,6 +1,6 @@
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
import ReactDOM from 'react-dom';
-import shortid from 'shortid';
+import { nanoid } from 'nanoid';
import {
LayoutUtils,
PanelEvent,
@@ -94,7 +94,7 @@ function ReactPanel({
// We want to regenerate the key every time the metadata changes, so that the portal is re-rendered
// eslint-disable-next-line react-hooks/exhaustive-deps
- const contentKey = useMemo(() => shortid.generate(), [metadata]);
+ const contentKey = useMemo(() => nanoid(), [metadata]);
const parent = useParentItem();
const { eventHub } = layoutManager;
diff --git a/plugins/ui/src/js/src/widget/DocumentHandler.tsx b/plugins/ui/src/js/src/widget/DocumentHandler.tsx
index f0ae8a48e..7d4f3c400 100644
--- a/plugins/ui/src/js/src/widget/DocumentHandler.tsx
+++ b/plugins/ui/src/js/src/widget/DocumentHandler.tsx
@@ -1,5 +1,5 @@
import React, { useCallback, useMemo, useRef, useState } from 'react';
-import shortid from 'shortid';
+import { nanoid } from 'nanoid';
import { WidgetDescriptor } from '@deephaven/dashboard';
import Log from '@deephaven/log';
import { EMPTY_FUNCTION } from '@deephaven/utils';
@@ -101,7 +101,7 @@ function DocumentHandler({
// If there are no more known IDs, generate a new one.
// This can happen if the document hasn't been opened before, or if it's rehydrated and a new panel is added.
// Note that if the order of panels changes, the worst case scenario is that panels appear in the wrong location in the layout.
- const panelId = widgetData.panelIds?.[panelIdIndex.current] ?? shortid();
+ const panelId = widgetData.panelIds?.[panelIdIndex.current] ?? nanoid();
panelIdIndex.current += 1;
return panelId;
}, [widgetData]);
diff --git a/plugins/ui/src/js/src/widget/WidgetUtils.tsx b/plugins/ui/src/js/src/widget/WidgetUtils.tsx
index ebec26892..ffee67c26 100644
--- a/plugins/ui/src/js/src/widget/WidgetUtils.tsx
+++ b/plugins/ui/src/js/src/widget/WidgetUtils.tsx
@@ -13,7 +13,6 @@ import {
Flex,
Grid,
Heading,
- IllustratedMessage,
Item,
ListActionGroup,
ListActionMenu,
@@ -53,6 +52,7 @@ import {
ActionGroup,
Button,
Form,
+ IllustratedMessage,
ListView,
Picker,
Radio,
diff --git a/plugins/ui/src/ui.schema.json b/plugins/ui/src/ui.schema.json
index 82cccb99b..e4fa98d86 100644
--- a/plugins/ui/src/ui.schema.json
+++ b/plugins/ui/src/ui.schema.json
@@ -60,6 +60,16 @@
"type": "array",
"prefixItems": [{ "type": "object" }],
"items": false
+ },
+ "callCallableParams": {
+ "type": "array",
+ "prefixItems": [{ "type": "string" }, { "type": "array" }],
+ "items": false
+ },
+ "closeCallableParams": {
+ "type": "array",
+ "prefixItems": [{ "type": "string" }],
+ "items": false
}
},
"type": "object",
@@ -67,8 +77,15 @@
"jsonrpc": "2.0",
"method": {
"anyOf": [
- { "enum": ["documentUpdated", "documentError"] },
- { "pattern": "^cb_(0-9)+_(0-9)+$" }
+ {
+ "enum": [
+ "documentUpdated",
+ "documentError",
+ "setState",
+ "callCallable",
+ "closeCallable"
+ ]
+ }
]
},
"allOf": [
@@ -111,15 +128,24 @@
{
"if": {
"properties": {
- "method": { "pattern": "^cb_(0-9)+_(0-9)+$" }
+ "method": { "pattern": "callCallable" }
}
},
"then": {
"properties": {
- "params": {
- "type": "array",
- "items": { "type": "any" }
- }
+ "params": { "$ref": "#/defs/callCallableParams" }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "method": { "pattern": "closeCallable" }
+ }
+ },
+ "then": {
+ "properties": {
+ "params": { "$ref": "#/defs/closeCallableParams" }
}
}
}
diff --git a/ruff.toml b/ruff.toml
index 96bed7376..b2c9ff227 100644
--- a/ruff.toml
+++ b/ruff.toml
@@ -1,5 +1,8 @@
[lint]
-select = ["ANN001"]
+select = ["ANN001", "TID251"]
[lint.per-file-ignores]
-"**/{test,matplotlib,json,plotly}/*" = ["ANN001"]
\ No newline at end of file
+"**/{test,matplotlib,json,plotly}/*" = ["ANN001"]
+
+[lint.flake8-tidy-imports.banned-api]
+"numbers".msg = "Import from numbers is likely an accident. `float` includes `int` and is likely the desired type."
\ No newline at end of file
diff --git a/templates/widget/{{ cookiecutter.python_project_name }}/src/js/package-lock.json b/templates/widget/{{ cookiecutter.python_project_name }}/src/js/package-lock.json
index 9f649285e..b67c4267d 100644
--- a/templates/widget/{{ cookiecutter.python_project_name }}/src/js/package-lock.json
+++ b/templates/widget/{{ cookiecutter.python_project_name }}/src/js/package-lock.json
@@ -177,7 +177,7 @@
"react-transition-group": "^4.4.2",
"react-virtualized-auto-sizer": "1.0.6",
"react-window": "^1.8.6",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=10"
@@ -213,7 +213,7 @@
"popper.js": "^1.16.1",
"prop-types": "^15.7.2",
"shell-quote": "^1.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -238,7 +238,7 @@
"lodash.ismatch": "^4.1.1",
"lodash.throttle": "^4.1.1",
"prop-types": "^15.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -336,7 +336,7 @@
"prop-types": "^15.7.2",
"react-beautiful-dnd": "^13.1.0",
"react-transition-group": "^4.4.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=10"
@@ -381,7 +381,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.clamp": "^4.0.3",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -429,7 +429,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.debounce": "^4.0.8",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -6898,15 +6898,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/shortid": {
- "version": "2.2.16",
- "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz",
- "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dependencies": {
- "nanoid": "^2.1.0"
- }
- },
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -7478,7 +7469,7 @@
"react-transition-group": "^4.4.2",
"react-virtualized-auto-sizer": "1.0.6",
"react-window": "^1.8.6",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/console": {
@@ -7507,7 +7498,7 @@
"popper.js": "^1.16.1",
"prop-types": "^15.7.2",
"shell-quote": "^1.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/dashboard": {
@@ -7525,7 +7516,7 @@
"lodash.ismatch": "^4.1.1",
"lodash.throttle": "^4.1.1",
"prop-types": "^15.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/filters": {
@@ -7597,7 +7588,7 @@
"prop-types": "^15.7.2",
"react-beautiful-dnd": "^13.1.0",
"react-transition-group": "^4.4.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/jsapi-bootstrap": {
@@ -7626,7 +7617,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.clamp": "^4.0.3",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/log": {
@@ -7662,7 +7653,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.debounce": "^4.0.8",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/redux": {
@@ -12683,14 +12674,6 @@
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
"integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA=="
},
- "shortid": {
- "version": "2.2.16",
- "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz",
- "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==",
- "requires": {
- "nanoid": "^2.1.0"
- }
- },
"side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
diff --git a/templates/widget/{{ cookiecutter.python_project_name }}/src/js/src/package-lock.json b/templates/widget/{{ cookiecutter.python_project_name }}/src/js/src/package-lock.json
index 33d1c1aae..8d4b53f88 100644
--- a/templates/widget/{{ cookiecutter.python_project_name }}/src/js/src/package-lock.json
+++ b/templates/widget/{{ cookiecutter.python_project_name }}/src/js/src/package-lock.json
@@ -16,7 +16,7 @@
"@deephaven/jsapi-types": "^0.58.0",
"@deephaven/log": "^0.58.0",
"@deephaven/plugin": "^0.58.0",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"devDependencies": {
"@deephaven/tsconfig": "^0.72.0",
@@ -175,7 +175,7 @@
"react-transition-group": "^4.4.2",
"react-virtualized-auto-sizer": "1.0.6",
"react-window": "^1.8.6",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=10"
@@ -211,7 +211,7 @@
"popper.js": "^1.16.1",
"prop-types": "^15.7.2",
"shell-quote": "^1.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -236,7 +236,7 @@
"lodash.ismatch": "^4.1.1",
"lodash.throttle": "^4.1.1",
"prop-types": "^15.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -334,7 +334,7 @@
"prop-types": "^15.7.2",
"react-beautiful-dnd": "^13.1.0",
"react-transition-group": "^4.4.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=10"
@@ -379,7 +379,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.clamp": "^4.0.3",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -427,7 +427,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.debounce": "^4.0.8",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
},
"engines": {
"node": ">=16"
@@ -6896,15 +6896,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/shortid": {
- "version": "2.2.16",
- "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz",
- "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dependencies": {
- "nanoid": "^2.1.0"
- }
- },
"node_modules/side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
@@ -7476,7 +7467,7 @@
"react-transition-group": "^4.4.2",
"react-virtualized-auto-sizer": "1.0.6",
"react-window": "^1.8.6",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/console": {
@@ -7505,7 +7496,7 @@
"popper.js": "^1.16.1",
"prop-types": "^15.7.2",
"shell-quote": "^1.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/dashboard": {
@@ -7523,7 +7514,7 @@
"lodash.ismatch": "^4.1.1",
"lodash.throttle": "^4.1.1",
"prop-types": "^15.7.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/filters": {
@@ -7595,7 +7586,7 @@
"prop-types": "^15.7.2",
"react-beautiful-dnd": "^13.1.0",
"react-transition-group": "^4.4.2",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/jsapi-bootstrap": {
@@ -7624,7 +7615,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.clamp": "^4.0.3",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/log": {
@@ -7660,7 +7651,7 @@
"@deephaven/log": "^0.58.0",
"@deephaven/utils": "^0.58.0",
"lodash.debounce": "^4.0.8",
- "shortid": "^2.2.16"
+ "nanoid": "^5.0.7"
}
},
"@deephaven/redux": {
@@ -12681,14 +12672,6 @@
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
"integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA=="
},
- "shortid": {
- "version": "2.2.16",
- "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz",
- "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==",
- "requires": {
- "nanoid": "^2.1.0"
- }
- },
"side-channel": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
diff --git a/tests/app.d/ui_render_all.py b/tests/app.d/ui_render_all.py
index 3d138a3c5..1d82022f3 100644
--- a/tests/app.d/ui_render_all.py
+++ b/tests/app.d/ui_render_all.py
@@ -64,7 +64,11 @@ def ui_components():
ui.heading("Heading"),
ui.icon("vsSymbolMisc"),
# TODO: #526 ui.icon_wrapper("TODO: fix this"),
- ui.illustrated_message(ui.icon("vsSymbolMisc"), "Illustrated Message"),
+ ui.illustrated_message(
+ ui.icon("vsWarning"),
+ ui.heading("Warning"),
+ ui.content("This is a warning message."),
+ ),
ui.list_view(
_item_table_source_with_action_group,
aria_label="List View - List action group",
diff --git a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-chromium-linux.png b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-chromium-linux.png
index 497c29423..9cf9ed48f 100644
Binary files a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-chromium-linux.png and b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-chromium-linux.png differ
diff --git a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-firefox-linux.png b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-firefox-linux.png
index 84b32377c..a317fac6e 100644
Binary files a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-firefox-linux.png and b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-firefox-linux.png differ
diff --git a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-webkit-linux.png b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-webkit-linux.png
index 456fb28df..8c9f65732 100644
Binary files a/tests/ui.spec.ts-snapshots/UI-all-components-render-1-webkit-linux.png and b/tests/ui.spec.ts-snapshots/UI-all-components-render-1-webkit-linux.png differ