@@ -32,7 +32,7 @@ import { Title } from '../../webComponents/Title/index.js';
3232import { FlexBox } from '../FlexBox/index.js' ;
3333import type { MessageItemPropTypes } from '../MessageItem/index.js' ;
3434import { classNames , styleData } from './MessageView.module.css.js' ;
35- import { getIconNameForType , getValueStateMap } from './utils.js' ;
35+ import { getIconNameForType , getValueStateMap , resolveTitleTextStr } from './utils.js' ;
3636
3737export interface MessageViewDomRef extends HTMLDivElement {
3838 /**
@@ -131,19 +131,37 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
131131 const childrenArray = Children . toArray ( children ) ;
132132 const messageTypes = resolveMessageTypes ( childrenArray as ReactElement < MessageItemPropTypes > [ ] ) ;
133133 const filledTypes = Object . values ( messageTypes ) . filter ( ( count ) => count > 0 ) . length ;
134+ // fallback to All if selected filter is removed
135+ const effectiveListFilter : ValueState | 'All' =
136+ listFilter !== 'All' && messageTypes [ listFilter ] === 0 ? 'All' : listFilter ;
137+
138+ // collapse details pane if the open MessageItem is no longer in children
139+ const effectiveSelectedMessage : SelectedMessage | null =
140+ selectedMessage !== null &&
141+ childrenArray . some ( ( child ) => {
142+ if ( ! isValidElement < MessageItemPropTypes > ( child ) ) {
143+ return false ;
144+ }
145+ return (
146+ resolveTitleTextStr ( child . props . titleText ) === selectedMessage . titleTextStr &&
147+ child . props . type === selectedMessage . type
148+ ) ;
149+ } )
150+ ? selectedMessage
151+ : null ;
134152
135153 const filteredChildren =
136- listFilter === 'All'
154+ effectiveListFilter === 'All'
137155 ? childrenArray
138156 : childrenArray . filter ( ( message ) => {
139157 if ( ! isValidElement ( message ) ) {
140158 return false ;
141159 }
142160 const castMessage = message as ReactElement < MessageItemPropTypes > ;
143- if ( listFilter === ValueState . Information ) {
161+ if ( effectiveListFilter === ValueState . Information ) {
144162 return castMessage ?. props ?. type === ValueState . Information || castMessage ?. props ?. type === ValueState . None ;
145163 }
146- return castMessage ?. props ?. type === listFilter ;
164+ return castMessage ?. props ?. type === effectiveListFilter ;
147165 } ) ;
148166
149167 const groupedMessages = resolveMessageGroups ( filteredChildren as ReactElement < MessageItemPropTypes > [ ] ) ;
@@ -194,7 +212,7 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
194212 }
195213 } ;
196214
197- const outerClasses = clsx ( classNames . container , className , selectedMessage && classNames . showDetails ) ;
215+ const outerClasses = clsx ( classNames . container , className , effectiveSelectedMessage && classNames . showDetails ) ;
198216 return (
199217 < div
200218 ref = { componentRef }
@@ -209,10 +227,13 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
209227 } }
210228 >
211229 < div
212- style = { { visibility : selectedMessage ? 'hidden' : 'visible' , opacity : selectedMessage ? 0.3 : 1 } }
230+ style = { {
231+ visibility : effectiveSelectedMessage ? 'hidden' : 'visible' ,
232+ opacity : effectiveSelectedMessage ? 0.3 : 1 ,
233+ } }
213234 className = { classNames . messagesContainer }
214235 >
215- { ! selectedMessage && (
236+ { ! effectiveSelectedMessage && (
216237 < >
217238 { filledTypes > 1 && (
218239 < Bar
@@ -221,7 +242,7 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
221242 onSelectionChange = { handleListFilterChange }
222243 accessibleName = { i18nBundle . getText ( MESSAGE_TYPES ) }
223244 >
224- < SegmentedButtonItem data-key = "All" selected = { listFilter === 'All' } >
245+ < SegmentedButtonItem data-key = "All" selected = { effectiveListFilter === 'All' } >
225246 { i18nBundle . getText ( ALL ) }
226247 </ SegmentedButtonItem >
227248 { /* @ts -expect-error: The key can't be typed, it's always `string`, but since the `ValueState` enum only contains strings it's fine to use here*/ }
@@ -233,7 +254,7 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
233254 < SegmentedButtonItem
234255 key = { valueState }
235256 data-key = { valueState }
236- selected = { listFilter === valueState }
257+ selected = { effectiveListFilter === valueState }
237258 icon = { getIconNameForType ( valueState ) }
238259 className = { classNames . button }
239260 tooltip = { getValueStateMap ( i18nBundle ) [ valueState ] }
@@ -271,12 +292,12 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
271292 </ div >
272293 < div
273294 className = { classNames . detailsContainer }
274- style = { { opacity : selectedMessage ? 1 : 0.3 } }
295+ style = { { opacity : effectiveSelectedMessage ? 1 : 0.3 } }
275296 data-component-name = "MessageViewDetailsContainer"
276297 >
277298 { childrenArray . length > 0 ? (
278299 < >
279- { showDetailsPageHeader && selectedMessage && (
300+ { showDetailsPageHeader && effectiveSelectedMessage && (
280301 < Bar
281302 startContent = {
282303 < Button
@@ -291,18 +312,18 @@ const MessageView = forwardRef<MessageViewDomRef, MessageViewPropTypes>((props,
291312 }
292313 />
293314 ) }
294- { selectedMessage && (
315+ { effectiveSelectedMessage && (
295316 < FlexBox className = { classNames . details } >
296317 < Icon
297- data-type = { selectedMessage . type ?? ValueState . Negative }
298- name = { getIconNameForType ( selectedMessage . type ) }
318+ data-type = { effectiveSelectedMessage . type ?? ValueState . Negative }
319+ name = { getIconNameForType ( effectiveSelectedMessage . type ) }
299320 className = { classNames . detailsIcon }
300321 />
301322 < FlexBox direction = { FlexBoxDirection . Column } className = { classNames . detailsTextContainer } >
302323 < Title level = { TitleLevel . H5 } className = { classNames . detailsTitle } wrappingType = { WrappingType . Normal } >
303- { selectedMessage . titleText }
324+ { effectiveSelectedMessage . titleText }
304325 </ Title >
305- < div className = { classNames . detailsText } > { selectedMessage . children } </ div >
326+ < div className = { classNames . detailsText } > { effectiveSelectedMessage . children } </ div >
306327 </ FlexBox >
307328 </ FlexBox >
308329 ) }
0 commit comments