Commit 422f4f7
Changed files (5)
lib
l10n
model
storage
screens
subsettings
lib/l10n/app_en.arb
@@ -476,5 +476,7 @@
"remove": "Remove",
"@remove": {},
"manageExportColumns": "Manage export columns",
- "@manageExportColumns": {}
+ "@manageExportColumns": {},
+ "buildIn": "Build-in",
+ "@buildIn": {}
}
lib/model/storage/export_columns_store.dart
@@ -18,7 +18,6 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
/// View of map between all [ExportColumn.internalName]s and [ExportColumn]s added by a user.
UnmodifiableMapView<String, ExportColumn> get userColumns => UnmodifiableMapView(_userColumns);
- // TODO: consider replacing with a allColumns getter once build ins are added.
/// Tries to save the column to the map with the [ExportColumn.internalName] key.
///
@@ -69,6 +68,14 @@ class ExportColumnsManager extends ChangeNotifier { // TODO: separate ExportColu
return UnmodifiableListView(columns);
}
+ /// Returns a list of all NativeColumns and BuildInColumns defined.
+ UnmodifiableListView<ExportColumn> getAllUnmodifiableColumns() {
+ final columns = <ExportColumn>[];
+ columns.addAll(NativeColumn.allColumns);
+ columns.addAll(BuildInColumn.allColumns);
+ return UnmodifiableListView(columns);
+ }
+
String toJson() { // TODO: update from and TO json to new style
final columns = [];
for (final c in _userColumns.values) {
lib/screens/subsettings/export_import/active_field_customization.dart
@@ -6,6 +6,7 @@ import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
import 'package:blood_pressure_app/model/storage/export_csv_settings_store.dart';
import 'package:blood_pressure_app/model/storage/export_pdf_settings_store.dart';
import 'package:blood_pressure_app/model/storage/export_settings_store.dart';
+import 'package:blood_pressure_app/screens/subsettings/export_import/export_column_management_screen.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart';
@@ -44,84 +45,89 @@ class ActiveExportFieldCustomization extends StatelessWidget {
},
);
- if (fieldsConfig.activePreset != ExportImportPreset.none) {
- return dropdown;
- }
return Column(
mainAxisSize: MainAxisSize.min,
children: [
dropdown,
- Container(
- margin: const EdgeInsets.symmetric(
- horizontal: 16,
- vertical: 5
- ),
- height: 400,
- decoration: BoxDecoration(
- border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
- borderRadius: const BorderRadius.all(Radius.circular(10)),
- ),
- child: Consumer<ExportColumnsManager>(
- builder: (context, availableColumns, child) {
- final activeColumns = fieldsConfig.getActiveColumns(availableColumns);
- return ReorderableListView.builder(
- itemBuilder: (context, idx) {
- if (idx >= activeColumns.length) {
- return ListTile(
- key: const Key('add field'),
- leading: const Icon(Icons.add),
- title: Text(localizations.addEntry),
- onTap: () async {
- final column = await showDialog<ExportColumn?>(context: context, builder: (context) =>
- SimpleDialog(
- title: Text(localizations.addEntry),
- insetPadding: const EdgeInsets.symmetric(
- vertical: 64,
- ),
- children: availableColumns.getAllColumns().map((column) =>
- ListTile(
- title: Text(column.userTitle(localizations)),
- onTap: () => Navigator.of(context).pop(column),
- )
- ).toList(),
- )
- );
- if (column != null) fieldsConfig.addUserColumn(column);
- },
- );
- }
- return ListTile(
- key: Key(activeColumns[idx].internalIdentifier + idx.toString()),
- title: Text(activeColumns[idx].userTitle(localizations)),
- trailing: Row(
- mainAxisSize: MainAxisSize.min,
- children: [
- IconButton(
- tooltip: localizations.remove,
- onPressed: () {
- fieldsConfig.removeUserColumn(activeColumns[idx].internalIdentifier);
- },
- icon: const Icon(Icons.remove_circle_outline)
- ),
- const Icon(Icons.drag_handle),
- ],
- ),
- );
- },
- itemCount: activeColumns.length + 1,
- onReorder: fieldsConfig.reorderUserColumns
- );
- }
- ),
- ),
ListTile(
title: Text(localizations.manageExportColumns),
trailing: const Icon(Icons.arrow_forward_ios),
onTap: () {
- // TODO implement adding / editing columns => separate ColumnsManagerScreen ?
+ Navigator.push(
+ context,
+ MaterialPageRoute(builder: (context) => const ExportColumnsManagementScreen()),);
},
),
+ if (fieldsConfig.activePreset == ExportImportPreset.none)
+ _buildActiveColumnsEditor(context, localizations, fieldsConfig),
],
);
}
+
+ Widget _buildActiveColumnsEditor(BuildContext context,
+ AppLocalizations localizations,
+ ActiveExportColumnConfiguration fieldsConfig) =>
+ Container(
+ margin: const EdgeInsets.symmetric(
+ horizontal: 16,
+ vertical: 5
+ ),
+ height: 400,
+ decoration: BoxDecoration(
+ border: Border.all(color: Theme.of(context).textTheme.labelLarge?.color ?? Colors.teal),
+ borderRadius: const BorderRadius.all(Radius.circular(10)),
+ ),
+ child: Consumer<ExportColumnsManager>(
+ builder: (context, availableColumns, child) {
+ final activeColumns = fieldsConfig.getActiveColumns(availableColumns);
+ return ReorderableListView.builder(
+ itemBuilder: (context, idx) {
+ if (idx >= activeColumns.length) {
+ return ListTile(
+ key: const Key('add field'),
+ leading: const Icon(Icons.add),
+ title: Text(localizations.addEntry),
+ onTap: () async {
+ final column = await showDialog<ExportColumn?>(context: context, builder: (context) =>
+ SimpleDialog(
+ title: Text(localizations.addEntry),
+ insetPadding: const EdgeInsets.symmetric(
+ vertical: 64,
+ ),
+ children: availableColumns.getAllColumns().map((column) =>
+ ListTile(
+ title: Text(column.userTitle(localizations)),
+ onTap: () => Navigator.of(context).pop(column),
+ )
+ ).toList(),
+ )
+ );
+ if (column != null) fieldsConfig.addUserColumn(column);
+ },
+ );
+ }
+ return ListTile(
+ key: Key(activeColumns[idx].internalIdentifier + idx.toString()),
+ title: Text(activeColumns[idx].userTitle(localizations)),
+ trailing: Row(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ IconButton(
+ tooltip: localizations.remove,
+ onPressed: () {
+ fieldsConfig.removeUserColumn(activeColumns[idx].internalIdentifier);
+ },
+ icon: const Icon(Icons.remove_circle_outline)
+ ),
+ const Icon(Icons.drag_handle),
+ ],
+ ),
+ );
+ },
+ itemCount: activeColumns.length + 1,
+ onReorder: fieldsConfig.reorderUserColumns
+ );
+ }
+ ),
+ );
}
\ No newline at end of file
lib/screens/subsettings/export_import/export_column_management_screen.dart
@@ -0,0 +1,60 @@
+import 'package:blood_pressure_app/model/storage/export_columns_store.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:provider/provider.dart';
+
+/// Page that shows all export columns and allows adding and editing custom ones.
+class ExportColumnsManagementScreen extends StatelessWidget {
+ const ExportColumnsManagementScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final localizations = AppLocalizations.of(context)!;
+ return Scaffold(
+ appBar: AppBar(
+ forceMaterialTransparency: true,
+ ),
+ body: Consumer<ExportColumnsManager>(
+ builder: (context, columnsManager, child) => ListView(
+ children: [
+ ExpansionTile(
+ title: Text(localizations.buildIn,
+ style: Theme.of(context).textTheme.titleLarge!,),
+ children: [
+ for (final column in columnsManager.getAllUnmodifiableColumns())
+ ListTile(
+ title: Text(column.userTitle(localizations)),
+ subtitle: column.formatPattern == null ? null : Text(column.formatPattern!),
+ )
+ ],
+ ),
+ ExpansionTile(
+ initiallyExpanded: true,
+ title: Text(localizations.custom,
+ style: Theme.of(context).textTheme.titleLarge!,),
+ children: [
+ for (final column in columnsManager.userColumns.values)
+ ListTile(
+ title: Text(column.userTitle(localizations)),
+ subtitle: Text(column.formatPattern.toString()),
+ trailing: const Icon(Icons.edit),
+ onTap: () {
+ // TODO: implement tile editing
+ },
+ ),
+ ListTile(
+ leading: const Icon(Icons.add),
+ title: Text(localizations.addExportformat),
+ onTap: () {
+ // TODO: reimplement tile adding
+ },
+ )
+ ],
+ )
+ ],
+ )
+ ),
+ );
+ }
+
+}
\ No newline at end of file
lib/screens/subsettings/export_import/export_import_screen.dart
@@ -12,6 +12,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:jsaver/jSaver.dart';
import 'package:provider/provider.dart';
+/// Screen to configure and perform exports and imports of blood pressure values.
class ExportImportScreen extends StatelessWidget {
const ExportImportScreen({super.key});