@@ -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,16 @@ 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 ) ;
10421043 }
10431044 } ;
10441045
@@ -1511,6 +1512,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
15111512 isShareModalOpen : false ,
15121513 isUploadModalOpen : false ,
15131514 isPreviewModalOpen : false ,
1515+ sidePanelState : SidePanelState . CLOSED ,
15141516 } ) ;
15151517
15161518 const {
@@ -1652,22 +1654,14 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
16521654 'hasError' | 'currentCollection' | 'metadataTemplate'
16531655 > => {
16541656 const { metadataViewProps } = this . props ;
1655- const { onSelectionChange } = metadataViewProps ?? { } ;
16561657 const { currentPageNumber, markers, selectedItemIds } = this . state ;
16571658 const hasNextMarker : boolean = ! ! markers [ currentPageNumber + 1 ] ;
16581659 const hasPrevMarker : boolean = currentPageNumber === 1 || ! ! markers [ currentPageNumber - 1 ] ;
16591660
16601661 return {
16611662 ...metadataViewProps ,
16621663 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- } ,
1664+ onSelectionChange : this . handleSelectedIdsChange ,
16711665 paginationProps : {
16721666 onMarkerBasedPageChange : this . markerBasedPaginate ,
16731667 hasNextMarker,
@@ -1754,11 +1748,27 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17541748 } ) ;
17551749 } ;
17561750
1757- clearSelectedItemIds = ( ) => {
1751+ handleSelectedIdsChange = ( ids : Selection , allowDuringEditing : boolean = false ) => {
1752+ const { onSelectionChange : onSelectionChangeExternal } = this . props . metadataViewProps ?? { } ;
1753+
1754+ if ( ! allowDuringEditing && this . state . sidePanelState === SidePanelState . EDITING ) {
1755+ return ;
1756+ }
1757+
1758+ onSelectionChangeExternal ?.( ids ) ;
1759+
17581760 this . setState ( {
1759- selectedItemIds : new Set ( ) ,
1760- isMetadataSidePanelOpen : false ,
1761+ selectedItemIds : ids ,
17611762 } ) ;
1763+
1764+ const isSelectionEmpty = ids !== 'all' && ids . size === 0 ;
1765+ if ( isSelectionEmpty ) {
1766+ this . closeSidePanel ( ) ;
1767+ }
1768+ } ;
1769+
1770+ clearSelectedItemIds = ( ) => {
1771+ this . handleSelectedIdsChange ( new Set ( ) , true ) ;
17621772 } ;
17631773
17641774 /**
@@ -1767,20 +1777,23 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
17671777 * @private
17681778 * @return {void }
17691779 */
1770- onMetadataSidePanelToggle = ( ) => {
1780+ onSidePanelToggle = ( ) => {
17711781 this . setState ( prevState => ( {
1772- isMetadataSidePanelOpen : ! prevState . isMetadataSidePanelOpen ,
1782+ sidePanelState :
1783+ prevState . sidePanelState === SidePanelState . CLOSED ? SidePanelState . OPEN : SidePanelState . CLOSED ,
17731784 } ) ) ;
17741785 } ;
17751786
1776- /**
1777- * Close metadata side panel
1778- *
1779- * @private
1780- * @return {void }
1781- */
1782- closeMetadataSidePanel = ( ) => {
1783- this . setState ( { isMetadataSidePanelOpen : false } ) ;
1787+ closeSidePanel = ( ) => {
1788+ this . setState ( {
1789+ sidePanelState : SidePanelState . CLOSED ,
1790+ } ) ;
1791+ } ;
1792+
1793+ onMetadataEditingChange = ( isEditing : boolean ) => {
1794+ this . setState ( {
1795+ sidePanelState : isEditing ? SidePanelState . EDITING : SidePanelState . OPEN ,
1796+ } ) ;
17841797 } ;
17851798
17861799 filterMetadata = ( fields : ExternalFilterValues ) => {
@@ -1848,7 +1861,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18481861 isCreateFolderModalOpen,
18491862 isDeleteModalOpen,
18501863 isLoading,
1851- isMetadataSidePanelOpen ,
1864+ sidePanelState ,
18521865 isPreviewModalOpen,
18531866 isRenameModalOpen,
18541867 isShareModalOpen,
@@ -1878,6 +1891,9 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
18781891
18791892 const metadataViewProps = this . getMetadataViewProps ( ) ;
18801893
1894+ const isSidePanelOpen = sidePanelState !== SidePanelState . CLOSED ;
1895+ const isEditing = sidePanelState === SidePanelState . EDITING ;
1896+
18811897 /* eslint-disable jsx-a11y/no-static-element-interactions */
18821898 /* eslint-disable jsx-a11y/no-noninteractive-tabindex */
18831899 return (
@@ -1911,7 +1927,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19111927 onGridViewSliderChange = { this . onGridViewSliderChange }
19121928 onItemClick = { this . fetchFolder }
19131929 onSortChange = { this . sort }
1914- onMetadataSidePanelToggle = { this . onMetadataSidePanelToggle }
1930+ onSidePanelToggle = { this . onSidePanelToggle }
19151931 onViewModeChange = { this . changeViewMode }
19161932 portalElement = { this . rootElement }
19171933 selectedItemIds = { selectedItemIds }
@@ -1927,6 +1943,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19271943 currentCollection = { currentCollection }
19281944 features = { features }
19291945 gridColumnCount = { Math . min ( gridColumnCount , maxGridColumnCount ) }
1946+ isEditing = { isEditing }
19301947 isMedium = { isMedium }
19311948 isSmall = { isSmall }
19321949 isTouch = { isTouch }
@@ -1964,11 +1981,13 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
19641981 </ Footer >
19651982 ) }
19661983 </ div >
1967- { isDefaultViewMetadata && isMetadataViewV2Feature && isMetadataSidePanelOpen && (
1984+ { isDefaultViewMetadata && isMetadataViewV2Feature && isSidePanelOpen && (
19681985 < MetadataSidePanel
19691986 currentCollection = { currentCollection }
1987+ isEditing = { isEditing }
19701988 metadataTemplate = { metadataTemplate }
1971- onClose = { this . closeMetadataSidePanel }
1989+ onClose = { this . closeSidePanel }
1990+ onEditingChange = { this . onMetadataEditingChange }
19721991 onUpdate = { this . updateMetadataV2 }
19731992 refreshCollection = { this . refreshCollection }
19741993 selectedItemIds = { selectedItemIds }
0 commit comments