@@ -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,26 +495,26 @@ type EditProps = {
493
495
projectName : string
494
496
vpcName : string
495
497
originalRule : VpcFirewallRule | null
498
+ existingRules : VpcFirewallRule [ ]
496
499
}
497
500
498
- // TODO: this whole thing. shouldn't take much to fill in the initialValues
499
- // based on the rule being edited
500
501
export function EditFirewallRuleModal ( {
501
502
onDismiss,
502
503
orgName,
503
504
projectName,
504
505
vpcName,
505
506
originalRule,
507
+ existingRules,
506
508
} : EditProps ) {
507
509
const parentIds = { orgName, projectName, vpcName }
508
510
const queryClient = useApiQueryClient ( )
509
511
510
512
function dismiss ( ) {
511
- updateRule . reset ( )
513
+ updateRules . reset ( )
512
514
onDismiss ( )
513
515
}
514
516
515
- const updateRule = useApiMutation ( 'vpcFirewallRulesPut' , {
517
+ const updateRules = useApiMutation ( 'vpcFirewallRulesPut' , {
516
518
onSuccess ( ) {
517
519
queryClient . invalidateQueries ( 'vpcFirewallRulesGet' , parentIds )
518
520
dismiss ( )
@@ -529,21 +531,47 @@ export function EditFirewallRuleModal({
529
531
onDismiss = { dismiss }
530
532
>
531
533
< 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
- // })
534
+ initialValues = {
535
+ {
536
+ enabled : originalRule . status === 'enabled' ,
537
+ name : originalRule . name ,
538
+ description : originalRule . description ,
539
+
540
+ priority : originalRule . priority . toString ( ) ,
541
+ action : originalRule . action ,
542
+ direction : originalRule . direction ,
543
+
544
+ protocols : originalRule . filters . protocols || [ ] ,
545
+
546
+ // port subform
547
+ ports : originalRule . filters . ports || [ ] ,
548
+ portRange : '' ,
549
+
550
+ // host subform
551
+ hosts : originalRule . filters . hosts || [ ] ,
552
+ hostType : '' ,
553
+ hostValue : '' ,
554
+
555
+ // target subform
556
+ targets : originalRule . targets ,
557
+ targetType : '' ,
558
+ targetValue : '' ,
559
+ } as Values // best way to tell formik this type
560
+ }
561
+ onSubmit = { ( values ) => {
562
+ // note different filter logic from create: filter by the *original* name
563
+ const otherRules = existingRules
564
+ . filter ( ( r ) => r . name !== originalRule . name )
565
+ . map ( firewallRuleGetToPut )
566
+ updateRules . mutate ( {
567
+ ...parentIds ,
568
+ body : {
569
+ rules : [ ...otherRules , valuesToRuleUpdate ( values ) ] ,
570
+ } ,
571
+ } )
544
572
} }
545
573
>
546
- < CommonForm id = { formId } error = { updateRule . error } />
574
+ < CommonForm id = { formId } error = { updateRules . error } />
547
575
</ Formik >
548
576
< SideModal . Footer >
549
577
< Button variant = "dim" className = "mr-2.5" onClick = { dismiss } >
0 commit comments