refactor providers e basi per spedizioni

This commit is contained in:
2026-05-15 10:12:05 +02:00
parent ad35f641b3
commit f19f19a279
21 changed files with 1542 additions and 830 deletions

View File

@@ -0,0 +1,132 @@
import 'package:flutter/material.dart';
import '../models/provider_location_model.dart';
class ProviderLocationDialog extends StatefulWidget {
final ProviderLocationModel? initialLocation;
const ProviderLocationDialog({super.key, this.initialLocation});
@override
State<ProviderLocationDialog> createState() => _ProviderLocationDialogState();
}
class _ProviderLocationDialogState extends State<ProviderLocationDialog> {
final _formKey = GlobalKey<FormState>();
late final TextEditingController _nameCtrl;
late final TextEditingController _addressCtrl;
late final TextEditingController _cityCtrl;
late final TextEditingController _zipCtrl;
late final TextEditingController _provCtrl;
late final TextEditingController _contactCtrl;
bool _isMain = false;
@override
void initState() {
super.initState();
final l = widget.initialLocation;
_nameCtrl = TextEditingController(text: l?.name);
_addressCtrl = TextEditingController(text: l?.address);
_cityCtrl = TextEditingController(text: l?.city);
_zipCtrl = TextEditingController(text: l?.zipCode);
_provCtrl = TextEditingController(text: l?.province);
_contactCtrl = TextEditingController(text: l?.contactPerson);
_isMain = l?.isMain ?? false;
}
@override
Widget build(BuildContext context) {
return AlertDialog(
title: Text(
widget.initialLocation == null
? 'Aggiungi Sede/Laboratorio'
: 'Modifica Sede',
),
content: SingleChildScrollView(
child: Form(
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextFormField(
controller: _nameCtrl,
decoration: const InputDecoration(
labelText: 'Nome Sede (es. Laboratorio Sud) *',
),
validator: (v) => v!.isEmpty ? 'Obbligatorio' : null,
),
TextFormField(
controller: _addressCtrl,
decoration: const InputDecoration(labelText: 'Indirizzo *'),
validator: (v) => v!.isEmpty ? 'Obbligatorio' : null,
),
Row(
children: [
Expanded(
flex: 2,
child: TextFormField(
controller: _cityCtrl,
decoration: const InputDecoration(labelText: 'Città *'),
validator: (v) => v!.isEmpty ? 'Obbligatorio' : null,
),
),
const SizedBox(width: 8),
Expanded(
child: TextFormField(
controller: _provCtrl,
decoration: const InputDecoration(labelText: 'Prov.'),
maxLength: 2,
),
),
],
),
TextFormField(
controller: _zipCtrl,
decoration: const InputDecoration(labelText: 'CAP *'),
keyboardType: TextInputType.number,
validator: (v) => v!.isEmpty ? 'Obbligatorio' : null,
),
TextFormField(
controller: _contactCtrl,
decoration: const InputDecoration(
labelText: 'Referente (opzionale)',
),
),
SwitchListTile(
title: const Text('Sede Principale'),
value: _isMain,
onChanged: (v) => setState(() => _isMain = v),
),
],
),
),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('Annulla'),
),
FilledButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
ProviderLocationModel newLocation = ProviderLocationModel(
id: widget.initialLocation?.id,
name: _nameCtrl.text.trim(),
address: _addressCtrl.text.trim(),
city: _cityCtrl.text.trim(),
zipCode: _zipCtrl.text.trim(),
province: _provCtrl.text.trim().toUpperCase(),
contactPerson: _contactCtrl.text.trim(),
isMain: _isMain,
companyId: widget.initialLocation?.companyId ?? '',
providerId: widget.initialLocation?.providerId ?? '',
);
// Restituiamo una mappa o un modello parziale (senza ID e FK che gestirà il Cubit)
Navigator.pop(context, newLocation);
}
},
child: const Text('Conferma'),
),
],
);
}
}