Fix datatable multirow multiple selection and deletion (#1764)

Co-authored-by: Jose Alberto Hernandez <alberto@blue-daemon.local>
This commit is contained in:
José Alberto Hernández
2023-06-06 21:54:13 -06:00
committed by GitHub
co-authored by Jose Alberto Hernandez
parent 75686c7f4c
commit 6bba522108
8 changed files with 45 additions and 25 deletions
+2 -2
View File
@@ -389,7 +389,7 @@ export class ClientsService {
}, },
page, page,
size: pageSize size: pageSize
} };
if (sortAttribute !== '' && sortDirection !== '') { if (sortAttribute !== '' && sortDirection !== '') {
request = { request = {
...request, ...request,
@@ -399,7 +399,7 @@ export class ClientsService {
property: sortAttribute property: sortAttribute
} }
] ]
} };
} }
return this.http.post(`/v2/clients/search`, request); return this.http.post(`/v2/clients/search`, request);
} }
+12 -2
View File
@@ -12,7 +12,9 @@ import { Dates } from './dates';
}) })
export class Datatables { export class Datatables {
systemFields: string[] = ['id', 'created_at', 'updated_at', 'client_id', 'savings_account_id', systemFields: string[] = ['id', 'created_at', 'updated_at'];
entitiesIdFields: string[] = ['client_id', 'savings_account_id',
'loan_id', 'group_id', 'center_id', 'office_id', 'product_loan_id', 'savings_product_id', 'share_product_id']; 'loan_id', 'group_id', 'center_id', 'office_id', 'product_loan_id', 'savings_product_id', 'share_product_id'];
constructor(private dateUtils: Dates, constructor(private dateUtils: Dates,
@@ -73,9 +75,17 @@ export class Datatables {
}); });
} }
public isEntityId(columnName: string): boolean {
return (this.entitiesIdFields.includes(columnName));
}
public isSystemColumn(columnName: string): boolean {
return (this.systemFields.includes(columnName) || this.entitiesIdFields.includes(columnName));
}
public filterSystemColumns(columnHeaders: any): any { public filterSystemColumns(columnHeaders: any): any {
return columnHeaders.filter((column: any, index: number) => { return columnHeaders.filter((column: any, index: number) => {
if (!this.systemFields.includes(column.columnName)) { if (!this.isSystemColumn(column.columnName)) {
column.idx = index; column.idx = index;
return column; return column;
} }
@@ -127,7 +127,7 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges {
'fixedEmiAmount': this.loansAccountTermsData.fixedEmiAmount, 'fixedEmiAmount': this.loansAccountTermsData.fixedEmiAmount,
'maxOutstandingLoanBalance': this.loansAccountTermsData.maxOutstandingLoanBalance, 'maxOutstandingLoanBalance': this.loansAccountTermsData.maxOutstandingLoanBalance,
'transactionProcessingStrategyCode': this.loansAccountTermsData.transactionProcessingStrategyCode, 'transactionProcessingStrategyCode': this.loansAccountTermsData.transactionProcessingStrategyCode,
'interestRateDifferential':this.loansAccountTermsData.interestRateDifferential, 'interestRateDifferential': this.loansAccountTermsData.interestRateDifferential,
'multiDisburseLoan': this.loansAccountTermsData.multiDisburseLoan 'multiDisburseLoan': this.loansAccountTermsData.multiDisburseLoan
}); });
@@ -211,7 +211,7 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges {
'fixedEmiAmount': this.loansAccountTermsData.fixedEmiAmount, 'fixedEmiAmount': this.loansAccountTermsData.fixedEmiAmount,
'maxOutstandingLoanBalance': this.loansAccountTermsData.maxOutstandingLoanBalance, 'maxOutstandingLoanBalance': this.loansAccountTermsData.maxOutstandingLoanBalance,
'transactionProcessingStrategyCode': this.loansAccountTermsData.transactionProcessingStrategyCode, 'transactionProcessingStrategyCode': this.loansAccountTermsData.transactionProcessingStrategyCode,
'interestRateDifferential':this.loansAccountTermsData.interestRateDifferential, 'interestRateDifferential': this.loansAccountTermsData.interestRateDifferential,
'multiDisburseLoan': this.loansAccountTermsData.multiDisburseLoan 'multiDisburseLoan': this.loansAccountTermsData.multiDisburseLoan
}); });
} }
@@ -273,7 +273,7 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges {
'fixedEmiAmount': [''], 'fixedEmiAmount': [''],
'isTopup': [''], 'isTopup': [''],
'maxOutstandingLoanBalance': [''], 'maxOutstandingLoanBalance': [''],
'interestRateDifferential':[''], 'interestRateDifferential': [''],
'transactionProcessingStrategyCode': ['', Validators.required], 'transactionProcessingStrategyCode': ['', Validators.required],
'multiDisburseLoan': [false] 'multiDisburseLoan': [false]
}); });
+1 -1
View File
@@ -587,7 +587,7 @@ export class LoansService {
delete loansAccountData.isValid; delete loansAccountData.isValid;
loansAccountData.principal = loansAccountData.principalAmount; loansAccountData.principal = loansAccountData.principalAmount;
delete loansAccountData.principalAmount; delete loansAccountData.principalAmount;
delete loansAccountData.multiDisburseLoan; //this was just added so that disbursement data can be send in the backend delete loansAccountData.multiDisburseLoan; // this was just added so that disbursement data can be send in the backend
return loansAccountData; return loansAccountData;
} }
@@ -147,7 +147,7 @@ export class SavingsAccountTermsStepComponent implements OnChanges, OnInit {
const payload = this.savingsAccountTermsForm.getRawValue(); const payload = this.savingsAccountTermsForm.getRawValue();
delete payload.currencyCode; delete payload.currencyCode;
delete payload.decimal; delete payload.decimal;
delete payload.minBalanceForInterestCalculation; //Backend is not accepting minBalanceForInterestCalculation value delete payload.minBalanceForInterestCalculation; // Backend is not accepting minBalanceForInterestCalculation value
return payload; return payload;
} }
@@ -10,13 +10,13 @@
<fa-icon icon="plus" class="m-r-10"></fa-icon>Add <fa-icon icon="plus" class="m-r-10"></fa-icon>Add
</button> </button>
</span> </span>
<span *mifosxHasPermission="'DELETE_' + datatableName"> <span *mifosxHasPermission="'DELETE_' + datatableName" [fxShow]="isSelected">
<button class="delete-button" mat-raised-button color="warn" (click)="deleteSelected()" *ngIf="dataObject.data.length > 0"> <button class="delete-button" mat-raised-button color="warn" (click)="deleteSelected()">
<fa-icon icon="trash" [disabled]="!isAnySelected()" class="m-r-10"></fa-icon>Delete Selected <fa-icon icon="trash" class="m-r-10"></fa-icon>Delete Selected
</button> </button>
</span> </span>
<span *mifosxHasPermission="'DELETE_' + datatableName"> <span *mifosxHasPermission="'DELETE_' + datatableName" [fxShow]="datatableData.length > 0">
<button class="delete-button" mat-raised-button color="warn" (click)="delete()" *ngIf="dataObject.data.length > 0"> <button class="delete-button" mat-raised-button color="warn" (click)="delete()">
<fa-icon icon="trash" class="m-r-10"></fa-icon>Delete All <fa-icon icon="trash" class="m-r-10"></fa-icon>Delete All
</button> </button>
</span> </span>
@@ -31,7 +31,7 @@
<th mat-header-cell *matHeaderCellDef></th> <th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let data"> <td mat-cell *matCellDef="let data">
<mat-checkbox class="center" (click)="$event.stopPropagation()" <mat-checkbox class="center" (click)="$event.stopPropagation()"
(change)="$event ? selection.toggle(data) : null" [checked]="selection.isSelected(data)"> (change)="$event ? itemToggle(data) : null" [checked]="selection.isSelected(data)">
</mat-checkbox> </mat-checkbox>
</td> </td>
</ng-container> </ng-container>
@@ -39,7 +39,7 @@
<ng-container *ngIf="i > 0"> <ng-container *ngIf="i > 0">
<th mat-header-cell class="right" *matHeaderCellDef> {{datatableColumn}} </th> <th mat-header-cell class="right" *matHeaderCellDef> {{datatableColumn}} </th>
<td mat-cell class="right" *matCellDef="let data" [ngClass]="isToDelete(data)"> <td mat-cell class="right" *matCellDef="let data" [ngClass]="isToDelete(data)">
{{ formatValue(i, data.row[i]) }} {{ formatValue(i, data.row[i - 1]) }}
</td> </td>
</ng-container> </ng-container>
</ng-container> </ng-container>
@@ -40,6 +40,7 @@ export class DatatableMultiRowComponent implements OnInit, OnDestroy, OnChanges
showDeleteBotton: boolean; showDeleteBotton: boolean;
/** Row Selection Data */ /** Row Selection Data */
selection: SelectionModel<any>; selection: SelectionModel<any>;
isSelected = false;
/** Data Table Reference */ /** Data Table Reference */
@ViewChild('dataTable') dataTableRef: MatTable<Element>; @ViewChild('dataTable') dataTableRef: MatTable<Element>;
@@ -73,6 +74,7 @@ export class DatatableMultiRowComponent implements OnInit, OnDestroy, OnChanges
this.datatableName = routeParams.datatableName; this.datatableName = routeParams.datatableName;
}); });
this.setData(); this.setData();
this.isSelected = false;
} }
ngOnDestroy(): void { ngOnDestroy(): void {
@@ -86,13 +88,15 @@ export class DatatableMultiRowComponent implements OnInit, OnDestroy, OnChanges
} }
setData() { setData() {
this.datatableColumns = [this.SELECT_NAME_FIELD].concat(this.dataObject.columnHeaders.map((columnHeader: any) => { this.datatableColumns = [this.SELECT_NAME_FIELD];
return columnHeader.columnName; this.dataObject.columnHeaders.filter((columnHeader: any) => {
}) if (!this.datatables.isEntityId(columnHeader.columnName)) {
); this.datatableColumns.push(columnHeader.columnName);
this.datatableData = this.dataObject.data; return columnHeader;
// console.log(this.datatableData); }
});
this.datatableData = this.dataObject.data;
if (this.dataTableRef) { if (this.dataTableRef) {
this.dataTableRef.renderRows(); this.dataTableRef.renderRows();
} }
@@ -198,7 +202,7 @@ export class DatatableMultiRowComponent implements OnInit, OnDestroy, OnChanges
} }
isAnySelected() { isAnySelected() {
return (this.selection.selected.length > 0); return (this.selection.selected && this.selection.selected.length > 0);
} }
/** Selects all rows if they are not all selected; otherwise clear selection. */ /** Selects all rows if they are not all selected; otherwise clear selection. */
@@ -208,6 +212,12 @@ export class DatatableMultiRowComponent implements OnInit, OnDestroy, OnChanges
} else { } else {
this.selection = new SelectionModel(true, []); this.selection = new SelectionModel(true, []);
} }
this.isSelected = (this.selection.selected.length > 0);
}
itemToggle(data: any): void {
this.selection.toggle(data);
this.isSelected = (this.selection.selected.length > 0);
} }
/** The label for the checkbox on the passed row */ /** The label for the checkbox on the passed row */