diff --git a/src/elements/common/sub-header/SubHeader.tsx b/src/elements/common/sub-header/SubHeader.tsx
index 7f3afbca73..004f9421ef 100644
--- a/src/elements/common/sub-header/SubHeader.tsx
+++ b/src/elements/common/sub-header/SubHeader.tsx
@@ -28,6 +28,7 @@ export interface SubHeaderProps {
onGridViewSliderChange?: (newSliderValue: number) => void;
onItemClick: (id: string | null, triggerNavigationEvent: boolean | null) => void;
onSortChange: (sortBy: string, sortDirection: string) => void;
+ onMetadataSidePanelToggle?: () => void;
onUpload: () => void;
onViewModeChange?: (viewMode: ViewMode) => void;
portalElement?: HTMLElement;
@@ -53,6 +54,7 @@ const SubHeader = ({
onCreate,
onItemClick,
onSortChange,
+ onMetadataSidePanelToggle,
onUpload,
onViewModeChange,
portalElement,
@@ -109,9 +111,11 @@ const SubHeader = ({
onCreate={onCreate}
onGridViewSliderChange={onGridViewSliderChange}
onSortChange={onSortChange}
+ onMetadataSidePanelToggle={onMetadataSidePanelToggle}
onUpload={onUpload}
onViewModeChange={onViewModeChange}
portalElement={portalElement}
+ selectedItemIds={selectedItemIds}
view={view}
viewMode={viewMode}
/>
diff --git a/src/elements/common/sub-header/SubHeaderLeftV2.tsx b/src/elements/common/sub-header/SubHeaderLeftV2.tsx
index 252c1f1ee3..0aa00f5445 100644
--- a/src/elements/common/sub-header/SubHeaderLeftV2.tsx
+++ b/src/elements/common/sub-header/SubHeaderLeftV2.tsx
@@ -1,8 +1,9 @@
-import React, { useMemo } from 'react';
+import * as React from 'react';
import { useIntl } from 'react-intl';
import { XMark } from '@box/blueprint-web-assets/icons/Fill/index';
import { IconButton, PageHeader, Text } from '@box/blueprint-web';
import type { Selection } from 'react-aria-components';
+import { useSelectedItemText } from '../../content-explorer/utils';
import type { Collection } from '../../../common/types/core';
import messages from '../messages';
@@ -20,27 +21,7 @@ const SubHeaderLeftV2 = (props: SubHeaderLeftV2Props) => {
const { currentCollection, onClearSelectedItemIds, rootName, selectedItemIds, title } = props;
const { formatMessage } = useIntl();
- // Generate selected item text based on selected keys
- const selectedItemText: string = useMemo(() => {
- const selectedCount = selectedItemIds === 'all' ? currentCollection.items.length : selectedItemIds.size;
-
- if (selectedCount === 0) {
- return '';
- }
-
- // Case 1: Single selected item - show item name
- if (selectedCount === 1) {
- const selectedKey =
- selectedItemIds === 'all' ? currentCollection.items[0].id : selectedItemIds.values().next().value;
- const selectedItem = currentCollection.items.find(item => item.id === selectedKey);
- return selectedItem?.name ?? '';
- }
- // Case 2: Multiple selected items - show count
- if (selectedCount > 1) {
- return formatMessage(messages.numFilesSelected, { numSelected: selectedCount });
- }
- return '';
- }, [currentCollection.items, formatMessage, selectedItemIds]);
+ const selectedItemText = useSelectedItemText(currentCollection, selectedItemIds);
// Case 1 and 2: selected item text with X button
if (selectedItemText) {
diff --git a/src/elements/common/sub-header/SubHeaderRight.tsx b/src/elements/common/sub-header/SubHeaderRight.tsx
index deac81b762..017071162a 100644
--- a/src/elements/common/sub-header/SubHeaderRight.tsx
+++ b/src/elements/common/sub-header/SubHeaderRight.tsx
@@ -2,6 +2,7 @@ import * as React from 'react';
import { Button } from '@box/blueprint-web';
import { Pencil } from '@box/blueprint-web-assets/icons/Fill';
import { useIntl } from 'react-intl';
+import type { Selection } from 'react-aria-components';
import Sort from './Sort';
import Add from './Add';
import GridViewSlider from '../../../components/grid-view/GridViewSlider';
@@ -27,9 +28,11 @@ export interface SubHeaderRightProps {
onCreate: () => void;
onGridViewSliderChange: (newSliderValue: number) => void;
onSortChange: (sortBy: SortBy, sortDirection: SortDirection) => void;
+ onMetadataSidePanelToggle?: () => void;
onUpload: () => void;
onViewModeChange?: (viewMode: ViewMode) => void;
portalElement?: HTMLElement;
+ selectedItemIds?: Selection;
view: View;
viewMode: ViewMode;
}
@@ -45,9 +48,11 @@ const SubHeaderRight = ({
onCreate,
onGridViewSliderChange,
onSortChange,
+ onMetadataSidePanelToggle,
onUpload,
onViewModeChange,
portalElement,
+ selectedItemIds,
view,
viewMode,
}: SubHeaderRightProps) => {
@@ -60,6 +65,7 @@ const SubHeaderRight = ({
const showSort: boolean = isFolder && hasItems;
const showAdd: boolean = (!!canUpload || !!canCreateNewFolder) && isFolder;
const isMetadataView: boolean = view === VIEW_METADATA;
+ const hasSelectedItems: boolean = !!(selectedItemIds && (selectedItemIds === 'all' || selectedItemIds.size > 0));
return (
{!isMetadataView && (
@@ -90,8 +96,8 @@ const SubHeaderRight = ({
>
)}
- {isMetadataView && isMetadataViewV2Feature && (
-