Add cedula number field to professional request form

Shows document type locked to 'Cédula de ciudadanía' and adds required
number input field above the photo upload.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-28 17:49:34 -05:00
co-authored by Claude Sonnet 4.6
parent 28511491af
commit 9634aa13ff
+47 -14
View File
@@ -65,16 +65,19 @@ class _FormBody extends StatefulWidget {
class _FormBodyState extends State<_FormBody> {
final _rethusCtrl = TextEditingController();
final _specCtrl = TextEditingController();
final _cedulaNumCtrl = TextEditingController();
String? _selectedProfession;
List<String> _specs = [];
bool _loading = false;
bool _cedulaError = false;
bool _cedulaNumError = false;
bool _profError = false;
@override
void dispose() {
_rethusCtrl.dispose();
_specCtrl.dispose();
_cedulaNumCtrl.dispose();
super.dispose();
}
@@ -90,13 +93,14 @@ class _FormBodyState extends State<_FormBody> {
bool _validate(String cedulaUrl) {
final cErr = cedulaUrl.isEmpty;
final pErr =
_selectedProfession == null || _selectedProfession!.isEmpty;
final nErr = _cedulaNumCtrl.text.trim().isEmpty;
final pErr = _selectedProfession == null || _selectedProfession!.isEmpty;
setState(() {
_cedulaError = cErr;
_cedulaNumError = nErr;
_profError = pErr;
});
return !cErr && !pErr;
return !cErr && !nErr && !pErr;
}
Future<void> _submit() async {
@@ -107,6 +111,7 @@ class _FormBodyState extends State<_FormBody> {
setState(() => _loading = true);
try {
fp.copyProfesionalWith(
identification: _cedulaNumCtrl.text.trim(),
profession: _selectedProfession,
rethusCode: _rethusCtrl.text.trim(),
specializations: _specs,
@@ -228,30 +233,58 @@ class _FormBodyState extends State<_FormBody> {
const SizedBox(height: 16),
// ── 1. Foto / PDF de cédula (obligatorio) ──────────────────────────
// ── 1. Cédula (número + foto) ───────────────────────────────────────
_SectionCard(
cardBg: cardBg,
border: border,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_Label('Foto / PDF de cédula', Icons.badge_outlined,
required: true),
const SizedBox(height: 12),
_Label('Cédula de ciudadanía', Icons.badge_outlined, required: true),
const SizedBox(height: 4),
// Tipo fijo
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: isDark ? const Color(0xFF334155) : const Color(0xFFF1F5F9),
borderRadius: BorderRadius.circular(8),
border: Border.all(color: border),
),
child: Row(
children: [
Icon(Icons.lock_outline, size: 14, color: textSec),
const SizedBox(width: 6),
Text('Tipo: Cédula de ciudadanía', style: TextStyle(fontSize: 13, color: textSec)),
],
),
),
const SizedBox(height: 10),
// Número
TextField(
controller: _cedulaNumCtrl,
keyboardType: TextInputType.number,
style: TextStyle(color: textPrimary, fontSize: 14),
decoration: InputDecoration(
hintText: 'Número de cédula',
hintStyle: TextStyle(color: textSec, fontSize: 13),
border: OutlineInputBorder(borderRadius: BorderRadius.circular(8)),
contentPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
errorText: _cedulaNumError ? 'Ingresa tu número de cédula' : null,
),
onChanged: (_) { if (_cedulaNumError) setState(() => _cedulaNumError = false); },
),
const SizedBox(height: 10),
// Foto
_UploadTile(
label: cedulaUploaded
? 'Cédula subida ✓'
: 'Subir foto o PDF de la cédula',
label: cedulaUploaded ? 'Foto de cédula subida ✓' : 'Subir foto o PDF de la cédula',
uploaded: cedulaUploaded,
onTap: () => _pickAndUpload(
(b) => fp.uploadPdfIdentification(b, user.id)),
onTap: () => _pickAndUpload((b) => fp.uploadPdfIdentification(b, user.id)),
),
if (_cedulaError)
const Padding(
padding: EdgeInsets.only(top: 8),
child: Text('Debes subir la foto de tu cédula',
style: TextStyle(
color: Colors.redAccent, fontSize: 12)),
style: TextStyle(color: Colors.redAccent, fontSize: 12)),
),
],
),