From 2cbb9aaa657b670fdc7552e7eb692046a9d2e59e Mon Sep 17 00:00:00 2001 From: Chaim Date: Mon, 30 Mar 2026 10:02:05 +0000 Subject: [PATCH] feat: auto-assign extensions + form validation - Backend: new customers auto-get all active extensions assigned - Frontend: required field validation (name, URL, credentials) - Frontend: removed manual "add extension" dropdown (auto-assigned) Co-Authored-By: Claude Opus 4.6 (1M context) --- dashboard/src/App.jsx | 18 ++++++++---------- server.py | 9 ++++++++- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/dashboard/src/App.jsx b/dashboard/src/App.jsx index 888d248..cc75da5 100644 --- a/dashboard/src/App.jsx +++ b/dashboard/src/App.jsx @@ -179,7 +179,13 @@ function CustomerForm({ onDone, onCancel, customer }) { } } + const [error, setError] = useState('') + const submit = async () => { + if (!form.name.trim()) { setError('שם לקוח הוא שדה חובה'); return } + if (!form.espocrm_url.trim()) { setError('EspoCRM URL הוא שדה חובה'); return } + if (!isEdit && !form.espocrm_api_key) { setError('יש להזין שם משתמש וסיסמה'); return } + setError('') const payload = { ...form } if (!payload.espocrm_api_key) delete payload.espocrm_api_key const url = isEdit ? `${API}/customers/${customer.id}` : `${API}/customers` @@ -223,6 +229,7 @@ function CustomerForm({ onDone, onCancel, customer }) {

השאר ריק כדי לא לשנות

)} + {error &&

{error}

}
) } diff --git a/server.py b/server.py index ef8621f..d2953b8 100644 --- a/server.py +++ b/server.py @@ -541,7 +541,14 @@ class APIHandler(BaseHTTPRequestHandler): VALUES (%s,%s,%s,%s,%s,%s,%s,%s) RETURNING id""", (body['name'], body.get('email'), body['espocrm_url'], body['espocrm_api_key'], body.get('coolify_url'), body.get('coolify_token'), body.get('coolify_app_uuid'), body.get('notes')), fetch='one') - self._respond(201, {'id': row['id'], 'name': body['name']}) + cid = row['id'] + # Auto-assign all active extensions to new customer + all_exts = query("SELECT id FROM extensions WHERE is_active", fetch='all') + for ext in all_exts: + query("""INSERT INTO customer_extensions (customer_id, extension_id, auto_update, license_status) + VALUES (%s, %s, true, 'active') ON CONFLICT DO NOTHING""", + (cid, ext['id']), fetch=None) + self._respond(201, {'id': cid, 'name': body['name']}) def _update_customer(self, cid, body): fields, values = [], []