1export default function DomainFormModal({
11 if (!showModal) return null;
13 const handleSubmit = (e) => {
15 onSubmit(formData, editingDomain);
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>
27 <form onSubmit={handleSubmit}>
28 <div className="modal-body">
29 <div className="form-row">
30 <div className="form-group">
31 <label>Domain Name *</label>
34 value={formData.domain_name}
35 onChange={(e) => setFormData({ ...formData, domain_name: e.target.value })}
36 placeholder="example.com"
40 <div className="form-group">
41 <label>Customer *</label>
43 value={formData.customer_id}
44 onChange={(e) => setFormData({ ...formData, customer_id: e.target.value })}
47 <option value="">Select customer...</option>
48 {customers.map((c) => (
49 <option key={c.customer_id} value={c.customer_id}>
57 <div className="form-row">
58 <div className="form-group">
59 <label>Registrar *</label>
61 value={formData.registrar}
62 onChange={(e) => setFormData({ ...formData, registrar: e.target.value })}
65 <option value="enom">Enom</option>
66 <option value="moniker">Moniker</option>
67 <option value="cloudflare">Cloudflare</option>
68 <option value="other">Other</option>
71 <div className="form-group">
72 <label>Status *</label>
74 value={formData.status}
75 onChange={(e) => setFormData({ ...formData, status: e.target.value })}
78 <option value="active">Active</option>
79 <option value="pending">Pending</option>
80 <option value="expired">Expired</option>
81 <option value="cancelled">Cancelled</option>
86 <div className="form-row">
87 <div className="form-group">
88 <label>Registration Date</label>
91 value={formData.registration_date}
92 onChange={(e) => setFormData({ ...formData, registration_date: e.target.value })}
95 <div className="form-group">
96 <label>Expiry Date *</label>
99 value={formData.expiry_date}
100 onChange={(e) => setFormData({ ...formData, expiry_date: e.target.value })}
106 <div className="form-row">
107 <div className="form-group">
108 <label>Contract (Optional)</label>
110 value={formData.contract_id}
111 onChange={(e) => setFormData({ ...formData, contract_id: e.target.value })}
113 <option value="">No contract</option>
114 {contracts.map((c) => (
115 <option key={c.contract_id} value={c.contract_id}>
120 <small>Link this domain to a contract for automated billing</small>
122 <div className="form-group">
123 <label>DNS Provider</label>
126 value={formData.dns_provider}
127 onChange={(e) => setFormData({ ...formData, dns_provider: e.target.value })}
128 placeholder="Cloudflare, Route53, etc."
133 <div className="form-group">
134 <label>Nameservers (one per line)</label>
136 value={formData.nameservers}
137 onChange={(e) => setFormData({ ...formData, nameservers: e.target.value })}
138 placeholder="ns1.example.com ns2.example.com"
143 <div className="form-group">
144 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
147 checked={formData.auto_renew}
148 onChange={(e) => setFormData({ ...formData, auto_renew: e.target.checked })}
150 <span>Enable auto-renewal</span>
154 <div className="form-group">
155 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
158 checked={formData.privacy_protection}
159 onChange={(e) => setFormData({ ...formData, privacy_protection: e.target.checked })}
161 <span>Privacy protection (WHOIS privacy)</span>
165 {!editingDomain && formData.registrar === 'cloudflare' && (
166 <div className="form-group">
167 <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>
170 checked={formData.create_zone !== false}
171 onChange={(e) => setFormData({ ...formData, create_zone: e.target.checked })}
173 <span>Create DNS zone in Cloudflare</span>
174 <small style={{ marginLeft: 'auto', color: '#666' }}>Recommended</small>
176 <small style={{ display: 'block', marginTop: '4px', color: '#666' }}>
177 Automatically creates a DNS zone for this domain in Cloudflare
182 <div className="form-group">
185 value={formData.notes}
186 onChange={(e) => setFormData({ ...formData, notes: e.target.value })}
187 placeholder="Additional notes about this domain..."
192 <div className="modal-footer">
193 <button type="button" className="btn btn-secondary" onClick={onClose}>
196 <button type="submit" className="btn btn-primary">
197 {editingDomain ? 'Update Domain' : 'Register Domain'}