@@ -3,6 +3,7 @@ import type {
33 ITransportMode ,
44 IProject ,
55 IKpi ,
6+ IIKpiResultBeforeAfter ,
67} from "../../types" ;
78import type { SplitItem } from "../../components/react/KpiCards/ModalSplitChart" ;
89import type { MarkerData } from "../../components/react/MapViewer" ;
@@ -43,49 +44,66 @@ export function separateMeasures(measures: IProject[]): {
4344 * Prepare modal split chart data from KPI results
4445 * KPI 15.a represents modal split per transport mode
4546 */
46- export function prepareModalSplitData (
47- livingLab : ILivingLabPopulated ,
47+ export function getModalSplitKpiResults (
48+ kpiDefinitions : IKpi [ ] ,
49+ allTransportModes : ITransportMode [ ] ,
50+ kpiResults : IIKpiResultBeforeAfter [ ]
51+ ) : {
52+ kpiName : string ;
53+ before : { label : string ; data : SplitItem [ ] } ;
54+ after : { label : string ; data : SplitItem [ ] } ;
55+ } [ ] {
56+ if ( ! kpiDefinitions || ! allTransportModes || ! kpiResults . length ) {
57+ return [ ] ;
58+ }
59+ return (
60+ kpiDefinitions
61+ ?. filter ( ( kpi ) => [ "15.a" , "15.b" , "15.c" ] . includes ( kpi . kpi_number ) )
62+ . map ( ( kpi ) => {
63+ const modalSplitKpiResults = kpiResults . filter (
64+ ( result ) => result . kpidefinition_id === kpi . id
65+ ) ;
66+
67+ return prepareModalSplitData (
68+ modalSplitKpiResults ,
69+ allTransportModes ,
70+ kpi
71+ ) ;
72+ } ) || [ ]
73+ ) ;
74+ }
75+
76+ function prepareModalSplitData (
77+ kpiResults : IIKpiResultBeforeAfter [ ] ,
4878 allTransportModes : ITransportMode [ ] ,
49- kpidefinitions : IKpi [ ]
79+ parentKpiDefinition ? : IKpi
5080) : {
81+ kpiName : string ;
5182 before : { label : string ; data : SplitItem [ ] } ;
5283 after : { label : string ; data : SplitItem [ ] } ;
5384} {
5485 if (
55- ! livingLab . kpi_results ||
86+ kpiResults ?. length === 0 ||
5687 ! allTransportModes ||
5788 allTransportModes . length === 0
5889 ) {
5990 return {
60- before : { label : "Before" , data : [ ] } ,
61- after : { label : "After" , data : [ ] } ,
62- } ;
63- }
64-
65- // Find KPI 15.a results (modal split)
66- const modalSplitKpis = livingLab . kpi_results ?. filter (
67- ( kpi ) =>
68- kpidefinitions ?. find ( ( def ) => def . id === kpi . kpidefinition_id )
69- ?. kpi_number === "15.a"
70- ) ;
71-
72- if ( modalSplitKpis . length === 0 ) {
73- return {
91+ kpiName : "Modal Split" ,
7492 before : { label : "Before" , data : [ ] } ,
7593 after : { label : "After" , data : [ ] } ,
7694 } ;
7795 }
7896
7997 const beforeData : SplitItem [ ] = [ ] ;
8098 const afterData : SplitItem [ ] = [ ] ;
81- const beforeLabelWithMinYear = modalSplitKpis [ 0 ] . result_before ?. date
82- ? `Before (${ new Date ( modalSplitKpis [ 0 ] . result_before . date ) . getFullYear ( ) } )`
99+ const beforeLabelWithMinYear = kpiResults [ 0 ] . result_before ?. date
100+ ? `Before (${ new Date ( kpiResults [ 0 ] . result_before . date ) . getFullYear ( ) } )`
83101 : "Before" ;
84- const afterLabelWithMinYear = modalSplitKpis [ 0 ] . result_after ?. date
85- ? `After (${ new Date ( modalSplitKpis [ 0 ] . result_after . date ) . getFullYear ( ) } )`
102+ const afterLabelWithMinYear = kpiResults [ 0 ] . result_after ?. date
103+ ? `After (${ new Date ( kpiResults [ 0 ] . result_after . date ) . getFullYear ( ) } )`
86104 : "After" ;
87105
88- modalSplitKpis . forEach ( ( kpi ) => {
106+ kpiResults . forEach ( ( kpi ) => {
89107 // Find the transport mode for this KPI result
90108 const transportMode = allTransportModes . find (
91109 ( tm ) => tm . id === kpi . result_before ?. transport_mode_id
@@ -111,6 +129,7 @@ export function prepareModalSplitData(
111129 } ) ;
112130
113131 return {
132+ kpiName : parentKpiDefinition ?. name || "Modal Split" ,
114133 before : { label : beforeLabelWithMinYear , data : beforeData } ,
115134 after : { label : afterLabelWithMinYear , data : afterData } ,
116135 } ;
0 commit comments