feat: multiple sms campaign actions (#1164)

Fixes: #1163
This commit is contained in:
Karan Takalkar
2020-08-01 18:52:47 +05:30
committed by GitHub
parent 24d3752baa
commit d77a78d3c6
3 changed files with 170 additions and 8 deletions
@@ -205,6 +205,14 @@ export class OrganizationService {
return this.http.put(`/smscampaigns/${campaignId}`, campaign);
}
/**
* @param {any} campaign Campaign to be deleted.
* @returns {Observable<any>}
*/
deleteSmsCampaign(campaignId: string): Observable<any> {
return this.http.delete(`/smscampaigns/${campaignId}`);
}
/**
* @returns {Observable<any>} SMS Campaign template
*/
@@ -212,6 +220,17 @@ export class OrganizationService {
return this.http.get('/smscampaigns/template');
}
/**
* @param {string} campaignId Campaign Id
* @param {any} data Data
* @param {string} command Command
* @returns {Observable<any>}
*/
executeSmsCampaignCommand(campaignId: string, data: any, command: string): Observable<any> {
const httpParams = new HttpParams().set('command', command.toString());
return this.http.post(`/smscampaigns/${campaignId}`, data, { params: httpParams });
}
/**
* @param {any} SMS
* @returns {Observable<any>} Messages Data
@@ -9,25 +9,25 @@
</span>
<span *ngIf="smsCampaignData.campaignStatus.value === 'Pending'">
<button mat-raised-button color="accent" *mifosxHasPermission="'ACTIVATE_SMSCAMPAIGN'">
<button mat-raised-button color="accent" *mifosxHasPermission="'ACTIVATE_SMSCAMPAIGN'" (click)="activateCampaign()">
<fa-icon icon="lock-open"></fa-icon>&nbsp;&nbsp;Activate
</button>
</span>
<span *ngIf="smsCampaignData.campaignStatus.value !== 'closed'">
<button mat-raised-button color="warn" *mifosxHasPermission="'CLOSE_SMSCAMPAIGN'">
<button mat-raised-button color="warn" *mifosxHasPermission="'CLOSE_SMSCAMPAIGN'" (click)="closeCampaign()">
<fa-icon icon="times"></fa-icon>&nbsp;&nbsp;Close
</button>
</span>
<span *ngIf="smsCampaignData.campaignStatus.value !== 'Pending' && smsCampaignData.campaignStatus.value !== 'active'">
<button mat-raised-button color="accent" *mifosxHasPermission="'REACTIVATE_SMSCAMPAIGN'">
<button mat-raised-button color="accent" *mifosxHasPermission="'REACTIVATE_SMSCAMPAIGN'" (click)="reactivateCampaign()">
<fa-icon icon="undo"></fa-icon>&nbsp;&nbsp;Reactivate
</button>
</span>
<span *ngIf="smsCampaignData.campaignStatus.value === 'closed'">
<button mat-raised-button color="warn" *mifosxHasPermission="'DELETE_SMSCAMPAIGN'">
<button mat-raised-button color="warn" *mifosxHasPermission="'DELETE_SMSCAMPAIGN'" (click)="deleteCampaign()">
<fa-icon icon="trash"></fa-icon>&nbsp;&nbsp;Delete
</button>
</span>
@@ -1,10 +1,18 @@
/** Angular Imports */
import { Component, OnInit, ViewChild } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
import { MatTableDataSource, MatTable } from '@angular/material';
import { ActivatedRoute } from '@angular/router';
import { MatTableDataSource, MatTable, MatDialog } from '@angular/material';
import { ActivatedRoute, Router } from '@angular/router';
import { DatePipe } from '@angular/common';
/** Custom Dialogs */
import { DeleteDialogComponent } from 'app/shared/delete-dialog/delete-dialog.component';
import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component';
/** Custom Models */
import { FormfieldBase } from 'app/shared/form-dialog/formfield/model/formfield-base';
import { DatepickerBase } from 'app/shared/form-dialog/formfield/model/datepicker-base';
/** Custom Services */
import { OrganizationService } from '../../organization.service';
@@ -61,13 +69,17 @@ export class ViewCampaignComponent implements OnInit {
];
/**
* Retrieves the SMS Campaign data from `resolve`
* Retrieves the SMS Campaign data from `resolve
* @param {Router} router Router
* @param {ActivatedRoute} route Activated Route
* @param {MatDialog} dialog Mat Dialog
* @param {FormBuilder} formBuilder Form Builder
* @param {DatePipe} datePipe Date Pipe
* @param {OrganizationService} organizationService Organization Service
*/
constructor(private route: ActivatedRoute,
constructor(private router: Router,
private route: ActivatedRoute,
public dialog: MatDialog,
private formBuilder: FormBuilder,
private datePipe: DatePipe,
private organizationService: OrganizationService) {
@@ -106,6 +118,137 @@ export class ViewCampaignComponent implements OnInit {
this.smsForm.reset();
}
/**
* Closes the SMS Campaign.
*/
closeCampaign() {
const formfields: FormfieldBase[] = [
new DatepickerBase({
controlName: 'closureDate',
label: 'Closure Date',
value: '',
type: 'date',
required: true
})
];
const data = {
title: 'Close SMS Campaign',
layout: { addButtonText: 'Confirm' },
formfields: formfields
};
const closeCampaignDialogRef = this.dialog.open(FormDialogComponent, { data });
closeCampaignDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
const locale = 'en';
const dateFormat = 'dd MMMM yyyy';
const dataObject = {
closureDate: this.datePipe.transform(response.data.value.closureDate, dateFormat),
dateFormat,
locale
};
this.organizationService.executeSmsCampaignCommand(this.smsCampaignData.id, dataObject, 'close').subscribe(() => {
this.reload();
});
}
});
}
/**
* Activates the SMS Campaign.
*/
activateCampaign() {
const formfields: FormfieldBase[] = [
new DatepickerBase({
controlName: 'activationDate',
label: 'Activation Date',
value: '',
type: 'date',
required: true
})
];
const data = {
title: 'Activate SMS Campaign',
layout: { addButtonText: 'Confirm' },
formfields: formfields
};
const activateCampaignDialogRef = this.dialog.open(FormDialogComponent, { data });
activateCampaignDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
const locale = 'en';
const dateFormat = 'dd MMMM yyyy';
const dataObject = {
activationDate: this.datePipe.transform(response.data.value.activationDate, dateFormat),
dateFormat,
locale
};
this.organizationService.executeSmsCampaignCommand(this.smsCampaignData.id, dataObject, 'activate').subscribe(() => {
this.reload();
});
}
});
}
/**
* Reactivates the SMS Campaign.
*/
reactivateCampaign() {
const formfields: FormfieldBase[] = [
new DatepickerBase({
controlName: 'activationDate',
label: 'Reactivation Date',
value: '',
type: 'date',
required: true
})
];
const data = {
title: 'Reactivate SMS Campaign',
layout: { addButtonText: 'Confirm' },
formfields: formfields
};
const reactivateCampaignDialogRef = this.dialog.open(FormDialogComponent, { data });
reactivateCampaignDialogRef.afterClosed().subscribe((response: any) => {
if (response.data) {
const locale = 'en';
const dateFormat = 'dd MMMM yyyy';
const dataObject = {
activationDate: this.datePipe.transform(response.data.value.activationDate, dateFormat),
dateFormat,
locale
};
this.organizationService.executeSmsCampaignCommand(this.smsCampaignData.id, dataObject, 'reactivate').subscribe(() => {
this.reload();
});
}
});
}
/**
* Deletes the SMS Campaign.
*/
deleteCampaign() {
const deleteSmsCampaignDialogRef = this.dialog.open(DeleteDialogComponent, {
data: { deleteContext: `sms campaing with id: ${this.smsCampaignData.id}` }
});
deleteSmsCampaignDialogRef.afterClosed().subscribe((response: any) => {
if (response.delete) {
this.organizationService.deleteSmsCampaign(this.smsCampaignData.id).subscribe(() => {
this.router.navigate(['../'], { relativeTo: this.route });
});
}
});
}
/**
* Refetches data fot the component
* TODO: Replace by a custom reload component instead of hard-coded back-routing.
*/
private reload() {
const url: string = this.router.url;
this.router.navigateByUrl(`/organization/sms-campaigns`, {skipLocationChange: true})
.then(() => this.router.navigate([url]));
}
/**
* Retrives messages by status.
*/