瀏覽代碼

Partner profile UI

master
kj1352 3 年之前
父節點
當前提交
be60ba34eb
共有 16 個文件被更改,包括 464 次插入13 次删除
  1. +3
    -0
      src/app/app-routing.module.ts
  2. +5
    -1
      src/app/app.module.ts
  3. +2
    -2
      src/app/dashboard/dashboard.component.html
  4. +3
    -3
      src/app/dashboard/dashboard.component.ts
  5. +107
    -0
      src/app/dashboard/partner-details/partner-details.component.html
  6. +95
    -0
      src/app/dashboard/partner-details/partner-details.component.scss
  7. +25
    -0
      src/app/dashboard/partner-details/partner-details.component.spec.ts
  8. +25
    -0
      src/app/dashboard/partner-details/partner-details.component.ts
  9. +5
    -1
      src/app/dashboard/report/report.component.html
  10. +5
    -1
      src/app/dashboard/settings/settings.component.html
  11. +2
    -3
      src/app/dashboard/table/table.component.html
  12. +7
    -1
      src/app/dashboard/table/table.component.ts
  13. +44
    -0
      src/assets/delete.svg
  14. +48
    -0
      src/assets/edit.svg
  15. +43
    -0
      src/assets/save.svg
  16. +45
    -1
      src/styles.scss

+ 3
- 0
src/app/app-routing.module.ts 查看文件

@@ -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
}


+ 5
- 1
src/app/app.module.ts 查看文件

@@ -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'),
}),


+ 2
- 2
src/app/dashboard/dashboard.component.html 查看文件

@@ -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>


+ 3
- 3
src/app/dashboard/dashboard.component.ts 查看文件

@@ -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);
// })
}
}

+ 107
- 0
src/app/dashboard/partner-details/partner-details.component.html 查看文件

@@ -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>

+ 95
- 0
src/app/dashboard/partner-details/partner-details.component.scss 查看文件

@@ -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;
}
}

+ 25
- 0
src/app/dashboard/partner-details/partner-details.component.spec.ts 查看文件

@@ -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();
});
});

+ 25
- 0
src/app/dashboard/partner-details/partner-details.component.ts 查看文件

@@ -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();
}

}

+ 5
- 1
src/app/dashboard/report/report.component.html 查看文件

@@ -1 +1,5 @@
<p>report works!</p>
<div class="subpage">
<header class="main-header">
<h2> Reports </h2>
</header>
</div>

+ 5
- 1
src/app/dashboard/settings/settings.component.html 查看文件

@@ -1 +1,5 @@
<p>settings works!</p>
<div class="subpage">
<header class="main-header">
<h2> Settings </h2>
</header>
</div>

+ 2
- 3
src/app/dashboard/table/table.component.html 查看文件

@@ -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 }}


+ 7
- 1
src/app/dashboard/table/table.component.ts 查看文件

@@ -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) } });
}

}

+ 44
- 0
src/assets/delete.svg 查看文件

@@ -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>

+ 48
- 0
src/assets/edit.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>

+ 43
- 0
src/assets/save.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>

+ 45
- 1
src/styles.scss 查看文件

@@ -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%;


Loading…
取消
儲存