5
5
*
6
6
* Copyright Oxide Computer Company
7
7
*/
8
- import { createRoutesFromElements , Navigate , Route } from 'react-router-dom'
8
+ import { createRoutesFromElements , Navigate , Route , type UIMatch } from 'react-router-dom'
9
9
10
10
import { RouterDataErrorBoundary } from './components/ErrorBoundary'
11
11
import { NotFound } from './components/ErrorPage'
@@ -118,7 +118,11 @@ export const routes = createRoutesFromElements(
118
118
// very important. see `currentUserLoader` and `useCurrentUser`
119
119
shouldRevalidate = { ( ) => true }
120
120
>
121
- < Route path = "settings" handle = { { crumb : 'Settings' } } element = { < SettingsLayout /> } >
121
+ < Route
122
+ path = "settings"
123
+ handle = { { crumb : 'Settings' , crumbPath : pb . profile ( ) } }
124
+ element = { < SettingsLayout /> }
125
+ >
122
126
< Route index element = { < Navigate to = "profile" replace /> } />
123
127
< Route path = "profile" element = { < ProfilePage /> } handle = { { crumb : 'Profile' } } />
124
128
< Route
@@ -136,8 +140,12 @@ export const routes = createRoutesFromElements(
136
140
</ Route >
137
141
138
142
< Route path = "system" element = { < SystemLayout /> } loader = { SystemLayout . loader } >
139
- < Route element = { < SilosPage /> } loader = { SilosPage . loader } >
140
- < Route path = "silos" element = { null } handle = { { crumb : 'Silos' } } />
143
+ < Route
144
+ element = { < SilosPage /> }
145
+ loader = { SilosPage . loader }
146
+ handle = { { crumb : 'Silos' , crumbPath : pb . silos ( ) } }
147
+ >
148
+ < Route path = "silos" element = { null } />
141
149
< Route path = "silos-new" element = { < CreateSiloSideModalForm /> } />
142
150
</ Route >
143
151
< Route path = "silos" handle = { { crumb : 'Silos' } } >
@@ -167,7 +175,7 @@ export const routes = createRoutesFromElements(
167
175
path = "inventory"
168
176
element = { < InventoryPage /> }
169
177
loader = { InventoryPage . loader }
170
- handle = { { crumb : 'Inventory' } }
178
+ handle = { { crumb : 'Inventory' , crumbPath : pb . sledInventory ( ) } }
171
179
>
172
180
< Route index element = { < Navigate to = "sleds" replace /> } loader = { SledsTab . loader } />
173
181
< Route
@@ -242,9 +250,6 @@ export const routes = createRoutesFromElements(
242
250
243
251
< Route index element = { < Navigate to = { pb . projects ( ) } replace /> } />
244
252
245
- { /* These are done here instead of nested so we don't flash a layout on 404s */ }
246
- < Route path = "projects/:project" element = { < Navigate to = "instances" replace /> } />
247
-
248
253
< Route element = { < SiloLayout /> } >
249
254
< Route
250
255
path = "images"
@@ -311,7 +316,10 @@ export const routes = createRoutesFromElements(
311
316
path = ":project"
312
317
element = { < ProjectLayout overrideContentPane = { < SerialConsoleContentPane /> } /> }
313
318
loader = { ProjectLayout . loader }
314
- handle = { { crumb : projectCrumb } }
319
+ handle = { {
320
+ crumb : projectCrumb ,
321
+ crumbPath : ( { params } : UIMatch ) => pb . project ( { project : params . project ! } ) ,
322
+ } }
315
323
>
316
324
< Route path = "instances" handle = { { crumb : 'Instances' } } >
317
325
< Route path = ":instance" handle = { { crumb : instanceCrumb } } >
@@ -329,8 +337,12 @@ export const routes = createRoutesFromElements(
329
337
path = ":project"
330
338
element = { < ProjectLayout /> }
331
339
loader = { ProjectLayout . loader }
332
- handle = { { crumb : projectCrumb } }
340
+ handle = { {
341
+ crumb : projectCrumb ,
342
+ crumbPath : ( { params } : UIMatch ) => pb . project ( { project : params . project ! } ) ,
343
+ } }
333
344
>
345
+ < Route index element = { < Navigate to = "instances" replace /> } />
334
346
< Route
335
347
path = "instances-new"
336
348
element = { < CreateInstanceForm /> }
@@ -339,7 +351,14 @@ export const routes = createRoutesFromElements(
339
351
/>
340
352
< Route path = "instances" handle = { { crumb : 'Instances' } } >
341
353
< Route index element = { < InstancesPage /> } loader = { InstancesPage . loader } />
342
- < Route path = ":instance" handle = { { crumb : instanceCrumb } } >
354
+ < Route
355
+ path = ":instance"
356
+ handle = { {
357
+ crumb : instanceCrumb ,
358
+ crumbPath : ( { params } : UIMatch ) =>
359
+ pb . instance ( { project : params . project ! , instance : params . instance ! } ) ,
360
+ } }
361
+ >
343
362
< Route index element = { < Navigate to = "storage" replace /> } />
344
363
< Route element = { < InstancePage /> } loader = { InstancePage . loader } >
345
364
< Route
@@ -370,7 +389,14 @@ export const routes = createRoutesFromElements(
370
389
</ Route >
371
390
</ Route >
372
391
373
- < Route loader = { VpcsPage . loader } handle = { { crumb : 'VPCs' } } element = { < VpcsPage /> } >
392
+ < Route
393
+ loader = { VpcsPage . loader }
394
+ handle = { {
395
+ crumb : 'VPCs' ,
396
+ crumbPath : ( m : UIMatch ) => pb . vpcs ( { project : m . params . project ! } ) ,
397
+ } }
398
+ element = { < VpcsPage /> }
399
+ >
374
400
< Route path = "vpcs" element = { null } />
375
401
< Route
376
402
path = "vpcs-new"
@@ -380,7 +406,14 @@ export const routes = createRoutesFromElements(
380
406
</ Route >
381
407
382
408
< Route path = "vpcs" handle = { { crumb : 'VPCs' } } >
383
- < Route path = ":vpc" handle = { { crumb : vpcCrumb } } >
409
+ < Route
410
+ path = ":vpc"
411
+ handle = { {
412
+ crumb : vpcCrumb ,
413
+ crumbPath : ( { params } : UIMatch ) =>
414
+ pb . vpc ( { project : params . project ! , vpc : params . vpc ! } ) ,
415
+ } }
416
+ >
384
417
< Route element = { < VpcPage /> } loader = { VpcPage . loader } >
385
418
< Route
386
419
index
@@ -422,7 +455,7 @@ export const routes = createRoutesFromElements(
422
455
loader = { VpcSubnetsTab . loader }
423
456
handle = { { crumb : 'Subnets' } }
424
457
>
425
- < Route path = "subnets" />
458
+ < Route path = "subnets" element = { null } />
426
459
< Route
427
460
path = "subnets-new"
428
461
element = { < CreateSubnetForm /> }
@@ -445,7 +478,7 @@ export const routes = createRoutesFromElements(
445
478
path = ":router/edit"
446
479
element = { < EditRouterSideModalForm /> }
447
480
loader = { EditRouterSideModalForm . loader }
448
- handle = { { crumb : 'Edit Router' } }
481
+ handle = { { crumb : 'Edit Router' , titleOnly : true } }
449
482
/>
450
483
</ Route >
451
484
< Route
@@ -488,7 +521,10 @@ export const routes = createRoutesFromElements(
488
521
< Route
489
522
element = { < FloatingIpsPage /> }
490
523
loader = { FloatingIpsPage . loader }
491
- handle = { { crumb : 'Floating IPs' } }
524
+ handle = { {
525
+ crumb : 'Floating IPs' ,
526
+ crumbPath : ( m : UIMatch ) => pb . floatingIps ( { project : m . params . project ! } ) ,
527
+ } }
492
528
>
493
529
< Route path = "floating-ips" element = { null } />
494
530
< Route
@@ -506,7 +542,10 @@ export const routes = createRoutesFromElements(
506
542
507
543
< Route
508
544
element = { < DisksPage /> }
509
- handle = { { crumb : 'Disks' } }
545
+ handle = { {
546
+ crumb : 'Disks' ,
547
+ crumbPath : ( m : UIMatch ) => pb . disks ( { project : m . params . project ! } ) ,
548
+ } }
510
549
loader = { DisksPage . loader }
511
550
>
512
551
< Route path = "disks" element = { null } />
@@ -523,7 +562,10 @@ export const routes = createRoutesFromElements(
523
562
524
563
< Route
525
564
element = { < SnapshotsPage /> }
526
- handle = { { crumb : 'Snapshots' } }
565
+ handle = { {
566
+ crumb : 'Snapshots' ,
567
+ crumbPath : ( m : UIMatch ) => pb . snapshots ( { project : m . params . project ! } ) ,
568
+ } }
527
569
loader = { SnapshotsPage . loader }
528
570
>
529
571
< Route path = "snapshots" element = { null } />
@@ -542,7 +584,10 @@ export const routes = createRoutesFromElements(
542
584
543
585
< Route
544
586
element = { < ImagesPage /> }
545
- handle = { { crumb : 'Images' } }
587
+ handle = { {
588
+ crumb : 'Images' ,
589
+ crumbPath : ( m : UIMatch ) => pb . projectImages ( { project : m . params . project ! } ) ,
590
+ } }
546
591
loader = { ImagesPage . loader }
547
592
>
548
593
< Route path = "images" element = { null } />
0 commit comments