Skip to content

Commit f11b13a

Browse files
authored
[tree-widget-react]: Context menu actions (#1522)
* Update to latest hierarchies-react version with support for context menu actions * extract-api * change * Revert testing changes * Avoid setting contextMenuActions and menuActions getters if there is no content * Bump deps * update change file
1 parent 2f715c9 commit f11b13a

File tree

19 files changed

+764
-636
lines changed

19 files changed

+764
-636
lines changed

apps/learning-snippets/pnpm-lock.yaml

Lines changed: 199 additions & 163 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/test-viewer/pnpm-lock.yaml

Lines changed: 404 additions & 356 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "major",
3+
"comment": "Exposed ability to render tree actions in context menu. BREAKING: `getInlineActions` and `getMenuActions` takes in `{ targetNode: PresentationHierarchyNode, selectedNodes: PresentationHierarchyNode[] }` as a first argument instead of `PresentationHierarchyNode` to match the new API in `@itwin/presentation-hierarchies-react`.",
4+
"packageName": "@itwin/tree-widget-react",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/itwin/tree-widget/api/tree-widget-react.api.md

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { RenameAction } from '@itwin/presentation-hierarchies-react';
2727
import type { SelectionStorage } from '@itwin/presentation-hierarchies-react';
2828
import { StrataKitTreeRenderer } from '@itwin/presentation-hierarchies-react';
2929
import type { TranslationOptions } from '@itwin/core-common';
30+
import type { TreeActionBaseAttributes } from '@itwin/presentation-hierarchies-react';
3031
import type { TreeRendererProps } from '@itwin/presentation-hierarchies-react';
3132
import type { useIModelTree } from '@itwin/presentation-hierarchies-react';
3233
import type { useSelectionHandler } from '@itwin/presentation-hierarchies-react';
@@ -84,7 +85,7 @@ export const CategoriesTreeComponent: {
8485
};
8586

8687
// @public (undocumented)
87-
interface CategoriesTreeComponentProps extends Pick<CategoriesTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getDecorations" | "hierarchyConfig" | "treeLabel"> {
88+
interface CategoriesTreeComponentProps extends Pick<CategoriesTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "hierarchyConfig" | "treeLabel"> {
8889
headerButtons?: Array<(props: CategoriesTreeHeaderButtonProps) => React.ReactNode>;
8990
// (undocumented)
9091
onFeatureUsed?: (feature: string) => void;
@@ -115,7 +116,7 @@ export function CategoriesTreeIcon({ node }: {
115116
}): JSX_2.Element | undefined;
116117

117118
// @beta (undocumented)
118-
type CategoriesTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> & UseCategoriesTreeProps & {
119+
type CategoriesTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> & UseCategoriesTreeProps & {
119120
hierarchyLevelConfig?: {
120121
sizeLimit?: number;
121122
};
@@ -143,7 +144,7 @@ export const ClassificationsTreeComponent: {
143144
};
144145

145146
// @alpha (undocumented)
146-
interface ClassificationsTreeComponentProps extends Pick<ClassificationsTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getDecorations" | "hierarchyConfig" | "getEditingProps" | "treeLabel"> {
147+
interface ClassificationsTreeComponentProps extends Pick<ClassificationsTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "hierarchyConfig" | "getEditingProps" | "treeLabel"> {
147148
// (undocumented)
148149
onFeatureUsed?: (feature: string) => void;
149150
// (undocumented)
@@ -162,7 +163,7 @@ export function ClassificationsTreeIcon({ node }: {
162163
}): JSX_2.Element | undefined;
163164

164165
// @alpha (undocumented)
165-
type ClassificationsTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations" | "getEditingProps" | "treeLabel"> & UseClassificationsTreeProps & {
166+
type ClassificationsTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "getEditingProps" | "treeLabel"> & UseClassificationsTreeProps & {
166167
hierarchyLevelConfig?: {
167168
sizeLimit?: number;
168169
};
@@ -197,7 +198,7 @@ export const ExternalSourcesTreeComponent: {
197198
};
198199

199200
// @beta (undocumented)
200-
interface ExternalSourcesTreeComponentProps extends Pick<ExternalSourcesTreeProps, "selectionStorage" | "selectionMode" | "hierarchyLevelConfig" | "selectionMode" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> {
201+
interface ExternalSourcesTreeComponentProps extends Pick<ExternalSourcesTreeProps, "selectionStorage" | "selectionMode" | "hierarchyLevelConfig" | "selectionMode" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> {
201202
// (undocumented)
202203
onFeatureUsed?: (feature: string) => void;
203204
// (undocumented)
@@ -210,7 +211,7 @@ export function ExternalSourcesTreeIcon({ node }: {
210211
}): JSX_2.Element | undefined;
211212

212213
// @beta (undocumented)
213-
type ExternalSourcesTreeProps = Pick<TreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> & {
214+
type ExternalSourcesTreeProps = Pick<TreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> & {
214215
hierarchyLevelConfig?: {
215216
sizeLimit?: number;
216217
};
@@ -265,7 +266,7 @@ export const IModelContentTreeComponent: {
265266
};
266267

267268
// @beta (undocumented)
268-
interface IModelContentTreeComponentProps extends Pick<IModelContentTreeProps, "selectionStorage" | "hierarchyConfig" | "hierarchyLevelConfig" | "selectionMode" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> {
269+
interface IModelContentTreeComponentProps extends Pick<IModelContentTreeProps, "selectionStorage" | "hierarchyConfig" | "hierarchyLevelConfig" | "selectionMode" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> {
269270
// (undocumented)
270271
onFeatureUsed?: (feature: string) => void;
271272
// (undocumented)
@@ -283,7 +284,7 @@ export function IModelContentTreeIcon({ node }: {
283284
}): JSX_2.Element | undefined;
284285

285286
// @beta (undocumented)
286-
type IModelContentTreeProps = Pick<TreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> & {
287+
type IModelContentTreeProps = Pick<TreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> & {
287288
hierarchyLevelConfig?: {
288289
sizeLimit?: number;
289290
};
@@ -320,7 +321,7 @@ export const ModelsTreeComponent: {
320321
};
321322

322323
// @public (undocumented)
323-
interface ModelsTreeComponentProps extends Pick<ModelsTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "selectionPredicate" | "hierarchyConfig" | "visibilityHandlerOverrides" | "getFilteredPaths" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getDecorations" | "getSubTreePaths" | "treeLabel"> {
324+
interface ModelsTreeComponentProps extends Pick<ModelsTreeProps, "selectionStorage" | "hierarchyLevelConfig" | "selectionMode" | "selectionPredicate" | "hierarchyConfig" | "visibilityHandlerOverrides" | "getFilteredPaths" | "filter" | "emptyTreeContent" | "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "getSubTreePaths" | "treeLabel"> {
324325
headerButtons?: Array<(props: ModelsTreeHeaderButtonProps) => React.ReactNode>;
325326
// (undocumented)
326327
onFeatureUsed?: (feature: string) => void;
@@ -352,7 +353,7 @@ export function ModelsTreeIcon({ node }: {
352353
}): JSX_2.Element | undefined;
353354

354355
// @beta (undocumented)
355-
type ModelsTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations" | "treeLabel"> & UseModelsTreeProps & {
356+
type ModelsTreeProps = Pick<VisibilityTreeProps, "imodel" | "selectionStorage" | "selectionMode" | "emptyTreeContent"> & Pick<VisibilityTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations" | "treeLabel"> & UseModelsTreeProps & {
356357
hierarchyLevelConfig?: {
357358
sizeLimit?: number;
358359
};
@@ -423,11 +424,6 @@ interface TreeHeaderProps {
423424
buttons?: ReactNode;
424425
}
425426

426-
// @beta (undocumented)
427-
interface TreeItemVisibilityButtonProps {
428-
reserveSpace?: true;
429-
}
430-
431427
// @beta
432428
type TreeItemVisibilityButtonState = (LoadedTreeItemVisibilityButtonState | {
433429
isLoading: true;
@@ -453,8 +449,8 @@ type TreeProps = Pick<FunctionProps<typeof useIModelTree>, "getFilteredPaths" |
453449
export function TreeRenderer(props: TreeRendererProps_2): JSX_2.Element;
454450

455451
// @beta (undocumented)
456-
type TreeRendererProps_2 = Omit<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations"> & {
457-
[Property in keyof Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations">]?: (node: PresentationHierarchyNode, treeRendererProps: TreeRendererProps_2) => ReturnType<NonNullable<BaseTreeRendererProps[Property]>>;
452+
type TreeRendererProps_2 = Omit<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations"> & {
453+
[Property in keyof Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations">]?: (args: Parameters<NonNullable<BaseTreeRendererProps[Property]>>[0], treeRendererProps: TreeRendererProps_2) => ReturnType<NonNullable<BaseTreeRendererProps[Property]>>;
458454
};
459455

460456
// @public
@@ -672,9 +668,9 @@ interface UseModelsTreeResult {
672668
}
673669

674670
// @beta
675-
export const VisibilityAction: NamedExoticComponent<TreeItemVisibilityButtonProps & {
671+
export const VisibilityAction: NamedExoticComponent< {
676672
node: PresentationHierarchyNode;
677-
}>;
673+
} & TreeActionBaseAttributes>;
678674

679675
// @beta (undocumented)
680676
interface VisibilityContext {
@@ -703,8 +699,8 @@ type VisibilityTreeProps = Omit<TreeProps, "treeRenderer" | "imodelAccess"> & {
703699
export function VisibilityTreeRenderer(props: VisibilityTreeRendererProps): JSX_2.Element;
704700

705701
// @beta (undocumented)
706-
type VisibilityTreeRendererProps = Omit<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations"> & {
707-
[Property in keyof Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getDecorations">]?: (node: PresentationHierarchyNode, treeRendererProps: VisibilityTreeRendererProps) => ReturnType<NonNullable<BaseTreeRendererProps[Property]>>;
702+
type VisibilityTreeRendererProps = Omit<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations"> & {
703+
[Property in keyof Pick<BaseTreeRendererProps, "getInlineActions" | "getMenuActions" | "getContextMenuActions" | "getDecorations">]?: (args: Parameters<NonNullable<BaseTreeRendererProps[Property]>>[0], treeRendererProps: VisibilityTreeRendererProps) => ReturnType<NonNullable<BaseTreeRendererProps[Property]>>;
708704
} & VisibilityContext;
709705

710706
// (No @packageDocumentation comment for this package)

packages/itwin/tree-widget/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@
7272
},
7373
"dependencies": {
7474
"@itwin/presentation-core-interop": "^1.4.0-alpha.3",
75-
"@itwin/presentation-hierarchies": "^2.0.0-alpha.4",
76-
"@itwin/presentation-hierarchies-react": "2.0.0-alpha.39",
77-
"@itwin/presentation-shared": "^2.0.0-alpha.2",
75+
"@itwin/presentation-hierarchies": "^2.0.0-alpha.5",
76+
"@itwin/presentation-hierarchies-react": "2.0.0-alpha.42",
77+
"@itwin/presentation-shared": "^2.0.0-alpha.3",
7878
"@itwin/unified-selection": "^1.6.2-alpha.0",
7979
"classnames": "^2.5.1",
8080
"react-error-boundary": "^5.0.0",

0 commit comments

Comments
 (0)