@@ -17,7 +17,11 @@ import {
17
17
TextFieldError ,
18
18
TextFieldHint ,
19
19
} from '@oxide/ui'
20
- import type { ErrorResponse , VpcFirewallRule } from '@oxide/api'
20
+ import type {
21
+ ErrorResponse ,
22
+ VpcFirewallRule ,
23
+ VpcFirewallRuleUpdate ,
24
+ } from '@oxide/api'
21
25
import {
22
26
parsePortRange ,
23
27
useApiMutation ,
@@ -365,6 +369,21 @@ const CommonForm = ({ id, error }: FormProps) => {
365
369
)
366
370
}
367
371
372
+ const valuesToRuleUpdate = ( values : Values ) : VpcFirewallRuleUpdate => ( {
373
+ name : values . name ,
374
+ status : values . enabled ? 'enabled' : 'disabled' ,
375
+ action : values . action ,
376
+ description : values . description ,
377
+ direction : values . direction ,
378
+ filters : {
379
+ hosts : values . hosts ,
380
+ ports : values . ports ,
381
+ protocols : values . protocols ,
382
+ } ,
383
+ priority : parseInt ( values . priority , 10 ) ,
384
+ targets : values . targets ,
385
+ } )
386
+
368
387
type CreateProps = {
369
388
isOpen : boolean
370
389
onDismiss : ( ) => void
@@ -386,11 +405,11 @@ export function CreateFirewallRuleModal({
386
405
const queryClient = useApiQueryClient ( )
387
406
388
407
function dismiss ( ) {
389
- createRule . reset ( )
408
+ updateRules . reset ( )
390
409
onDismiss ( )
391
410
}
392
411
393
- const createRule = useApiMutation ( 'vpcFirewallRulesPut' , {
412
+ const updateRules = useApiMutation ( 'vpcFirewallRulesPut' , {
394
413
onSuccess ( ) {
395
414
queryClient . invalidateQueries ( 'vpcFirewallRulesGet' , parentIds )
396
415
dismiss ( )
@@ -444,36 +463,19 @@ export function CreateFirewallRuleModal({
444
463
. required ( 'Required' ) ,
445
464
} ) }
446
465
validateOnBlur
447
- onSubmit = { ( { name , ... values } ) => {
448
- const rules = existingRules
449
- . filter ( ( r ) => r . name !== name )
466
+ onSubmit = { ( values ) => {
467
+ const otherRules = existingRules
468
+ . filter ( ( r ) => r . name !== values . name )
450
469
. map ( firewallRuleGetToPut )
451
-
452
- createRule . mutate ( {
470
+ updateRules . mutate ( {
453
471
...parentIds ,
454
472
body : {
455
- rules : [
456
- ...rules ,
457
- {
458
- name,
459
- status : values . enabled ? 'enabled' : 'disabled' ,
460
- action : values . action ,
461
- description : values . description ,
462
- direction : values . direction ,
463
- filters : {
464
- hosts : values . hosts ,
465
- ports : values . ports ,
466
- protocols : values . protocols ,
467
- } ,
468
- priority : parseInt ( values . priority , 10 ) ,
469
- targets : values . targets ,
470
- } ,
471
- ] ,
473
+ rules : [ ...otherRules , valuesToRuleUpdate ( values ) ] ,
472
474
} ,
473
475
} )
474
476
} }
475
477
>
476
- < CommonForm id = { formId } error = { createRule . error } />
478
+ < CommonForm id = { formId } error = { updateRules . error } />
477
479
</ Formik >
478
480
< SideModal . Footer >
479
481
< Button variant = "dim" className = "mr-2.5" onClick = { dismiss } >
@@ -493,6 +495,7 @@ type EditProps = {
493
495
projectName : string
494
496
vpcName : string
495
497
originalRule : VpcFirewallRule | null
498
+ existingRules : VpcFirewallRule [ ]
496
499
}
497
500
498
501
// TODO: this whole thing. shouldn't take much to fill in the initialValues
@@ -503,16 +506,17 @@ export function EditFirewallRuleModal({
503
506
projectName,
504
507
vpcName,
505
508
originalRule,
509
+ existingRules,
506
510
} : EditProps ) {
507
511
const parentIds = { orgName, projectName, vpcName }
508
512
const queryClient = useApiQueryClient ( )
509
513
510
514
function dismiss ( ) {
511
- updateRule . reset ( )
515
+ updateRules . reset ( )
512
516
onDismiss ( )
513
517
}
514
518
515
- const updateRule = useApiMutation ( 'vpcFirewallRulesPut' , {
519
+ const updateRules = useApiMutation ( 'vpcFirewallRulesPut' , {
516
520
onSuccess ( ) {
517
521
queryClient . invalidateQueries ( 'vpcFirewallRulesGet' , parentIds )
518
522
dismiss ( )
@@ -529,21 +533,47 @@ export function EditFirewallRuleModal({
529
533
onDismiss = { dismiss }
530
534
>
531
535
< Formik
532
- initialValues = { {
533
- name : originalRule . name ,
534
- description : originalRule . description ,
535
- } }
536
- onSubmit = { ( _values ) => {
537
- // updateRule.mutate({
538
- // ...parentIds,
539
- // body: {
540
- // name,
541
- // description,
542
- // },
543
- // })
536
+ initialValues = {
537
+ {
538
+ enabled : originalRule . status === 'enabled' ,
539
+ name : originalRule . name ,
540
+ description : originalRule . description ,
541
+
542
+ priority : originalRule . priority . toString ( ) ,
543
+ action : originalRule . action ,
544
+ direction : originalRule . direction ,
545
+
546
+ protocols : originalRule . filters . protocols || [ ] ,
547
+
548
+ // port subform
549
+ ports : originalRule . filters . ports || [ ] ,
550
+ portRange : '' ,
551
+
552
+ // host subform
553
+ hosts : originalRule . filters . hosts || [ ] ,
554
+ hostType : '' ,
555
+ hostValue : '' ,
556
+
557
+ // target subform
558
+ targets : originalRule . targets ,
559
+ targetType : '' ,
560
+ targetValue : '' ,
561
+ } as Values // best way to tell formik this type
562
+ }
563
+ onSubmit = { ( values ) => {
564
+ // note different filter logic from create: filter by the *original* name
565
+ const otherRules = existingRules
566
+ . filter ( ( r ) => r . name !== originalRule . name )
567
+ . map ( firewallRuleGetToPut )
568
+ updateRules . mutate ( {
569
+ ...parentIds ,
570
+ body : {
571
+ rules : [ ...otherRules , valuesToRuleUpdate ( values ) ] ,
572
+ } ,
573
+ } )
544
574
} }
545
575
>
546
- < CommonForm id = { formId } error = { updateRule . error } />
576
+ < CommonForm id = { formId } error = { updateRules . error } />
547
577
</ Formik >
548
578
< SideModal . Footer >
549
579
< Button variant = "dim" className = "mr-2.5" onClick = { dismiss } >
0 commit comments