@@ -46,6 +46,7 @@ const formatCurrency = (value: number, currencyCode: string): string => {
4646interface ProjectCost {
4747 id : string ;
4848 projectName : string ;
49+ clusterId ?: string ;
4950 cost : number ;
5051 costPercentage : number ;
5152 monthOverMonthChange : number ;
@@ -181,12 +182,22 @@ function buildCostManagementQueryParams(
181182 queryParams [ `filter[${ groupBy } ]` ] = specificItemName ;
182183 } else if ( filterBy === 'tag' && selectedTagKey && selectedTagValue ) {
183184 // Tag filtering
184- const filterPrefix = filterOperation === 'excludes' ? 'exclude' : 'filter' ;
185- queryParams [ `${ filterPrefix } [tag:${ selectedTagKey } ]` ] = selectedTagValue ;
185+ if ( filterOperation === 'exact' ) {
186+ queryParams [ `filter[exact:tag:${ selectedTagKey } ]` ] = selectedTagValue ;
187+ } else if ( filterOperation === 'excludes' ) {
188+ queryParams [ `exclude[tag:${ selectedTagKey } ]` ] = selectedTagValue ;
189+ } else {
190+ queryParams [ `filter[tag:${ selectedTagKey } ]` ] = selectedTagValue ;
191+ }
186192 } else if ( filterValue ) {
187193 // Regular filtering
188- const filterPrefix = filterOperation === 'excludes' ? 'exclude' : 'filter' ;
189- queryParams [ `${ filterPrefix } [${ filterBy } ]` ] = filterValue ;
194+ if ( filterOperation === 'exact' ) {
195+ queryParams [ `filter[exact:${ filterBy } ]` ] = filterValue ;
196+ } else if ( filterOperation === 'excludes' ) {
197+ queryParams [ `exclude[${ filterBy } ]` ] = filterValue ;
198+ } else {
199+ queryParams [ `filter[${ filterBy } ]` ] = filterValue ;
200+ }
190201 }
191202
192203 // Add sorting
@@ -380,8 +391,24 @@ export function OpenShiftPage() {
380391 delta_value ?: number ;
381392 } ) || { } ;
382393
383- const nameField = groupBy as keyof typeof item ;
384- const itemName = ( item [ nameField ] as string ) || 'Unknown' ;
394+ // For clusters, prefer values[0].clusters[0] (human-readable) over item.cluster (UUID)
395+ let itemName : string ;
396+ let clusterId : string | undefined ;
397+ if ( groupBy === 'cluster' ) {
398+ const valueItem = item . values ?. [ 0 ] as
399+ | { clusters ?: string [ ] ; cluster ?: string }
400+ | undefined ;
401+ const clustersArray = valueItem ?. clusters ;
402+ itemName =
403+ clustersArray && clustersArray . length > 0
404+ ? clustersArray [ 0 ]
405+ : ( item . cluster as string ) || 'Unknown' ;
406+ // Store the cluster UUID for display
407+ clusterId = ( item . cluster as string ) || undefined ;
408+ } else {
409+ const nameField = groupBy as keyof typeof item ;
410+ itemName = ( item [ nameField ] as string ) || 'Unknown' ;
411+ }
385412
386413 const costField =
387414 groupBy === 'project' && overheadDistribution === 'distribute'
@@ -399,6 +426,7 @@ export function OpenShiftPage() {
399426 return {
400427 id : `${ index } ` ,
401428 projectName : itemName ,
429+ clusterId,
402430 cost : costValue ,
403431 costPercentage : 0 ,
404432 monthOverMonthChange : deltaPercent ,
@@ -647,21 +675,41 @@ export function OpenShiftPage() {
647675 </ Typography >
648676 ) ,
649677 field : 'projectName' ,
678+ cellStyle : { minWidth : 350 } ,
679+ headerStyle : { minWidth : 350 } ,
650680 render : data => (
651- < div style = { { display : 'flex' , alignItems : 'center' , gap : '8px' } } >
652- < Typography variant = "body2" > { data . projectName } </ Typography >
653- { data . includesOverhead && (
681+ < div >
682+ < div
683+ style = { {
684+ display : 'flex' ,
685+ alignItems : 'center' ,
686+ justifyContent : 'space-between' ,
687+ gap : '8px' ,
688+ } }
689+ >
690+ < Typography variant = "body2" > { data . projectName } </ Typography >
691+ { groupBy === 'project' && data . includesOverhead && (
692+ < Typography
693+ variant = "caption"
694+ style = { {
695+ padding : '2px 6px' ,
696+ backgroundColor : '#F5F5F5' ,
697+ border : '1px solid #D2D2D2' ,
698+ borderRadius : '16px' ,
699+ color : 'black' ,
700+ whiteSpace : 'nowrap' ,
701+ } }
702+ >
703+ Includes overhead
704+ </ Typography >
705+ ) }
706+ </ div >
707+ { groupBy === 'cluster' && data . clusterId && (
654708 < Typography
655709 variant = "caption"
656- style = { {
657- padding : '2px 6px' ,
658- backgroundColor : '#F5F5F5' ,
659- border : '1px solid #D2D2D2' ,
660- borderRadius : '16px' ,
661- color : 'black' ,
662- } }
710+ style = { { color : '#666' , display : 'block' , marginTop : 10 } }
663711 >
664- Includes overhead
712+ { data . clusterId }
665713 </ Typography >
666714 ) }
667715 </ div >
@@ -858,6 +906,12 @@ export function OpenShiftPage() {
858906 if ( value !== 'project' ) {
859907 setShowPlatformSum ( false ) ;
860908 }
909+ // Sync filterBy with groupBy and reset filter value
910+ setFilterBy ( value ) ;
911+ setFilterValue ( '' ) ;
912+ // Reset tag-related filter fields
913+ setSelectedTagKey ( '' ) ;
914+ setSelectedTagValue ( '' ) ;
861915 } }
862916 selectedTag = { selectedTag }
863917 onSelectedTagChange = { value => {
0 commit comments