showCreateSetDialog function

Future<void> showCreateSetDialog(
  1. BuildContext context,
  2. NmCommandSetController controller
)

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();
}