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}