This commit is contained in:
Hillel Coren 2020-02-12 23:13:33 +02:00
parent 6cfbf3b24a
commit d67ddcad86
1 changed files with 80 additions and 75 deletions

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:intl/intl.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
@ -52,11 +51,10 @@ class ReportsScreen extends StatelessWidget {
leading: isMobile(context) || state.prefState.isMenuFloated leading: isMobile(context) || state.prefState.isMenuFloated
? null ? null
: IconButton( : IconButton(
icon: Icon(Icons.menu), icon: Icon(Icons.menu),
onPressed: () => onPressed: () => store
store .dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)),
.dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)), ),
),
title: Row( title: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
@ -94,11 +92,10 @@ class ReportsScreen extends StatelessWidget {
kReportTaxRate, kReportTaxRate,
kReportQuote, kReportQuote,
] ]
.map((report) => .map((report) => DropdownMenuItem(
DropdownMenuItem( value: report,
value: report, child: Text(localization.lookup(report)),
child: Text(localization.lookup(report)), ))
))
.toList(), .toList(),
), ),
@ -179,7 +176,7 @@ class ReportDataTable extends StatefulWidget {
class _ReportDataTableState extends State<ReportDataTable> { class _ReportDataTableState extends State<ReportDataTable> {
final Map<String, Map<String, TextEditingController>> final Map<String, Map<String, TextEditingController>>
_textEditingControllers = {}; _textEditingControllers = {};
@override @override
void didChangeDependencies() { void didChangeDependencies() {
@ -238,19 +235,26 @@ class _ReportDataTableState extends State<ReportDataTable> {
SingleChildScrollView( SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
child: DataTable( child: DataTable(
sortColumnIndex: state.userCompany.settings
.reportSettings[state.uiState.reportsUIState.report].sortIndex,
sortAscending: state
.userCompany
.settings
.reportSettings[state.uiState.reportsUIState.report]
.sortAscending,
columns: reportResult.tableColumns( columns: reportResult.tableColumns(
context, context,
(index, ascending) => (index, ascending) =>
widget.viewModel.onReportSorted(index, ascending)), widget.viewModel.onReportSorted(index, ascending)),
rows: [ rows: [
reportResult.tableFilters(context, reportResult.tableFilters(context,
_textEditingControllers[state.uiState.reportsUIState.report], _textEditingControllers[state.uiState.reportsUIState.report],
(column, value) { (column, value) {
widget.viewModel.onReportFiltersChanged( widget.viewModel.onReportFiltersChanged(
context, context,
state.uiState.reportsUIState.filters state.uiState.reportsUIState.filters
.rebuild((b) => b..addAll({column: value}))); .rebuild((b) => b..addAll({column: value})));
}), }),
...reportResult.tableRows(context), ...reportResult.tableRows(context),
], ],
), ),
@ -271,8 +275,8 @@ class ReportResult {
final List<String> allColumns; final List<String> allColumns;
final List<List<ReportElement>> data; final List<List<ReportElement>> data;
List<DataColumn> tableColumns(BuildContext context, List<DataColumn> tableColumns(
Function(int, bool) onSortCallback) { BuildContext context, Function(int, bool) onSortCallback) {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
return [ return [
@ -288,62 +292,64 @@ class ReportResult {
]; ];
} }
DataRow tableFilters(BuildContext context, DataRow tableFilters(
BuildContext context,
Map<String, TextEditingController> textEditingControllers, Map<String, TextEditingController> textEditingControllers,
Function(String, String) onFilterChanged) { Function(String, String) onFilterChanged) {
return DataRow(cells: [ return DataRow(cells: [
for (String column in columns) for (String column in columns)
DataCell(TypeAheadFormField( if (['updated_at', 'created_at'].contains(column))
noItemsFoundBuilder: (context) => SizedBox(), DataCell(Text(column))
suggestionsBoxDecoration: SuggestionsBoxDecoration( else
constraints: BoxConstraints( DataCell(TypeAheadFormField(
minWidth: 300, noItemsFoundBuilder: (context) => SizedBox(),
suggestionsBoxDecoration: SuggestionsBoxDecoration(
constraints: BoxConstraints(
minWidth: 300,
),
), ),
), suggestionsCallback: (filter) {
suggestionsCallback: (filter) { filter = filter.toLowerCase();
filter = filter.toLowerCase(); final index = columns.indexOf(column);
final index = columns.indexOf(column); return data
return data .where((row) =>
.where((row) => row[index].sortString().toLowerCase().contains(filter) &&
row[index].sortString().toLowerCase().contains(filter) && row[index].sortString().trim().isNotEmpty)
row[index] .map((row) => row[index].sortString())
.sortString() .toSet()
.trim() .toList();
.isNotEmpty) },
.map((row) => row[index].sortString()) itemBuilder: (context, String entityId) {
.toSet() return Padding(
.toList(); padding: const EdgeInsets.all(12),
}, child: Text('$entityId'),
itemBuilder: (context, String entityId) { );
return Padding( },
padding: const EdgeInsets.all(12), onSuggestionSelected: (String value) {
child: Text('$entityId'), textEditingControllers[column].text = value;
); onFilterChanged(column, value);
}, },
onSuggestionSelected: (String value) { textFieldConfiguration: TextFieldConfiguration<String>(
textEditingControllers[column].text = value; controller: textEditingControllers[column],
onFilterChanged(column, value); decoration: InputDecoration(
}, suffixIcon:
textFieldConfiguration: TextFieldConfiguration<String>( (textEditingControllers[column]?.text ?? '').isEmpty
controller: textEditingControllers[column], ? null
decoration: InputDecoration( : IconButton(
suffixIcon: (textEditingControllers[column]?.text ?? '').isEmpty icon: Icon(
? null Icons.clear,
: IconButton( color: Colors.grey,
icon: Icon( ),
Icons.clear, onPressed: () {
color: Colors.grey, textEditingControllers[column].text = '';
), onFilterChanged(column, '');
onPressed: () { },
textEditingControllers[column].text = ''; )),
onFilterChanged(column, ''); ),
}, autoFlipDirection: true,
)), animationStart: 1,
), debounceDuration: Duration(seconds: 0),
autoFlipDirection: true, ))
animationStart: 1,
debounceDuration: Duration(seconds: 0),
))
]); ]);
} }
@ -353,11 +359,10 @@ class ReportResult {
DataRow( DataRow(
cells: row cells: row
.map( .map(
(row) => (row) => DataCell(
DataCell(
row.renderWidget(context), row.renderWidget(context),
), ),
) )
.toList(), .toList(),
) )
]; ];