@@ -171,6 +171,12 @@ export interface ContentExplorerProps {
171171 uploadHost ?: string ;
172172}
173173
174+ enum SidePanelState {
175+ CLOSED = 'CLOSED' ,
176+ OPEN = 'OPEN' ,
177+ EDITING = 'EDITING' ,
178+ }
179+
174180type State = {
175181 currentCollection : Collection ;
176182 currentOffset : number ;
@@ -182,7 +188,6 @@ type State = {
182188 isCreateFolderModalOpen : boolean ;
183189 isDeleteModalOpen : boolean ;
184190 isLoading : boolean ;
185- isMetadataSidePanelOpen : boolean ;
186191 isPreviewModalOpen : boolean ;
187192 isRenameModalOpen : boolean ;
188193 isShareModalOpen : boolean ;
@@ -194,6 +199,7 @@ type State = {
194199 searchQuery : string ;
195200 selected ?: BoxItem ;
196201 selectedItemIds : Selection ;
202+ sidePanelState : SidePanelState ;
197203 sortBy : SortBy | string ;
198204 sortDirection : SortDirection ;
199205 view : View ;
@@ -310,7 +316,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
310316 isCreateFolderModalOpen : false ,
311317 isDeleteModalOpen : false ,
312318 isLoading : false ,
313- isMetadataSidePanelOpen : false ,
319+ sidePanelState : SidePanelState . CLOSED ,
314320 isPreviewModalOpen : false ,
315321 isRenameModalOpen : false ,
316322 isShareModalOpen : false ,
@@ -1022,23 +1028,21 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
10221028 * @return {void }
10231029 */
10241030 validateSelectedItemIds = ( items : BoxItem [ ] ) : void => {
1031+ const { onSelectionChange : onSelectionChangeExternal } = this . props . metadataViewProps ?? { } ;
10251032 const { selectedItemIds } = this . state ;
10261033
1027- if ( selectedItemIds === 'all' || selectedItemIds . size === 0 ) {
1028- // If all/none items are selected, no need to change anything
1029- return ;
1030- }
1031-
1032- const validSelectedIds = new Set < string > ( ) ;
1034+ let validSelectedIds = new Set < string > ( ) ;
10331035
1034- items . forEach ( item => {
1035- if ( selectedItemIds . has ( item . id ) ) {
1036- validSelectedIds . add ( item . id ) ;
1037- }
1038- } ) ;
1036+ if ( selectedItemIds === 'all' ) {
1037+ validSelectedIds = new Set ( items . map ( item => item . id ) ) ;
1038+ } else if ( selectedItemIds . size > 0 ) {
1039+ validSelectedIds = new Set ( items . filter ( item => selectedItemIds . has ( item . id ) ) . map ( item => item . id ) ) ;
1040+ }
10391041
10401042 if ( ! isEqual ( validSelectedIds , selectedItemIds ) ) {
1043+ onSelectionChangeExternal ?.( validSelectedIds ) ;
10411044 this . setState ( { selectedItemIds : validSelectedIds } ) ;
1045+ this . closeSidePanel ( ) ;
10421046 }
10431047 } ;
10441048
@@ -1511,6 +1515,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
15111515 isShareModalOpen : false ,
15121516 isUploadModalOpen : false ,
15131517 isPreviewModalOpen : false ,
1518+ sidePanelState : SidePanelState . CLOSED ,
15141519 } ) ;
15151520
15161521 const {
@@ -1652,22 +1657,14 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
16521657 'hasError' | 'currentCollection' | 'metadataTemplate'
16531658 > => {
16541659 const { metadataViewProps } = this . props ;
1655- const { onSelectionChange } = metadataViewProps ?? { } ;
16561660 const { currentPageNumber, markers, selectedItemIds } = this . state ;
16571661 const hasNextMarker : boolean = ! ! markers [ currentPageNumber + 1 ] ;
16581662 const hasPrevMarker : boolean = currentPageNumber === 1 || ! ! markers [ currentPageNumber - 1 ] ;
16591663
16601664 return {
16611665 ...metadataViewProps ,
16621666 selectedKeys : selectedItemIds ,
1663- onSelectionChange : ( ids : Selection ) => {
1664- onSelectionChange ?.( ids ) ;
1665- const isSelectionEmpty = ids !== 'all' && ids . size === 0 ;
1666- this . setState ( {
1667- selectedItemIds : ids ,
1668- ...( isSelectionEmpty && { isMetadataSidePanelOpen : false } ) ,
1669- } ) ;
1670- } ,
1667+ onSelectionChange : this . handleSelectedIdsChange ,
16711668 paginationProps : {
16721669 onMarkerBasedPageChange : this . markerBasedPaginate ,
16731670 hasNextMarker,
@@ -1754,11 +1751,37 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17541751 } ) ;
17551752 } ;
17561753
1754+ handleSelectedIdsChange = ( ids : Selection ) => {
1755+ const { onSelectionChange : onSelectionChangeExternal } = this . props . metadataViewProps ?? { } ;
1756+ const { sidePanelState } = this . state ;
1757+
1758+ // Prevent changing selection when in edit mode
1759+ if ( sidePanelState === SidePanelState . EDITING ) {
1760+ return ;
1761+ }
1762+
1763+ onSelectionChangeExternal ?.( ids ) ;
1764+
1765+ this . setState ( {
1766+ selectedItemIds : ids ,
1767+ } ) ;
1768+
1769+ const isSelectionEmpty = ids !== 'all' && ids . size === 0 ;
1770+ if ( isSelectionEmpty ) {
1771+ this . closeSidePanel ( ) ;
1772+ }
1773+ } ;
1774+
17571775 clearSelectedItemIds = ( ) => {
1776+ const { onSelectionChange : onSelectionChangeExternal } = this . props . metadataViewProps ?? { } ;
1777+
1778+ onSelectionChangeExternal ?.( new Set ( ) ) ;
1779+
17581780 this . setState ( {
17591781 selectedItemIds : new Set ( ) ,
1760- isMetadataSidePanelOpen : false ,
17611782 } ) ;
1783+
1784+ this . closeSidePanel ( ) ;
17621785 } ;
17631786
17641787 /**
@@ -1767,20 +1790,23 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17671790 * @private
17681791 * @return {void }
17691792 */
1770- onMetadataSidePanelToggle = ( ) => {
1793+ onSidePanelToggle = ( ) => {
17711794 this . setState ( prevState => ( {
1772- isMetadataSidePanelOpen : ! prevState . isMetadataSidePanelOpen ,
1795+ sidePanelState :
1796+ prevState . sidePanelState === SidePanelState . CLOSED ? SidePanelState . OPEN : SidePanelState . CLOSED ,
17731797 } ) ) ;
17741798 } ;
17751799
1776- /**
1777- * Close metadata side panel
1778- *
1779- * @private
1780- * @return {void }
1781- */
1782- closeMetadataSidePanel = ( ) => {
1783- this . setState ( { isMetadataSidePanelOpen : false } ) ;
1800+ closeSidePanel = ( ) => {
1801+ this . setState ( {
1802+ sidePanelState : SidePanelState . CLOSED ,
1803+ } ) ;
1804+ } ;
1805+
1806+ onMetadataEditingChange = ( isEditing : boolean ) => {
1807+ this . setState ( {
1808+ sidePanelState : isEditing ? SidePanelState . EDITING : SidePanelState . OPEN ,
1809+ } ) ;
17841810 } ;
17851811
17861812 filterMetadata = ( fields : ExternalFilterValues ) => {
@@ -1848,7 +1874,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18481874 isCreateFolderModalOpen,
18491875 isDeleteModalOpen,
18501876 isLoading,
1851- isMetadataSidePanelOpen ,
1877+ sidePanelState ,
18521878 isPreviewModalOpen,
18531879 isRenameModalOpen,
18541880 isShareModalOpen,
@@ -1878,6 +1904,9 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18781904
18791905 const metadataViewProps = this . getMetadataViewProps ( ) ;
18801906
1907+ const isSidePanelOpen = sidePanelState !== SidePanelState . CLOSED ;
1908+ const isEditing = sidePanelState === SidePanelState . EDITING ;
1909+
18811910 /* eslint-disable jsx-a11y/no-static-element-interactions */
18821911 /* eslint-disable jsx-a11y/no-noninteractive-tabindex */
18831912 return (
@@ -1911,7 +1940,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19111940 onGridViewSliderChange = { this . onGridViewSliderChange }
19121941 onItemClick = { this . fetchFolder }
19131942 onSortChange = { this . sort }
1914- onMetadataSidePanelToggle = { this . onMetadataSidePanelToggle }
1943+ onSidePanelToggle = { this . onSidePanelToggle }
19151944 onViewModeChange = { this . changeViewMode }
19161945 portalElement = { this . rootElement }
19171946 selectedItemIds = { selectedItemIds }
@@ -1927,6 +1956,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19271956 currentCollection = { currentCollection }
19281957 features = { features }
19291958 gridColumnCount = { Math . min ( gridColumnCount , maxGridColumnCount ) }
1959+ isEditing = { isEditing }
19301960 isMedium = { isMedium }
19311961 isSmall = { isSmall }
19321962 isTouch = { isTouch }
@@ -1964,11 +1994,13 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19641994 </ Footer >
19651995 ) }
19661996 </ div >
1967- { isDefaultViewMetadata && isMetadataViewV2Feature && isMetadataSidePanelOpen && (
1997+ { isDefaultViewMetadata && isMetadataViewV2Feature && isSidePanelOpen && (
19681998 < MetadataSidePanel
19691999 currentCollection = { currentCollection }
2000+ isEditing = { isEditing }
19702001 metadataTemplate = { metadataTemplate }
1971- onClose = { this . closeMetadataSidePanel }
2002+ onClose = { this . closeSidePanel }
2003+ onEditingChange = { this . onMetadataEditingChange }
19722004 onUpdate = { this . updateMetadataV2 }
19732005 refreshCollection = { this . refreshCollection }
19742006 selectedItemIds = { selectedItemIds }
0 commit comments