back-testing-react 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cjs/index.js +17 -17
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/esm/index.js +17 -17
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/index.d.ts +35 -10
  6. package/package.json +5 -1
  7. package/src/components/back-testing-cat-legend/back-testing-cat-legend.css +1 -1
  8. package/src/components/back-testing-cat-legend/back-testing-cat-legend.tsx +7 -7
  9. package/src/components/back-testing-map/back-testing-map.css +1 -1
  10. package/src/components/back-testing-map/back-testing-map.service.ts +21 -5
  11. package/src/components/back-testing-map/back-testing-map.tsx +51 -18
  12. package/src/components/back-testing-map/back-testing-map.types.ts +74 -11
  13. package/src/components/back-testing-payout-info/back-testing-payout-info.css +112 -0
  14. package/src/components/back-testing-payout-info/back-testing-payout-info.tsx +371 -0
  15. package/src/components/back-testing-payout-info/back-testing-payout-info.types.ts +9 -0
  16. package/src/components/back-testing-stepper/back-testing-stepper.css +30 -0
  17. package/src/components/back-testing-stepper/back-testing-stepper.tsx +322 -0
  18. package/src/components/back-testing-stepper/back-testing-stepper.types.ts +41 -0
  19. package/src/components/back-testing-stepper/inputs/distance-input/distance-input.css +57 -0
  20. package/src/components/back-testing-stepper/inputs/distance-input/distance-input.stories.tsx +20 -0
  21. package/src/components/back-testing-stepper/inputs/distance-input/distance-input.tsx +93 -0
  22. package/src/components/back-testing-stepper/inputs/distance-input/distance-input.types.ts +41 -0
  23. package/src/components/back-testing-stepper/inputs/file-input/file-input.css +26 -0
  24. package/src/components/back-testing-stepper/inputs/file-input/file-input.stories.tsx +20 -0
  25. package/src/components/back-testing-stepper/inputs/file-input/file-input.tsx +43 -0
  26. package/src/components/back-testing-stepper/inputs/file-input/file-input.types.ts +10 -0
  27. package/src/components/back-testing-stepper/inputs/number-input/number-input.css +48 -0
  28. package/src/components/back-testing-stepper/inputs/number-input/number-input.stories.tsx +20 -0
  29. package/src/components/back-testing-stepper/inputs/number-input/number-input.tsx +55 -0
  30. package/src/components/back-testing-stepper/inputs/number-input/number-input.types.ts +12 -0
  31. package/src/components/back-testing-stepper/inputs/select-input/select-input.css +13 -0
  32. package/src/components/back-testing-stepper/inputs/select-input/select-input.stories.tsx +27 -0
  33. package/src/components/back-testing-stepper/inputs/select-input/select-input.tsx +63 -0
  34. package/src/components/back-testing-stepper/inputs/select-input/select-input.types.ts +8 -0
  35. package/src/components/back-testing-stepper/inputs/text-input/text-input.css +35 -0
  36. package/src/components/back-testing-stepper/inputs/text-input/text-input.stories.tsx +18 -0
  37. package/src/components/back-testing-stepper/inputs/text-input/text-input.tsx +32 -0
  38. package/src/components/back-testing-stepper/inputs/text-input/text-input.types.ts +6 -0
  39. package/src/components/back-testing-stepper/inputs/worldmap-search/worldmap-search.css +16 -0
  40. package/src/components/back-testing-stepper/inputs/worldmap-search/worldmap-search.stories.tsx +20 -0
  41. package/src/components/back-testing-stepper/inputs/worldmap-search/worldmap-search.tsx +151 -0
  42. package/src/components/back-testing-stepper/inputs/worldmap-search/worldmap-search.types.ts +11 -0
  43. package/src/components/back-testing-stepper/steps/input-anemometer/input-anemometer.css +0 -0
  44. package/src/components/back-testing-stepper/steps/input-anemometer/input-anemometer.tsx +188 -0
  45. package/src/components/back-testing-stepper/steps/input-anemometer/input-anemometer.types.ts +16 -0
  46. package/src/components/back-testing-stepper/steps/input-ciac/input-ciac.scss +0 -0
  47. package/src/components/back-testing-stepper/steps/input-ciac/input-ciac.tsx +225 -0
  48. package/src/components/back-testing-stepper/steps/input-ciac/input-ciac.types.ts +17 -0
  49. package/src/components/back-testing-stepper/steps/input-location/input-location.css +0 -0
  50. package/src/components/back-testing-stepper/steps/input-location/input-location.tsx +135 -0
  51. package/src/components/back-testing-stepper/steps/input-location/input-location.types.ts +16 -0
  52. package/src/components/back-testing-stepper/steps/input-proxy/input-proxy.css +0 -0
  53. package/src/components/back-testing-stepper/steps/input-proxy/input-proxy.tsx +173 -0
  54. package/src/components/back-testing-stepper/steps/input-proxy/input-proxy.types.ts +16 -0
  55. package/src/components/back-testing-stepper/steps/step.types.ts +58 -0
  56. package/src/components/back-testing-storm-legend/back-testing-storm-legend.stories.tsx +56 -33
  57. package/src/components/back-testing-wizard/back-testing-wizard.css +36 -0
  58. package/src/components/back-testing-wizard/back-testing-wizard.stories.tsx +734 -0
  59. package/src/components/back-testing-wizard/back-testing-wizard.tsx +102 -0
  60. package/src/components/back-testing-wizard/back-testing-wizard.types.ts +12 -0
