@@ -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 ,
@@ -1024,21 +1030,17 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
10241030 validateSelectedItemIds = ( items : BoxItem [ ] ) : void => {
10251031 const { selectedItemIds } = this . state ;
10261032
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 > ( ) ;
1033+ let validSelectedIds = new Set < string > ( ) ;
10331034
1034- items . forEach ( item => {
1035- if ( selectedItemIds . has ( item . id ) ) {
1036- validSelectedIds . add ( item . id ) ;
1037- }
1038- } ) ;
1035+ if ( selectedItemIds === 'all' ) {
1036+ validSelectedIds = new Set ( items . map ( item => item . id ) ) ;
1037+ } else if ( selectedItemIds . size > 0 ) {
1038+ validSelectedIds = new Set ( items . filter ( item => selectedItemIds . has ( item . id ) ) . map ( item => item . id ) ) ;
1039+ }
10391040
10401041 if ( ! isEqual ( validSelectedIds , selectedItemIds ) ) {
1041- this . setState ( { selectedItemIds : validSelectedIds } ) ;
1042+ this . handleSelectedIdsChange ( validSelectedIds , true ) ;
1043+ this . closeSidePanel ( ) ;
10421044 }
10431045 } ;
10441046
@@ -1511,6 +1513,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
15111513 isShareModalOpen : false ,
15121514 isUploadModalOpen : false ,
15131515 isPreviewModalOpen : false ,
1516+ sidePanelState : SidePanelState . CLOSED ,
15141517 } ) ;
15151518
15161519 const {
@@ -1652,22 +1655,14 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
16521655 'hasError' | 'currentCollection' | 'metadataTemplate'
16531656 > => {
16541657 const { metadataViewProps } = this . props ;
1655- const { onSelectionChange } = metadataViewProps ?? { } ;
16561658 const { currentPageNumber, markers, selectedItemIds } = this . state ;
16571659 const hasNextMarker : boolean = ! ! markers [ currentPageNumber + 1 ] ;
16581660 const hasPrevMarker : boolean = currentPageNumber === 1 || ! ! markers [ currentPageNumber - 1 ] ;
16591661
16601662 return {
16611663 ...metadataViewProps ,
16621664 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- } ,
1665+ onSelectionChange : this . handleSelectedIdsChange ,
16711666 paginationProps : {
16721667 onMarkerBasedPageChange : this . markerBasedPaginate ,
16731668 hasNextMarker,
@@ -1754,11 +1749,28 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17541749 } ) ;
17551750 } ;
17561751
1757- clearSelectedItemIds = ( ) => {
1752+ handleSelectedIdsChange = ( ids : Selection , allowDuringEditing : boolean = false ) => {
1753+ const { metadataViewProps } = this . props ;
1754+ const { onSelectionChange : onSelectionChangeExternal } = metadataViewProps ;
1755+
1756+ if ( ! allowDuringEditing && this . state . sidePanelState === SidePanelState . EDITING ) {
1757+ return ;
1758+ }
1759+
1760+ onSelectionChangeExternal ?.( ids ) ;
1761+
17581762 this . setState ( {
1759- selectedItemIds : new Set ( ) ,
1760- isMetadataSidePanelOpen : false ,
1763+ selectedItemIds : ids ,
17611764 } ) ;
1765+
1766+ const isSelectionEmpty = ids !== 'all' && ids . size === 0 ;
1767+ if ( isSelectionEmpty ) {
1768+ this . closeSidePanel ( ) ;
1769+ }
1770+ } ;
1771+
1772+ clearSelectedItemIds = ( ) => {
1773+ this . handleSelectedIdsChange ( new Set ( ) , true ) ;
17621774 } ;
17631775
17641776 /**
@@ -1767,20 +1779,27 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17671779 * @private
17681780 * @return {void }
17691781 */
1770- onMetadataSidePanelToggle = ( ) => {
1782+ onSidePanelToggle = ( ) => {
17711783 this . setState ( prevState => ( {
1772- isMetadataSidePanelOpen : ! prevState . isMetadataSidePanelOpen ,
1784+ sidePanelState :
1785+ prevState . sidePanelState === SidePanelState . CLOSED ? SidePanelState . OPEN : SidePanelState . CLOSED ,
17731786 } ) ) ;
17741787 } ;
17751788
1776- /**
1777- * Close metadata side panel
1778- *
1779- * @private
1780- * @return {void }
1781- */
1782- closeMetadataSidePanel = ( ) => {
1783- this . setState ( { isMetadataSidePanelOpen : false } ) ;
1789+ closeSidePanel = ( ) => {
1790+ this . setState ( {
1791+ sidePanelState : SidePanelState . CLOSED ,
1792+ } ) ;
1793+ } ;
1794+
1795+ onSidePanelEditingChange = ( isEditing : boolean ) => {
1796+ const { sidePanelState } = this . state ;
1797+
1798+ if ( sidePanelState !== SidePanelState . CLOSED ) {
1799+ this . setState ( {
1800+ sidePanelState : isEditing ? SidePanelState . EDITING : SidePanelState . OPEN ,
1801+ } ) ;
1802+ }
17841803 } ;
17851804
17861805 filterMetadata = ( fields : ExternalFilterValues ) => {
@@ -1848,7 +1867,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18481867 isCreateFolderModalOpen,
18491868 isDeleteModalOpen,
18501869 isLoading,
1851- isMetadataSidePanelOpen ,
1870+ sidePanelState ,
18521871 isPreviewModalOpen,
18531872 isRenameModalOpen,
18541873 isShareModalOpen,
@@ -1878,6 +1897,9 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18781897
18791898 const metadataViewProps = this . getMetadataViewProps ( ) ;
18801899
1900+ const isSidePanelOpen = sidePanelState !== SidePanelState . CLOSED ;
1901+ const isEditing = sidePanelState === SidePanelState . EDITING ;
1902+
18811903 /* eslint-disable jsx-a11y/no-static-element-interactions */
18821904 /* eslint-disable jsx-a11y/no-noninteractive-tabindex */
18831905 return (
@@ -1911,7 +1933,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19111933 onGridViewSliderChange = { this . onGridViewSliderChange }
19121934 onItemClick = { this . fetchFolder }
19131935 onSortChange = { this . sort }
1914- onMetadataSidePanelToggle = { this . onMetadataSidePanelToggle }
1936+ onSidePanelToggle = { this . onSidePanelToggle }
19151937 onViewModeChange = { this . changeViewMode }
19161938 portalElement = { this . rootElement }
19171939 selectedItemIds = { selectedItemIds }
@@ -1927,6 +1949,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19271949 currentCollection = { currentCollection }
19281950 features = { features }
19291951 gridColumnCount = { Math . min ( gridColumnCount , maxGridColumnCount ) }
1952+ isEditing = { isEditing }
19301953 isMedium = { isMedium }
19311954 isSmall = { isSmall }
19321955 isTouch = { isTouch }
@@ -1964,11 +1987,13 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19641987 </ Footer >
19651988 ) }
19661989 </ div >
1967- { isDefaultViewMetadata && isMetadataViewV2Feature && isMetadataSidePanelOpen && (
1990+ { isDefaultViewMetadata && isMetadataViewV2Feature && isSidePanelOpen && (
19681991 < MetadataSidePanel
19691992 currentCollection = { currentCollection }
1993+ isEditing = { isEditing }
19701994 metadataTemplate = { metadataTemplate }
1971- onClose = { this . closeMetadataSidePanel }
1995+ onClose = { this . closeSidePanel }
1996+ onEditingChange = { this . onSidePanelEditingChange }
19721997 onUpdate = { this . updateMetadataV2 }
19731998 refreshCollection = { this . refreshCollection }
19741999 selectedItemIds = { selectedItemIds }
0 commit comments