From 67b766e61f2573417f7e28c7ed8ed5d3ad3c2ecf Mon Sep 17 00:00:00 2001
From: Muskan Khedia <36980003+muskankhedia@users.noreply.github.com>
Date: Wed, 20 May 2020 17:50:06 +0530
Subject: [PATCH] feat: add center view (notes tab) (#787)
Fixes: #785
---
src/app/centers/centers-routing.module.ts | 18 +++-
.../centers-view/centers-view.component.html | 4 +
.../notes-tab/notes-tab.component.html | 32 ++++++
.../notes-tab/notes-tab.component.scss | 4 +
.../notes-tab/notes-tab.component.spec.ts | 25 +++++
.../notes-tab/notes-tab.component.ts | 100 ++++++++++++++++++
src/app/centers/centers.module.ts | 4 +-
src/app/centers/centers.service.ts | 38 +++++++
.../common-resolvers/center-notes.resolver.ts | 31 ++++++
9 files changed, 253 insertions(+), 3 deletions(-)
create mode 100644 src/app/centers/centers-view/notes-tab/notes-tab.component.html
create mode 100644 src/app/centers/centers-view/notes-tab/notes-tab.component.scss
create mode 100644 src/app/centers/centers-view/notes-tab/notes-tab.component.spec.ts
create mode 100644 src/app/centers/centers-view/notes-tab/notes-tab.component.ts
create mode 100644 src/app/centers/common-resolvers/center-notes.resolver.ts
diff --git a/src/app/centers/centers-routing.module.ts b/src/app/centers/centers-routing.module.ts
index 1ae65bc31..bbf2feb4a 100644
--- a/src/app/centers/centers-routing.module.ts
+++ b/src/app/centers/centers-routing.module.ts
@@ -7,15 +7,20 @@ import { Route } from '../core/route/route.service';
/** Translation Imports */
import { extract } from '../core/i18n/i18n.service';
+/** Custom Components */
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 { NotesTabComponent } from './centers-view/notes-tab/notes-tab.component';
+
+/** Custom Resolvers */
+import { OfficesResolver } from 'app/accounting/common-resolvers/offices.resolver';
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';
+import { CenterNotesResolver } from './common-resolvers/center-notes.resolver';
const routes: Routes = [
Route.withShell([
@@ -53,6 +58,14 @@ const routes: Routes = [
centerViewData: CenterResourceResolver,
savingsAccountData: SavingsAccountResolver
}
+ },
+ {
+ path: 'notes',
+ component: NotesTabComponent,
+ data: { title: extract('Notes'), breadcrumb: 'Notes', routeParamBreadcrumb: false },
+ resolve: {
+ centerNotes: CenterNotesResolver
+ }
}
]
}
@@ -69,7 +82,8 @@ const routes: Routes = [
CenterViewResolver,
SavingsAccountResolver,
CenterResourceResolver,
- CenterSummaryResolver
+ CenterSummaryResolver,
+ CenterNotesResolver
]
})
export class CentersRoutingModule { }
diff --git a/src/app/centers/centers-view/centers-view.component.html b/src/app/centers/centers-view/centers-view.component.html
index 7b442adfd..dff623dff 100644
--- a/src/app/centers/centers-view/centers-view.component.html
+++ b/src/app/centers/centers-view/centers-view.component.html
@@ -87,6 +87,10 @@
[active]="general.isActive">
General
+
+ Notes
+
diff --git a/src/app/centers/centers-view/notes-tab/notes-tab.component.html b/src/app/centers/centers-view/notes-tab/notes-tab.component.html
new file mode 100644
index 000000000..27af57d3b
--- /dev/null
+++ b/src/app/centers/centers-view/notes-tab/notes-tab.component.html
@@ -0,0 +1,32 @@
+
+
Notes
+
+
+
+
+
+
+ {{centerNote.note}}
+
+ Created by: {{centerNote.createdByUsername}}
+ Date: {{centerNote.createdOn | date}}
+
+
+
+
+
+
+
+
diff --git a/src/app/centers/centers-view/notes-tab/notes-tab.component.scss b/src/app/centers/centers-view/notes-tab/notes-tab.component.scss
new file mode 100644
index 000000000..b40728956
--- /dev/null
+++ b/src/app/centers/centers-view/notes-tab/notes-tab.component.scss
@@ -0,0 +1,4 @@
+.tab-container {
+ padding: 1%;
+ margin: 1%;
+}
diff --git a/src/app/centers/centers-view/notes-tab/notes-tab.component.spec.ts b/src/app/centers/centers-view/notes-tab/notes-tab.component.spec.ts
new file mode 100644
index 000000000..add42af72
--- /dev/null
+++ b/src/app/centers/centers-view/notes-tab/notes-tab.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NotesTabComponent } from './notes-tab.component';
+
+describe('NotesTabComponent', () => {
+ let component: NotesTabComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ NotesTabComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(NotesTabComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/centers/centers-view/notes-tab/notes-tab.component.ts b/src/app/centers/centers-view/notes-tab/notes-tab.component.ts
new file mode 100644
index 000000000..524d8990e
--- /dev/null
+++ b/src/app/centers/centers-view/notes-tab/notes-tab.component.ts
@@ -0,0 +1,100 @@
+import { Component, OnInit, ViewChild } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { MatDialog } from '@angular/material';
+import { FormGroup, FormBuilder, Validators } from '@angular/forms';
+
+/** Custom Components */
+import { DeleteDialogComponent } from '../../../shared/delete-dialog/delete-dialog.component';
+import { FormDialogComponent } from 'app/shared/form-dialog/form-dialog.component';
+
+/** Custom Services */
+import { CentersService } from '../../centers.service';
+import { AuthenticationService } from '../../../core/authentication/authentication.service';
+
+@Component({
+ selector: 'mifosx-notes-tab',
+ templateUrl: './notes-tab.component.html',
+ styleUrls: ['./notes-tab.component.scss']
+})
+export class NotesTabComponent implements OnInit {
+ centerId: string;
+ username: string;
+ centerNotes: any;
+ noteForm: FormGroup;
+ @ViewChild('formRef') formRef: any;
+
+
+ constructor(private route: ActivatedRoute,
+ private formBuilder: FormBuilder,
+ private centersService: CentersService,
+ private authenticationService: AuthenticationService,
+ private dialog: MatDialog) {
+ const savedCredentials = this.authenticationService.getCredentials();
+ this.username = savedCredentials.username;
+ this.centerId = this.route.parent.snapshot.params['centerId'];
+ this.route.data.subscribe((data: { centerNotes: any }) => {
+ this.centerNotes = data.centerNotes;
+ });
+ }
+
+ ngOnInit() {
+ this.createNoteForm();
+ }
+
+ createNoteForm() {
+ this.noteForm = this.formBuilder.group({
+ 'note': ['', Validators.required]
+ });
+ }
+
+ submit() {
+ this.centersService.createCenterNote(this.centerId, this.noteForm.value).subscribe((response: any) => {
+ this.centerNotes.push({
+ id: response.resourceId,
+ createdByUsername: this.username,
+ createdOn: new Date(),
+ note: this.noteForm.value.note
+ });
+ this.formRef.resetForm();
+ });
+ }
+
+ editNote(noteId: string, noteContent: string, index: number) {
+ const editNoteDialogRef = this.dialog.open(FormDialogComponent, {
+ data: { formfields: [{
+ controlName: 'note',
+ required: true,
+ value: noteContent,
+ controlType: 'input',
+ label: 'Note'
+ }],
+ layout: {
+ columns: 1,
+ addButtonText: 'Confirm'
+ },
+ title: 'Edit Note'
+ }
+ });
+ editNoteDialogRef.afterClosed().subscribe((response: any) => {
+ if (response.data) {
+ this.centersService.editCenterNote(this.centerId, noteId, response.data.value).subscribe(() => {
+ this.centerNotes[index].note = response.data.value.note;
+ });
+ }
+ });
+ }
+
+ deleteNote(noteId: string, index: number) {
+ const deleteNoteDialogRef = this.dialog.open(DeleteDialogComponent, {
+ data: { deleteContext: `Note id:${noteId}` }
+ });
+ deleteNoteDialogRef.afterClosed().subscribe((response: any) => {
+ if (response.delete) {
+ this.centersService.deleteCenterNote(this.centerId, noteId)
+ .subscribe(() => {
+ this.centerNotes.splice(index, 1);
+ });
+ }
+ });
+ }
+}
diff --git a/src/app/centers/centers.module.ts b/src/app/centers/centers.module.ts
index 8d20ee980..9affae153 100644
--- a/src/app/centers/centers.module.ts
+++ b/src/app/centers/centers.module.ts
@@ -12,6 +12,7 @@ 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';
+import { NotesTabComponent } from './centers-view/notes-tab/notes-tab.component';
/**
* Centers Module
@@ -29,7 +30,8 @@ import { GeneralTabComponent } from './centers-view/general-tab/general-tab.comp
CentersComponent,
CreateCenterComponent,
CentersViewComponent,
- GeneralTabComponent
+ GeneralTabComponent,
+ NotesTabComponent
]
})
export class CentersModule { }
diff --git a/src/app/centers/centers.service.ts b/src/app/centers/centers.service.ts
index 17c884287..be3da70e2 100644
--- a/src/app/centers/centers.service.ts
+++ b/src/app/centers/centers.service.ts
@@ -88,4 +88,42 @@ export class CentersService {
getSavingsAccountDetails(centerId: string): Observable {
return this.http.get(`/centers/${centerId}/accounts`);
}
+
+ /**
+ * @param centerId Center Id
+ * @returns The notes for particular center
+ */
+ getCenterNotes(centerId: string): Observable {
+ return this.http.get(`/groups/${centerId}/notes`);
+ }
+
+ /**
+ * Adds a note to the particular Center Id
+ * @param centerId Center ID
+ * @param noteData Note Data to be added
+ * @returns {Observable}
+ */
+ createCenterNote(centerId: string, noteData: any): Observable {
+ return this.http.post(`/groups/${centerId}/notes`, noteData);
+ }
+
+ /**
+ * Edits the Center Note
+ * @param centerId Center ID
+ * @param noteId Note ID
+ * @param noteData Note Data
+ */
+ editCenterNote(centerId: string, noteId: string, noteData: any) {
+ return this.http.put(`/groups/${centerId}/notes/${noteId}`, noteData);
+ }
+
+ /**
+ * Deletes the particular Note
+ * @param centerId Center ID
+ * @param noteId Note ID
+ */
+ deleteCenterNote(centerId: string, noteId: string) {
+ return this.http.delete(`/groups/${centerId}/notes/${noteId}`);
+ }
+
}
diff --git a/src/app/centers/common-resolvers/center-notes.resolver.ts b/src/app/centers/common-resolvers/center-notes.resolver.ts
new file mode 100644
index 000000000..215618b2a
--- /dev/null
+++ b/src/app/centers/common-resolvers/center-notes.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 notes data resolver.
+ */
+@Injectable()
+export class CenterNotesResolver implements Resolve