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,34 +408,22 @@ class _ReportDataTableState extends State<ReportDataTable> {
],
),
),
FormCard(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
sortColumnIndex: reportSettings.sortIndex != null &&
reportResult.columns.length > reportSettings.sortIndex
? reportSettings.sortIndex
: null,
sortAscending: reportSettings.sortAscending,
columns: reportResult.tableColumns(
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),
],
),
SingleChildScrollView(
padding: const EdgeInsets.all(12),
child: PaginatedDataTable(
header: SizedBox(),
sortColumnIndex: reportSettings.sortIndex != null &&
reportResult.columns.length > reportSettings.sortIndex
? reportSettings.sortIndex
: null,
sortAscending: reportSettings.sortAscending,
columns: reportResult.tableColumns(
context,
(index, ascending) =>
widget.viewModel.onReportSorted(index, ascending)),
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,23 +946,21 @@ class ReportResult {
reportState.filters[groupBy].isNotEmpty;
if (groupBy.isEmpty || isGroupByFIltered) {
for (var i = 0; i < data.length; i++) {
final row = data[i];
final cells = <DataCell>[];
for (var j = 0; j < row.length; j++) {
final cell = row[j];
final column = columns[j];
cells.add(
DataCell(cell.renderWidget(context, column), onTap: () {
viewEntityById(
context: context,
entityId: cell.entityId,
entityType: cell.entityType);
}),
);
}
rows.add(DataRow(cells: cells));
final row = data[index-1];
final cells = <DataCell>[];
for (var j = 0; j < row.length; j++) {
final cell = row[j];
final column = columns[j];
cells.add(
DataCell(cell.renderWidget(context, column), onTap: () {
viewEntityById(
context: context,
entityId: cell.entityId,
entityType: cell.entityType);
}),
);
}
return DataRow(cells: cells);
} else {
final groupTotals = viewModel.groupTotals;
final keys = groupTotals.keys.toList();
@ -921,72 +978,70 @@ class ReportResult {
}
return 0;
});
keys.forEach((group) {
final values = viewModel.groupTotals[group];
final cells = <DataCell>[];
for (var column in sortedColumns(context)) {
String value = '';
final group = keys[index-1];
final values = viewModel.groupTotals[group];
final cells = <DataCell>[];
for (var column in sortedColumns(context)) {
String value = '';
if (column == groupBy) {
if (group.isEmpty) {
value = AppLocalization.of(context).blank;
} else if (getReportColumnType(column, context) ==
ReportColumnType.dateTime ||
getReportColumnType(column, context) == ReportColumnType.date) {
value = formatDate(group, context);
} else {
value = group;
}
value = value + ' (' + values['count'].floor().toString() + ')';
} else if (getReportColumnType(column, context) ==
ReportColumnType.number) {
value = formatNumber(values[column], context);
}
cells.add(DataCell(Text(value), onTap: () {
if (group.isEmpty) {
return;
}
if (column == groupBy) {
if (group.isEmpty) {
value = AppLocalization.of(context).blank;
} else if (getReportColumnType(column, context) ==
String filter = group;
String customStartDate = '';
String customEndDate = '';
if (getReportColumnType(column, context) ==
ReportColumnType.dateTime ||
getReportColumnType(column, context) == ReportColumnType.date) {
value = formatDate(group, context);
} else {
value = group;
}
value = value + ' (' + values['count'].floor().toString() + ')';
} else if (getReportColumnType(column, context) ==
ReportColumnType.number) {
value = formatNumber(values[column], context);
}
cells.add(DataCell(Text(value), onTap: () {
if (group.isEmpty) {
return;
}
if (column == groupBy) {
String filter = group;
String customStartDate = '';
String customEndDate = '';
if (getReportColumnType(column, context) ==
ReportColumnType.dateTime ||
getReportColumnType(column, context) ==
ReportColumnType.date) {
filter = DateRange.custom.toString();
final date = DateTime.tryParse(group);
customStartDate = group;
if (reportState.subgroup == kReportGroupDay) {
customEndDate = convertDateTimeToSqlDate(addDays(date, 1));
} else if (reportState.subgroup == kReportGroupMonth) {
customEndDate = convertDateTimeToSqlDate(addMonths(date, 1));
} else {
customEndDate = convertDateTimeToSqlDate(addYears(date, 1));
}
} else if (getReportColumnType(column, context) ==
ReportColumnType.bool) {
filter = filter == AppLocalization.of(context).yes
? 'true'
: filter == AppLocalization.of(context).no ? 'false' : '';
filter = DateRange.custom.toString();
final date = DateTime.tryParse(group);
customStartDate = group;
if (reportState.subgroup == kReportGroupDay) {
customEndDate = convertDateTimeToSqlDate(addDays(date, 1));
} else if (reportState.subgroup == kReportGroupMonth) {
customEndDate = convertDateTimeToSqlDate(addMonths(date, 1));
} else {
customEndDate = convertDateTimeToSqlDate(addYears(date, 1));
}
store.dispatch(
UpdateReportSettings(
report: reportState.report,
selectedGroup: filter,
customStartDate: customStartDate,
customEndDate: customEndDate,
filters: reportState.filters
.rebuild((b) => b..addAll({column: filter})),
),
);
} else if (getReportColumnType(column, context) ==
ReportColumnType.bool) {
filter = filter == AppLocalization.of(context).yes
? 'true'
: filter == AppLocalization.of(context).no ? 'false' : '';
}
}));
}
rows.add(DataRow(cells: cells));
});
}
store.dispatch(
UpdateReportSettings(
report: reportState.report,
selectedGroup: filter,
customStartDate: customStartDate,
customEndDate: customEndDate,
filters: reportState.filters
.rebuild((b) => b..addAll({column: filter})),
),
);
}
}));
}
return rows;
return DataRow(cells: cells);
}
}
List<DataColumn> totalColumns(