diff --git a/src/app/organization/adhoc-query/adhoc-queries.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts similarity index 90% rename from src/app/organization/adhoc-query/adhoc-queries.resolver.ts rename to src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts index e5b66c16e..afdc98352 100644 --- a/src/app/organization/adhoc-query/adhoc-queries.resolver.ts +++ b/src/app/organization/adhoc-query/common-resolvers/adhoc-queries.resolver.ts @@ -6,7 +6,7 @@ import { Resolve } from '@angular/router'; import { Observable } from 'rxjs'; /** Custom Services */ -import { OrganizationService } from '../organization.service'; +import { OrganizationService } from '../../organization.service'; /** * Adhoc Queries data resolver. diff --git a/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts new file mode 100644 index 000000000..068e9b517 --- /dev/null +++ b/src/app/organization/adhoc-query/common-resolvers/adhoc-query-and-template.resolver.ts @@ -0,0 +1,31 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { OrganizationService } from 'app/organization/organization.service'; + +/** + * Adhoc Query and template data resolver. + */ +@Injectable() +export class AdhocQueryAndTemplateResolver implements Resolve { + + /** + * @param {OrganizationService} organizationService Organization service. + */ + constructor(private organizationService: OrganizationService) {} + + /** + * Returns the adhoc query and template data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const adhocQueryId = route.paramMap.get('id'); + return this.organizationService.getAdhocQueryAndTemplate(adhocQueryId); + } + +} diff --git a/src/app/organization/adhoc-query/adhoc-query.resolver.ts b/src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts similarity index 100% rename from src/app/organization/adhoc-query/adhoc-query.resolver.ts rename to src/app/organization/adhoc-query/common-resolvers/adhoc-query.resolver.ts diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html new file mode 100644 index 000000000..3fd626ea3 --- /dev/null +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.html @@ -0,0 +1,88 @@ +
+ + + +
+ + + +
+ + + Name + + + Name is required + + + + + SQL Query + + + SQL Query is required + + + + + Insert into table + + + Insert into table is required + + + + + Table Fields + + + Table Fields are required + + + + + Email + + + Email is invalid + + + + + Report Run Frequency + + + {{ reportRunFrequency.value }} + + + + + + Custom Report Run Frequency (Days) + + + Custom Report Run Frequency is required + + + Custom Report Run Frequency must be larger than 0 + + + + + Active + + +
+ +
+ + + + + + +
+ +
+ +
diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.scss b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.spec.ts b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.spec.ts new file mode 100644 index 000000000..d9c88c69e --- /dev/null +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { EditAdhocQueryComponent } from './edit-adhoc-query.component'; + +describe('EditAdhocQueryComponent', () => { + let component: EditAdhocQueryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ EditAdhocQueryComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EditAdhocQueryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts new file mode 100644 index 000000000..34ca076e8 --- /dev/null +++ b/src/app/organization/adhoc-query/edit-adhoc-query/edit-adhoc-query.component.ts @@ -0,0 +1,91 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; +import { Router, ActivatedRoute } from '@angular/router'; + +/** Custom Services */ +import { OrganizationService } from '../../organization.service'; + +/** + * Edit Adhoc Query component. + */ +@Component({ + selector: 'mifosx-edit-adhoc-query', + templateUrl: './edit-adhoc-query.component.html', + styleUrls: ['./edit-adhoc-query.component.scss'] +}) +export class EditAdhocQueryComponent implements OnInit { + + /** Edit Adhoc Query form. */ + editAdhocQueryForm: FormGroup; + /** Adhoc Query template data. */ + adhocQueryTemplateData: any; + /** Report run frequencies data. */ + reportRunFrequencyData: any; + + /** + * Retrieves the adhoc query template data from `resolve`. + * @param {FormBuilder} formBuilder Form Builder. + * @param {OrganizationService} organizationService Organization Service. + * @param {ActivatedRoute} route Activated Route. + * @param {Router} router Router for navigation. + */ + constructor(private formBuilder: FormBuilder, + private organizationService: OrganizationService, + private route: ActivatedRoute, + private router: Router) { + this.route.data.subscribe((data: { adhocQueryAndTemplate: any }) => { + this.adhocQueryTemplateData = data.adhocQueryAndTemplate; + }); + } + + /** + * Creates the edit adhoc query form and sets the conditional controls of the adhoc query form. + */ + ngOnInit() { + this.createEditAdhocQueryForm(); + this.setConditionalControls(); + } + + /** + * Creates the edit adhoc query form. + */ + createEditAdhocQueryForm() { + this.reportRunFrequencyData = this.adhocQueryTemplateData.reportRunFrequencies; + this.editAdhocQueryForm = this.formBuilder.group({ + 'name': [this.adhocQueryTemplateData.name, Validators.required], + 'query': [this.adhocQueryTemplateData.query, Validators.required], + 'tableName': [this.adhocQueryTemplateData.tableName, Validators.required], + 'tableFields': [this.adhocQueryTemplateData.tableFields, Validators.required], + 'email': [this.adhocQueryTemplateData.email, Validators.email], + 'reportRunFrequency': [''], + 'isActive': [this.adhocQueryTemplateData.isActive] + }); + } + + /** + * Sets the conditional controls of the adhoc query form + */ + setConditionalControls() { + this.editAdhocQueryForm.get('reportRunFrequency').valueChanges.subscribe(reportRunFrequencyId => { + if (reportRunFrequencyId === 5) { + this.editAdhocQueryForm.addControl('reportRunEvery', new FormControl('', [Validators.required, Validators.min(1)])); + this.editAdhocQueryForm.get('reportRunEvery').patchValue(this.adhocQueryTemplateData.reportRunEvery); + } else { + this.editAdhocQueryForm.removeControl('reportRunEvery'); + } + }); + this.editAdhocQueryForm.get('reportRunFrequency').patchValue(this.adhocQueryTemplateData.reportRunFrequency); + } + + /** + * Submits the adhoc query form and updates adhoc query, + * if successful redirects to view adhoc query. + */ + submit() { + this.organizationService.updateAdhocQuery(this.adhocQueryTemplateData.id, this.editAdhocQueryForm.value).subscribe(() => { + this.router.navigate(['../'], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html index 6778618db..3b0d25c77 100644 --- a/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html +++ b/src/app/organization/adhoc-query/view-adhoc-query/view-adhoc-query.component.html @@ -1,5 +1,5 @@
- diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index 869f46b96..9a6e857e4 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -48,6 +48,7 @@ import { SettleCashComponent } from './tellers/cashiers/settle-cash/settle-cash. import { EditCashierComponent } from './tellers/cashiers/edit-cashier/edit-cashier.component'; import { CreateCashierComponent } from './tellers/cashiers/create-cashier/create-cashier.component'; import { EditHolidayComponent } from './holidays/edit-holiday/edit-holiday.component'; +import { EditAdhocQueryComponent } from './adhoc-query/edit-adhoc-query/edit-adhoc-query.component'; /** Custom Resolvers */ import { LoanProvisioningCriteriaResolver } from './loan-provisioning-criteria/loan-provisioning-criteria.resolver'; @@ -57,8 +58,8 @@ import { EmployeeResolver } from './employees/employee.resolver'; import { EditEmployeeResolver } from './employees/edit-employee.resolver'; import { CurrenciesResolver } from './currencies/currencies.resolver'; import { SmsCampaignsResolver } from './sms-campaigns/common-resolvers/sms-campaigns.resolver'; -import { AdhocQueriesResolver } from './adhoc-query/adhoc-queries.resolver'; -import { AdhocQueryResolver } from './adhoc-query/adhoc-query.resolver'; +import { AdhocQueriesResolver } from './adhoc-query/common-resolvers/adhoc-queries.resolver'; +import { AdhocQueryResolver } from './adhoc-query/common-resolvers/adhoc-query.resolver'; import { TellersResolver } from './tellers/common-resolvers/tellers.resolver'; import { TellerResolver } from './tellers/common-resolvers/teller.resolver'; import { PaymentTypesResolver } from './payment-types/payment-types.resolver'; @@ -82,6 +83,7 @@ import { ManageFundsResolver } from './manage-funds/manage-funds.resolver'; import { CashierTransactionTemplateResolver } from './tellers/teller-transaction-template.resolver'; import { EditCashierResolver } from './tellers/common-resolvers/edit-cashier.resolver'; import { HolidayTemplateResolver } from './holidays/holiday-template.resolver'; +import { AdhocQueryAndTemplateResolver } from './adhoc-query/common-resolvers/adhoc-query-and-template.resolver'; /** Organization Routes */ const routes: Routes = [ @@ -288,11 +290,24 @@ const routes: Routes = [ }, { path: ':id', - component: ViewAdhocQueryComponent, - data: { title: extract('View Adhoc Query'), routeResolveBreadcrumb: ['adhocQuery', 'name']}, - resolve: { - adhocQuery: AdhocQueryResolver - } + data: { title: extract('View Adhoc Query'), routeParamBreadcrumb: 'id' }, + children: [ + { + path: '', + component: ViewAdhocQueryComponent, + resolve: { + adhocQuery: AdhocQueryResolver + }, + }, + { + path: 'edit', + component: EditAdhocQueryComponent, + data: { title: extract('Edit Adhoc Query'), breadcrumb: 'Edit', routeParamBreadcrumb: false }, + resolve: { + adhocQueryAndTemplate: AdhocQueryAndTemplateResolver + } + } + ] } ] }, @@ -543,6 +558,7 @@ const routes: Routes = [ WorkingDaysResolver, EditOfficeResolver, AdhocQueryTemplateResolver, + AdhocQueryAndTemplateResolver, LoanProvisioningCriteriasResolver, CashierResolver, CashiersResolver, diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts index ff7700283..42a9d98f3 100644 --- a/src/app/organization/organization.module.ts +++ b/src/app/organization/organization.module.ts @@ -51,6 +51,7 @@ import { AllocateCashComponent } from './tellers/cashiers/allocate-cash/allocate import { EditCashierComponent } from './tellers/cashiers/edit-cashier/edit-cashier.component'; import { CreateCashierComponent } from './tellers/cashiers/create-cashier/create-cashier.component'; import { EditHolidayComponent } from './holidays/edit-holiday/edit-holiday.component'; +import { EditAdhocQueryComponent } from './adhoc-query/edit-adhoc-query/edit-adhoc-query.component'; /** * Organization Module @@ -108,6 +109,7 @@ import { EditHolidayComponent } from './holidays/edit-holiday/edit-holiday.compo EditCashierComponent, CreateCashierComponent, EditHolidayComponent, + EditAdhocQueryComponent ] }) export class OrganizationModule { } diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index 073925765..f409646a6 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -225,6 +225,15 @@ export class OrganizationService { return this.http.get(`/adhocquery/template`); } + /** + * @param {string} adhocQueryId Adhoc Query ID of adhoc query. + * @returns {Observable} Adhoc query and template. + */ + getAdhocQueryAndTemplate(adhocQueryId: string): Observable { + const httpParams = new HttpParams().set('template', 'true'); + return this.http.get(`/adhocquery/${adhocQueryId}`, { params: httpParams }); + } + /** * @param {any} adhocQuery Adhoc Query to be created. * @returns {Observable} @@ -233,6 +242,15 @@ export class OrganizationService { return this.http.post('/adhocquery', adhocQuery); } + /** + * @param {any} queryId Query Id + * @param {any} adhocQuery Adhoc Query to be created. + * @returns {Observable} + */ + updateAdhocQuery(queryId: any, adhocQuery: any): Observable { + return this.http.put(`/adhocquery/${queryId}`, adhocQuery); + } + /** * @param {string} adhocQueryId Adhoc Query ID of adhoc query to be deleted. * @returns {Observable}