| @@ -7,6 +7,7 @@ import { MockComponent } from './widgets/mock/mock.component'; | |||||
| import { RegisterBusinessComponent } from './pages/register-business/register-business.component'; | import { RegisterBusinessComponent } from './pages/register-business/register-business.component'; | ||||
| import { TabsComponent } from './layout/tabs/tabs.component'; | import { TabsComponent } from './layout/tabs/tabs.component'; | ||||
| import { InvestigateBusinessEntitiesAndIndividualsComponent } from './pages/investigate-business-entities-and-individuals/investigate-business-entities-and-individuals.component'; | import { InvestigateBusinessEntitiesAndIndividualsComponent } from './pages/investigate-business-entities-and-individuals/investigate-business-entities-and-individuals.component'; | ||||
| import { DashboardComponent } from './pages/dashboard/dashboard.component'; | |||||
| const routes: Routes = [ | const routes: Routes = [ | ||||
| { path: '', pathMatch: 'full', redirectTo: 'login' }, | { path: '', pathMatch: 'full', redirectTo: 'login' }, | ||||
| @@ -18,6 +19,9 @@ const routes: Routes = [ | |||||
| }, { | }, { | ||||
| path: 'e-services', | path: 'e-services', | ||||
| component: EServicesComponent, | component: EServicesComponent, | ||||
| }, { | |||||
| path: 'dashboard', | |||||
| component: DashboardComponent, | |||||
| }, { | }, { | ||||
| path:'check-status', | path:'check-status', | ||||
| component: CheckStatusComponent | component: CheckStatusComponent | ||||
| @@ -30,6 +30,7 @@ import { ConcurComplianceReviewComponent } from './pages/investigate-business-en | |||||
| import { ClosingRemarksComponent } from './pages/investigate-business-entities-and-individuals/closing-remarks/closing-remarks.component'; | import { ClosingRemarksComponent } from './pages/investigate-business-entities-and-individuals/closing-remarks/closing-remarks.component'; | ||||
| import { PreparePreliminaryLetterComponent } from './pages/investigate-business-entities-and-individuals/prepare-preliminary-letter/prepare-preliminary-letter.component'; | import { PreparePreliminaryLetterComponent } from './pages/investigate-business-entities-and-individuals/prepare-preliminary-letter/prepare-preliminary-letter.component'; | ||||
| import { RespondToPreliminaryLetterComponent } from './pages/investigate-business-entities-and-individuals/respond-to-preliminary-letter/respond-to-preliminary-letter.component'; | import { RespondToPreliminaryLetterComponent } from './pages/investigate-business-entities-and-individuals/respond-to-preliminary-letter/respond-to-preliminary-letter.component'; | ||||
| import { DashboardComponent } from './pages/dashboard/dashboard.component'; | |||||
| @NgModule({ | @NgModule({ | ||||
| declarations: [ | declarations: [ | ||||
| @@ -58,7 +59,8 @@ import { RespondToPreliminaryLetterComponent } from './pages/investigate-busines | |||||
| ConcurComplianceReviewComponent, | ConcurComplianceReviewComponent, | ||||
| ClosingRemarksComponent, | ClosingRemarksComponent, | ||||
| PreparePreliminaryLetterComponent, | PreparePreliminaryLetterComponent, | ||||
| RespondToPreliminaryLetterComponent | |||||
| RespondToPreliminaryLetterComponent, | |||||
| DashboardComponent | |||||
| ], | ], | ||||
| imports: [ | imports: [ | ||||
| BrowserModule, | BrowserModule, | ||||
| @@ -4,8 +4,8 @@ | |||||
| </figure> | </figure> | ||||
| <nav> | <nav> | ||||
| <a *ngIf="loginName === 'Officer'" [routerLink]="['/tabs/dashboard']"> Dashboard </a> | |||||
| <a [routerLink]="['/tabs/e-services']"> E-Services </a> | <a [routerLink]="['/tabs/e-services']"> E-Services </a> | ||||
| <!-- <a [routerLink]="['/tabs/check-status']"> Application Status </a> --> | |||||
| </nav> | </nav> | ||||
| <div class="search-input"> | <div class="search-input"> | ||||
| @@ -0,0 +1,86 @@ | |||||
| <header class="tab-header"> | |||||
| <h2> | |||||
| Dashboard | |||||
| </h2> | |||||
| </header> | |||||
| <header class="page-heading"> | |||||
| <h1> Non compliance - COM/LLPs </h1> | |||||
| <p> A search module to filter down non compliant entities </p> | |||||
| </header> | |||||
| <div class="form-holder"> | |||||
| <div class="two-column-holder"> | |||||
| <app-select-input | |||||
| label="Entity type" | |||||
| [options]="entityTypeOptions" | |||||
| ></app-select-input> | |||||
| <app-select-input | |||||
| label="Category" | |||||
| [value]="selectedCategory" | |||||
| [options]="categoryOptions" | |||||
| (onChange)="updateSelectedCategory($event)" | |||||
| ></app-select-input> | |||||
| <app-generic-input | |||||
| type="text" | |||||
| label="UEN" | |||||
| ></app-generic-input> | |||||
| <app-select-input | |||||
| label="Enforcment status" | |||||
| [options]="enforcementStatusOptions" | |||||
| ></app-select-input> | |||||
| <app-date-input | |||||
| label="AR/AD From date" | |||||
| ></app-date-input> | |||||
| <app-date-input | |||||
| label="AR/AD To date" | |||||
| ></app-date-input> | |||||
| </div> | |||||
| <div class="form-action-buttons"> | |||||
| <button class="common-button" (click)="submitSearch()"> | |||||
| Submit | |||||
| </button> | |||||
| <button class="common-button neutral" (click)="resetSearch()"> | |||||
| Reset | |||||
| </button> | |||||
| </div> | |||||
| <section class="table" *ngIf="isShowingResults"> | |||||
| <header> | |||||
| <div class="cell"> S/N </div> | |||||
| <div class="cell"> UEN </div> | |||||
| <div class="cell"> Compliance ID </div> | |||||
| <div class="cell"> Entity name </div> | |||||
| <div class="cell"> Last FYE </div> | |||||
| <div class="cell"> Enforcment status </div> | |||||
| <div class="cell"> Actions </div> | |||||
| </header> | |||||
| <ul> | |||||
| <li> | |||||
| <div class="cell"> 1 </div> | |||||
| <div class="cell"> 001 </div> | |||||
| <div class="cell"> 20190027N </div> | |||||
| <div class="cell"> ABC PTE.LTD </div> | |||||
| <div class="cell"> 01/01/2021 </div> | |||||
| <div class="cell"> Closed </div> | |||||
| <div class="cell"> | |||||
| <button [routerLink]="['/tabs/investigate-business-entities-and-individuals']"> Initiate Enforcment </button> | |||||
| </div> | |||||
| </li> | |||||
| <li> | |||||
| <div class="cell"> 2 </div> | |||||
| <div class="cell"> 002 </div> | |||||
| <div class="cell"> 20190027M </div> | |||||
| <div class="cell"> DEF PTE.LTD </div> | |||||
| <div class="cell"> 01/01/2020 </div> | |||||
| <div class="cell"> 1st EF letter </div> | |||||
| <div class="cell"> | |||||
| <button> Supress </button> | |||||
| </div> | |||||
| </li> | |||||
| </ul> | |||||
| </section> | |||||
| </div> | |||||
| @@ -0,0 +1,136 @@ | |||||
| .page-heading { | |||||
| text-align: center; | |||||
| line-height: 1.5; | |||||
| margin: 3rem auto; | |||||
| h1 { | |||||
| font-size: 3rem; | |||||
| color: var(--dark-grey); | |||||
| filter: brightness(80%); | |||||
| font-weight: 300; | |||||
| letter-spacing: 0.5px; | |||||
| margin-bottom: 1.5rem; | |||||
| } | |||||
| p { | |||||
| font-size: 1.4rem; | |||||
| color: var(--dark-grey); | |||||
| width: 50%; | |||||
| margin: 0 auto; | |||||
| } | |||||
| } | |||||
| .form-holder { | |||||
| width: calc(70% - 2rem); | |||||
| padding: 4rem; | |||||
| margin: 0 auto; | |||||
| } | |||||
| .two-column-holder { | |||||
| display: grid; | |||||
| grid-template-columns: 1fr 1fr; | |||||
| & > * { | |||||
| width: calc(100% - 2rem); | |||||
| } | |||||
| } | |||||
| .form-action-buttons { | |||||
| text-align: center; | |||||
| margin-bottom: 2rem; | |||||
| button { | |||||
| &:first-child { | |||||
| margin-right: 2rem; | |||||
| } | |||||
| } | |||||
| } | |||||
| .table { | |||||
| margin: 4rem auto; | |||||
| border-radius: 1rem; | |||||
| overflow: auto; | |||||
| border: 2px solid var(--border-grey); | |||||
| min-height: 10rem; | |||||
| header { | |||||
| background: linear-gradient(90deg, var(--secondary) 0%, var(--primary)); | |||||
| color: white; | |||||
| font-size: 1.6rem; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: flex-start; | |||||
| text-align: center; | |||||
| height: 5.5rem; | |||||
| font-weight: 300; | |||||
| letter-spacing: 0.5px; | |||||
| } | |||||
| .cell { | |||||
| &:nth-child(1) { | |||||
| width: 10%; | |||||
| } | |||||
| &:nth-child(2) { | |||||
| width: 10%; | |||||
| } | |||||
| &:nth-child(3), &:nth-child(4), &:nth-child(5), &:nth-child(6) { | |||||
| width: 15%; | |||||
| } | |||||
| &:nth-child(7) { | |||||
| width: 20rem; | |||||
| } | |||||
| } | |||||
| ul { | |||||
| list-style: none; | |||||
| } | |||||
| li { | |||||
| display: flex; | |||||
| align-items: flex-start; | |||||
| justify-content: flex-start; | |||||
| text-align: center; | |||||
| padding: 2rem 0; | |||||
| &:nth-child(even) { | |||||
| background-color: var(--border-grey); | |||||
| } | |||||
| .cell { | |||||
| font-size: 1.4rem; | |||||
| color: var(--dark-grey); | |||||
| line-height: 1.7; | |||||
| &:not(:nth-child(7)) { | |||||
| margin-top: 1rem; | |||||
| } | |||||
| h5 { | |||||
| font-weight: 500; | |||||
| filter: brightness(80%); | |||||
| font-size: 1.6rem; | |||||
| } | |||||
| button { | |||||
| background-color: var(--highlight); | |||||
| font-size: 1.5rem; | |||||
| letter-spacing: 0.5px; | |||||
| color: white; | |||||
| border-radius: 4rem; | |||||
| height: 4rem; | |||||
| width: 90%; | |||||
| display: block; | |||||
| margin: 0 auto; | |||||
| border: 0px; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| .table-holder, .key-value-holder { | |||||
| width: 90%; | |||||
| margin: 0 auto; | |||||
| } | |||||
| @@ -0,0 +1,25 @@ | |||||
| import { ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { DashboardComponent } from './dashboard.component'; | |||||
| describe('DashboardComponent', () => { | |||||
| let component: DashboardComponent; | |||||
| let fixture: ComponentFixture<DashboardComponent>; | |||||
| beforeEach(async () => { | |||||
| await TestBed.configureTestingModule({ | |||||
| declarations: [ DashboardComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| }); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(DashboardComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,48 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | |||||
| @Component({ | |||||
| selector: 'app-dashboard', | |||||
| templateUrl: './dashboard.component.html', | |||||
| styleUrls: ['./dashboard.component.scss'] | |||||
| }) | |||||
| export class DashboardComponent implements OnInit { | |||||
| isShowingResults = false; | |||||
| entityTypeOptions = [ | |||||
| 'All', | |||||
| 'Local company', | |||||
| 'LLP', | |||||
| ]; | |||||
| categoryOptions = [ | |||||
| 'Green', | |||||
| 'Amber', | |||||
| 'Red', | |||||
| ]; | |||||
| enforcementStatusOptions = [ | |||||
| '1st Enforcement Letter', | |||||
| '2nd Enforcement Letter', | |||||
| 'Suppressed', | |||||
| ]; | |||||
| selectedCategory = ''; | |||||
| constructor() { } | |||||
| ngOnInit(): void { | |||||
| } | |||||
| submitSearch() { | |||||
| this.isShowingResults = true; | |||||
| } | |||||
| resetSearch() { | |||||
| this.isShowingResults = false; | |||||
| } | |||||
| updateSelectedCategory(selectedCategory: string) { | |||||
| this.selectedCategory = selectedCategory; | |||||
| } | |||||
| } | |||||
| @@ -7,29 +7,6 @@ import { Component, OnInit } from '@angular/core'; | |||||
| }) | }) | ||||
| export class EServicesComponent implements OnInit { | export class EServicesComponent implements OnInit { | ||||
| keyValues = [{ | |||||
| key: 'Receipt Number', | |||||
| value: 'ACRA38293', | |||||
| }, { | |||||
| key: 'ARN', | |||||
| value: 'ARN2021110294038', | |||||
| }, { | |||||
| key: 'EP Reference No.', | |||||
| value: '20910038829384470' | |||||
| }, { | |||||
| key: 'Tax ID', | |||||
| value: 'M9-0C038921', | |||||
| }, { | |||||
| key: 'Paid By', | |||||
| value: 'KOH YA TING', | |||||
| }, { | |||||
| key: 'Payment Date', | |||||
| value: '06/11/2021 11:28:01' | |||||
| }, { | |||||
| key: 'Paid Via', | |||||
| value: 'Net Banking', | |||||
| }]; | |||||
| constructor() { } | constructor() { } | ||||
| ngOnInit(): void { | ngOnInit(): void { | ||||
| @@ -1,6 +1,6 @@ | |||||
| <div class="input-holder"> | <div class="input-holder"> | ||||
| <select> | <select> | ||||
| <option *ngFor="let option of options" [value]="option"> {{ option }} </option> | |||||
| <option *ngFor="let option of options" [value]="option" [selected]="value === option"> {{ option }} </option> | |||||
| </select> | </select> | ||||
| <img src="../../../../assets/icons/chevron-down.svg" alt="calendar icon"> | <img src="../../../../assets/icons/chevron-down.svg" alt="calendar icon"> | ||||
| @@ -1,4 +1,4 @@ | |||||
| import { Component, Input, OnInit } from '@angular/core'; | |||||
| import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; | |||||
| export interface SelectInputProperties { | export interface SelectInputProperties { | ||||
| name: string, | name: string, | ||||
| @@ -14,10 +14,18 @@ export interface SelectInputProperties { | |||||
| export class SelectInputComponent implements OnInit { | export class SelectInputComponent implements OnInit { | ||||
| @Input() label = ''; | @Input() label = ''; | ||||
| @Input() options: Array<string> = []; | @Input() options: Array<string> = []; | ||||
| @Input() value = ''; | |||||
| @Output() onChange = new EventEmitter<string>(); | |||||
| constructor() { } | constructor() { } | ||||
| ngOnInit(): void { | ngOnInit(): void { | ||||
| } | } | ||||
| updateValue(value: string) { | |||||
| this.value = value; | |||||
| this.onChange.emit(value); | |||||
| } | |||||
| } | } | ||||