@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; | |||
import { RouterModule, Routes } from '@angular/router'; | |||
import { DashboardComponent } from './dashboard/dashboard.component'; | |||
import { GraphComponent } from './dashboard/graph/graph.component'; | |||
import { PartnerDetailsComponent } from './dashboard/partner-details/partner-details.component'; | |||
import { ReportComponent } from './dashboard/report/report.component'; | |||
import { SettingsComponent } from './dashboard/settings/settings.component'; | |||
import { TableComponent } from './dashboard/table/table.component'; | |||
@@ -19,6 +20,8 @@ const routes: Routes = [ | |||
path: 'partners', component: TableComponent | |||
}, { | |||
path: 'report', component: ReportComponent | |||
}, { | |||
path: 'partners/partner-details', component: PartnerDetailsComponent | |||
}, { | |||
path: 'settings', component: SettingsComponent | |||
} | |||
@@ -14,6 +14,8 @@ import { ReportComponent } from './dashboard/report/report.component'; | |||
import { SettingsComponent } from './dashboard/settings/settings.component'; | |||
import { PartnerProfileService } from './services/partner-profile.service'; | |||
import { PartnerDetailsComponent } from './dashboard/partner-details/partner-details.component'; | |||
import { FormsModule } from '@angular/forms'; | |||
@NgModule({ | |||
declarations: [ | |||
@@ -23,13 +25,15 @@ import { PartnerProfileService } from './services/partner-profile.service'; | |||
GraphComponent, | |||
TableComponent, | |||
ReportComponent, | |||
SettingsComponent | |||
SettingsComponent, | |||
PartnerDetailsComponent | |||
], | |||
imports: [ | |||
BrowserModule, | |||
AppRoutingModule, | |||
BrowserAnimationsModule, | |||
HttpClientModule, | |||
FormsModule, | |||
NgxEchartsModule.forRoot({ | |||
echarts: () => import('echarts'), | |||
}), | |||
@@ -1,13 +1,13 @@ | |||
<div class="container"> | |||
<section class="sidebar"> | |||
<figure class="logo" [routerLink]="'graph'"> | |||
<figure class="logo" [routerLink]="'/dashboard/analytics'"> | |||
<img src="assets/logo.png" alt="cac logo"> | |||
</figure> | |||
<nav> | |||
<a [ngClass]="{'active' : currentURL.includes('analytics')}" [routerLink]="'analytics'"> <img src="assets/dashboard.svg" alt=""> <span> Dashboard </span> </a> | |||
<a [ngClass]="{'active' : currentURL.includes('partners')}" [routerLink]="'partners'"> <img src="assets/database.svg" alt=""> <span> All Partners </span> </a> | |||
<a [ngClass]="{'active' : currentURL.includes('report')}" [routerLink]="'report'"> <img src="assets/report.svg" alt=""> <span> Report </span> </a> | |||
<a [ngClass]="{'active' : currentURL.includes('report')}" [routerLink]="'report'"> <img src="assets/report.svg" alt=""> <span> Reports </span> </a> | |||
<a [ngClass]="{'active' : currentURL.includes('settings')}" [routerLink]="'settings'"> <img src="assets/settings.svg" alt=""> <span> Settings </span> </a> | |||
<a [routerLink]="'/login'"> <img src="assets/logout.svg" alt=""> <span> Logout </span> </a> | |||
</nav> | |||
@@ -25,8 +25,8 @@ export class DashboardComponent implements OnInit { | |||
} | |||
}); | |||
this.partnerProfileService.getPartnersData().then(data => { | |||
console.log(data); | |||
}) | |||
// this.partnerProfileService.getPartnersData().then(data => { | |||
// console.log(data); | |||
// }) | |||
} | |||
} |
@@ -0,0 +1,107 @@ | |||
<section class="subpage"> | |||
<header class="main-header"> | |||
<h2> Partner Profile </h2> | |||
</header> | |||
<div class="segments"> | |||
<button class="button" [ngClass]="{'active' : selectedSegment === 1}" (click)="selectedSegment = 1"> Profile </button> | |||
<button class="button" [ngClass]="{'active' : selectedSegment === 2}" (click)="selectedSegment = 2"> Implementation Data </button> | |||
<button class="button" [ngClass]="{'active' : selectedSegment === 3}" (click)="selectedSegment = 3"> Training Data </button> | |||
</div> | |||
<section class="card"> | |||
<header> | |||
<h5> Primary Contact </h5> | |||
</header> | |||
<div class="container"> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.primaryContact.name"> | |||
<label> Name </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.primaryContact.designation"> | |||
<label> Name </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.primaryContact.email"> | |||
<label> Name </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.primaryContact.contactNumber"> | |||
<label> Contact </label> | |||
</div> | |||
</div> | |||
</section> | |||
<section class="card"> | |||
<header> | |||
<h5> Basic Info </h5> | |||
</header> | |||
<div class="container"> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.name"> | |||
<label> Name </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.website"> | |||
<label> Official Website </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.type"> | |||
<label> Type </label> | |||
</div> | |||
<div class="input-holder"> | |||
<div class="text"> <button *ngFor="let area of partnerDetails.organizationBasicInfo.areasOfWork"> {{ area }} </button> </div> | |||
<label> Thematic areas of work </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.source"> | |||
<label> How did you hear about us </label> | |||
</div> | |||
<div class="input-holder"> | |||
<input type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.referralName"> | |||
<label> Name of the organisation and person that referred </label> | |||
</div> | |||
<div class="checkbox-holder"> | |||
<input type="checkbox" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.wouldLikeUpdates"> | |||
<label> I would like to receive periodic updates about CAC </label> | |||
</div> | |||
<div class="input-holder"> | |||
<textarea type="text" disabled="{{ !isFormEditable }}" [(ngModel)]="partnerDetails.organizationBasicInfo.reasonForBecomingMember"></textarea> | |||
<label> I would like to become a member of CAC because </label> | |||
</div> | |||
</div> | |||
</section> | |||
<section class="footer-buttons"> | |||
<button class="button back" [routerLink]="'/dashboard/partners'"> | |||
<img src="assets/chevron-left.svg" alt=""> | |||
Back | |||
</button> | |||
<ng-container *ngIf="!isFormEditable"> | |||
<button class="button edit" (click)="isFormEditable=true"> <img src="assets/edit.svg" alt=""> Edit </button> | |||
<button class="button"> <img src="assets/export.svg" alt=""> Export </button> | |||
<button class="button delete"> <img src="assets/delete.svg" alt=""> Delete </button> | |||
</ng-container> | |||
<ng-container *ngIf="isFormEditable"> | |||
<button class="button edit" (click)="isFormEditable=false"> <img src="assets/save.svg" alt=""> Save </button> | |||
<button class="button delete" (click)="isFormEditable=false"> X Cancel </button> | |||
</ng-container> | |||
</section> | |||
</section> |
@@ -0,0 +1,95 @@ | |||
.card { | |||
margin: 24px 20px; | |||
header { | |||
margin-bottom: 24px; | |||
h5 { | |||
color: var(--primary-text); | |||
font-size: 20px; | |||
} | |||
} | |||
.container { | |||
display: grid; | |||
grid-template-columns: 1fr 1fr; | |||
grid-gap: 24px; | |||
align-items: flex-start; | |||
} | |||
.input-holder, .checkbox-holder { | |||
margin: 0; | |||
} | |||
} | |||
.segments { | |||
button { | |||
border: 2px solid var(--input-border); | |||
padding: 7px 20px; | |||
border-radius: var(--common-border-radius); | |||
background-color: white; | |||
margin-left: 20px; | |||
color: var(--secondary-text); | |||
font-weight: 500; | |||
transition: background-color 0.3s, color 0.3s; | |||
&.active { | |||
background-color: var(--primary); | |||
border-color: var(--primary); | |||
color: white; | |||
} | |||
} | |||
} | |||
.footer-buttons { | |||
display: flex; | |||
justify-content: flex-end; | |||
position: sticky; | |||
background-color: white; | |||
box-shadow: 0px 0px 50px var(--input-border); | |||
bottom: 0; | |||
left: 0; | |||
padding: 20px 10px; | |||
z-index: 2; | |||
border-radius: var(--common-border-radius); | |||
width: 100%; | |||
button { | |||
border: 2px solid var(--input-border); | |||
padding: 7px 20px; | |||
border-radius: var(--common-border-radius); | |||
background-color: white; | |||
margin: 0 10px; | |||
color: var(--secondary-text); | |||
font-weight: 500; | |||
transition: background-color 0.3s, color 0.3s; | |||
img { | |||
vertical-align: middle; | |||
width: 15px; | |||
height: 15px; | |||
} | |||
&.back { | |||
margin-right: auto; | |||
} | |||
&.edit { | |||
color: var(--primary); | |||
border-color: var(--primary); | |||
} | |||
&.delete { | |||
color: #eb445a; | |||
border-color: #eb445a; | |||
} | |||
} | |||
} | |||
.subpage { | |||
padding: 0; | |||
.main-header { | |||
padding-top: 20px; | |||
padding-left: 20px; | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
import { ComponentFixture, TestBed } from '@angular/core/testing'; | |||
import { PartnerDetailsComponent } from './partner-details.component'; | |||
describe('PartnerDetailsComponent', () => { | |||
let component: PartnerDetailsComponent; | |||
let fixture: ComponentFixture<PartnerDetailsComponent>; | |||
beforeEach(async () => { | |||
await TestBed.configureTestingModule({ | |||
declarations: [ PartnerDetailsComponent ] | |||
}) | |||
.compileComponents(); | |||
}); | |||
beforeEach(() => { | |||
fixture = TestBed.createComponent(PartnerDetailsComponent); | |||
component = fixture.componentInstance; | |||
fixture.detectChanges(); | |||
}); | |||
it('should create', () => { | |||
expect(component).toBeTruthy(); | |||
}); | |||
}); |
@@ -0,0 +1,25 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
import { ActivatedRoute } from '@angular/router'; | |||
@Component({ | |||
selector: 'app-partner-details', | |||
templateUrl: './partner-details.component.html', | |||
styleUrls: ['./partner-details.component.scss'] | |||
}) | |||
export class PartnerDetailsComponent implements OnInit { | |||
partnerDetails: any; | |||
isFormEditable: boolean = false; | |||
selectedSegment: 1 | 2 | 3 = 1; | |||
constructor( | |||
private activateRouter:ActivatedRoute | |||
) { } | |||
ngOnInit(): void { | |||
this.activateRouter.queryParams.subscribe((data: any) => { | |||
this.partnerDetails = JSON.parse(data.data); | |||
console.log(this.partnerDetails); | |||
}).unsubscribe(); | |||
} | |||
} |
@@ -1 +1,5 @@ | |||
<p>report works!</p> | |||
<div class="subpage"> | |||
<header class="main-header"> | |||
<h2> Reports </h2> | |||
</header> | |||
</div> |
@@ -1 +1,5 @@ | |||
<p>settings works!</p> | |||
<div class="subpage"> | |||
<header class="main-header"> | |||
<h2> Settings </h2> | |||
</header> | |||
</div> |
@@ -12,8 +12,7 @@ | |||
<input type="text" placeholder="Partner name, location, PRA user, contact..."> | |||
<label> Search </label> | |||
</div> | |||
<button class="button" (click)="showExportOptions = true"> <img src="assets/export.svg" alt=""> Export | |||
</button> | |||
<button class="button" (click)="showExportOptions = true"> <img src="assets/export.svg" alt=""> Export </button> | |||
<button class="button"> <img src="assets/filter.svg" alt=""> Filter </button> | |||
</div> | |||
@@ -40,7 +39,7 @@ | |||
<div class="col"> Primary Contact </div> | |||
</header> | |||
<section class="data"> | |||
<div class="row" *ngFor="let partner of userData"> | |||
<div class="row" *ngFor="let partner of userData" (click)="showPartnerDetails(partner)"> | |||
<div class="col"> <input type="checkbox"> </div> | |||
<div class="col"> | |||
{{ partner.organizationBasicInfo.name }} | |||
@@ -1,5 +1,6 @@ | |||
import { Component, OnInit } from '@angular/core'; | |||
import { PartnerProfileService } from '../../services/partner-profile.service'; | |||
import { Router } from '@angular/router'; | |||
@Component({ | |||
selector: 'app-table', | |||
@@ -11,7 +12,8 @@ export class TableComponent implements OnInit { | |||
showExportOptions: boolean = false; | |||
constructor( | |||
private partnerProfileService: PartnerProfileService | |||
private partnerProfileService: PartnerProfileService, | |||
private router: Router | |||
) { } | |||
ngOnInit(): void { | |||
@@ -20,4 +22,8 @@ export class TableComponent implements OnInit { | |||
}, (e) => console.log(e)); | |||
} | |||
showPartnerDetails(partner: any) { | |||
this.router.navigate(['dashboard/partners/partner-details'], { queryParams : { data: JSON.stringify(partner) } }); | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
<?xml version="1.0" encoding="iso-8859-1"?> | |||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |||
<svg fill="#eb445a" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||
width="900.5px" height="900.5px" viewBox="0 0 900.5 900.5" style="enable-background:new 0 0 900.5 900.5;" xml:space="preserve" | |||
> | |||
<g> | |||
<path d="M176.415,880.5c0,11.046,8.954,20,20,20h507.67c11.046,0,20-8.954,20-20V232.487h-547.67V880.5L176.415,880.5z | |||
M562.75,342.766h75v436.029h-75V342.766z M412.75,342.766h75v436.029h-75V342.766z M262.75,342.766h75v436.029h-75V342.766z"/> | |||
<path d="M618.825,91.911V20c0-11.046-8.954-20-20-20h-297.15c-11.046,0-20,8.954-20,20v71.911v12.5v12.5H141.874 | |||
c-11.046,0-20,8.954-20,20v50.576c0,11.045,8.954,20,20,20h34.541h547.67h34.541c11.046,0,20-8.955,20-20v-50.576 | |||
c0-11.046-8.954-20-20-20H618.825v-12.5V91.911z M543.825,112.799h-187.15v-8.389v-12.5V75h187.15v16.911v12.5V112.799z"/> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
</svg> |
@@ -0,0 +1,48 @@ | |||
<?xml version="1.0" encoding="iso-8859-1"?> | |||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||
<svg fill="#2a7a99" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||
viewBox="0 0 487.977 487.977" style="enable-background:new 0 0 487.977 487.977;" xml:space="preserve"> | |||
<g> | |||
<g> | |||
<path d="M484.685,196.177c-4-3.8-10.3-3.7-14.1,0.3l-181,189.6l-14.1-57.6l188.8-189.7c3.9-3.9,3.9-10.2,0-14.1 | |||
c-3.9-3.9-10.2-3.9-14.1,0l-188.8,189.6l-70.3-17.7l-17.7-70.3l189.6-188.8c3.9-3.9,3.9-10.2,0-14.1c-3.9-3.9-10.2-3.9-14.1,0 | |||
l-189.6,188.9l-57.6-14.1l189.6-181c4-3.8,4.1-10.1,0.3-14.1s-10.1-4.1-14.1-0.3l-202.7,193.6l-0.1,0.1c-0.3,0.2-0.5,0.5-0.7,0.8 | |||
c-0.1,0.1-0.1,0.1-0.2,0.2c-0.3,0.3-0.5,0.7-0.7,1v0.1c-0.2,0.3-0.4,0.7-0.5,1c0,0.1-0.1,0.2-0.1,0.3c-0.1,0.3-0.2,0.6-0.3,1 | |||
c0,0.1,0,0.1-0.1,0.2l-71.6,274.4c-0.9,3.4,0.1,7.1,2.6,9.6c1.9,1.9,4.5,2.9,7.1,2.9c0.8,0,1.7-0.1,2.5-0.3l274.4-71.6 | |||
c0.1,0,0.1,0,0.2-0.1c0.3-0.1,0.6-0.2,1-0.3c0.1,0,0.2-0.1,0.3-0.1c0.3-0.2,0.7-0.3,1-0.5h0.1c0.4-0.2,0.7-0.5,1-0.7 | |||
c0.1-0.1,0.1-0.1,0.2-0.2c0.3-0.2,0.5-0.5,0.8-0.7l0.1-0.1l193.6-202.7C488.785,206.277,488.685,199.977,484.685,196.177z | |||
M23.785,463.777l18.7-71.7l53,53L23.785,463.777z M117.885,439.277l-69.6-69.6l40.3-154.2l65.4,16l19.1,75.7 | |||
c0.9,3.6,3.7,6.4,7.3,7.3h0l75.7,19.1l16,65.4L117.885,439.277z"/> | |||
</g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
</svg> |
@@ -0,0 +1,43 @@ | |||
<?xml version="1.0" encoding="iso-8859-1"?> | |||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||
<svg fill="#2a7a99" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||
viewBox="0 0 49 49" style="enable-background:new 0 0 49 49;" xml:space="preserve"> | |||
<g> | |||
<rect x="27.5" y="5" width="6" height="10"/> | |||
<path d="M39.914,0H0.5v49h48V8.586L39.914,0z M10.5,2h26v16h-26V2z M39.5,47h-31V26h31V47z"/> | |||
<path d="M13.5,32h7c0.553,0,1-0.447,1-1s-0.447-1-1-1h-7c-0.553,0-1,0.447-1,1S12.947,32,13.5,32z"/> | |||
<path d="M13.5,36h10c0.553,0,1-0.447,1-1s-0.447-1-1-1h-10c-0.553,0-1,0.447-1,1S12.947,36,13.5,36z"/> | |||
<path d="M26.5,36c0.27,0,0.52-0.11,0.71-0.29c0.18-0.19,0.29-0.45,0.29-0.71s-0.11-0.521-0.29-0.71c-0.37-0.37-1.04-0.37-1.41,0 | |||
c-0.19,0.189-0.3,0.439-0.3,0.71c0,0.27,0.109,0.52,0.29,0.71C25.979,35.89,26.229,36,26.5,36z"/> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
<g> | |||
</g> | |||
</svg> |
@@ -46,6 +46,29 @@ | |||
} | |||
} | |||
.checkbox-holder { | |||
background-color: var(--input-background); | |||
border-radius: var(--common-border-radius); | |||
margin: 24px 0; | |||
display: block; | |||
display: flex; | |||
align-items: center; | |||
padding: 10px; | |||
border-bottom: 2px solid var(--input-border); | |||
border-bottom-right-radius: 0; | |||
border-bottom-left-radius: 0; | |||
label { | |||
font-size: 14px; | |||
color: var(--input-placeholder-text); | |||
display: block; | |||
} | |||
input { | |||
margin-right: 10px; | |||
} | |||
} | |||
.input-holder { | |||
background-color: var(--input-background); | |||
border-radius: var(--common-border-radius); | |||
@@ -98,7 +121,7 @@ | |||
border-bottom-left-radius: 0; | |||
} | |||
input { | |||
input, textarea, .text { | |||
display: block; | |||
background-color: transparent; | |||
color: var(--primary-text); | |||
@@ -127,9 +150,30 @@ | |||
} | |||
} | |||
} | |||
textarea { | |||
height: 100px; | |||
padding: 10px; | |||
resize: none; | |||
} | |||
.text { | |||
button { | |||
border: 2px solid var(--input-border); | |||
border-radius: var(--common-border-radius); | |||
font-size: 12px; | |||
color: var(--primary-text); | |||
padding: 5px 15px; | |||
margin-right: 5px; | |||
margin-top: 3px; | |||
font-weight: 500; | |||
letter-spacing: 0.5px; | |||
} | |||
} | |||
} | |||
.subpage { | |||
position: relative; | |||
padding: 20px; | |||
height: 100vh; | |||
width: 100%; | |||