showCreateSetDialog function
Show create set dialog.
Implementation
Future<void> showCreateSetDialog(BuildContext context, NmCommandSetController controller) async {
final l10n = NmTelecom.l10n(context);
final id = TextEditingController();
final name = TextEditingController();
final operator = TextEditingController();
final code = TextEditingController(text: 'RU');
final country = TextEditingController(text: 'Россия');
final region = TextEditingController();
var clone = true;
var sourceId = controller.selectedId ?? controller.records.first.id;
String? error;
await showDialog<void>(
context: context,
builder: (dialogContext) => StatefulBuilder(
builder: (context, setState) => AlertDialog(
title: Row(children: [const NmIcon(NmFugue.applicationBadgePlus), const SizedBox(width: 8), Text(l10n.cmdSetNewDialogTitle)]),
content: SizedBox(
width: 500,
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
SegmentedButton<bool>(
segments: [
ButtonSegment(value: true, label: Text(l10n.cmdSetCloneSegment), icon: const NmIcon(NmFugue.applicationsStack)),
ButtonSegment(value: false, label: Text(l10n.cmdSetBlankSegment), icon: const NmIcon(NmFugue.applicationForm)),
],
selected: {clone},
onSelectionChanged: (value) => setState(() => clone = value.first),
),
if (clone) ...[
const SizedBox(height: 12),
DropdownButtonFormField<String>(
initialValue: sourceId,
decoration: InputDecoration(labelText: l10n.cmdSetSourceSetLabel, border: const OutlineInputBorder()),
items: [for (final item in controller.records) DropdownMenuItem(value: item.id, child: Text(item.name))],
onChanged: (value) => sourceId = value ?? sourceId,
),
],
const SizedBox(height: 12),
_field(id, l10n.cmdSetNewIdLabel),
const SizedBox(height: 10),
_field(name, l10n.cmdSetFieldName),
const SizedBox(height: 10),
_field(operator, l10n.cmdSetFieldOperator),
const SizedBox(height: 10),
Row(
children: [
Expanded(flex: 2, child: _field(code, l10n.cmdSetFieldCode)),
const SizedBox(width: 10),
Expanded(flex: 5, child: _field(country, l10n.cmdSetFieldCountry)),
],
),
const SizedBox(height: 10),
_field(region, l10n.cmdSetFieldRegionOptional),
if (error != null) ...[
const SizedBox(height: 10),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const NmIcon(NmFugue.exclamation),
const SizedBox(width: 8),
Expanded(
child: Text(
error!,
style: context.nm.text.body.copyWith(color: context.nm.colors.dangerText, fontWeight: FontWeight.w600),
),
),
],
),
],
],
),
),
),
actions: [
TextButton(onPressed: () => Navigator.pop(dialogContext), child: Text(l10n.cmdSetCancel)),
FilledButton(
onPressed: () {
final result = clone
? controller.cloneSet(
sourceId,
id: id.text.trim(),
name: name.text.trim(),
operator: operator.text.trim(),
countryCode: code.text.trim().toUpperCase(),
countryName: country.text.trim(),
region: region.text.trim(),
l10n: l10n,
)
: controller.createBlank(
id: id.text.trim(),
name: name.text.trim(),
operator: operator.text.trim(),
countryCode: code.text.trim().toUpperCase(),
countryName: country.text.trim(),
region: region.text.trim(),
l10n: l10n,
);
if (result.isValid) {
Navigator.pop(dialogContext);
} else {
setState(() => error = result.issues.first.message);
}
},
child: Text(l10n.cmdSetCreateButton),
),
],
),
),
);
id.dispose();
name.dispose();
operator.dispose();
code.dispose();
country.dispose();
region.dispose();
}