From 2e895384323dc5a46df69edc659febe4aeb2f3a1 Mon Sep 17 00:00:00 2001 From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com> Date: Wed, 20 May 2020 15:57:02 +0530 Subject: [PATCH] feat: add centers view page (general tab) (#782) Fixes: #218 --- src/app/centers/centers-routing.module.ts | 34 ++++- .../centers-view.component-theme.scss | 13 ++ .../centers-view/centers-view.component.html | 93 ++++++++++++ .../centers-view/centers-view.component.scss | 39 +++++ .../centers-view.component.spec.ts | 25 ++++ .../centers-view/centers-view.component.ts | 37 +++++ .../general-tab/general-tab.component.html | 140 ++++++++++++++++++ .../general-tab/general-tab.component.scss | 28 ++++ .../general-tab/general-tab.component.spec.ts | 25 ++++ .../general-tab/general-tab.component.ts | 48 ++++++ src/app/centers/centers.component.html | 2 +- src/app/centers/centers.component.scss | 9 +- src/app/centers/centers.module.ts | 10 +- src/app/centers/centers.service.ts | 27 ++++ .../center-resource.resolver.ts | 31 ++++ .../center-summary.resolver.ts | 31 ++++ .../common-resolvers/center-view.resolver.ts | 31 ++++ .../savings-account.resolver.ts | 31 ++++ src/app/pipes/status-lookup.pipe.ts | 1 + src/assets/images/center_placeholder.png | Bin 0 -> 27317 bytes src/theme/custom/denim-yellowgreen.scss | 2 + src/theme/custom/pictonblue-yellowgreen.scss | 2 + 22 files changed, 654 insertions(+), 5 deletions(-) create mode 100644 src/app/centers/centers-view/centers-view.component-theme.scss create mode 100644 src/app/centers/centers-view/centers-view.component.html create mode 100644 src/app/centers/centers-view/centers-view.component.scss create mode 100644 src/app/centers/centers-view/centers-view.component.spec.ts create mode 100644 src/app/centers/centers-view/centers-view.component.ts create mode 100644 src/app/centers/centers-view/general-tab/general-tab.component.html create mode 100644 src/app/centers/centers-view/general-tab/general-tab.component.scss create mode 100644 src/app/centers/centers-view/general-tab/general-tab.component.spec.ts create mode 100644 src/app/centers/centers-view/general-tab/general-tab.component.ts create mode 100644 src/app/centers/common-resolvers/center-resource.resolver.ts create mode 100644 src/app/centers/common-resolvers/center-summary.resolver.ts create mode 100644 src/app/centers/common-resolvers/center-view.resolver.ts create mode 100644 src/app/centers/common-resolvers/savings-account.resolver.ts create mode 100644 src/assets/images/center_placeholder.png diff --git a/src/app/centers/centers-routing.module.ts b/src/app/centers/centers-routing.module.ts index c0a3c8b62..1ae65bc31 100644 --- a/src/app/centers/centers-routing.module.ts +++ b/src/app/centers/centers-routing.module.ts @@ -10,6 +10,12 @@ import { extract } from '../core/i18n/i18n.service'; import { CentersComponent } from './centers.component'; import { CreateCenterComponent } from './create-center/create-center.component'; import { OfficesResolver } from 'app/accounting/common-resolvers/offices.resolver'; +import { CentersViewComponent } from './centers-view/centers-view.component'; +import { GeneralTabComponent } from './centers-view/general-tab/general-tab.component'; +import { CenterViewResolver } from './common-resolvers/center-view.resolver'; +import { SavingsAccountResolver } from './common-resolvers/savings-account.resolver'; +import { CenterResourceResolver } from './common-resolvers/center-resource.resolver'; +import { CenterSummaryResolver } from './common-resolvers/center-summary.resolver'; const routes: Routes = [ Route.withShell([ @@ -29,6 +35,26 @@ const routes: Routes = [ resolve: { offices: OfficesResolver, } + }, + { + path: ':centerId', + component: CentersViewComponent, + data: { title: extract('Centers View'), routeParamBreadcrumb: 'centerId' }, + resolve: { + centerViewData: CenterViewResolver + }, + children: [ + { + path: 'general', + component: GeneralTabComponent, + data: { title: extract('General'), breadcrumb: 'General', routeParamBreadcrumb: false }, + resolve: { + centerSummaryData: CenterSummaryResolver, + centerViewData: CenterResourceResolver, + savingsAccountData: SavingsAccountResolver + } + } + ] } ] } @@ -38,6 +64,12 @@ const routes: Routes = [ @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule], - providers: [OfficesResolver] + providers: [ + OfficesResolver, + CenterViewResolver, + SavingsAccountResolver, + CenterResourceResolver, + CenterSummaryResolver + ] }) export class CentersRoutingModule { } diff --git a/src/app/centers/centers-view/centers-view.component-theme.scss b/src/app/centers/centers-view/centers-view.component-theme.scss new file mode 100644 index 000000000..ea0a53818 --- /dev/null +++ b/src/app/centers/centers-view/centers-view.component-theme.scss @@ -0,0 +1,13 @@ +@import "~@angular/material/theming"; + +@mixin centers-view-component-theme($theme) { + $primary: map-get($theme, primary); + + mifosx-centers-view { + .center-card { + .header { + background-color: mat-color($primary, 500); + } + } + } +} diff --git a/src/app/centers/centers-view/centers-view.component.html b/src/app/centers/centers-view/centers-view.component.html new file mode 100644 index 000000000..7b442adfd --- /dev/null +++ b/src/app/centers/centers-view/centers-view.component.html @@ -0,0 +1,93 @@ + + + +
+
+ +
+
+
+ +

+ + Center Name : {{centerViewData.name}} +

+
+ +
+
+

+ Account #:{{centerViewData.accountNo}}
+ Office: {{centerViewData.officeName}}
+ + External Id: {{centerViewData.externalId}}
+
+ + Staff: {{centerViewData.staffName}}
+
+ Activation Date : + {{(centerViewData.activationDate)?(centerViewData.activationDate|date) :'Not Activated'}}
+

+
+
+

+ Next Meeting On: + + {{centerViewData.collectionMeetingCalendar.nextTenRecurringDates[0]|date}} + + +
+ Meeting Frequency: {{centerViewData.collectionMeetingCalendar.humanReadable}} +
+ Unassigned
+ Closed Date: {{centerViewData.timeline.closedOnDate|date}} +

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
diff --git a/src/app/centers/centers-view/centers-view.component.scss b/src/app/centers/centers-view/centers-view.component.scss new file mode 100644 index 000000000..e67ff794c --- /dev/null +++ b/src/app/centers/centers-view/centers-view.component.scss @@ -0,0 +1,39 @@ +.center-card { + margin: 0 auto; + max-width: 80rem; + width: 90%; + padding: 0; + .header { + padding: 1%; + .header-title-group { + .center-card-title { + color: white; + width: 90%; + p { + color: white; + } + } + } + .profile-image-container { + margin: 1%; + .profile-image { + object-fit: cover; + border-radius: 20px; + } + } + .center-actions { + align-self: flex-end; + margin: 0 1%; + } + } + .navigation-tabs { + overflow: auto; + } +} + +.meetingDetails { + float:right; + margin-right: 10px; + border: 1px black solid; + padding: 10px; +} diff --git a/src/app/centers/centers-view/centers-view.component.spec.ts b/src/app/centers/centers-view/centers-view.component.spec.ts new file mode 100644 index 000000000..dad47f80c --- /dev/null +++ b/src/app/centers/centers-view/centers-view.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CentersViewComponent } from './centers-view.component'; + +describe('CentersViewComponent', () => { + let component: CentersViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CentersViewComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CentersViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/centers/centers-view/centers-view.component.ts b/src/app/centers/centers-view/centers-view.component.ts new file mode 100644 index 000000000..79bd80e1f --- /dev/null +++ b/src/app/centers/centers-view/centers-view.component.ts @@ -0,0 +1,37 @@ +/** Angular Imports */ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +/** + * Create Center View + */ +@Component({ + selector: 'mifosx-centers-view', + templateUrl: './centers-view.component.html', + styleUrls: ['./centers-view.component.scss'] +}) +export class CentersViewComponent implements OnInit { + + /** Stores Center View Data */ + centerViewData: any; + meetingData: boolean; + + /** + * Retrieves the data for center + * @param route route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe((data: { + centerViewData: any, + }) => { + this.centerViewData = data.centerViewData; + }); + } + + ngOnInit() { + if (this.centerViewData.collectionMeetingCalendar) { + this.meetingData = true; + } else { this.meetingData = false; } + } + +} diff --git a/src/app/centers/centers-view/general-tab/general-tab.component.html b/src/app/centers/centers-view/general-tab/general-tab.component.html new file mode 100644 index 000000000..c1c4f06d3 --- /dev/null +++ b/src/app/centers/centers-view/general-tab/general-tab.component.html @@ -0,0 +1,140 @@ +
+
+

Center Closed

+
+

Summary Details

+
+

+ Active Clients: {{centerSummaryData.activeClients}}
+ Active Group Loans: {{centerSummaryData.activeGroupLoans}}
+ Active Client Loans: {{centerSummaryData.activeClientLoans}}
+ Active Overdue Group Loans: {{centerSummaryData.overdueGroupLoans}}
+

+

+ Active Group Borrowers: {{centerSummaryData.activeGroupBorrowers}}
+ Active Client Borrowers: {{centerSummaryData.activeClientBorrowers}}
+ Active Overdue Client Loans: {{centerSummaryData.overdueClientLoans}}
+

+
+ + + +

Groups

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Account Number + {{element.accountNo}} Group Name {{element.name}} Office Name {{element.officeName}} Submitted On {{element.timeline.submittedOnDate|date}}
+
+ + + + + + +

Savings Account Overview

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Account No + {{element.accountNo}} Products {{element.productName}} Balance {{element.accountBalance}} Actions + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + +
diff --git a/src/app/centers/centers-view/general-tab/general-tab.component.scss b/src/app/centers/centers-view/general-tab/general-tab.component.scss new file mode 100644 index 000000000..ecbf73a5f --- /dev/null +++ b/src/app/centers/centers-view/general-tab/general-tab.component.scss @@ -0,0 +1,28 @@ +.tab-container { + padding: 1%; + margin: 1%; + + h3{ + margin:1% auto; + } + .summary-details-container { + border: 1px solid; + padding: 1%; + } + + table { + width: 100%; + .account-action-button{ + min-width: 26px; + padding: 0 6px; + margin: 4px; + line-height: 25px; + } + } +} + +.closedCenter { + text-align: center; + color: red; + font-size: 2rem; +} diff --git a/src/app/centers/centers-view/general-tab/general-tab.component.spec.ts b/src/app/centers/centers-view/general-tab/general-tab.component.spec.ts new file mode 100644 index 000000000..68ff6503e --- /dev/null +++ b/src/app/centers/centers-view/general-tab/general-tab.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { GeneralTabComponent } from './general-tab.component'; + +describe('GeneralTabComponent', () => { + let component: GeneralTabComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ GeneralTabComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(GeneralTabComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/centers/centers-view/general-tab/general-tab.component.ts b/src/app/centers/centers-view/general-tab/general-tab.component.ts new file mode 100644 index 000000000..77b24712c --- /dev/null +++ b/src/app/centers/centers-view/general-tab/general-tab.component.ts @@ -0,0 +1,48 @@ +/** Angular Imports */ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +/** + * Create Center General Tab Component + */ +@Component({ + selector: 'mifosx-general-tab', + templateUrl: './general-tab.component.html', + styleUrls: ['./general-tab.component.scss'] +}) +export class GeneralTabComponent implements OnInit { + + /** Savings Account Table Columns */ + savingsAccountColumns: string[] = ['Account No', 'Products', 'Balance', 'Actions']; + /** Groups Table Columns */ + groupsColumns: string[] = ['Account No', 'Group Name', 'Office Name', 'Submitted On']; + /** Stores the summary of center */ + centerSummaryData: any; + /** Stores Center Data for particular center */ + centerViewData: any; + /** Stores Saving Account for particular center */ + savingsAccountData: any; + /** Stores Group Data */ + groupResourceData: any; + + /** + * Retrieves the data for centers + * @param {ActivatedRoute} route Activated Route. + */ + constructor(private route: ActivatedRoute) { + this.route.data.subscribe((data: { + centerSummaryData: any, + centerViewData: any, + savingsAccountData: any + }) => { + this.centerSummaryData = data.centerSummaryData[0]; + this.centerViewData = data.centerViewData; + this.savingsAccountData = data.savingsAccountData.savingsAccounts; + this.groupResourceData = data.centerViewData.groupMembers; + }); + } + + ngOnInit() { + } + +} diff --git a/src/app/centers/centers.component.html b/src/app/centers/centers.component.html index bad25b9d2..3a66a3f36 100644 --- a/src/app/centers/centers.component.html +++ b/src/app/centers/centers.component.html @@ -52,7 +52,7 @@ - + diff --git a/src/app/centers/centers.component.scss b/src/app/centers/centers.component.scss index 15e12ff37..28cb201c5 100644 --- a/src/app/centers/centers.component.scss +++ b/src/app/centers/centers.component.scss @@ -5,6 +5,13 @@ .search-button{ min-width: 30px; margin: 4px; - + } +} + +table { + width: 100%; + + .select-row:hover { + cursor: pointer; } } diff --git a/src/app/centers/centers.module.ts b/src/app/centers/centers.module.ts index 75839507e..8d20ee980 100644 --- a/src/app/centers/centers.module.ts +++ b/src/app/centers/centers.module.ts @@ -5,10 +5,13 @@ import { NgModule } from '@angular/core'; import { CentersRoutingModule } from './centers-routing.module'; import { SharedModule } from 'app/shared/shared.module'; import { PipesModule } from '../pipes/pipes.module'; +import { DirectivesModule } from '../directives/directives.module'; /** Custom Components */ import { CentersComponent } from './centers.component'; import { CreateCenterComponent } from './create-center/create-center.component'; +import { CentersViewComponent } from './centers-view/centers-view.component'; +import { GeneralTabComponent } from './centers-view/general-tab/general-tab.component'; /** * Centers Module @@ -19,11 +22,14 @@ import { CreateCenterComponent } from './create-center/create-center.component'; imports: [ SharedModule, CentersRoutingModule, - PipesModule + PipesModule, + DirectivesModule ], declarations: [ CentersComponent, - CreateCenterComponent + CreateCenterComponent, + CentersViewComponent, + GeneralTabComponent ] }) export class CentersModule { } diff --git a/src/app/centers/centers.service.ts b/src/app/centers/centers.service.ts index 9c2f5d078..17c884287 100644 --- a/src/app/centers/centers.service.ts +++ b/src/app/centers/centers.service.ts @@ -61,4 +61,31 @@ export class CentersService { return this.http.get('/centers/template', { params: httpParams }); } + /** + * @param centerId CenterID + * @returns {Observable} Group Data for Center + */ + getCenterData(centerId: string): Observable { + const httpParams = new HttpParams() + .set('associations', 'groupMembers,collectionMeetingCalendar'); + return this.http.get(`/centers/${centerId}`, { params: httpParams } ); + } + + /** + * @param centerId Center ID + * @returns {Observable} Returns the entire details of the Center ID + */ + getCenterSummary(centerId: string): Observable { + const httpParams = new HttpParams().set('R_groupId', centerId) + .set('genericResultSet', 'false'); + return this.http.get(`/runreports/GroupSummaryCounts`, { params: httpParams }); + } + + /** + * @param centerId Center ID + * @returns {Observable} Returns the saving account for that center + */ + getSavingsAccountDetails(centerId: string): Observable { + return this.http.get(`/centers/${centerId}/accounts`); + } } diff --git a/src/app/centers/common-resolvers/center-resource.resolver.ts b/src/app/centers/common-resolvers/center-resource.resolver.ts new file mode 100644 index 000000000..a8ccbf89d --- /dev/null +++ b/src/app/centers/common-resolvers/center-resource.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 { CentersService } from '../centers.service'; + +/** + * Centers data resolver. + */ +@Injectable() +export class CenterResourceResolver implements Resolve { + + /** + * @param {CentersService} CentersService Centers service. + */ + constructor(private centersService: CentersService) { } + + /** + * Returns the Centers data for General Tab. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const centerId = route.parent.paramMap.get('centerId'); + return this.centersService.getCenterData(centerId); + } + +} diff --git a/src/app/centers/common-resolvers/center-summary.resolver.ts b/src/app/centers/common-resolvers/center-summary.resolver.ts new file mode 100644 index 000000000..accf32410 --- /dev/null +++ b/src/app/centers/common-resolvers/center-summary.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 { CentersService } from '../centers.service'; + +/** + * Centers data resolver. + */ +@Injectable() +export class CenterSummaryResolver implements Resolve { + + /** + * @param {CentersService} CentersService Centers service. + */ + constructor(private centersService: CentersService) { } + + /** + * Returns the Centers Summary Data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const centerId = route.parent.paramMap.get('centerId'); + return this.centersService.getCenterSummary(centerId); + } + +} diff --git a/src/app/centers/common-resolvers/center-view.resolver.ts b/src/app/centers/common-resolvers/center-view.resolver.ts new file mode 100644 index 000000000..51acb9ca4 --- /dev/null +++ b/src/app/centers/common-resolvers/center-view.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 { CentersService } from '../centers.service'; + +/** + * Centers data resolver. + */ +@Injectable() +export class CenterViewResolver implements Resolve { + + /** + * @param {CentersService} CentersService Centers service. + */ + constructor(private centersService: CentersService) { } + + /** + * Returns the Centers data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const centerId = route.paramMap.get('centerId'); + return this.centersService.getCenterData(centerId); + } + +} diff --git a/src/app/centers/common-resolvers/savings-account.resolver.ts b/src/app/centers/common-resolvers/savings-account.resolver.ts new file mode 100644 index 000000000..ecf01865d --- /dev/null +++ b/src/app/centers/common-resolvers/savings-account.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 { CentersService } from '../centers.service'; + +/** + * Centers data resolver. + */ +@Injectable() +export class SavingsAccountResolver implements Resolve { + + /** + * @param {CentersService} CentersService Centers service. + */ + constructor(private centersService: CentersService) { } + + /** + * Returns the Center Savings Account data. + * @returns {Observable} + */ + resolve(route: ActivatedRouteSnapshot): Observable { + const centerId = route.parent.paramMap.get('centerId'); + return this.centersService.getSavingsAccountDetails(centerId); + } + +} diff --git a/src/app/pipes/status-lookup.pipe.ts b/src/app/pipes/status-lookup.pipe.ts index 36a72b665..c5cee8cfb 100644 --- a/src/app/pipes/status-lookup.pipe.ts +++ b/src/app/pipes/status-lookup.pipe.ts @@ -39,6 +39,7 @@ export class StatusLookupPipe implements PipeTransform { 'smsCampaignStatus.active': 'status-active', 'smsCampaignStatus.pending': 'status-pending', 'smsCampaignStatus.closed': 'status-closed', + 'groupingStatusType.active': 'status-active' }; return cssClassNameLookup[status]; } diff --git a/src/assets/images/center_placeholder.png b/src/assets/images/center_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..04550482dbd9cc2bfbcb52708bd42e2b15145c3d GIT binary patch literal 27317 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 literal 0 HcmV?d00001 diff --git a/src/theme/custom/denim-yellowgreen.scss b/src/theme/custom/denim-yellowgreen.scss index e6b71cfd9..40d8fc15d 100644 --- a/src/theme/custom/denim-yellowgreen.scss +++ b/src/theme/custom/denim-yellowgreen.scss @@ -2,6 +2,7 @@ // Plus imports for other components in your app. @import '../../app/clients/clients-view/clients-view.component-theme.scss'; @import '../../app/groups/groups-view/groups-view.component-theme.scss'; +@import '../../app/centers/centers-view/centers-view.component-theme.scss'; // Custom material palette $mat-denim: ( @@ -49,3 +50,4 @@ $mifosx-app-theme: mat-light-theme($mifosx-app-primary, $mifosx-app-accent, $mif @include angular-material-theme($mifosx-app-theme); @include clients-view-component-theme($mifosx-app-theme); @include groups-view-component-theme($mifosx-app-theme); +@include centers-view-component-theme($mifosx-app-theme); diff --git a/src/theme/custom/pictonblue-yellowgreen.scss b/src/theme/custom/pictonblue-yellowgreen.scss index 88e1ffe65..8a637355a 100644 --- a/src/theme/custom/pictonblue-yellowgreen.scss +++ b/src/theme/custom/pictonblue-yellowgreen.scss @@ -2,6 +2,7 @@ // Plus imports for other components in your app. @import '../../app/clients/clients-view/clients-view.component-theme.scss'; @import '../../app/groups/groups-view/groups-view.component-theme.scss'; +@import '../../app/centers/centers-view/centers-view.component-theme.scss'; // Custom material palette $mat-picton-blue: ( @@ -49,3 +50,4 @@ $mifosx-app-theme: mat-light-theme($mifosx-app-primary, $mifosx-app-accent, $mif @include angular-material-theme($mifosx-app-theme); @include clients-view-component-theme($mifosx-app-theme); @include groups-view-component-theme($mifosx-app-theme); +@include centers-view-component-theme($mifosx-app-theme);