Finalize CRM module: bookings, pricing, survey with full UI integration and validation
This commit is contained in:
@@ -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 }}>
|
||||
|
||||
Reference in New Issue
Block a user