5
5
} from 'react' ;
6
6
import { InfoIcon } from '@ifrc-go/icons' ;
7
7
import {
8
+ BarChart ,
8
9
Button ,
9
10
Chip ,
10
11
Container ,
@@ -18,9 +19,12 @@ import {
18
19
TabPanel ,
19
20
Tabs ,
20
21
TextOutput ,
22
+ TimeSeriesChart ,
21
23
} from '@ifrc-go/ui' ;
22
24
import { useTranslation } from '@ifrc-go/ui/hooks' ;
23
25
import {
26
+ getDatesSeparatedByMonths ,
27
+ getFormattedDateKey ,
24
28
hasSomeDefinedValue ,
25
29
numericIdSelector ,
26
30
resolveToComponent ,
@@ -98,6 +102,83 @@ const disasterTypeKeySelector = (type: DisasterType) => type.id;
98
102
const disasterTypeLabelSelector = ( type : DisasterType ) => type . name ?? '?' ;
99
103
100
104
/** @knipignore */
105
+
106
+ const sectorData = [
107
+ {
108
+ id : 1 ,
109
+ name : 'Health' ,
110
+ value : 23 ,
111
+ } ,
112
+ {
113
+ id : 2 ,
114
+ name : 'Recovery' ,
115
+ value : 55 ,
116
+ } ,
117
+ {
118
+ id : 3 ,
119
+ name : 'Education' ,
120
+ value : 60 ,
121
+ } ,
122
+ {
123
+ id : 4 ,
124
+ name : 'DRR' ,
125
+ value : 35 ,
126
+ } ,
127
+
128
+ ] ;
129
+
130
+ const timeSeriesDataKeys = [
131
+ {
132
+ date : '2024-12' ,
133
+ count : 2 ,
134
+ } ,
135
+ {
136
+ date : '2024-11' ,
137
+ count : 8 ,
138
+ } ,
139
+ {
140
+ date : '2024-10' ,
141
+ count : 27 ,
142
+ } ,
143
+ {
144
+ date : '2024-09' ,
145
+ count : 48 ,
146
+ } ,
147
+ {
148
+ date : '2024-01' ,
149
+ count : 23 ,
150
+ } ,
151
+ {
152
+ date : '2024-08' ,
153
+ count : 70 ,
154
+ } ,
155
+ {
156
+ date : '2024-07' ,
157
+ count : 85 ,
158
+ } ,
159
+ {
160
+ date : '2024-06' ,
161
+ count : 84 ,
162
+ } ,
163
+ {
164
+ date : '2024-05' ,
165
+ count : 73 ,
166
+ } ,
167
+ ] ;
168
+ const oneYearAgo = new Date ( ) ;
169
+ oneYearAgo . setFullYear ( oneYearAgo . getFullYear ( ) - 1 ) ;
170
+ oneYearAgo . setDate ( 1 ) ;
171
+ oneYearAgo . setMonth ( oneYearAgo . getMonth ( ) + 1 ) ;
172
+ oneYearAgo . setHours ( 0 , 0 , 0 , 0 ) ;
173
+ const timeseriesChartClassNameSelector = ( ) => styles . sourceChart ;
174
+ const xAxisFormatter = ( date : Date ) => date . toLocaleString (
175
+ navigator . language ,
176
+ { month : 'short' } ,
177
+ ) ;
178
+ const keySelector = ( item ) => item . id ;
179
+ const valueSelector = ( item ) => item . value ;
180
+ const labelSelector = ( item ) => item . name ;
181
+
101
182
// eslint-disable-next-line import/prefer-default-export
102
183
export function Component ( ) {
103
184
const strings = useTranslation ( i18n ) ;
@@ -281,7 +362,22 @@ export function Component() {
281
362
setFilterPristine ( true ) ;
282
363
setQuery ( undefined ) ;
283
364
} , [ resetFilter ] ) ;
284
-
365
+ const dateList = useMemo (
366
+ ( ) => {
367
+ const startDate = oneYearAgo ;
368
+ const endDate = new Date ( ) ;
369
+ return getDatesSeparatedByMonths ( startDate , endDate ) ;
370
+ } ,
371
+ [ ] ,
372
+ ) ;
373
+ const timeSeriesValueSelector = useCallback (
374
+ ( _ : string , date : Date ) => timeSeriesDataKeys ?. find (
375
+ ( source ) => (
376
+ getFormattedDateKey ( source . date ) === getFormattedDateKey ( date )
377
+ ) ,
378
+ ) ?. count ?? 0 ,
379
+ [ ] ,
380
+ ) ;
285
381
return (
286
382
< Page
287
383
className = { styles . operationalLearning }
@@ -444,6 +540,55 @@ export function Component() {
444
540
</ >
445
541
) }
446
542
/>
543
+ < div className = { styles . learningOverview } >
544
+ < Container
545
+ heading = "Map"
546
+
547
+ />
548
+ < div className = { styles . charts } >
549
+ < Container
550
+ heading = { strings . learningBySector }
551
+ className = { styles . learningChart }
552
+ withHeaderBorder
553
+ withInternalPadding
554
+ >
555
+ < BarChart
556
+ data = { sectorData }
557
+ keySelector = { keySelector }
558
+ valueSelector = { valueSelector }
559
+ labelSelector = { labelSelector }
560
+ />
561
+ </ Container >
562
+ < Container
563
+ heading = { strings . learningByRegions }
564
+ className = { styles . learningChart }
565
+ withHeaderBorder
566
+ withInternalPadding
567
+ >
568
+ < BarChart
569
+ data = { sectorData }
570
+ keySelector = { keySelector }
571
+ valueSelector = { valueSelector }
572
+ labelSelector = { labelSelector }
573
+ />
574
+ </ Container >
575
+ < Container
576
+ heading = { strings . sourceOvertime }
577
+ className = { styles . learningChart }
578
+ withHeaderBorder
579
+ withInternalPadding
580
+ >
581
+ < TimeSeriesChart
582
+ className = { styles . timeSeriesChart }
583
+ timePoints = { dateList }
584
+ dataKeys = { timeSeriesDataKeys }
585
+ valueSelector = { timeSeriesValueSelector }
586
+ classNameSelector = { timeseriesChartClassNameSelector }
587
+ xAxisFormatter = { xAxisFormatter }
588
+ />
589
+ </ Container >
590
+ </ div >
591
+ </ div >
447
592
{ showKeyInsights && (
448
593
< KeyInsights
449
594
opsLearningSummaryResponse = { opsLearningSummaryResponse }
0 commit comments