From 4cbada765ae6acad0256cf6e6b04c7cc4201c66b Mon Sep 17 00:00:00 2001 From: "Omar H." Date: Wed, 4 Feb 2026 16:27:54 -0500 Subject: [PATCH 1/2] Enhance context menu options: add disabled state --- .../src/imodel-browser/IModelGrid.stories.tsx | 19 ++++++++++++++++--- .../src/utils/_buildMenuOptions.tsx | 6 ++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/apps/storybook/src/imodel-browser/IModelGrid.stories.tsx b/packages/apps/storybook/src/imodel-browser/IModelGrid.stories.tsx index d2a8ee05..2064f526 100644 --- a/packages/apps/storybook/src/imodel-browser/IModelGrid.stories.tsx +++ b/packages/apps/storybook/src/imodel-browser/IModelGrid.stories.tsx @@ -213,19 +213,32 @@ IndividualContextMenu.args = { children: "displayName contains 'R'", visible: (iModel) => iModel.displayName?.includes("R") ?? false, key: "withR", - onClick: (iModel) => alert("Contains R" + iModel?.displayName), + onClick: (iModel) => alert("Contains R: " + iModel?.displayName), }, { children: "Add description", visible: (iModel) => !iModel.description, key: "addD", - onClick: (iModel) => alert("Add description" + iModel?.displayName), + onClick: (iModel) => alert("Add description: " + iModel?.displayName), }, { children: "Edit description", visible: (iModel) => !!iModel.description, key: "editD", - onClick: (iModel) => alert("Edit description" + iModel?.displayName), + onClick: (iModel) => alert("Edit description: " + iModel?.displayName), + }, + ], +}; + +export const DisabledContextMenu = Template.bind({}); +DisabledContextMenu.args = { + apiOverrides: { serverEnvironmentPrefix: "qa" }, + iModelActions: [ + { + children: "Disabled if name contains 'T'", + disabled: (iModel) => iModel.displayName?.includes("T") ?? false, + key: "withT", + onClick: (iModel) => alert("Does not contain T: " + iModel?.displayName), }, ], }; diff --git a/packages/modules/imodel-browser/src/utils/_buildMenuOptions.tsx b/packages/modules/imodel-browser/src/utils/_buildMenuOptions.tsx index 1e273e9a..9d870382 100644 --- a/packages/modules/imodel-browser/src/utils/_buildMenuOptions.tsx +++ b/packages/modules/imodel-browser/src/utils/_buildMenuOptions.tsx @@ -8,10 +8,11 @@ import React from "react"; type MenuItemProps = React.ComponentPropsWithoutRef; export interface ContextMenuBuilderItem - extends Omit { + extends Omit { key: string; visible?: boolean | ((value: T) => boolean); onClick?: ((value?: T, refetchData?: () => void) => void) | undefined; + disabled?: MenuItemProps["disabled"] | ((value: T) => boolean); } /** Build MenuItem array for the value for each provided options @@ -27,10 +28,11 @@ export const _buildManagedContextMenuOptions: ( ?.filter?.(({ visible }) => { return typeof visible === "function" ? visible(value) : visible ?? true; }) - .map(({ key, visible, onClick, ...contextMenuProps }) => { + .map(({ key, visible, onClick, disabled, ...contextMenuProps }) => { return ( { e?.stopPropagation(); closeMenu?.(); From f3df4e178332d6569527aa0afc19c60478520059 Mon Sep 17 00:00:00 2001 From: "Omar H." Date: Wed, 4 Feb 2026 16:29:38 -0500 Subject: [PATCH 2/2] Add option to provide callback function for iModel action disable prop --- ...isable-imodel-action-callback_2026-02-04-21-29.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@itwin/imodel-browser-react/omar-disable-imodel-action-callback_2026-02-04-21-29.json diff --git a/common/changes/@itwin/imodel-browser-react/omar-disable-imodel-action-callback_2026-02-04-21-29.json b/common/changes/@itwin/imodel-browser-react/omar-disable-imodel-action-callback_2026-02-04-21-29.json new file mode 100644 index 00000000..8a6e115b --- /dev/null +++ b/common/changes/@itwin/imodel-browser-react/omar-disable-imodel-action-callback_2026-02-04-21-29.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@itwin/imodel-browser-react", + "comment": "Add option to provide callback function to iModel action disable prop", + "type": "minor" + } + ], + "packageName": "@itwin/imodel-browser-react" +} \ No newline at end of file