@@ -14,6 +14,8 @@ import {
1414 useDimension ,
1515} from "../../api" ;
1616
17+ import { cls } from "../../utils" ;
18+ import { Dialog } from "../dialog" ;
1719import { BrowserIcon , MobileDeviceIcon , OSIcon , ReferrerIcon } from "../icons" ;
1820import { countryCodeToFlag , formatFullUrl , formatHost , getHref , tryParseUrl } from "./utils" ;
1921
@@ -113,18 +115,72 @@ export const DimensionTable = ({
113115 </ div >
114116 ) }
115117 </ div >
116- < button
117- type = "button"
118- className = { `${ styles . showMore } ${ ( dataTruncated ?. length ?? 0 ) === 0 ? styles . showMoreHidden : "" } ` }
119- onClick = { ( ) => console . log ( "show more" ) }
120- >
121- < ZoomIn size = { 16 } />
122- Show details
123- </ button >
118+ < DetailsModal project = { project } dimension = { dimension } metric = { metric } range = { range } />
124119 </ >
125120 ) ;
126121} ;
127122
123+ const DetailsModal = ( {
124+ project,
125+ dimension,
126+ metric,
127+ range,
128+ } : { project : ProjectResponse ; dimension : Dimension ; metric : Metric ; range : DateRange } ) => {
129+ const { data, biggest, order, isLoading } = useDimension ( { project, dimension, metric, range } ) ;
130+
131+ return (
132+ < Dialog
133+ title = { `${ dimensionNames [ dimension ] } - ${ metricNames [ metric ] } ` }
134+ description = { `Detailed breakdown of ${ dimensionNames [ dimension ] } by ${ metricNames [ metric ] } ` }
135+ hideTitle
136+ hideDescription
137+ showClose
138+ className = { styles . detailsModal }
139+ trigger = { ( ) => (
140+ < button
141+ type = "button"
142+ className = { cls ( styles . showMore , ( data ?. length ?? 0 ) === 0 && styles . showMoreHidden ) }
143+ onClick = { ( ) => console . log ( "show more" ) }
144+ >
145+ < ZoomIn size = { 16 } />
146+ Show details
147+ </ button >
148+ ) }
149+ >
150+ < div className = { styles . dimensionTable } style = { { "--count" : data ?. length } as React . CSSProperties } >
151+ < div className = { styles . dimensionHeader } >
152+ < div > { dimensionNames [ dimension ] } </ div >
153+ < div > { metricNames [ metric ] } </ div >
154+ </ div >
155+ { data ?. map ( ( d ) => {
156+ return (
157+ < div
158+ key = { d . dimensionValue }
159+ style = { { order : order ?. indexOf ( d . dimensionValue ) } }
160+ className = { styles . dimensionRow }
161+ >
162+ < DimensionValueBar value = { d . value } biggest = { biggest } >
163+ < DimensionLabel dimension = { dimension } value = { d } />
164+ </ DimensionValueBar >
165+ < div > { formatMetricVal ( metric , d . value ) } </ div >
166+ </ div >
167+ ) ;
168+ } ) }
169+ { isLoading && data ?. length === 0 && (
170+ < div className = { styles . dimensionEmpty } >
171+ < div > Loading...</ div >
172+ </ div >
173+ ) }
174+ { ! isLoading && data ?. length === 0 && (
175+ < div className = { styles . dimensionEmpty } >
176+ < div > No data available</ div >
177+ </ div >
178+ ) }
179+ </ div >
180+ </ Dialog >
181+ ) ;
182+ } ;
183+
128184const dimensionLabels : Record < Dimension , ( value : DimensionTableRow ) => React . ReactNode > = {
129185 platform : ( value ) => (
130186 < >
0 commit comments