@@ -14,7 +14,7 @@ import {
1414} from '@/components/ui/dialog' ;
1515import { DropdownMenu , DropdownMenuContent , DropdownMenuItem , DropdownMenuSeparator , DropdownMenuTrigger } from '@/components/ui/dropdown-menu' ;
1616import { Button } from '@/components/ui/button' ;
17- import { useForm } from '@inertiajs/react' ;
17+ import { useForm , usePage } from '@inertiajs/react' ;
1818import { LoaderCircleIcon , MoreVerticalIcon } from 'lucide-react' ;
1919import FormSuccessful from '@/components/form-successful' ;
2020import { FormEvent , useState } from 'react' ;
@@ -23,24 +23,41 @@ import { Form, FormField, FormFields } from '@/components/ui/form';
2323import { Label } from '@/components/ui/label' ;
2424import { Input } from '@/components/ui/input' ;
2525import { Checkbox } from '@/components/ui/checkbox' ;
26+ import { SharedData } from '@/types' ;
27+ import { DynamicFieldConfig } from '@/types/dynamic-field-config' ;
28+ import DynamicFieldComponent from '@/components/ui/dynamic-field' ;
2629
2730function Edit ( { dnsProvider } : { dnsProvider : DNSProvider } ) {
2831 const [ open , setOpen ] = useState ( false ) ;
29- const form = useForm ( {
32+ const page = usePage < SharedData > ( ) ;
33+ const providerConfig = page . props . configs . dns_provider . providers [ dnsProvider . provider ] ;
34+ const editFields : DynamicFieldConfig [ ] = providerConfig ?. edit_form || [ ] ;
35+
36+ const initialData : Record < string , string | number | boolean | string [ ] > = {
3037 name : dnsProvider . name ,
3138 global : dnsProvider . project_id === null ,
39+ } ;
40+
41+ // Pre-fill editable (non-sensitive) data, leave credential fields empty
42+ editFields . forEach ( ( field ) => {
43+ initialData [ field . name ] = dnsProvider . editable_data ?. [ field . name ] ?? '' ;
3244 } ) ;
3345
46+ const form = useForm ( initialData ) ;
47+
3448 const submit = ( e : FormEvent ) => {
3549 e . preventDefault ( ) ;
36- form . patch ( route ( 'dns-providers.update' , dnsProvider . id ) ) ;
50+ form . patch ( route ( 'dns-providers.update' , dnsProvider . id ) , {
51+ onSuccess : ( ) => setOpen ( false ) ,
52+ } ) ;
3753 } ;
54+
3855 return (
3956 < Dialog open = { open } onOpenChange = { setOpen } >
4057 < DialogTrigger asChild >
4158 < DropdownMenuItem onSelect = { ( e ) => e . preventDefault ( ) } > Edit</ DropdownMenuItem >
4259 </ DialogTrigger >
43- < DialogContent >
60+ < DialogContent className = "max-h-screen overflow-y-auto sm:max-w-xl" >
4461 < DialogHeader >
4562 < DialogTitle > Edit { dnsProvider . name } </ DialogTitle >
4663 < DialogDescription className = "sr-only" > Edit DNS provider</ DialogDescription >
@@ -49,16 +66,26 @@ function Edit({ dnsProvider }: { dnsProvider: DNSProvider }) {
4966 < FormFields >
5067 < FormField >
5168 < Label htmlFor = "name" > Name</ Label >
52- < Input type = "text" id = "name" name = "name" value = { form . data . name } onChange = { ( e ) => form . setData ( 'name' , e . target . value ) } />
69+ < Input type = "text" id = "name" name = "name" value = { form . data . name as string } onChange = { ( e ) => form . setData ( 'name' , e . target . value ) } />
5370 < InputError message = { form . errors . name } />
5471 </ FormField >
72+ { editFields . map ( ( field : DynamicFieldConfig ) => (
73+ < DynamicFieldComponent
74+ key = { `edit-field-${ field . name } ` }
75+ value = { form . data [ field . name ] }
76+ onChange = { ( value ) => form . setData ( field . name , value ) }
77+ config = { field }
78+ error = { form . errors [ field . name ] }
79+ />
80+ ) ) }
5581 < FormField >
5682 < div className = "flex items-center space-x-3" >
57- < Checkbox id = "global" name = "global" checked = { form . data . global } onClick = { ( ) => form . setData ( 'global' , ! form . data . global ) } />
83+ < Checkbox id = "global" name = "global" checked = { form . data . global as boolean } onClick = { ( ) => form . setData ( 'global' , ! form . data . global ) } />
5884 < Label htmlFor = "global" > Is global (accessible in all projects)</ Label >
5985 </ div >
6086 < InputError message = { form . errors . global } />
6187 </ FormField >
88+ < InputError message = { form . errors . provider } />
6289 </ FormFields >
6390 </ Form >
6491 < DialogFooter >
0 commit comments