I have a need to write a generic function which will enable/disable buttons based on conditions inside a JSON.
JSON:
{
PURCHASE_LIEN: {
LABEL: 'PURCHASE LIEN',
DISABLE: true,
CONDITION: [
{
ReviewPurchaseDecisionStatus: true,
PurchaseDecisionStatus: false
},
{
ReviewPurchaseDecisionStatus: true,
'ReviewPurchaseDecision.Status': 'NOT QUALIFIED'
}
]
},
NOT_QUALIFIED: {
LABEL: 'NOT QUALIFIED',
DISABLE: true,
CONDITION: [
{
ReviewPurchaseDecisionStatus: true,
PurchaseDecisionStatus: false
},
{
ReviewPurchaseDecisionStatus: true,
'ReviewPurchaseDecision.Status': 'PURCHASED'
}
]
}
}
In the JSON, I have two buttons "PURCHASE_LIEN" and "NOT_QUALIFIED". Both functions has array of conditions based on the condition, the button should enable/disable using "DISABLE" property.
VALIDATION.SERVICE.TS
The below function will set the DISABLE property of the button based on the conditions against an object (selectedRow).
public disableButton(buttonContainer: any, buttonID: string, selectedRow: any) {
let status = true;
for (let i = 0; i < buttonContainer[buttonID]['CONDITION'].length; i++) {
const condition = buttonContainer[buttonID]['CONDITION'][i];
for (const conditionName in condition) {
if (condition[conditionName] !== selectedRow[condition]) {
status = false;
}
}
if (status) {
buttonContainer[buttonID].DISABLE = false;
break;
} else {
buttonContainer[buttonID].DISABLE = true;
}
}
return buttonContainer;
}
app.component.html
<div class="col-12 col-sm-6 col-md-4 col-lg-2">
<button class="btn btn-primary btn-semi-circle" (click)="showModal('Purchase')"
[disabled]="disableButton(buttonGroup, 'PURCHASE_LIEN', selectedRowData)">Purchase
Lien</button>
<!-- [disabled]="PURCHASE_LIEN_DISABLE" -->
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-2">
<button class="btn btn-danger btn-semi-circle" (click)="showModal('Not Qualified')"
[disabled]="disableButton(buttonGroup, 'NOT_QUALIFIED', selectedRowData)">Not
Qualified</button>
<!-- [disabled]="NOT_QUALIFIED_DISABLE" -->
</div>
app.component.ts
export class ReviewPurchaseDecisionComponent implements OnInit {
public buttonGroup: any = {
PURCHASE_LIEN: {
LABEL: 'PURCHASE LIEN',
DISABLE: true,
CONDITION: [
{
ReviewPurchaseDecisionStatus: true,
PurchaseDecisionStatus: false
},
{
ReviewPurchaseDecisionStatus: true,
'ReviewPurchaseDecision.Status': 'NOT QUALIFIED'
}
]
},
NOT_QUALIFIED: {
LABEL: 'NOT QUALIFIED',
DISABLE: true,
CONDITION: [
{
ReviewPurchaseDecisionStatus: true,
PurchaseDecisionStatus: false
},
{
ReviewPurchaseDecisionStatus: true,
'ReviewPurchaseDecision.Status': 'PURCHASED'
}
]
}
};
constructor(
public router: Router,
public validation: ValidationService,
private fb: FormBuilder,
private http: HttpHelperService,
private myMonitoringService: MyMonitoringService,
private authentication: AuthenticationService,
private sessionService: SessionService,
public dialogService: DialogServiceService,
private caseService: CaseService,
private cookieService: CookieService
) {}
disableButton(buttonContainer: any, buttonID: string, selectedRow: any) {
this.buttonGroup = this.validation.disableButton(
buttonContainer,
buttonID,
selectedRow
);
return this.buttonGroup[buttonID].DISABLE;
}
}
The disableButton method in validation service changes the DISABLE property value to true/false based on the conditions, but the button doesn't enable. It doesn't detect the changes