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,34 +408,22 @@ 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
|
||||||
: null,
|
: null,
|
||||||
sortAscending: reportSettings.sortAscending,
|
sortAscending: reportSettings.sortAscending,
|
||||||
columns: reportResult.tableColumns(
|
columns: reportResult.tableColumns(
|
||||||
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,23 +946,21 @@ 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];
|
final column = columns[j];
|
||||||
final column = columns[j];
|
cells.add(
|
||||||
cells.add(
|
DataCell(cell.renderWidget(context, column), onTap: () {
|
||||||
DataCell(cell.renderWidget(context, column), onTap: () {
|
viewEntityById(
|
||||||
viewEntityById(
|
context: context,
|
||||||
context: context,
|
entityId: cell.entityId,
|
||||||
entityId: cell.entityId,
|
entityType: cell.entityType);
|
||||||
entityType: cell.entityType);
|
}),
|
||||||
}),
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
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,72 +978,70 @@ class ReportResult {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
keys.forEach((group) {
|
|
||||||
final values = viewModel.groupTotals[group];
|
final group = keys[index-1];
|
||||||
final cells = <DataCell>[];
|
final values = viewModel.groupTotals[group];
|
||||||
for (var column in sortedColumns(context)) {
|
final cells = <DataCell>[];
|
||||||
String value = '';
|
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 (column == groupBy) {
|
||||||
if (group.isEmpty) {
|
String filter = group;
|
||||||
value = AppLocalization.of(context).blank;
|
String customStartDate = '';
|
||||||
} else if (getReportColumnType(column, context) ==
|
String customEndDate = '';
|
||||||
|
if (getReportColumnType(column, context) ==
|
||||||
ReportColumnType.dateTime ||
|
ReportColumnType.dateTime ||
|
||||||
getReportColumnType(column, context) == ReportColumnType.date) {
|
getReportColumnType(column, context) == ReportColumnType.date) {
|
||||||
value = formatDate(group, context);
|
filter = DateRange.custom.toString();
|
||||||
} else {
|
final date = DateTime.tryParse(group);
|
||||||
value = group;
|
customStartDate = group;
|
||||||
}
|
if (reportState.subgroup == kReportGroupDay) {
|
||||||
value = value + ' (' + values['count'].floor().toString() + ')';
|
customEndDate = convertDateTimeToSqlDate(addDays(date, 1));
|
||||||
} else if (getReportColumnType(column, context) ==
|
} else if (reportState.subgroup == kReportGroupMonth) {
|
||||||
ReportColumnType.number) {
|
customEndDate = convertDateTimeToSqlDate(addMonths(date, 1));
|
||||||
value = formatNumber(values[column], context);
|
} else {
|
||||||
}
|
customEndDate = convertDateTimeToSqlDate(addYears(date, 1));
|
||||||
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' : '';
|
|
||||||
}
|
}
|
||||||
store.dispatch(
|
} else if (getReportColumnType(column, context) ==
|
||||||
UpdateReportSettings(
|
ReportColumnType.bool) {
|
||||||
report: reportState.report,
|
filter = filter == AppLocalization.of(context).yes
|
||||||
selectedGroup: filter,
|
? 'true'
|
||||||
customStartDate: customStartDate,
|
: filter == AppLocalization.of(context).no ? 'false' : '';
|
||||||
customEndDate: customEndDate,
|
|
||||||
filters: reportState.filters
|
|
||||||
.rebuild((b) => b..addAll({column: filter})),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}));
|
store.dispatch(
|
||||||
}
|
UpdateReportSettings(
|
||||||
rows.add(DataRow(cells: cells));
|
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(
|
List<DataColumn> totalColumns(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue