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> {
final Map<String, Map<String, TextEditingController>>
_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
void didChangeDependencies() {
@ -373,10 +408,10 @@ class _ReportDataTableState extends State<ReportDataTable> {
],
),
),
FormCard(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
SingleChildScrollView(
padding: const EdgeInsets.all(12),
child: PaginatedDataTable(
header: SizedBox(),
sortColumnIndex: reportSettings.sortIndex != null &&
reportResult.columns.length > reportSettings.sortIndex
? reportSettings.sortIndex
@ -386,21 +421,9 @@ class _ReportDataTableState extends State<ReportDataTable> {
context,
(index, ascending) =>
widget.viewModel.onReportSorted(index, ascending)),
rows: [
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),
],
),
),
source: dataTableSource,
),
)
],
);
}
@ -513,6 +536,7 @@ class ReportCharts extends StatelessWidget {
}
}
enum ReportColumnType {
string,
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 {
ReportResult({
@required this.columns,
@ -737,7 +797,7 @@ class ReportResult {
for (String column in sortedColumns(context))
if (textEditingControllers == null ||
!textEditingControllers.containsKey(column))
DataCell(SizedBox())
DataCell(Text(textEditingControllers == null ? 'null' : 'test'))
else if (getReportColumnType(column, context) == ReportColumnType.bool)
DataCell(AppDropdownButton<bool>(
labelText: null,
@ -873,8 +933,7 @@ class ReportResult {
]);
}
List<DataRow> tableRows(BuildContext context, ReportsScreenVM viewModel) {
final rows = <DataRow>[];
DataRow tableRow(BuildContext context, ReportsScreenVM viewModel, int index) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final reportState = state.uiState.reportsUIState;
@ -887,8 +946,7 @@ class ReportResult {
reportState.filters[groupBy].isNotEmpty;
if (groupBy.isEmpty || isGroupByFIltered) {
for (var i = 0; i < data.length; i++) {
final row = data[i];
final row = data[index-1];
final cells = <DataCell>[];
for (var j = 0; j < row.length; j++) {
final cell = row[j];
@ -902,8 +960,7 @@ class ReportResult {
}),
);
}
rows.add(DataRow(cells: cells));
}
return DataRow(cells: cells);
} else {
final groupTotals = viewModel.groupTotals;
final keys = groupTotals.keys.toList();
@ -921,7 +978,8 @@ class ReportResult {
}
return 0;
});
keys.forEach((group) {
final group = keys[index-1];
final values = viewModel.groupTotals[group];
final cells = <DataCell>[];
for (var column in sortedColumns(context)) {
@ -951,8 +1009,7 @@ class ReportResult {
String customEndDate = '';
if (getReportColumnType(column, context) ==
ReportColumnType.dateTime ||
getReportColumnType(column, context) ==
ReportColumnType.date) {
getReportColumnType(column, context) == ReportColumnType.date) {
filter = DateRange.custom.toString();
final date = DateTime.tryParse(group);
customStartDate = group;
@ -982,11 +1039,9 @@ class ReportResult {
}
}));
}
rows.add(DataRow(cells: cells));
});
}
return rows;
return DataRow(cells: cells);
}
}
List<DataColumn> totalColumns(