@@ -0,0 +1,371 @@
1
+ "use client"
2
+
3
+ import "./back-testing-payout-info.css"
4
+
5
+ import * as React from 'react';
6
+ import { styled } from '@mui/material/styles';
7
+ import Card from '@mui/material/Card';
8
+ import CardHeader from '@mui/material/CardHeader';
9
+ import CardContent from '@mui/material/CardContent';
10
+ import CardActions from '@mui/material/CardActions';
11
+ import Collapse from '@mui/material/Collapse';
12
+ import Avatar from '@mui/material/Avatar';
13
+ import IconButton, { IconButtonProps } from '@mui/material/IconButton';
14
+ import Typography from '@mui/material/Typography';
15
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
16
+ import AttachMoneyIcon from '@mui/icons-material/AttachMoney';
17
+ import { Box, Button, Checkbox, CircularProgress, List, ListItem, ListItemAvatar, ListItemText } from "@mui/material";
18
+ import TrendingUpIcon from '@mui/icons-material/TrendingUp';
19
+ import CycloneIcon from '@mui/icons-material/Cyclone';
20
+ import WindPowerIcon from '@mui/icons-material/WindPower';
21
+ import AirIcon from '@mui/icons-material/Air';
22
+ import { GeoJSONSource } from "mapbox-gl";
23
+ import { Geometry, GeoJsonProperties, Feature, FeatureCollection } from "geojson";
24
+ import { RadioButtonChecked, RadioButtonUncheckedOutlined } from "@mui/icons-material";
25
+ import { BackTestingPayoutInfoProps } from "./back-testing-payout-info.types";
26
+ import { StormPayout } from "../back-testing-map/back-testing-map.service";
27
+ import { TROPICAL_STORM_LAYER, TROPICAL_STORM_TRACK_LAYER } from "../back-testing-map/back-testing-map.types";
28
+
29
+ interface ExpandMoreProps extends IconButtonProps {
30
+ expand: boolean;
31
+ }
32
+
33
+ const ExpandMore = styled((props: ExpandMoreProps) => {
34
+ const { expand, ...other } = props;
35
+ return <IconButton {...other} />;
36
+ })(({ theme }) => ({
37
+ marginLeft: 'auto',
38
+ transition: theme.transitions.create('transform', {
39
+ duration: theme.transitions.duration.shortest,
40
+ }),
41
+ variants: [
42
+ {
43
+ props: ({ expand }) => !expand,
44
+ style: {
45
+ transform: 'rotate(0deg)',
46
+ },
47
+ },
48
+ {
49
+ props: ({ expand }) => !!expand,
50
+ style: {
51
+ transform: 'rotate(180deg)',
52
+ },
53
+ },
54
+ ],
55
+ }));
56
+
57
+ function BackTestingPayoutInfo(props: BackTestingPayoutInfoProps){
58
+
59
+ const [expanded, setExpanded] = React.useState<boolean[]>(props.stormPayouts.map((storm) => { return false}));
60
+
61
+ const handleExpandClick = (index:number) => {
62
+ let newVal = expanded.map((val) => {return false})
63
+ newVal[index] = !expanded[index]
64
+ setExpanded(newVal);
65
+ };
66
+
67
+ const handleCheckboxClick = (storm: string, year:number,e:React.ChangeEvent<HTMLInputElement>) => {
68
+ let checked = e.target.checked;
69
+ toggleStormTrack(storm,year,checked)
70
+ };
71
+
72
+ const handleBack = () => {
73
+ if(props.onBack != undefined){
74
+ props.onBack();
75
+ }
76
+ }
77
+
78
+ const handleRestart = () => {
79
+ if(props.onRestart != undefined){
80
+ props.onRestart();
81
+ }
82
+ }
83
+
84
+ function maskDateString(value:string){
85
+ let date = new Date(Date.parse(value));
86
+ return date.toLocaleDateString('en-us', { day:"numeric", year:"numeric", month:"short"})
87
+ }
88
+
89
+ function maskCurrency(value:number){
90
+ let USDollar = new Intl.NumberFormat('en-US', {
91
+ style: 'currency',
92
+ currency: 'USD',
93
+ });
94
+ return USDollar.format(value)
95
+ }
96
+
97
+ function maskStormCategory(cat:number): string {
98
+ switch(cat){
99
+ case 5:
100
+ case 4:
101
+ case 3:
102
+ case 2:
103
+ case 1:
104
+ return `Category ${cat}`
105
+ case 0:
106
+ return "Tropical Storm"
107
+ case -1:
108
+ return "Tropical Depression"
109
+ case -2:
110
+ return "Tropical Expression"
111
+ case -3:
112
+ return "Tropical Expression"
113
+ case -4:
114
+ return "Tropical Expression"
115
+ case -5:
116
+ return "Tropical Expression"
117
+ case -10:
118
+ return "N/A"
119
+ default:
120
+ return ""
121
+ }
122
+ }
123
+
124
+ const unfocusStormTracks = () => {
125
+ if(props.mapInstanceRef && props.mapInstanceRef.current){
126
+ const circleSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_LAYER)
127
+ if (circleSource){
128
+ let features = (((circleSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
129
+ let newData = features.map((feature) => {
130
+ return {
131
+ type: feature.type,
132
+ geometry: feature.geometry,
133
+ properties:{
134
+ view: feature.properties?.view,
135
+ muted: feature.properties?.checked !== undefined ? !feature.properties.checked : true,
136
+ name : feature.properties?.name,
137
+ year: feature.properties?.year,
138
+ windspeed: feature.properties?.windspeed,
139
+ category: feature.properties?.category,
140
+ time: feature.properties?.time,
141
+ latitude: feature.properties?.latitude,
142
+ longitude: feature.properties?.longitude,
143
+ location: feature.properties?.location,
144
+ checked: feature.properties?.checked,
145
+ color: feature.properties?.color }}
146
+ }) as Feature<Geometry, GeoJsonProperties>[]
147
+ (circleSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
148
+ }
149
+ const lineSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_TRACK_LAYER)
150
+ if (lineSource){
151
+ let features = (((lineSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
152
+ let newData = features.map((feature) => {
153
+ return {
154
+ type: feature.type,
155
+ geometry: feature.geometry,
156
+ properties:{
157
+ view: feature.properties?.view,
158
+ muted: feature.properties?.checked !== undefined ? !feature.properties.checked : true,
159
+ name : feature.properties?.name,
160
+ year: feature.properties?.year,
161
+ category: feature.properties?.category,
162
+ checked: feature.properties?.checked,
163
+ color: feature.properties?.color }}
164
+ }) as Feature<Geometry, GeoJsonProperties>[]
165
+ (lineSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
166
+ }
167
+ }
168
+ }
169
+
170
+ const toggleStormTrack = (storm: string, year:number, checked: boolean) => {
171
+ if(props.mapInstanceRef && props.mapInstanceRef.current){
172
+ const circleSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_LAYER)
173
+ if (circleSource){
174
+ let features = (((circleSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
175
+ let newData = features.map((feature) => {
176
+ return {
177
+ type: feature.type,
178
+ geometry: feature.geometry,
179
+ properties:{
180
+ view: feature.properties?.view,
181
+ muted: (feature.properties?.name == storm && feature.properties?.year == year) ? !checked : feature.properties?.muted,
182
+ name : feature.properties?.name,
183
+ year: feature.properties?.year,
184
+ windspeed: feature.properties?.windspeed,
185
+ category: feature.properties?.category,
186
+ time: feature.properties?.time,
187
+ latitude: feature.properties?.latitude,
188
+ longitude: feature.properties?.longitude,
189
+ location: feature.properties?.location,
190
+ checked: (feature.properties?.name == storm && feature.properties?.year == year) ? checked : feature.properties?.checked,
191
+ color: feature.properties?.color }}
192
+ }) as Feature<Geometry, GeoJsonProperties>[]
193
+ (circleSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
194
+ }
195
+ const lineSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_TRACK_LAYER)
196
+ if (lineSource){
197
+ let features = (((lineSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
198
+ let newData = features.map((feature) => {
199
+ return {
200
+ type: feature.type,
201
+ geometry: feature.geometry,
202
+ properties:{
203
+ view: feature.properties?.view,
204
+ muted: (feature.properties?.name == storm && feature.properties?.year == year) ? !checked : feature.properties?.muted,
205
+ name : feature.properties?.name,
206
+ year: feature.properties?.year,
207
+ category: feature.properties?.category,
208
+ checked: (feature.properties?.name == storm && feature.properties?.year == year) ? checked : feature.properties?.checked,
209
+ color: feature.properties?.color }}
210
+ }) as Feature<Geometry, GeoJsonProperties>[]
211
+ (lineSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
212
+ }
213
+ }
214
+ }
215
+
216
+ const focusOnStormTrack = (storm: string, year:number) => {
217
+ if(props.mapInstanceRef && props.mapInstanceRef.current){
218
+ const circleSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_LAYER)
219
+ if (circleSource){
220
+ let features = (((circleSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
221
+ let newData = features.map((feature) => {
222
+ return {
223
+ type: feature.type,
224
+ geometry: feature.geometry,
225
+ properties:{
226
+ view: feature.properties?.view,
227
+ muted: feature.properties?.checked ? false : (feature.properties?.name != storm || feature.properties?.year != year),
228
+ name : feature.properties?.name,
229
+ year: feature.properties?.year,
230
+ windspeed: feature.properties?.windspeed,
231
+ category: feature.properties?.category,
232
+ time: feature.properties?.time,
233
+ latitude: feature.properties?.latitude,
234
+ longitude: feature.properties?.longitude,
235
+ location: feature.properties?.location,
236
+ checked: feature.properties?.checked,
237
+ color: feature.properties?.color }}
238
+ }) as Feature<Geometry, GeoJsonProperties>[]
239
+ (circleSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
240
+ }
241
+ const lineSource = (props.mapInstanceRef.current as mapboxgl.Map).getSource(TROPICAL_STORM_TRACK_LAYER)
242
+ if (lineSource){
243
+ let features = (((lineSource as GeoJSONSource)._data as unknown) as FeatureCollection).features;
244
+ let newData = features.map((feature) => {
245
+ return {
246
+ type: feature.type,
247
+ geometry: feature.geometry,
248
+ properties:{
249
+ view: feature.properties?.view,
250
+ muted: feature.properties?.checked ? false : (feature.properties?.name != storm || feature.properties?.year != year),
251
+ name : feature.properties?.name,
252
+ year: feature.properties?.year,
253
+ category: feature.properties?.category,
254
+ checked: feature.properties?.checked,
255
+ color: feature.properties?.color }}
256
+ }) as Feature<Geometry, GeoJsonProperties>[]
257
+ (lineSource as GeoJSONSource).setData({type: 'FeatureCollection', features: newData})
258
+ }
259
+ }
260
+ }
261
+
262
+ return(
263
+ <div className="payout-info-container">
264
+ <h3 className="header">Storm Payouts
265
+ <Button onClick={handleBack} sx={{ fontSize:'0.7em', float:'right', ml:1}}>Back</Button>
266
+ <Button variant="contained" onClick={handleRestart} sx={{ fontSize:'0.7em', float:'right' }}>Restart</Button>
267
+ </h3>
268
+ {props.status == "loading" && <Box sx={{pl:3, pt:2}}><CircularProgress size={18}/><Typography sx={{ fontSize: '1.15em', display:'inline-block'}}>&nbsp;&nbsp;&nbsp;loading...</Typography></Box>}
269
+ {props.status == "idle" && <div className="scroll-container">
270
+ {props.stormPayouts.map((storm, index) => (
271
+ <div className={"card-container"} key={storm.name + storm.year} onMouseOver={() => {focusOnStormTrack(storm.name,storm.year)}} onMouseLeave={unfocusStormTracks}>
272
+ <Card sx={{ maxWidth: 345, border: '1px solid lightgray', borderRadius: 0, mr: '10px',ml: '10px', mb: '10px'}}>
273
+ <CardHeader
274
+ title={`${storm.name} ${storm.year}`}
275
+ titleTypographyProps={{sx:{fontSize:'1em', fontWeight:700}}}
276
+ subheader={`${maskDateString(storm.stormTrack[0].ISO_TIME)} to ${maskDateString(storm.stormTrack[storm.stormTrack.length - 1].ISO_TIME)}`}
277
+ subheaderTypographyProps={{sx:{fontSize:'0.9em',color:'black'}}}
278
+ />
279
+ <Checkbox onChange={(e) => {handleCheckboxClick(storm.name,storm.year,e)}} sx={{ float:'right', position:'relative', top:'-70px', left:'-5px'}} icon={<RadioButtonUncheckedOutlined />} checkedIcon={<RadioButtonChecked />} defaultChecked/>
280
+ <CardContent sx={{paddingTop:0}}>
281
+ <Typography variant="body2" sx={{ color: 'black', fontWeight: 700, marginBottom: '5px' }}>
282
+ Proxy:&nbsp;&nbsp;&nbsp;
283
+ {storm.proxy.windspeedMPH && <span style={{fontSize:'1em'}} className={`wind`}>{storm.proxy.windspeedMPH} MPH</span>}
284
+ {!storm.proxy.windspeedMPH && <span style={{fontSize:'1em'}} className={`wind`}>N/A</span>}
285
+ </Typography>
286
+
287
+ <Typography variant="body2" sx={{ color: 'black', fontWeight: 700, marginBottom: '5px' }}>
288
+ Anemometer:&nbsp;&nbsp;&nbsp;
289
+ {storm.anemometer.windspeedMPH && <span style={{fontSize:'1em'}} className={`wind`}>{storm.anemometer.windspeedMPH} MPH</span>}
290
+ {!storm.anemometer.windspeedMPH && <span style={{fontSize:'1em'}} className={`wind`}>N/A</span>}
291
+ </Typography>
292
+
293
+ <Typography variant="body2" sx={{ color: 'black', fontWeight: 700, marginBottom: '5px' }}>
294
+ CIAC:&nbsp;&nbsp;&nbsp;
295
+ {storm.ciac.category && <span style={{fontSize:'1em'}} className={`cat cat-${storm.ciac.category}`}>{maskStormCategory(storm.ciac.category as number)}</span>}
296
+ {!storm.ciac.category && <span style={{fontSize:'1em'}} className={`cat cat--10`}>{maskStormCategory(-10)}</span>}
297
+ </Typography>
298
+
299
+ <Typography variant="body2" sx={{ color: 'black', fontWeight: 700, marginTop: '15px'}}>
300
+ Policy Payout:
301
+ </Typography>
302
+ <Typography variant="body2" sx={{ color: 'black' }}>
303
+ {maskCurrency(storm.maxRecoveryAmount)}
304
+ </Typography>
305
+ </CardContent>
306
+ <CardActions sx={{position:'relative', top:-40, height:0}} disableSpacing>
307
+ <ExpandMore
308
+ expand={expanded[index]}
309
+ onClick={() => handleExpandClick(index)}
310
+ aria-expanded={expanded[index]}
311
+ aria-label="show more"
312
+ >
313
+ <ExpandMoreIcon />
314
+ </ExpandMore>
315
+ </CardActions>
316
+ <Collapse in={expanded[index]} timeout="auto" unmountOnExit>
317
+ <CardContent sx={{ borderTop:'1px solid lightgray' }}>
318
+ <List sx={{ width: '100%', maxWidth: 360, bgcolor: 'background.paper', paddingTop:0 }}>
319
+ <ListItem sx={{paddingLeft:0 }}>
320
+ <ListItemAvatar>
321
+ <Avatar sx={{backgroundColor: storm.maxRecovery == storm.proxy.proxyPayout ? '#0d47a1' : ''}}>
322
+ <AirIcon />
323
+ </Avatar>
324
+ </ListItemAvatar>
325
+ <ListItemText primary="Proxy Payout" primaryTypographyProps={{sx:{ fontSize:'0.85em', fontWeight: 700,color:'black'}}} secondaryTypographyProps={{color:'black'}} secondary={`${Math.round(storm.proxy.proxyPayout * 100)}%`} />
326
+ </ListItem>
327
+ <ListItem sx={{paddingLeft:0}}>
328
+ <ListItemAvatar>
329
+ <Avatar sx={{backgroundColor: storm.maxRecovery == storm.anemometer.anemometerPayout ? '#0d47a1' : ''}}>
330
+ <WindPowerIcon />
331
+ </Avatar>
332
+ </ListItemAvatar>
333
+ <ListItemText primary="Anemometer Payout" primaryTypographyProps={{sx:{ fontSize:'0.85em', fontWeight: 700,color:'black'}}} secondaryTypographyProps={{color:'black'}} secondary={`${Math.round(storm.anemometer.anemometerPayout * 100)}%`} />
334
+ </ListItem>
335
+ <ListItem sx={{paddingLeft:0}}>
336
+ <ListItemAvatar>
337
+ <Avatar sx={{backgroundColor: storm.maxRecovery == storm.ciac.ciacPayout ? '#0d47a1' : ''}}>
338
+ <CycloneIcon />
339
+ </Avatar>
340
+ </ListItemAvatar>
341
+ <ListItemText primary="CIAC Payout" primaryTypographyProps={{sx:{ fontSize:'0.85em', fontWeight: 700,color:'black'}}} secondaryTypographyProps={{color:'black'}} secondary={`${Math.round(storm.ciac.ciacPayout * 100)}%`} />
342
+ </ListItem>
343
+ <ListItem sx={{paddingLeft:0}}>
344
+ <ListItemAvatar>
345
+ <Avatar sx={{backgroundColor: '#0d47a1'}}>
346
+ <TrendingUpIcon />
347
+ </Avatar>
348
+ </ListItemAvatar>
349
+ <ListItemText primary="Max Payout" primaryTypographyProps={{sx:{ fontSize:'0.85em', fontWeight: 700,color:'black'}}} secondaryTypographyProps={{color:'black'}} secondary={`${Math.round(storm.maxRecovery * 100)}%`} />
350
+ </ListItem>
351
+ <ListItem sx={{paddingLeft:0}}>
352
+ <ListItemAvatar>
353
+ <Avatar sx={{backgroundColor:''}}>
354
+ <AttachMoneyIcon />
355
+ </Avatar>
356
+ </ListItemAvatar>
357
+ <ListItemText primary="Max Recovery Amount" primaryTypographyProps={{sx:{ fontSize:'0.85em', fontWeight: 700,color:'black'}}} secondaryTypographyProps={{color:'black'}} secondary={maskCurrency(storm.maxRecoveryAmount)} />
358
+ </ListItem>
359
+ </List>
360
+ </CardContent>
361
+ </Collapse>
362
+ </Card>
363
+ </div>
364
+ ))}
365
+ {props.stormPayouts.length == 0 && <Typography sx={{ fontSize: '1.15em', display:'inline-block', p:5 }}>No recovery payouts available...</Typography>}
366
+ </div>}
367
+ </div>
368
+ );
369
+ }
370
+
371
+ export default BackTestingPayoutInfo
@@ -0,0 +1,9 @@
1
+ import { StormPayout } from "../back-testing-map/back-testing-map.service"
2
+
3
+ export interface BackTestingPayoutInfoProps {
4
+ mapInstanceRef : React.MutableRefObject<any>
5
+ stormPayouts: StormPayout[],
6
+ status: 'loading'|'idle',
7
+ onBack?: () => void,
8
+ onRestart?: () => void
9
+ }
@@ -0,0 +1,30 @@
1
+ .stepper-container{
2
+ --icon-size: 2.5rem;
3
+ padding: 20px;
4
+ padding-right: 10px;
5
+ overflow-y:auto;
6
+ height: 100%;
7
+ }
8
+
9
+ .stepper-container .MuiStepConnector-line.MuiStepConnector-lineVertical {
10
+ margin-left:8px;
11
+ }
12
+
13
+ .stepper-container .MuiStepLabel-root .MuiStepLabel-iconContainer .MuiSvgIcon-root {
14
+ font-size: var(--icon-size);
15
+ }
16
+
17
+ .stepper-container .MuiStepLabel-root .MuiStepLabel-iconContainer circle {
18
+ font-size: var(--icon-size);
19
+ }
20
+
21
+ .stepper-container .MuiStepLabel-root.blue .MuiStepLabel-labelContainer .MuiStepLabel-label{
22
+ color:#448aff;
23
+ }
24
+
25
+
26
+ .stepper-container .MuiStepLabel-root .MuiStepLabel-labelContainer .MuiStepLabel-label{
27
+ font-size: 1.1rem;
28
+ font-weight: 600;
29
+ }
30
+