main
  1import 'package:blood_pressure_app/features/export_import/export_column_management_screen.dart';
  2import 'package:blood_pressure_app/features/settings/tiles/dropdown_list_tile.dart';
  3import 'package:blood_pressure_app/model/export_import/column.dart';
  4import 'package:blood_pressure_app/model/export_import/export_configuration.dart';
  5import 'package:blood_pressure_app/model/storage/common_settings_interfaces.dart';
  6import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
  7import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
  8import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
  9import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
 10import 'package:blood_pressure_app/model/storage/export_xsl_settings_store.dart';
 11import 'package:flutter/material.dart';
 12import 'package:blood_pressure_app/l10n/app_localizations.dart';
 13import 'package:provider/provider.dart';
 14
 15/// Setting for configuring fields in the current export.
 16class ActiveExportFieldCustomization extends StatelessWidget {
 17  /// Create a widget for configuring fields in the current export.
 18  const ActiveExportFieldCustomization({super.key,
 19    required this.format,});
 20
 21  final ExportFormat format;
 22
 23  @override
 24  Widget build(BuildContext context) => switch (format) {
 25    ExportFormat.csv => Consumer<CsvExportSettings>(builder: _builder),
 26    ExportFormat.pdf => Consumer<PdfExportSettings>(builder: _builder),
 27    ExportFormat.xsl => Consumer<ExcelExportSettings>(builder: _builder),
 28    ExportFormat.db => const SizedBox.shrink()
 29  };
 30
 31  Widget _builder(BuildContext context, CustomFieldsSettings settings, Widget? child) {
 32    final localizations = AppLocalizations.of(context)!;
 33    final fieldsConfig = settings.exportFieldsConfiguration;
 34    final dropdown = DropDownListTile(
 35      title: Text(localizations.exportFieldsPreset),
 36      value: fieldsConfig.activePreset,
 37      items: ExportImportPreset.values.map(
 38              (e) => DropdownMenuItem(
 39            value: e,
 40            child: Text(e.localize(localizations)),
 41          ),
 42      ).toList(),
 43      onChanged: (selectedPreset) {
 44        if (selectedPreset != null) {
 45          fieldsConfig.activePreset = selectedPreset;
 46        }
 47      },
 48    );
 49
 50    return Column(
 51      mainAxisSize: MainAxisSize.min,
 52      children: [
 53        dropdown,
 54        ListTile(
 55          title: Text(localizations.manageExportColumns),
 56          trailing: const Icon(Icons.arrow_forward_ios),
 57          onTap: () {
 58            Navigator.push(
 59              context,
 60              MaterialPageRoute(builder: (context) => const ExportColumnsManagementScreen()),);
 61          },
 62        ),
 63        if (fieldsConfig.activePreset == ExportImportPreset.none)
 64          _buildActiveColumnsEditor(context, localizations, fieldsConfig),
 65      ],
 66    );
 67  }
 68
 69  Widget _buildActiveColumnsEditor(BuildContext context,
 70    AppLocalizations localizations,
 71    ActiveExportColumnConfiguration fieldsConfig,) =>
 72      Container(
 73        margin: const EdgeInsets.symmetric(
 74            horizontal: 16,
 75            vertical: 5,
 76        ),
 77        height: 400,
 78        decoration: BoxDecoration(
 79          border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
 80          borderRadius: const BorderRadius.all(Radius.circular(10)),
 81        ),
 82        child: Consumer<ExportColumnsManager>(
 83          builder: (context, availableColumns, child) {
 84            final activeColumns = fieldsConfig.getActiveColumns(availableColumns);
 85            return ReorderableListView.builder(
 86              itemBuilder: (context, idx) {
 87                if (idx >= activeColumns.length) {
 88                  return ListTile(
 89                    key: const Key('add field'),
 90                    leading: const Icon(Icons.add),
 91                    title: Text(localizations.addEntry),
 92                    onTap: () async {
 93                      final column = await showDialog<ExportColumn?>(context: context, builder: (context) =>
 94                          SimpleDialog(
 95                            title: Text(localizations.addEntry),
 96                            insetPadding: const EdgeInsets.symmetric(
 97                              vertical: 64,
 98                            ),
 99                            children: availableColumns.getAllColumns().map((column) =>
100                              ListTile(
101                                title: Text(column.userTitle(localizations)),
102                                onTap: () => Navigator.pop(context, column),
103                              ),
104                            ).toList(),
105                          ),
106                      );
107                      if (column != null) fieldsConfig.addUserColumn(column);
108                    },
109                  );
110                }
111                return ListTile(
112                  key: Key(activeColumns[idx].internalIdentifier + idx.toString()),
113                  title: Text(activeColumns[idx].userTitle(localizations)),
114                  trailing: Row(
115                    mainAxisSize: MainAxisSize.min,
116                    children: [
117                      IconButton(
118                        tooltip: localizations.remove,
119                        onPressed: () {
120                          fieldsConfig.removeUserColumn(activeColumns[idx].internalIdentifier);
121                        },
122                        icon: const Icon(Icons.remove_circle_outline),
123                      ),
124                      const Icon(Icons.drag_handle),
125                    ],
126                  ),
127                );
128              },
129              itemCount: activeColumns.length + 1,
130              onReorder: fieldsConfig.reorderUserColumns,
131            );
132          },
133        ),
134      );
135}