@@ -8,7 +8,7 @@ import { TableComponent } from './dashboard/table/table.component'; | |||||
import { LoginComponent } from './login/login.component'; | import { LoginComponent } from './login/login.component'; | ||||
const routes: Routes = [ | const routes: Routes = [ | ||||
{ path: '', redirectTo: 'dashboard', pathMatch: 'full' }, | |||||
{ path: '', redirectTo: 'login', pathMatch: 'full' }, | |||||
{ path: 'login', component: LoginComponent }, | { path: 'login', component: LoginComponent }, | ||||
{ path: 'dashboard', component: DashboardComponent, children: [ | { path: 'dashboard', component: DashboardComponent, children: [ | ||||
{ | { | ||||
@@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'; | |||||
import { BrowserModule } from '@angular/platform-browser'; | import { BrowserModule } from '@angular/platform-browser'; | ||||
import { NgxEchartsModule } from 'ngx-echarts'; | import { NgxEchartsModule } from 'ngx-echarts'; | ||||
import { AppRoutingModule } from './app-routing.module'; | import { AppRoutingModule } from './app-routing.module'; | ||||
import { HttpClientModule } from '@angular/common/http'; | |||||
import { AppComponent } from './app.component'; | import { AppComponent } from './app.component'; | ||||
import { LoginComponent } from './login/login.component'; | import { LoginComponent } from './login/login.component'; | ||||
@@ -12,6 +13,8 @@ import { TableComponent } from './dashboard/table/table.component'; | |||||
import { ReportComponent } from './dashboard/report/report.component'; | import { ReportComponent } from './dashboard/report/report.component'; | ||||
import { SettingsComponent } from './dashboard/settings/settings.component'; | import { SettingsComponent } from './dashboard/settings/settings.component'; | ||||
import { PartnerProfileService } from './services/partner-profile.service'; | |||||
@NgModule({ | @NgModule({ | ||||
declarations: [ | declarations: [ | ||||
AppComponent, | AppComponent, | ||||
@@ -26,11 +29,14 @@ import { SettingsComponent } from './dashboard/settings/settings.component'; | |||||
BrowserModule, | BrowserModule, | ||||
AppRoutingModule, | AppRoutingModule, | ||||
BrowserAnimationsModule, | BrowserAnimationsModule, | ||||
HttpClientModule, | |||||
NgxEchartsModule.forRoot({ | NgxEchartsModule.forRoot({ | ||||
echarts: () => import('echarts'), | echarts: () => import('echarts'), | ||||
}), | }), | ||||
], | ], | ||||
providers: [], | |||||
providers: [ | |||||
PartnerProfileService, | |||||
], | |||||
bootstrap: [AppComponent] | bootstrap: [AppComponent] | ||||
}) | }) | ||||
export class AppModule { } | export class AppModule { } |
@@ -9,6 +9,7 @@ | |||||
<a [ngClass]="{'active' : currentURL.includes('partners')}" [routerLink]="'partners'"> <img src="assets/database.svg" alt=""> <span> All Partners </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> Report </span> </a> | ||||
<a [ngClass]="{'active' : currentURL.includes('settings')}" [routerLink]="'settings'"> <img src="assets/settings.svg" alt=""> <span> Settings </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> | </nav> | ||||
</section> | </section> | ||||
@@ -1,5 +1,6 @@ | |||||
import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
import { NavigationEnd, Router } from '@angular/router'; | import { NavigationEnd, Router } from '@angular/router'; | ||||
import { PartnerProfileService } from '../services/partner-profile.service'; | |||||
@Component({ | @Component({ | ||||
selector: 'app-dashboard', | selector: 'app-dashboard', | ||||
@@ -10,7 +11,8 @@ export class DashboardComponent implements OnInit { | |||||
currentURL: string = ''; | currentURL: string = ''; | ||||
constructor( | constructor( | ||||
private router: Router | |||||
private router: Router, | |||||
private partnerProfileService: PartnerProfileService | |||||
) { } | ) { } | ||||
ngOnInit(): void { | ngOnInit(): void { | ||||
@@ -22,5 +24,9 @@ export class DashboardComponent implements OnInit { | |||||
this.currentURL = val.url; | this.currentURL = val.url; | ||||
} | } | ||||
}); | }); | ||||
this.partnerProfileService.getPartnersData().then(data => { | |||||
console.log(data); | |||||
}) | |||||
} | } | ||||
} | } |
@@ -6,85 +6,50 @@ | |||||
<div class="card"> | <div class="card"> | ||||
<div class="table-actions"> | <div class="table-actions"> | ||||
<div class="input-holder"> | |||||
<div class="input-holder side-label"> | |||||
<input type="text" placeholder="Partner name, location, PRA user, contact..."> | <input type="text" placeholder="Partner name, location, PRA user, contact..."> | ||||
<label> Search </label> | <label> Search </label> | ||||
</div> | </div> | ||||
<button> Export </button> | |||||
<button> Filter </button> | |||||
<button class="button"> <img src="assets/export.svg" alt=""> Export </button> | |||||
<button class="button"> <img src="assets/filter.svg" alt=""> Filter </button> | |||||
</div> | </div> | ||||
<table> | |||||
<thead> | |||||
<tr> | |||||
<th>ID</th> | |||||
<th>First name</th> | |||||
<th>Last name</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr> | |||||
<td>1</td> | |||||
<td>Foo</td> | |||||
<td>Bar</td> | |||||
</tr> | |||||
<tr> | |||||
<td>2</td> | |||||
<td>Someone</td> | |||||
<td>Youknow</td> | |||||
</tr> | |||||
<tr> | |||||
<td>3</td> | |||||
<td>Iamout</td> | |||||
<td>Ofinspiration</td> | |||||
</tr> | |||||
<tr> | |||||
<td>4</td> | |||||
<td>Yoda</td> | |||||
<td>Skywalker</td> | |||||
</tr> | |||||
<tr> | |||||
<td>5</td> | |||||
<td>Patrick</td> | |||||
<td>Dupont</td> | |||||
</tr> | |||||
<tr> | |||||
<td>6</td> | |||||
<td>Barack</td> | |||||
<td>Obama</td> | |||||
</tr> | |||||
<tr> | |||||
<td>7</td> | |||||
<td>François</td> | |||||
<td>Holland</td> | |||||
</tr> | |||||
<tr> | |||||
<td>8</td> | |||||
<td>Michel</td> | |||||
<td>Popo</td> | |||||
</tr> | |||||
<tr> | |||||
<td>9</td> | |||||
<td>Chuck</td> | |||||
<td>Norris</td> | |||||
</tr> | |||||
<tr> | |||||
<td>10</td> | |||||
<td>Simon</td> | |||||
<td>Robin</td> | |||||
</tr> | |||||
<tr> | |||||
<td>11</td> | |||||
<td>Louis</td> | |||||
<td>Lin</td> | |||||
</tr> | |||||
<tr> | |||||
<td>12</td> | |||||
<td>Zelda</td> | |||||
<td>Link</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<section class="table"> | |||||
<header> | |||||
<div class="col"> Select </div> | |||||
<div class="col"> Name </div> | |||||
<div class="col"> Primary Disctrict & State </div> | |||||
<div class="col"> Type </div> | |||||
<div class="col"> Total Reach </div> | |||||
<div class="col"> Website </div> | |||||
<div class="col"> Primary Contact </div> | |||||
</header> | |||||
<section class="data"> | |||||
<div class="row" *ngFor="let partner of userData"> | |||||
<div class="col"> <input type="checkbox"> </div> | |||||
<div class="col"> | |||||
{{ partner.organizationBasicInfo.name }} | |||||
</div> | |||||
<div class="col"> | |||||
{{ partner.detailedProfile.district }}, {{ partner.detailedProfile.state }} | |||||
</div> | |||||
<div class="col"> | |||||
{{ partner.organizationBasicInfo.type }} | |||||
</div> | |||||
<div class="col"> | |||||
{{ partner.detailedProfile.totalReachOfOrganization }} | |||||
</div> | |||||
<div class="col"> | |||||
<a target="_blank" [href]="partner.organizationBasicInfo.website">{{ partner.organizationBasicInfo.website }}</a> | |||||
</div> | |||||
<div class="col"> | |||||
<div> {{ partner.primaryContact.name }} </div> | |||||
<a href="mailTo:{{partner.primaryContact.email}}"> {{ partner.primaryContact.email }} </a> | |||||
<a href="tel:{{partner.primaryContact.contactNumber}}"> {{ partner.primaryContact.contactNumber }} </a> | |||||
</div> | |||||
</div> | |||||
</section> | |||||
</section> | |||||
<section class="page-settings"> | <section class="page-settings"> | ||||
<div class="input-holder side-label"> | <div class="input-holder side-label"> | ||||
@@ -0,0 +1,98 @@ | |||||
.table-actions { | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: flex-end; | |||||
margin-bottom: 10px; | |||||
.input-holder { | |||||
margin: 0; | |||||
width: 30%; | |||||
margin-right: auto; | |||||
} | |||||
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; | |||||
img { | |||||
vertical-align: middle; | |||||
width: 15px; | |||||
height: 15px; | |||||
} | |||||
} | |||||
} | |||||
.table { | |||||
height: 50vh; | |||||
overflow: auto; | |||||
line-height: 1.8; | |||||
header, .row { | |||||
display: flex; | |||||
flex-wrap: nowrap; | |||||
align-items: center; | |||||
padding: 0 10px; | |||||
.col { | |||||
width: calc(100% / 7); | |||||
font-size: 14px; | |||||
p, a, &>div { | |||||
display: block; | |||||
white-space: nowrap; | |||||
overflow: hidden; | |||||
text-overflow: ellipsis; | |||||
width: 100%; | |||||
} | |||||
&:nth-child(1) { | |||||
width: 70px; | |||||
} | |||||
&:nth-child(3) { | |||||
flex-grow: 1; | |||||
} | |||||
&:nth-child(5) { | |||||
width: 100px; | |||||
} | |||||
} | |||||
} | |||||
header { | |||||
background-color: var(--secondary-text); | |||||
color: white; | |||||
border-radius: var(--common-border-radius); | |||||
position: sticky; | |||||
z-index: 1; | |||||
top: 0; | |||||
height: 50px; | |||||
} | |||||
.row { | |||||
color: var(--secondary-text); | |||||
background-color: white; | |||||
border-radius: var(--common-border-radius); | |||||
cursor: pointer; | |||||
transition: background-color 0.3s, color 0.3s; | |||||
&:nth-child(even) { | |||||
background-color: var(--input-background); | |||||
} | |||||
&:hover { | |||||
background-color: var(--primary); | |||||
color: white; | |||||
a { | |||||
color: var(--secondary); | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,15 +1,22 @@ | |||||
import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
import { PartnerProfileService } from '../../services/partner-profile.service'; | |||||
@Component({ | @Component({ | ||||
selector: 'app-table', | |||||
templateUrl: './table.component.html', | |||||
styleUrls: ['./table.component.scss'] | |||||
selector: 'app-table', | |||||
templateUrl: './table.component.html', | |||||
styleUrls: ['./table.component.scss'] | |||||
}) | }) | ||||
export class TableComponent implements OnInit { | export class TableComponent implements OnInit { | ||||
userData: Array<any> = []; | |||||
constructor() { } | |||||
constructor( | |||||
private partnerProfileService: PartnerProfileService | |||||
) { } | |||||
ngOnInit(): void { | |||||
} | |||||
ngOnInit(): void { | |||||
this.partnerProfileService.getPartnersData().then((data: any) => { | |||||
this.userData = data; | |||||
}, (e) => console.log(e)); | |||||
} | |||||
} | } |
@@ -16,7 +16,7 @@ export class LoginComponent implements OnInit { | |||||
} | } | ||||
authenticateUser() { | authenticateUser() { | ||||
this.router.navigate(['/dashboard']); | |||||
this.router.navigate(['/dashboard/analytics']); | |||||
} | } | ||||
} | } |
@@ -0,0 +1,16 @@ | |||||
import { TestBed } from '@angular/core/testing'; | |||||
import { PartnerProfileService } from './partner-profile.service'; | |||||
describe('PartnerProfileService', () => { | |||||
let service: PartnerProfileService; | |||||
beforeEach(() => { | |||||
TestBed.configureTestingModule({}); | |||||
service = TestBed.inject(PartnerProfileService); | |||||
}); | |||||
it('should be created', () => { | |||||
expect(service).toBeTruthy(); | |||||
}); | |||||
}); |
@@ -0,0 +1,18 @@ | |||||
import { Injectable } from '@angular/core'; | |||||
import { HttpClient } from '@angular/common/http'; | |||||
import { lastValueFrom } from 'rxjs'; | |||||
@Injectable({ | |||||
providedIn: 'root' | |||||
}) | |||||
export class PartnerProfileService { | |||||
constructor( | |||||
private http: HttpClient | |||||
) { } | |||||
async getPartnersData() { | |||||
return lastValueFrom(this.http.get('http://143.110.247.94/user-data/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2MjAyY2I3YmQwMWMxMzRhYjdjZmViOGUiLCJleHAiOjE2NDk0NjI0MDAsImlhdCI6MTY0NDM1MTEwMH0.MghrYB51zg5Qk2fk1yx9NO1nPLpdhwMK69XIuFrmrAY')); | |||||
} | |||||
} |
@@ -0,0 +1 @@ | |||||
<svg fill="#7b7b7b" width="20px" height="20px" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M15 15H2V6h2.595s.689-.896 2.17-2H1a1 1 0 0 0-1 1v11a1 1 0 0 0 1 1h15a1 1 0 0 0 1-1v-3.746l-2 1.645V15zm-1.639-6.95v3.551L20 6.4l-6.639-4.999v3.131C5.3 4.532 5.3 12.5 5.3 12.5c2.282-3.748 3.686-4.45 8.061-4.45z"/></svg> |
@@ -0,0 +1,40 @@ | |||||
<?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="#7b7b7b" 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 472.615 472.615" style="enable-background:new 0 0 472.615 472.615;" xml:space="preserve"> | |||||
<g> | |||||
<g> | |||||
<polygon points="472.615,12.908 0,12.908 180.081,202.629 180.066,459.708 292.55,401.525 292.534,202.629 "/> | |||||
</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,53 @@ | |||||
<?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="white" 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="46.782px" height="46.782px" viewBox="0 0 46.782 46.782" style="enable-background:new 0 0 46.782 46.782;" | |||||
xml:space="preserve"> | |||||
<g> | |||||
<g> | |||||
<path d="M46.629,33.693l-1.262-2.219c-0.204-0.358-0.709-0.651-1.121-0.651L27.75,30.825c-0.412,0-0.979-0.25-1.256-0.555 | |||||
l-0.985-1.08c-0.278-0.305-0.844-0.554-1.256-0.554h-5.604l-0.231-2.796c-0.347-2.177-2.387-3.554-4.535-3.072l-9.977,2.247 | |||||
c-2.148,0.483-3.904,2.669-3.903,4.871L0,38.807c0,2.194,1.758,4.386,3.903,4.873l9.979,2.245 | |||||
c2.148,0.482,4.188-0.896,4.535-3.075l0.231-2.792l0,0l3.609-0.001c0.412,0,0.978-0.25,1.255-0.556l0.984-1.078 | |||||
c0.277-0.305,0.843-0.555,1.255-0.555h1.163c0.412,0,0.9-0.302,1.084-0.672l0.154-0.313c0.185-0.37,0.673-0.673,1.084-0.673h0.705 | |||||
c0.412,0,0.836,0.326,0.94,0.726l0.056,0.208c0.105,0.398,0.514,0.725,0.904,0.725s0.862-0.302,1.047-0.672l0.155-0.314 | |||||
c0.185-0.37,0.671-0.672,1.083-0.672h0.705c0.412,0,0.835,0.326,0.939,0.726l0.055,0.208c0.104,0.398,0.527,0.727,0.939,0.727 | |||||
h7.478c0.411,0,0.917-0.293,1.12-0.652l1.263-2.219C46.833,34.639,46.833,34.052,46.629,33.693z M6.883,40.389 | |||||
c-1.857,0-3.357-2.705-3.357-6.042c0-3.338,1.5-6.043,3.357-6.043c1.855,0,3.356,2.705,3.356,6.043 | |||||
C10.239,37.684,8.738,40.389,6.883,40.389z"/> | |||||
<polygon points="17.709,21.248 23.5,15.458 29.291,21.248 33.744,16.794 27.953,11.006 33.744,5.214 29.291,0.761 23.5,6.553 | |||||
17.709,0.761 13.256,5.214 19.048,11.006 13.256,16.794 "/> | |||||
</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> |
@@ -68,9 +68,16 @@ | |||||
&:focus { | &:focus { | ||||
border: 2px solid var(--primary); | border: 2px solid var(--primary); | ||||
border-radius: var(--common-border-radius); | border-radius: var(--common-border-radius); | ||||
border-bottom-left-radius: 0px; | |||||
border-top-left-radius: 0px; | |||||
border-left: 0px; | |||||
& + label { | & + label { | ||||
border: 2px solid transparent; | |||||
border: 2px solid var(--primary); | |||||
border-radius: var(--common-border-radius); | |||||
border-top-right-radius: 0px; | |||||
border-bottom-right-radius: 0px; | |||||
border-right: 0px; | |||||
} | } | ||||
} | } | ||||
} | } | ||||