Reports
This commit is contained in:
parent
1a33cc36e2
commit
2ee522356d
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue