This commit is contained in:
Hillel Coren 2020-02-23 22:57:56 +02:00
parent 1a33cc36e2
commit 2ee522356d
1 changed files with 161 additions and 106 deletions

View File

@ -289,6 +289,41 @@ 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 = {};
ReportDataTableSource dataTableSource;
@override
void initState() {
super.initState();
final viewModel = widget.viewModel;
final reportUIState = viewModel.state.uiState.reportsUIState;
dataTableSource = ReportDataTableSource(
viewModel: viewModel,
context: context,
textEditingControllers: _textEditingControllers,
onFilterChanged: (column, value) {
viewModel.onReportFiltersChanged(context,
reportUIState.filters.rebuild((b) => b..addAll({column: value})));
});
}
@override
void didUpdateWidget(ReportDataTable oldWidget) {
super.didUpdateWidget(oldWidget);
final viewModel = widget.viewModel;
dataTableSource.viewModel = viewModel;
/*
dataTableSource.editingId = viewModel.state.productUIState.editing.id;
dataTableSource.entityList = viewModel.productList;
dataTableSource.entityMap = viewModel.productMap;
*/
// ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member
dataTableSource.notifyListeners();
}
@override @override
void didChangeDependencies() { void didChangeDependencies() {
@ -373,10 +408,10 @@ class _ReportDataTableState extends State<ReportDataTable> {
], ],
), ),
), ),
FormCard( SingleChildScrollView(
child: SingleChildScrollView( padding: const EdgeInsets.all(12),
scrollDirection: Axis.horizontal, child: PaginatedDataTable(
child: DataTable( header: SizedBox(),
sortColumnIndex: reportSettings.sortIndex != null && sortColumnIndex: reportSettings.sortIndex != null &&
reportResult.columns.length > reportSettings.sortIndex reportResult.columns.length > reportSettings.sortIndex
? reportSettings.sortIndex ? reportSettings.sortIndex
@ -386,21 +421,9 @@ class _ReportDataTableState extends State<ReportDataTable> {
context, context,
(index, ascending) => (index, ascending) =>
widget.viewModel.onReportSorted(index, ascending)), widget.viewModel.onReportSorted(index, ascending)),
rows: [ source: dataTableSource,
reportResult.tableFilters(
context,
_textEditingControllers[
state.uiState.reportsUIState.report], (column, value) {
widget.viewModel.onReportFiltersChanged(
context,
state.uiState.reportsUIState.filters
.rebuild((b) => b..addAll({column: value})));
}),
...reportResult.tableRows(context, widget.viewModel),
],
),
),
), ),
)
], ],
); );
} }
@ -513,6 +536,7 @@ class ReportCharts extends StatelessWidget {
} }
} }
enum ReportColumnType { enum ReportColumnType {
string, string,
dateTime, dateTime,
@ -558,6 +582,42 @@ ReportColumnType getReportColumnType(String column, BuildContext context) {
} }
} }
class ReportDataTableSource extends DataTableSource {
ReportDataTableSource({
@required this.context,
@required this.textEditingControllers,
@required this.onFilterChanged,
@required this.viewModel,
});
ReportsScreenVM viewModel;
final BuildContext context;
final Map<String, Map<String, TextEditingController>> textEditingControllers;
final Function(String, String) onFilterChanged;
@override
int get selectedRowCount => 0;
@override
bool get isRowCountApproximate => false;
@override
int get rowCount => viewModel.reportResult.data.length + 1;
@override
DataRow getRow(int index) {
final reportResult = viewModel.reportResult;
if (index == 0) {
return reportResult.tableFilters(
context,
textEditingControllers[viewModel.state.uiState.reportsUIState.report],
(column, value) => onFilterChanged(column, value));
} else {
return reportResult.tableRow(context, viewModel, index);
}
}
}
class ReportResult { class ReportResult {
ReportResult({ ReportResult({
@required this.columns, @required this.columns,
@ -737,7 +797,7 @@ class ReportResult {
for (String column in sortedColumns(context)) for (String column in sortedColumns(context))
if (textEditingControllers == null || if (textEditingControllers == null ||
!textEditingControllers.containsKey(column)) !textEditingControllers.containsKey(column))
DataCell(SizedBox()) DataCell(Text(textEditingControllers == null ? 'null' : 'test'))
else if (getReportColumnType(column, context) == ReportColumnType.bool) else if (getReportColumnType(column, context) == ReportColumnType.bool)
DataCell(AppDropdownButton<bool>( DataCell(AppDropdownButton<bool>(
labelText: null, labelText: null,
@ -873,8 +933,7 @@ class ReportResult {
]); ]);
} }
List<DataRow> tableRows(BuildContext context, ReportsScreenVM viewModel) { DataRow tableRow(BuildContext context, ReportsScreenVM viewModel, int index) {
final rows = <DataRow>[];
final store = StoreProvider.of<AppState>(context); final store = StoreProvider.of<AppState>(context);
final state = store.state; final state = store.state;
final reportState = state.uiState.reportsUIState; final reportState = state.uiState.reportsUIState;
@ -887,8 +946,7 @@ class ReportResult {
reportState.filters[groupBy].isNotEmpty; reportState.filters[groupBy].isNotEmpty;
if (groupBy.isEmpty || isGroupByFIltered) { if (groupBy.isEmpty || isGroupByFIltered) {
for (var i = 0; i < data.length; i++) { final row = data[index-1];
final row = data[i];
final cells = <DataCell>[]; final cells = <DataCell>[];
for (var j = 0; j < row.length; j++) { for (var j = 0; j < row.length; j++) {
final cell = row[j]; final cell = row[j];
@ -902,8 +960,7 @@ class ReportResult {
}), }),
); );
} }
rows.add(DataRow(cells: cells)); return DataRow(cells: cells);
}
} else { } else {
final groupTotals = viewModel.groupTotals; final groupTotals = viewModel.groupTotals;
final keys = groupTotals.keys.toList(); final keys = groupTotals.keys.toList();
@ -921,7 +978,8 @@ class ReportResult {
} }
return 0; return 0;
}); });
keys.forEach((group) {
final group = keys[index-1];
final values = viewModel.groupTotals[group]; final values = viewModel.groupTotals[group];
final cells = <DataCell>[]; final cells = <DataCell>[];
for (var column in sortedColumns(context)) { for (var column in sortedColumns(context)) {
@ -951,8 +1009,7 @@ class ReportResult {
String customEndDate = ''; String customEndDate = '';
if (getReportColumnType(column, context) == if (getReportColumnType(column, context) ==
ReportColumnType.dateTime || ReportColumnType.dateTime ||
getReportColumnType(column, context) == getReportColumnType(column, context) == ReportColumnType.date) {
ReportColumnType.date) {
filter = DateRange.custom.toString(); filter = DateRange.custom.toString();
final date = DateTime.tryParse(group); final date = DateTime.tryParse(group);
customStartDate = group; customStartDate = group;
@ -982,11 +1039,9 @@ class ReportResult {
} }
})); }));
} }
rows.add(DataRow(cells: cells));
});
}
return rows; return DataRow(cells: cells);
}
} }
List<DataColumn> totalColumns( List<DataColumn> totalColumns(