From ee4329ed21b44b6b574c2ebb92b17195c411ee75 Mon Sep 17 00:00:00 2001 From: "Oussema.exe" Date: Sun, 26 Apr 2020 21:27:25 +0100 Subject: [PATCH] feat: add create adhoc query component (#573) Fixes: #537 --- .../adhoc-query-template.resolver.ts | 30 +++++++ .../adhoc-query/adhoc-query.component.html | 2 +- .../create-adhoc-query.component.html | 88 ++++++++++++++++++ .../create-adhoc-query.component.scss | 3 + .../create-adhoc-query.component.spec.ts | 25 ++++++ .../create-adhoc-query.component.ts | 89 +++++++++++++++++++ .../organization-routing.module.ts | 13 ++- src/app/organization/organization.module.ts | 4 +- src/app/organization/organization.service.ts | 15 ++++ 9 files changed, 266 insertions(+), 3 deletions(-) create mode 100644 src/app/organization/adhoc-query/adhoc-query-template.resolver.ts create mode 100644 src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html create mode 100644 src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.scss create mode 100644 src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.spec.ts create mode 100644 src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts diff --git a/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts b/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts new file mode 100644 index 000000000..8335a1b52 --- /dev/null +++ b/src/app/organization/adhoc-query/adhoc-query-template.resolver.ts @@ -0,0 +1,30 @@ +/** Angular Imports */ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; + +/** rxjs Imports */ +import { Observable } from 'rxjs'; + +/** Custom Services */ +import { OrganizationService } from 'app/organization/organization.service'; + +/** + * Adhoc Query template data resolver. + */ +@Injectable() +export class AdhocQueryTemplateResolver implements Resolve { + + /** + * @param {OrganizationService} organizationService Organization service. + */ + constructor(private organizationService: OrganizationService) {} + + /** + * Returns the adhoc query template data. + * @returns {Observable} + */ + resolve(): Observable { + return this.organizationService.getAdhocQueryTemplate(); + } + +} diff --git a/src/app/organization/adhoc-query/adhoc-query.component.html b/src/app/organization/adhoc-query/adhoc-query.component.html index 78748d061..6e1d17f0f 100644 --- a/src/app/organization/adhoc-query/adhoc-query.component.html +++ b/src/app/organization/adhoc-query/adhoc-query.component.html @@ -1,5 +1,5 @@
- diff --git a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.html new file mode 100644 index 000000000..b088c2d95 --- /dev/null +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-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/create-adhoc-query/create-adhoc-query.component.scss b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.scss new file mode 100644 index 000000000..d774f68da --- /dev/null +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.scss @@ -0,0 +1,3 @@ +.container { + max-width: 37rem; +} diff --git a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.spec.ts b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.spec.ts new file mode 100644 index 000000000..a9422e178 --- /dev/null +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateAdhocQueryComponent } from './create-adhoc-query.component'; + +describe('CreateAdhocQueryComponent', () => { + let component: CreateAdhocQueryComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateAdhocQueryComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateAdhocQueryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts new file mode 100644 index 000000000..5385475e9 --- /dev/null +++ b/src/app/organization/adhoc-query/create-adhoc-query/create-adhoc-query.component.ts @@ -0,0 +1,89 @@ +/** 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'; + +/** + * Create Adhoc Query component. + */ +@Component({ + selector: 'mifosx-create-adhoc-query', + templateUrl: './create-adhoc-query.component.html', + styleUrls: ['./create-adhoc-query.component.scss'] +}) +export class CreateAdhocQueryComponent implements OnInit { + + /** Adhoc Query form. */ + adhocQueryForm: 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: { adhocQueryTemplate: any }) => { + this.adhocQueryTemplateData = data.adhocQueryTemplate; + }); + } + + /** + * Creates the adhoc query form and sets the conditional controls of the adhoc query form. + */ + ngOnInit() { + this.createAdhocQueryForm(); + this.setConditionalControls(); + } + + /** + * Creates the adhoc query form. + */ + createAdhocQueryForm() { + this.reportRunFrequencyData = this.adhocQueryTemplateData.reportRunFrequencies; + this.adhocQueryForm = this.formBuilder.group({ + 'name': ['', Validators.required], + 'query': ['', Validators.required], + 'tableName': ['', Validators.required], + 'tableFields': ['', Validators.required], + 'email': ['', Validators.email], + 'reportRunFrequency': [''], + 'isActive': [false] + }); + } + + /** + * Sets the conditional controls of the adhoc query form + */ + setConditionalControls() { + this.adhocQueryForm.get('reportRunFrequency').valueChanges.subscribe(reportRunFrequencyId => { + if (reportRunFrequencyId === 5) { + this.adhocQueryForm.addControl('reportRunEvery', new FormControl('', [Validators.required, Validators.min(1)])); + } else { + this.adhocQueryForm.removeControl('reportRunEvery'); + } + }); + } + + /** + * Submits the adhoc query form and creates adhoc query, + * if successful redirects to view adhoc query. + */ + submit() { + this.organizationService.createAdhocQuery(this.adhocQueryForm.value).subscribe((response: any) => { + this.router.navigate(['../', response.resourceId], { relativeTo: this.route }); + }); + } + +} diff --git a/src/app/organization/organization-routing.module.ts b/src/app/organization/organization-routing.module.ts index 03dc1be9a..61208b68a 100644 --- a/src/app/organization/organization-routing.module.ts +++ b/src/app/organization/organization-routing.module.ts @@ -28,6 +28,7 @@ import { EntityDataTableChecksComponent } from './entity-data-table-checks/entit import { WorkingDaysComponent } from './working-days/working-days.component'; import { CreateOfficeComponent } from './offices/create-office/create-office.component'; import { CreatePaymentTypeComponent } from './payment-types/create-payment-type/create-payment-type.component'; +import { CreateAdhocQueryComponent } from './adhoc-query/create-adhoc-query/create-adhoc-query.component'; /** Custom Resolvers */ import { LoanProvisioningCriteriaResolver } from './loan-provisioning-criteria/loan-provisioning-criteria.resolver'; @@ -45,6 +46,7 @@ import { PaymentTypeResolver } from './payment-types/payment-type.resolver'; import { PasswordPreferencesTemplateResolver } from './password-preferences/password-preferences-template.resolver'; import { EntityDataTableChecksResolver } from './entity-data-table-checks/entity-data-table-checks.resolver'; import { WorkingDaysResolver } from './working-days/working-days.resolver'; +import { AdhocQueryTemplateResolver } from './adhoc-query/adhoc-query-template.resolver'; /** Organization Routes */ const routes: Routes = [ @@ -142,6 +144,14 @@ const routes: Routes = [ adhocQueries: AdhocQueriesResolver } }, + { + path: 'create', + component: CreateAdhocQueryComponent, + data: { title: extract('Create Adhoc Query'), breadcrumb: 'Create' }, + resolve: { + adhocQueryTemplate: AdhocQueryTemplateResolver + } + }, { path: ':id', component: ViewAdhocQueryComponent, @@ -261,7 +271,8 @@ const routes: Routes = [ PaymentTypeResolver, PasswordPreferencesTemplateResolver, EntityDataTableChecksResolver, - WorkingDaysResolver + WorkingDaysResolver, + AdhocQueryTemplateResolver ] }) export class OrganizationRoutingModule { } diff --git a/src/app/organization/organization.module.ts b/src/app/organization/organization.module.ts index 63c640389..bde684e94 100644 --- a/src/app/organization/organization.module.ts +++ b/src/app/organization/organization.module.ts @@ -26,6 +26,7 @@ import { CreateOfficeComponent } from './offices/create-office/create-office.com import { CreateEmployeeComponent } from './employees/create-employee/create-employee.component'; import { CreatePaymentTypeComponent } from './payment-types/create-payment-type/create-payment-type.component'; import { ViewEmployeeComponent } from './employees/view-employee/view-employee.component'; +import { CreateAdhocQueryComponent } from './adhoc-query/create-adhoc-query/create-adhoc-query.component'; /** * Organization Module @@ -57,7 +58,8 @@ import { ViewEmployeeComponent } from './employees/view-employee/view-employee.c CreateOfficeComponent, CreateEmployeeComponent, CreatePaymentTypeComponent, - ViewEmployeeComponent + ViewEmployeeComponent, + CreateAdhocQueryComponent ] }) export class OrganizationModule { } diff --git a/src/app/organization/organization.service.ts b/src/app/organization/organization.service.ts index 17c1cf26d..0b94f8951 100644 --- a/src/app/organization/organization.service.ts +++ b/src/app/organization/organization.service.ts @@ -92,6 +92,21 @@ export class OrganizationService { return this.http.get(`/adhocquery/${adhocQueryId}`); } + /** + * @returns {Observable} Adhoc query Template data + */ + getAdhocQueryTemplate(): Observable { + return this.http.get(`/adhocquery/template`); + } + + /** + * @param {any} adhocQuery Adhoc Query to be created. + * @returns {Observable} + */ + createAdhocQuery(adhocQuery: any): Observable { + return this.http.post('/adhocquery', adhocQuery); + } + /** * @param {string} adhocQueryId Adhoc Query ID of adhoc query to be deleted. * @returns {Observable}