EverydayTech Platform - Developer Reference
Complete Source Code Documentation - All Applications
Loading...
Searching...
No Matches
DomainFormModal.jsx
Go to the documentation of this file.
1export default function DomainFormModal({
2 showModal,
3 editingDomain,
4 formData,
5 setFormData,
6 customers,
7 contracts,
8 onSubmit,
9 onClose
10}) {
11 if (!showModal) return null;
12
13 const handleSubmit = (e) => {
14 e.preventDefault();
15 onSubmit(formData, editingDomain);
16 };
17
18 return (
19 <div className="modal-overlay" onClick={onClose}>
20 <div className="modal-content" onClick={(e) => e.stopPropagation()}>
21 <div className="modal-header">
22 <h2>{editingDomain ? 'Edit Domain' : 'Register New Domain'}</h2>
23 <button className="modal-close" onClick={onClose}>
24 <span className="material-symbols-outlined">close</span>
25 </button>
26 </div>
27 <form onSubmit={handleSubmit}>
28 <div className="modal-body">
29 <div className="form-row">
30 <div className="form-group">
31 <label>Domain Name *</label>
32 <input
33 type="text"
34 value={formData.domain_name}
35 onChange={(e) => setFormData({ ...formData, domain_name: e.target.value })}
36 placeholder="example.com"
37 required
38 />
39 </div>
40 <div className="form-group">
41 <label>Customer *</label>
42 <select
43 value={formData.customer_id}
44 onChange={(e) => setFormData({ ...formData, customer_id: e.target.value })}
45 required
46 >
47 <option value="">Select customer...</option>
48 {customers.map((c) => (
49 <option key={c.customer_id} value={c.customer_id}>
50 {c.name}
51 </option>
52 ))}
53 </select>
54 </div>
55 </div>
56
57 <div className="form-row">
58 <div className="form-group">
59 <label>Registrar *</label>
60 <select
61 value={formData.registrar}
62 onChange={(e) => setFormData({ ...formData, registrar: e.target.value })}
63 required
64 >
65 <option value="enom">Enom</option>
66 <option value="moniker">Moniker</option>
67 <option value="cloudflare">Cloudflare</option>
68 <option value="other">Other</option>
69 </select>
70 </div>
71 <div className="form-group">
72 <label>Status *</label>
73 <select
74 value={formData.status}
75 onChange={(e) => setFormData({ ...formData, status: e.target.value })}
76 required
77 >
78 <option value="active">Active</option>
79 <option value="pending">Pending</option>
80 <option value="expired">Expired</option>
81 <option value="cancelled">Cancelled</option>
82 </select>
83 </div>
84 </div>
85
86 <div className="form-row">
87 <div className="form-group">
88 <label>Registration Date</label>
89 <input
90 type="date"
91 value={formData.registration_date}
92 onChange={(e) => setFormData({ ...formData, registration_date: e.target.value })}
93 />
94 </div>
95 <div className="form-group">
96 <label>Expiry Date *</label>
97 <input
98 type="date"
99 value={formData.expiry_date}
100 onChange={(e) => setFormData({ ...formData, expiry_date: e.target.value })}
101 required
102 />
103 </div>
104 </div>
105
106 <div className="form-row">
107 <div className="form-group">
108 <label>Contract (Optional)</label>
109 <select
110 value={formData.contract_id}
111 onChange={(e) => setFormData({ ...formData, contract_id: e.target.value })}
112 >
113 <option value="">No contract</option>
114 {contracts.map((c) => (
115 <option key={c.contract_id} value={c.contract_id}>
116 {c.title}
117 </option>
118 ))}
119 </select>
120 <small>Link this domain to a contract for automated billing</small>
121 </div>
122 <div className="form-group">
123 <label>DNS Provider</label>
124 <input
125 type="text"
126 value={formData.dns_provider}
127 onChange={(e) => setFormData({ ...formData, dns_provider: e.target.value })}
128 placeholder="Cloudflare, Route53, etc."
129 />
130 </div>
131 </div>
132
133 <div className="form-group">
134 <label>Nameservers (one per line)</label>
135 <textarea
136 value={formData.nameservers}
137 onChange={(e) => setFormData({ ...formData, nameservers: e.target.value })}
138 placeholder="ns1.example.com&#10;ns2.example.com"
139 rows="3"
140 />
141 </div>
142
143 <div className="form-group">
144 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
145 <input
146 type="checkbox"
147 checked={formData.auto_renew}
148 onChange={(e) => setFormData({ ...formData, auto_renew: e.target.checked })}
149 />
150 <span>Enable auto-renewal</span>
151 </label>
152 </div>
153
154 <div className="form-group">
155 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
156 <input
157 type="checkbox"
158 checked={formData.privacy_protection}
159 onChange={(e) => setFormData({ ...formData, privacy_protection: e.target.checked })}
160 />
161 <span>Privacy protection (WHOIS privacy)</span>
162 </label>
163 </div>
164
165 {!editingDomain && formData.registrar === 'cloudflare' && (
166 <div className="form-group">
167 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
168 <input
169 type="checkbox"
170 checked={formData.create_zone !== false}
171 onChange={(e) => setFormData({ ...formData, create_zone: e.target.checked })}
172 />
173 <span>Create DNS zone in Cloudflare</span>
174 <small style={{ marginLeft: 'auto', color: '#666' }}>Recommended</small>
175 </label>
176 <small style={{ display: 'block', marginTop: '4px', color: '#666' }}>
177 Automatically creates a DNS zone for this domain in Cloudflare
178 </small>
179 </div>
180 )}
181
182 <div className="form-group">
183 <label>Notes</label>
184 <textarea
185 value={formData.notes}
186 onChange={(e) => setFormData({ ...formData, notes: e.target.value })}
187 placeholder="Additional notes about this domain..."
188 rows="3"
189 />
190 </div>
191 </div>
192 <div className="modal-footer">
193 <button type="button" className="btn btn-secondary" onClick={onClose}>
194 Cancel
195 </button>
196 <button type="submit" className="btn btn-primary">
197 {editingDomain ? 'Update Domain' : 'Register Domain'}
198 </button>
199 </div>
200 </form>
201 </div>
202 </div>
203 );
204}