Finalize CRM module: bookings, pricing, survey with full UI integration and validation

This commit is contained in:
2026-06-22 17:47:36 +05:30
parent 59fc91f034
commit 72a1eb0701
23 changed files with 2620 additions and 326 deletions

View File

@@ -4,11 +4,11 @@ import {
MenuItem, Alert, CircularProgress, IconButton
} from '@mui/material';
import CloseIcon from '@mui/icons-material/Close';
import { createPoint, setPayload, COLLECTIONS } from '@/utils/qdrant';
import { createUser, updateUser } from '@/utils/apiClient';
const ROLES = ['admin', 'rep', 'manager'];
const EMPTY = { name: '', email: '', phone: '', role: 'rep', pin: '' };
const EMPTY = { name: '', email: '', phone: '', role: 'rep', pin: '', password: '' };
const withValue = (opts, v) => (v && !opts.includes(v) ? [v, ...opts] : opts);
@@ -30,22 +30,24 @@ export default function UserFormDialog({ open, mode, initial, onClose, onSaved }
const handleSave = async () => {
if (!form.name.trim()) { setError('Name is required.'); return; }
if (!form.email.trim()) { setError('Email is required.'); return; }
if (!isEdit && !form.password.trim()) { setError('Password is required.'); return; }
setSaving(true);
setError(null);
const payload = {
name: form.name.trim(),
first_name: form.name.trim(),
email: form.email.trim(),
phone: form.phone,
role: form.role,
...(form.pin ? { pin: String(form.pin) } : {})
...(form.password ? { password: form.password } : {}),
...(form.pin ? { pin: String(form.pin) } : {}),
};
try {
if (isEdit) {
await setPayload(COLLECTIONS.teamUsers, initial.id, payload);
await updateUser(initial.id, payload);
} else {
await createPoint(COLLECTIONS.teamUsers, payload);
await createUser(payload);
}
onSaved();
} catch (e) {
@@ -73,6 +75,14 @@ export default function UserFormDialog({ open, mode, initial, onClose, onSaved }
</TextField>
</Grid>
<Grid item xs={12} sm={6}><TextField fullWidth size="small" label="PIN" value={form.pin} onChange={set('pin')} /></Grid>
<Grid item xs={12} sm={6}>
<TextField
fullWidth size="small" type="password"
label={isEdit ? 'New Password (optional)' : 'Password *'}
value={form.password}
onChange={set('password')}
/>
</Grid>
</Grid>
</DialogContent>
<DialogActions sx={{ px: 3, py: 2 }}>