This commit is contained in:
Hillel Coren 2020-02-24 15:32:14 +02:00
parent 2d45e8364c
commit e96dfbf32a
14 changed files with 79 additions and 59 deletions

View File

@ -643,9 +643,9 @@ abstract class UserSettingsEntity
abstract class ReportSettingsEntity abstract class ReportSettingsEntity
implements Built<ReportSettingsEntity, ReportSettingsEntityBuilder> { implements Built<ReportSettingsEntity, ReportSettingsEntityBuilder> {
factory ReportSettingsEntity({int sortIndex, bool sortAscending, int sortTotalsIndex, bool sortTotalsAscending, }) { factory ReportSettingsEntity({String sortColumn, bool sortAscending, int sortTotalsIndex, bool sortTotalsAscending, }) {
return _$ReportSettingsEntity._( return _$ReportSettingsEntity._(
sortIndex: sortIndex, sortColumn: sortColumn ?? '',
sortAscending: sortAscending ?? true, sortAscending: sortAscending ?? true,
sortTotalsIndex: sortTotalsIndex, sortTotalsIndex: sortTotalsIndex,
sortTotalsAscending: sortTotalsAscending ?? true, sortTotalsAscending: sortTotalsAscending ?? true,
@ -656,8 +656,8 @@ abstract class ReportSettingsEntity
ReportSettingsEntity._(); ReportSettingsEntity._();
@nullable @nullable
@BuiltValueField(wireName: 'sort_index') @BuiltValueField(wireName: 'sort_column')
int get sortIndex; String get sortColumn;
// TODO remove nullable // TODO remove nullable
@nullable @nullable

View File

@ -943,11 +943,11 @@ class _$ReportSettingsEntitySerializer
specifiedType: specifiedType:
const FullType(BuiltList, const [const FullType(String)])), const FullType(BuiltList, const [const FullType(String)])),
]; ];
if (object.sortIndex != null) { if (object.sortColumn != null) {
result result
..add('sort_index') ..add('sort_column')
..add(serializers.serialize(object.sortIndex, ..add(serializers.serialize(object.sortColumn,
specifiedType: const FullType(int))); specifiedType: const FullType(String)));
} }
if (object.sortAscending != null) { if (object.sortAscending != null) {
result result
@ -982,9 +982,9 @@ class _$ReportSettingsEntitySerializer
iterator.moveNext(); iterator.moveNext();
final dynamic value = iterator.current; final dynamic value = iterator.current;
switch (key) { switch (key) {
case 'sort_index': case 'sort_column':
result.sortIndex = serializers.deserialize(value, result.sortColumn = serializers.deserialize(value,
specifiedType: const FullType(int)) as int; specifiedType: const FullType(String)) as String;
break; break;
case 'sort_ascending': case 'sort_ascending':
result.sortAscending = serializers.deserialize(value, result.sortAscending = serializers.deserialize(value,
@ -4065,7 +4065,7 @@ class UserSettingsEntityBuilder
class _$ReportSettingsEntity extends ReportSettingsEntity { class _$ReportSettingsEntity extends ReportSettingsEntity {
@override @override
final int sortIndex; final String sortColumn;
@override @override
final bool sortAscending; final bool sortAscending;
@override @override
@ -4080,7 +4080,7 @@ class _$ReportSettingsEntity extends ReportSettingsEntity {
(new ReportSettingsEntityBuilder()..update(updates)).build(); (new ReportSettingsEntityBuilder()..update(updates)).build();
_$ReportSettingsEntity._( _$ReportSettingsEntity._(
{this.sortIndex, {this.sortColumn,
this.sortAscending, this.sortAscending,
this.sortTotalsIndex, this.sortTotalsIndex,
this.sortTotalsAscending, this.sortTotalsAscending,
@ -4104,7 +4104,7 @@ class _$ReportSettingsEntity extends ReportSettingsEntity {
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(other, this)) return true; if (identical(other, this)) return true;
return other is ReportSettingsEntity && return other is ReportSettingsEntity &&
sortIndex == other.sortIndex && sortColumn == other.sortColumn &&
sortAscending == other.sortAscending && sortAscending == other.sortAscending &&
sortTotalsIndex == other.sortTotalsIndex && sortTotalsIndex == other.sortTotalsIndex &&
sortTotalsAscending == other.sortTotalsAscending && sortTotalsAscending == other.sortTotalsAscending &&
@ -4115,7 +4115,7 @@ class _$ReportSettingsEntity extends ReportSettingsEntity {
int get hashCode { int get hashCode {
return $jf($jc( return $jf($jc(
$jc( $jc(
$jc($jc($jc(0, sortIndex.hashCode), sortAscending.hashCode), $jc($jc($jc(0, sortColumn.hashCode), sortAscending.hashCode),
sortTotalsIndex.hashCode), sortTotalsIndex.hashCode),
sortTotalsAscending.hashCode), sortTotalsAscending.hashCode),
columns.hashCode)); columns.hashCode));
@ -4124,7 +4124,7 @@ class _$ReportSettingsEntity extends ReportSettingsEntity {
@override @override
String toString() { String toString() {
return (newBuiltValueToStringHelper('ReportSettingsEntity') return (newBuiltValueToStringHelper('ReportSettingsEntity')
..add('sortIndex', sortIndex) ..add('sortColumn', sortColumn)
..add('sortAscending', sortAscending) ..add('sortAscending', sortAscending)
..add('sortTotalsIndex', sortTotalsIndex) ..add('sortTotalsIndex', sortTotalsIndex)
..add('sortTotalsAscending', sortTotalsAscending) ..add('sortTotalsAscending', sortTotalsAscending)
@ -4137,9 +4137,9 @@ class ReportSettingsEntityBuilder
implements Builder<ReportSettingsEntity, ReportSettingsEntityBuilder> { implements Builder<ReportSettingsEntity, ReportSettingsEntityBuilder> {
_$ReportSettingsEntity _$v; _$ReportSettingsEntity _$v;
int _sortIndex; String _sortColumn;
int get sortIndex => _$this._sortIndex; String get sortColumn => _$this._sortColumn;
set sortIndex(int sortIndex) => _$this._sortIndex = sortIndex; set sortColumn(String sortColumn) => _$this._sortColumn = sortColumn;
bool _sortAscending; bool _sortAscending;
bool get sortAscending => _$this._sortAscending; bool get sortAscending => _$this._sortAscending;
@ -4165,7 +4165,7 @@ class ReportSettingsEntityBuilder
ReportSettingsEntityBuilder get _$this { ReportSettingsEntityBuilder get _$this {
if (_$v != null) { if (_$v != null) {
_sortIndex = _$v.sortIndex; _sortColumn = _$v.sortColumn;
_sortAscending = _$v.sortAscending; _sortAscending = _$v.sortAscending;
_sortTotalsIndex = _$v.sortTotalsIndex; _sortTotalsIndex = _$v.sortTotalsIndex;
_sortTotalsAscending = _$v.sortTotalsAscending; _sortTotalsAscending = _$v.sortTotalsAscending;
@ -4194,7 +4194,7 @@ class ReportSettingsEntityBuilder
try { try {
_$result = _$v ?? _$result = _$v ??
new _$ReportSettingsEntity._( new _$ReportSettingsEntity._(
sortIndex: sortIndex, sortColumn: sortColumn,
sortAscending: sortAscending, sortAscending: sortAscending,
sortTotalsIndex: sortTotalsIndex, sortTotalsIndex: sortTotalsIndex,
sortTotalsAscending: sortTotalsAscending, sortTotalsAscending: sortTotalsAscending,

View File

@ -58,9 +58,9 @@ Reducer<UserCompanyEntity> userCompanyEntityReducer = combineReducers([
final settings = userCompany.settings.reportSettings[action.report]; final settings = userCompany.settings.reportSettings[action.report];
return userCompany.rebuild((b) => b return userCompany.rebuild((b) => b
..settings.reportSettings[action.report] = settings.rebuild((b) => b ..settings.reportSettings[action.report] = settings.rebuild((b) => b
..sortAscending = action.sortIndex == null ..sortAscending = action.sortColumn == null
? settings.sortAscending ? settings.sortAscending
: action.sortIndex == settings.sortIndex : action.sortColumn == settings.sortColumn
? !settings.sortAscending ? !settings.sortAscending
: true : true
..sortTotalsAscending = action.sortTotalsIndex == null ..sortTotalsAscending = action.sortTotalsIndex == null
@ -68,14 +68,14 @@ Reducer<UserCompanyEntity> userCompanyEntityReducer = combineReducers([
: action.sortTotalsIndex == settings.sortTotalsIndex : action.sortTotalsIndex == settings.sortTotalsIndex
? !settings.sortTotalsAscending ? !settings.sortTotalsAscending
: true : true
..sortIndex = action.sortIndex ?? settings.sortIndex ..sortColumn = action.sortColumn ?? settings.sortColumn
..sortTotalsIndex = ..sortTotalsIndex =
action.sortTotalsIndex ?? settings.sortTotalsIndex)); action.sortTotalsIndex ?? settings.sortTotalsIndex));
} else { } else {
return userCompany.rebuild( return userCompany.rebuild(
(b) => b (b) => b
..settings.reportSettings[action.report] = ReportSettingsEntity( ..settings.reportSettings[action.report] = ReportSettingsEntity(
sortIndex: action.sortIndex, sortColumn: action.sortColumn,
sortTotalsIndex: action.sortTotalsIndex, sortTotalsIndex: action.sortTotalsIndex,
), ),
); );

View File

@ -21,7 +21,7 @@ class UpdateReportSettings implements PersistUI {
this.group, this.group,
this.selectedGroup, this.selectedGroup,
this.subgroup, this.subgroup,
this.sortIndex, this.sortColumn,
this.sortTotalsIndex, this.sortTotalsIndex,
this.customStartDate, this.customStartDate,
this.customEndDate, this.customEndDate,
@ -33,7 +33,7 @@ class UpdateReportSettings implements PersistUI {
final String selectedGroup; final String selectedGroup;
final String chart; final String chart;
final String subgroup; final String subgroup;
final int sortIndex; final String sortColumn;
final int sortTotalsIndex; final int sortTotalsIndex;
final String customStartDate; final String customStartDate;
final String customEndDate; final String customEndDate;

View File

@ -279,12 +279,13 @@ ReportResult clientReport(
} }
} }
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, clientReportSettings)); final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, clientReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
ClientReportFields.values.map((item) => EnumUtils.parse(item)).toList(), ClientReportFields.values.map((item) => EnumUtils.parse(item)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -132,13 +132,14 @@ ReportResult creditReport(
} }
} }
final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort( data.sort(
(rowA, rowB) => sortReportTableRows(rowA, rowB, creditReportSettings)); (rowA, rowB) => sortReportTableRows(rowA, rowB, creditReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
CreditReportFields.values.map((e) => EnumUtils.parse(e)).toList(), CreditReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -141,12 +141,13 @@ ReportResult documentReport(
} }
} }
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, documentReportSettings)); final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, documentReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
DocumentReportFields.values.map((e) => EnumUtils.parse(e)).toList(), DocumentReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -188,12 +188,13 @@ ReportResult expenseReport(
} }
} }
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, expenseReportSettings)); final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, expenseReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
ExpenseReportFields.values.map((e) => EnumUtils.parse(e)).toList(), ExpenseReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -230,12 +230,13 @@ ReportResult invoiceReport(
} }
} }
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, invoiceReportSettings)); final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, invoiceReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
InvoiceReportFields.values.map((e) => EnumUtils.parse(e)).toList(), InvoiceReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -159,12 +159,13 @@ ReportResult paymentReport(
} }
} }
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, paymentReportSettings)); final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort((rowA, rowB) => sortReportTableRows(rowA, rowB, paymentReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
PaymentReportFields.values.map((e) => EnumUtils.parse(e)).toList(), PaymentReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -157,13 +157,14 @@ ReportResult productReport(
} }
} }
final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort( data.sort(
(rowA, rowB) => sortReportTableRows(rowA, rowB, productReportSettings)); (rowA, rowB) => sortReportTableRows(rowA, rowB, productReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: allColumns:
ProductReportFields.values.map((e) => EnumUtils.parse(e)).toList(), ProductReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,

View File

@ -378,6 +378,7 @@ class _ReportDataTableState extends State<ReportDataTable> {
final reportSettings = final reportSettings =
state.userCompany.settings?.reportSettings[reportState.report] ?? state.userCompany.settings?.reportSettings[reportState.report] ??
ReportSettingsEntity(); ReportSettingsEntity();
final sortedColumns = reportResult.sortedColumns(reportState);
return Column( return Column(
children: <Widget>[ children: <Widget>[
@ -411,15 +412,21 @@ class _ReportDataTableState extends State<ReportDataTable> {
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: PaginatedDataTable( child: PaginatedDataTable(
header: SizedBox(), 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,
*
*/
sortColumnIndex: sortedColumns.contains(reportSettings.sortColumn)
? sortedColumns.indexOf(reportSettings.sortColumn)
: 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(sortedColumns[index], ascending)),
source: dataTableSource, source: dataTableSource,
), ),
) )
@ -1246,17 +1253,20 @@ class ReportBoolValue extends ReportElement {
} }
} }
int sortReportTableRows( int sortReportTableRows(dynamic rowA, dynamic rowB,
dynamic rowA, dynamic rowB, ReportSettingsEntity reportSettings) { ReportSettingsEntity reportSettings, List<String> columns) {
if (reportSettings.sortIndex == null) { if (reportSettings.sortColumn == null || reportSettings.sortColumn.isEmpty) {
return 0;
} else if (rowA.length <= reportSettings.sortIndex ||
rowB.length <= reportSettings.sortIndex) {
return 0; return 0;
} }
final dynamic valueA = rowA[reportSettings.sortIndex].value; final index = columns.indexOf(reportSettings.sortColumn);
final dynamic valueB = rowB[reportSettings.sortIndex].value;
if (rowA.length <= index || rowB.length <= index) {
return 0;
}
final dynamic valueA = rowA[index].value;
final dynamic valueB = rowB[index].value;
if (reportSettings.sortAscending) { if (reportSettings.sortAscending) {
return valueA.compareTo(valueB); return valueA.compareTo(valueB);

View File

@ -67,7 +67,7 @@ class ReportsScreenVM {
final Function(BuildContext, List<String>) onReportColumnsChanged; final Function(BuildContext, List<String>) onReportColumnsChanged;
final Function(BuildContext) onExportPressed; final Function(BuildContext) onExportPressed;
final Function(BuildContext, BuiltMap<String, String>) onReportFiltersChanged; final Function(BuildContext, BuiltMap<String, String>) onReportFiltersChanged;
final Function(int, bool) onReportSorted; final Function(String, bool) onReportSorted;
final Function(int, bool) onReportTotalsSorted; final Function(int, bool) onReportTotalsSorted;
final Function({ final Function({
String report, String report,
@ -190,10 +190,10 @@ class ReportsScreenVM {
state.uiState.reportsUIState, state.uiState.reportsUIState,
reportSettings, reportSettings,
), ),
onReportSorted: (index, ascending) { onReportSorted: (column, ascending) {
store.dispatch(UpdateReportSettings( store.dispatch(UpdateReportSettings(
report: state.uiState.reportsUIState.report, report: state.uiState.reportsUIState.report,
sortIndex: index, sortColumn: column,
)); ));
}, },
onReportTotalsSorted: (index, ascending) { onReportTotalsSorted: (index, ascending) {
@ -385,14 +385,16 @@ GroupTotals calculateReportTotals({
final rows = totals.keys.toList(); final rows = totals.keys.toList();
final sortedColumns = reportResult.sortedColumns(reportState); final sortedColumns = reportResult.sortedColumns(reportState);
final index = sortedColumns.contains(reportSettings.sortColumn)
? sortedColumns.indexOf(reportSettings.sortColumn)
: 0;
rows.sort((rowA, rowB) { rows.sort((rowA, rowB) {
final valuesA = totals[rowA]; final valuesA = totals[rowA];
final valuesB = totals[rowB]; final valuesB = totals[rowB];
if (reportSettings.sortIndex != null && if (index != null && index < columns.length) {
reportSettings.sortIndex < columns.length) { final sort = sortedColumns[index];
final sort = sortedColumns[reportSettings.sortIndex]; if (index == 0) {
if (reportSettings.sortIndex == 0) {
return reportSettings.sortAscending return reportSettings.sortAscending
? rowA.compareTo(rowB) ? rowA.compareTo(rowB)
: rowB.compareTo(rowA); : rowB.compareTo(rowA);

View File

@ -190,12 +190,13 @@ ReportResult taskReport(
} }
} }
final selectedColumns = columns.map((item) => EnumUtils.parse(item)).toList();
data.sort( data.sort(
(rowA, rowB) => sortReportTableRows(rowA, rowB, taskReportSettings)); (rowA, rowB) => sortReportTableRows(rowA, rowB, taskReportSettings, selectedColumns));
return ReportResult( return ReportResult(
allColumns: TaskReportFields.values.map((e) => EnumUtils.parse(e)).toList(), allColumns: TaskReportFields.values.map((e) => EnumUtils.parse(e)).toList(),
columns: columns.map((item) => EnumUtils.parse(item)).toList(), columns: selectedColumns,
defaultColumns: defaultColumns:
defaultColumns.map((item) => EnumUtils.parse(item)).toList(), defaultColumns.map((item) => EnumUtils.parse(item)).toList(),
data: data, data: data,