mirror of
https://github.com/akveo/ngx-admin.git
synced 2025-12-16 15:40:11 +01:00
Ups
This commit is contained in:
parent
73f036a059
commit
603d3f876c
24 changed files with 823 additions and 285 deletions
33
src/app/pages/account/account.module.ts
Normal file
33
src/app/pages/account/account.module.ts
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import { NbCardModule, NbInputModule, NbButtonModule, NbIconModule } from '@nebular/theme';
|
||||
import { ProfileComponent } from './profile/profile.component';
|
||||
import { SettingsComponent } from './settings/settings.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
ReactiveFormsModule,
|
||||
NbCardModule,
|
||||
NbInputModule,
|
||||
NbButtonModule,
|
||||
NbIconModule,
|
||||
RouterModule.forChild([
|
||||
{
|
||||
path: 'profile',
|
||||
component: ProfileComponent,
|
||||
},
|
||||
{
|
||||
path: 'settings',
|
||||
component: SettingsComponent,
|
||||
},
|
||||
]),
|
||||
],
|
||||
declarations: [
|
||||
ProfileComponent,
|
||||
SettingsComponent,
|
||||
],
|
||||
})
|
||||
export class AccountModule { }
|
||||
74
src/app/pages/account/profile/profile.component.html
Normal file
74
src/app/pages/account/profile/profile.component.html
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
<div class="row">
|
||||
<div class="col-12">
|
||||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Your Profile</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<form [formGroup]="profileForm" (ngSubmit)="onSubmit()">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="firstName">First Name</label>
|
||||
<input nbInput fullWidth id="firstName" formControlName="firstName" placeholder="First Name">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="lastName">Last Name</label>
|
||||
<input nbInput fullWidth id="lastName" formControlName="lastName" placeholder="Last Name">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="email">Email</label>
|
||||
<input nbInput fullWidth id="email" formControlName="email" placeholder="Email">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="phone">Phone</label>
|
||||
<input nbInput fullWidth id="phone" formControlName="phone" placeholder="Phone Number">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="company">Company</label>
|
||||
<input nbInput fullWidth id="company" formControlName="company" placeholder="Company">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label class="label" for="position">Position</label>
|
||||
<input nbInput fullWidth id="position" formControlName="position" placeholder="Position">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="form-group">
|
||||
<label class="label" for="address">Address</label>
|
||||
<input nbInput fullWidth id="address" formControlName="address" placeholder="Address">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-4">
|
||||
<div class="col-12 text-center">
|
||||
<button nbButton status="primary" [disabled]="profileForm.invalid">
|
||||
<nb-icon icon="save-outline"></nb-icon> Update Profile
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
</div>
|
||||
</div>
|
||||
9
src/app/pages/account/profile/profile.component.scss
Normal file
9
src/app/pages/account/profile/profile.component.scss
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
.form-group {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 500;
|
||||
}
|
||||
32
src/app/pages/account/profile/profile.component.ts
Normal file
32
src/app/pages/account/profile/profile.component.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'ngx-profile',
|
||||
templateUrl: './profile.component.html',
|
||||
styleUrls: ['./profile.component.scss']
|
||||
})
|
||||
export class ProfileComponent implements OnInit {
|
||||
profileForm: FormGroup;
|
||||
|
||||
constructor(private fb: FormBuilder) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this.profileForm = this.fb.group({
|
||||
firstName: ['John', Validators.required],
|
||||
lastName: ['Doe', Validators.required],
|
||||
email: ['john.doe@example.com', [Validators.required, Validators.email]],
|
||||
company: ['Acme Corp', Validators.required],
|
||||
position: ['Product Manager', Validators.required],
|
||||
phone: ['+1 (555) 123-4567', Validators.required],
|
||||
address: ['123 Main St, New York, NY 10001', Validators.required],
|
||||
});
|
||||
}
|
||||
|
||||
onSubmit() {
|
||||
if (this.profileForm.valid) {
|
||||
// Handle profile update logic
|
||||
console.log('Profile updated:', this.profileForm.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
101
src/app/pages/account/settings/settings.component.html
Normal file
101
src/app/pages/account/settings/settings.component.html
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
<div class="row">
|
||||
<div class="col-12">
|
||||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Account Settings</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<form [formGroup]="settingsForm" (ngSubmit)="onSubmit()">
|
||||
<h6 class="section-title">Notifications</h6>
|
||||
<div class="settings-section">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" class="custom-control-input" id="emailNotifications" formControlName="emailNotifications">
|
||||
<label class="custom-control-label" for="emailNotifications">Email Notifications</label>
|
||||
</div>
|
||||
<small class="form-text text-muted">Receive verification results and updates via email</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" class="custom-control-input" id="smsNotifications" formControlName="smsNotifications">
|
||||
<label class="custom-control-label" for="smsNotifications">SMS Notifications</label>
|
||||
</div>
|
||||
<small class="form-text text-muted">Receive verification results and updates via SMS</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h6 class="section-title">Security</h6>
|
||||
<div class="settings-section">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-switch">
|
||||
<input type="checkbox" class="custom-control-input" id="twoFactorAuth" formControlName="twoFactorAuth">
|
||||
<label class="custom-control-label" for="twoFactorAuth">Two-Factor Authentication</label>
|
||||
</div>
|
||||
<small class="form-text text-muted">Enable 2FA for additional security</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="dataRetention">Data Retention</label>
|
||||
<select class="form-control" id="dataRetention" formControlName="dataRetention">
|
||||
<option value="7days">7 Days</option>
|
||||
<option value="30days">30 Days</option>
|
||||
<option value="90days">90 Days</option>
|
||||
<option value="1year">1 Year</option>
|
||||
</select>
|
||||
<small class="form-text text-muted">How long to keep your verification results</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h6 class="section-title">Appearance</h6>
|
||||
<div class="settings-section">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="theme">Theme</label>
|
||||
<select class="form-control" id="theme" formControlName="theme">
|
||||
<option value="default">Default</option>
|
||||
<option value="dark">Dark</option>
|
||||
<option value="cosmic">Cosmic</option>
|
||||
<option value="corporate">Corporate</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="language">Language</label>
|
||||
<select class="form-control" id="language" formControlName="language">
|
||||
<option value="en">English</option>
|
||||
<option value="es">Spanish</option>
|
||||
<option value="fr">French</option>
|
||||
<option value="de">German</option>
|
||||
<option value="zh">Chinese</option>
|
||||
<option value="ja">Japanese</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-4">
|
||||
<div class="col-12 text-center">
|
||||
<button nbButton status="primary">
|
||||
<nb-icon icon="save-outline"></nb-icon> Save Settings
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
</div>
|
||||
</div>
|
||||
19
src/app/pages/account/settings/settings.component.scss
Normal file
19
src/app/pages/account/settings/settings.component.scss
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
.section-title {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 10px;
|
||||
font-weight: 600;
|
||||
border-bottom: 1px solid #edf1f7;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.settings-section {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.custom-control-label {
|
||||
cursor: pointer;
|
||||
}
|
||||
31
src/app/pages/account/settings/settings.component.ts
Normal file
31
src/app/pages/account/settings/settings.component.ts
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'ngx-settings',
|
||||
templateUrl: './settings.component.html',
|
||||
styleUrls: ['./settings.component.scss']
|
||||
})
|
||||
export class SettingsComponent implements OnInit {
|
||||
settingsForm: FormGroup;
|
||||
|
||||
constructor(private fb: FormBuilder) { }
|
||||
|
||||
ngOnInit(): void {
|
||||
this.settingsForm = this.fb.group({
|
||||
emailNotifications: [true],
|
||||
smsNotifications: [false],
|
||||
twoFactorAuth: [true],
|
||||
dataRetention: ['30days'],
|
||||
theme: ['default'],
|
||||
language: ['en'],
|
||||
});
|
||||
}
|
||||
|
||||
onSubmit() {
|
||||
if (this.settingsForm.valid) {
|
||||
// Handle settings update logic
|
||||
console.log('Settings updated:', this.settingsForm.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
57
src/app/pages/countries/countries.component.html
Normal file
57
src/app/pages/countries/countries.component.html
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
<div class="row">
|
||||
<div class="col-12">
|
||||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Available Countries</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<p>
|
||||
Select from our available countries below to perform identity verification. Each country has different
|
||||
data sources, update frequencies, and record counts.
|
||||
</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-4 mb-4" *ngFor="let country of countries">
|
||||
<nb-card [status]="country.availability ? 'success' : 'basic'">
|
||||
<nb-card-header>
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="country-icon mr-2">{{ country.icon }}</span>
|
||||
<span>{{ country.name }}</span>
|
||||
<span class="ml-auto">
|
||||
<nb-icon *ngIf="country.availability" icon="checkmark-circle-2-outline" status="success"></nb-icon>
|
||||
<nb-icon *ngIf="!country.availability" icon="clock-outline" status="warning"></nb-icon>
|
||||
</span>
|
||||
</div>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<div class="country-info">
|
||||
<div class="info-item">
|
||||
<strong>Records:</strong> {{ country.records }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Updates:</strong> {{ country.updateFrequency }}
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<strong>Status:</strong> {{ country.availability ? 'Available' : 'Coming Soon' }}
|
||||
</div>
|
||||
</div>
|
||||
</nb-card-body>
|
||||
<nb-card-footer *ngIf="country.availability">
|
||||
<button nbButton fullWidth status="primary" [routerLink]="['/pages/identity/manual-lookup']" [queryParams]="{country: country.code}">
|
||||
<nb-icon icon="search-outline"></nb-icon>
|
||||
Verify Identity
|
||||
</button>
|
||||
</nb-card-footer>
|
||||
<nb-card-footer *ngIf="!country.availability">
|
||||
<button nbButton fullWidth status="basic" disabled>
|
||||
<nb-icon icon="alert-triangle-outline"></nb-icon>
|
||||
Coming Soon
|
||||
</button>
|
||||
</nb-card-footer>
|
||||
</nb-card>
|
||||
</div>
|
||||
</div>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
</div>
|
||||
</div>
|
||||
12
src/app/pages/countries/countries.component.scss
Normal file
12
src/app/pages/countries/countries.component.scss
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
.country-icon {
|
||||
font-size: 1.5rem;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.country-info {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.info-item {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
65
src/app/pages/countries/countries.component.ts
Normal file
65
src/app/pages/countries/countries.component.ts
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'ngx-countries',
|
||||
templateUrl: './countries.component.html',
|
||||
styleUrls: ['./countries.component.scss']
|
||||
})
|
||||
export class CountriesComponent implements OnInit {
|
||||
|
||||
countries = [
|
||||
{
|
||||
name: 'Australia',
|
||||
code: 'aus',
|
||||
records: '15M+',
|
||||
updateFrequency: 'Weekly',
|
||||
availability: true,
|
||||
icon: '🇦🇺'
|
||||
},
|
||||
{
|
||||
name: 'Indonesia',
|
||||
code: 'indo',
|
||||
records: '120M+',
|
||||
updateFrequency: 'Monthly',
|
||||
availability: true,
|
||||
icon: '🇮🇩'
|
||||
},
|
||||
{
|
||||
name: 'Japan',
|
||||
code: 'japan',
|
||||
records: '85M+',
|
||||
updateFrequency: 'Bi-weekly',
|
||||
availability: true,
|
||||
icon: '🇯🇵'
|
||||
},
|
||||
{
|
||||
name: 'Malaysia',
|
||||
code: 'malay',
|
||||
records: '20M+',
|
||||
updateFrequency: 'Weekly',
|
||||
availability: true,
|
||||
icon: '🇲🇾'
|
||||
},
|
||||
{
|
||||
name: 'Singapore',
|
||||
code: 'sg',
|
||||
records: '5M+',
|
||||
updateFrequency: 'Weekly',
|
||||
availability: true,
|
||||
icon: '🇸🇬'
|
||||
},
|
||||
{
|
||||
name: 'Thailand',
|
||||
code: 'thai',
|
||||
records: '45M+',
|
||||
updateFrequency: 'Monthly',
|
||||
availability: false,
|
||||
icon: '🇹🇭'
|
||||
},
|
||||
];
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
}
|
||||
24
src/app/pages/countries/countries.module.ts
Normal file
24
src/app/pages/countries/countries.module.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { NbCardModule, NbIconModule, NbListModule } from '@nebular/theme';
|
||||
import { CountriesComponent } from './countries.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
NbCardModule,
|
||||
NbIconModule,
|
||||
NbListModule,
|
||||
RouterModule.forChild([
|
||||
{
|
||||
path: '',
|
||||
component: CountriesComponent,
|
||||
},
|
||||
]),
|
||||
],
|
||||
declarations: [
|
||||
CountriesComponent,
|
||||
],
|
||||
})
|
||||
export class CountriesModule { }
|
||||
44
src/app/pages/identity/identity.module.ts
Normal file
44
src/app/pages/identity/identity.module.ts
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { ReactiveFormsModule } from '@angular/forms';
|
||||
import {
|
||||
NbCardModule,
|
||||
NbButtonModule,
|
||||
NbInputModule,
|
||||
NbSelectModule,
|
||||
NbSpinnerModule,
|
||||
NbProgressBarModule,
|
||||
NbIconModule
|
||||
} from '@nebular/theme';
|
||||
import { ManualLookupComponent } from './manual-lookup/manual-lookup.component';
|
||||
import { ResultsHistoryComponent } from './results-history/results-history.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
ReactiveFormsModule,
|
||||
RouterModule.forChild([
|
||||
{
|
||||
path: 'manual-lookup',
|
||||
component: ManualLookupComponent,
|
||||
},
|
||||
{
|
||||
path: 'results-history',
|
||||
component: ResultsHistoryComponent,
|
||||
},
|
||||
]),
|
||||
NbCardModule,
|
||||
NbButtonModule,
|
||||
NbInputModule,
|
||||
NbSelectModule,
|
||||
NbSpinnerModule,
|
||||
NbProgressBarModule,
|
||||
NbIconModule
|
||||
],
|
||||
declarations: [
|
||||
ManualLookupComponent,
|
||||
ResultsHistoryComponent,
|
||||
],
|
||||
})
|
||||
export class IdentityModule { }
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
<div class="row">
|
||||
<div class="col-12 col-md-6">
|
||||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Identity Verification - Manual Lookup</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<form [formGroup]="identityForm" (ngSubmit)="onSubmit()">
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">First Name</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="firstName" placeholder="First Name">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Last Name</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="lastName" placeholder="Last Name">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Date of Birth</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="dateOfBirth" placeholder="YYYY-MM-DD">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Country</label>
|
||||
<div class="col-sm-8">
|
||||
<nb-select fullWidth formControlName="country" placeholder="Select Country">
|
||||
<nb-option value="aus">Australia</nb-option>
|
||||
<nb-option value="indo">Indonesia</nb-option>
|
||||
<nb-option value="japan">Japan</nb-option>
|
||||
<nb-option value="malay">Malaysia</nb-option>
|
||||
</nb-select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">ID Number</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="identificationNumber" placeholder="Identification Number">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Email</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="email" placeholder="Email">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Phone</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="phone" placeholder="Phone Number">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-4 col-form-label">Address</label>
|
||||
<div class="col-sm-8">
|
||||
<input nbInput fullWidth formControlName="address" placeholder="Address">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-3">
|
||||
<div class="col-12 text-center">
|
||||
<button nbButton status="primary" [disabled]="identityForm.invalid || isSubmitting">
|
||||
<nb-icon icon="search-outline"></nb-icon> Verify Identity
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-md-6" *ngIf="result">
|
||||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Verification Results</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<div class="match-result">
|
||||
<h6>Overall Match Confidence</h6>
|
||||
<nb-progress-bar [value]="result.overallMatch" status="primary" [displayValue]="true"></nb-progress-bar>
|
||||
</div>
|
||||
|
||||
<div class="field-matches mt-4">
|
||||
<h6>Field-level Match Breakdown</h6>
|
||||
|
||||
<div class="field-match-item">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Name</span>
|
||||
<span>{{ result.fieldMatches.name }}%</span>
|
||||
</div>
|
||||
<nb-progress-bar [value]="result.fieldMatches.name" size="tiny" status="success"></nb-progress-bar>
|
||||
</div>
|
||||
|
||||
<div class="field-match-item mt-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Date of Birth</span>
|
||||
<span>{{ result.fieldMatches.dateOfBirth }}%</span>
|
||||
</div>
|
||||
<nb-progress-bar [value]="result.fieldMatches.dateOfBirth" size="tiny" status="success"></nb-progress-bar>
|
||||
</div>
|
||||
|
||||
<div class="field-match-item mt-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Address</span>
|
||||
<span>{{ result.fieldMatches.address }}%</span>
|
||||
</div>
|
||||
<nb-progress-bar [value]="result.fieldMatches.address" size="tiny" status="warning"></nb-progress-bar>
|
||||
</div>
|
||||
|
||||
<div class="field-match-item mt-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>Identification</span>
|
||||
<span>{{ result.fieldMatches.identification }}%</span>
|
||||
</div>
|
||||
<nb-progress-bar [value]="result.fieldMatches.identification" size="tiny" status="info"></nb-progress-bar>
|
||||
</div>
|
||||
</div>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
.field-match-item {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.match-result {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
import { Component } from '@angular/core';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
|
||||
@Component({
|
||||
selector: 'ngx-manual-lookup',
|
||||
templateUrl: './manual-lookup.component.html',
|
||||
styleUrls: ['./manual-lookup.component.scss']
|
||||
})
|
||||
export class ManualLookupComponent {
|
||||
identityForm: FormGroup;
|
||||
isSubmitting = false;
|
||||
result = null;
|
||||
|
||||
constructor(private fb: FormBuilder) {
|
||||
this.identityForm = this.fb.group({
|
||||
firstName: ['', Validators.required],
|
||||
lastName: ['', Validators.required],
|
||||
dateOfBirth: ['', Validators.required],
|
||||
country: ['', Validators.required],
|
||||
identificationNumber: [''],
|
||||
email: ['', Validators.email],
|
||||
phone: [''],
|
||||
address: [''],
|
||||
});
|
||||
}
|
||||
|
||||
onSubmit() {
|
||||
if (this.identityForm.valid) {
|
||||
this.isSubmitting = true;
|
||||
// Here you would call your identity verification service
|
||||
setTimeout(() => {
|
||||
this.isSubmitting = false;
|
||||
this.result = {
|
||||
overallMatch: 85,
|
||||
fieldMatches: {
|
||||
name: 90,
|
||||
dateOfBirth: 100,
|
||||
address: 70,
|
||||
identification: 80
|
||||
}
|
||||
};
|
||||
}, 2000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
<nb-card>
|
||||
<nb-card-header>
|
||||
<h5>Verification Results History</h5>
|
||||
</nb-card-header>
|
||||
<nb-card-body>
|
||||
<div class="table-responsive">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Date/Time</th>
|
||||
<th>Country</th>
|
||||
<th>Match Score</th>
|
||||
<th>Status</th>
|
||||
<th>Actions</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let lookup of recentLookups">
|
||||
<td>{{ lookup.date }}</td>
|
||||
<td>{{ lookup.country }}</td>
|
||||
<td>
|
||||
<nb-progress-bar [value]="lookup.score" size="tiny" [status]="getStatusClass(lookup.status)" [displayValue]="true"></nb-progress-bar>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-{{ getStatusClass(lookup.status) }}">{{ lookup.status }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<button nbButton ghost size="small" status="info" title="View Details">
|
||||
<nb-icon icon="eye-outline"></nb-icon>
|
||||
</button>
|
||||
<button nbButton ghost size="small" status="primary" title="Download Report">
|
||||
<nb-icon icon="download-outline"></nb-icon>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</nb-card-body>
|
||||
</nb-card>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
button {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.badge {
|
||||
padding: 0.4rem 0.6rem;
|
||||
}
|
||||
|
||||
.badge-success {
|
||||
background-color: #00d68f;
|
||||
}
|
||||
|
||||
.badge-warning {
|
||||
background-color: #ffaa00;
|
||||
}
|
||||
|
||||
.badge-danger {
|
||||
background-color: #ff3d71;
|
||||
}
|
||||
|
||||
.badge-info {
|
||||
background-color: #0095ff;
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'ngx-results-history',
|
||||
templateUrl: './results-history.component.html',
|
||||
styleUrls: ['./results-history.component.scss']
|
||||
})
|
||||
export class ResultsHistoryComponent implements OnInit {
|
||||
|
||||
// Sample data for demonstration
|
||||
recentLookups = [
|
||||
{ date: '2025-05-19 10:30', country: 'Australia', score: 95, status: 'Verified' },
|
||||
{ date: '2025-05-19 09:15', country: 'Indonesia', score: 82, status: 'Verified' },
|
||||
{ date: '2025-05-18 16:45', country: 'Malaysia', score: 60, status: 'Partial Match' },
|
||||
{ date: '2025-05-18 14:20', country: 'Japan', score: 42, status: 'No Match' },
|
||||
{ date: '2025-05-17 11:30', country: 'Australia', score: 88, status: 'Verified' },
|
||||
{ date: '2025-05-17 09:45', country: 'Indonesia', score: 76, status: 'Verified' },
|
||||
];
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit(): void {
|
||||
}
|
||||
|
||||
getStatusClass(status: string): string {
|
||||
switch (status) {
|
||||
case 'Verified':
|
||||
return 'success';
|
||||
case 'Partial Match':
|
||||
return 'warning';
|
||||
case 'No Match':
|
||||
return 'danger';
|
||||
default:
|
||||
return 'info';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -21,5 +21,4 @@ const routes: Routes = [
|
|||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule],
|
||||
})
|
||||
export class MiscellaneousRoutingModule {
|
||||
}
|
||||
export class MiscellaneousRoutingModule { }
|
||||
|
|
@ -2,9 +2,7 @@ import { Component } from '@angular/core';
|
|||
|
||||
@Component({
|
||||
selector: 'ngx-miscellaneous',
|
||||
template: `
|
||||
<router-outlet></router-outlet>
|
||||
`,
|
||||
template: `<router-outlet></router-outlet>`,
|
||||
})
|
||||
export class MiscellaneousComponent {
|
||||
}
|
||||
|
|
@ -1,16 +1,19 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { NbButtonModule, NbCardModule } from '@nebular/theme';
|
||||
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { ThemeModule } from '../../@theme/theme.module';
|
||||
import { NbCardModule, NbButtonModule, NbIconModule } from '@nebular/theme';
|
||||
|
||||
import { MiscellaneousRoutingModule } from './miscellaneous-routing.module';
|
||||
import { MiscellaneousComponent } from './miscellaneous.component';
|
||||
import { NotFoundComponent } from './not-found/not-found.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
ThemeModule,
|
||||
NbCardModule,
|
||||
NbButtonModule,
|
||||
NbIconModule,
|
||||
MiscellaneousRoutingModule,
|
||||
],
|
||||
declarations: [
|
||||
|
|
|
|||
|
|
@ -2,245 +2,41 @@ import { NbMenuItem } from '@nebular/theme';
|
|||
|
||||
export const MENU_ITEMS: NbMenuItem[] = [
|
||||
{
|
||||
title: 'E-commerce',
|
||||
icon: 'shopping-cart-outline',
|
||||
title: 'Dashboard',
|
||||
icon: 'home-outline',
|
||||
link: '/pages/dashboard',
|
||||
home: true,
|
||||
},
|
||||
{
|
||||
title: 'IoT Dashboard',
|
||||
icon: 'home-outline',
|
||||
link: '/pages/iot-dashboard',
|
||||
},
|
||||
{
|
||||
title: 'FEATURES',
|
||||
group: true,
|
||||
},
|
||||
{
|
||||
title: 'Layout',
|
||||
icon: 'layout-outline',
|
||||
title: 'Identity Verification',
|
||||
icon: 'person-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Stepper',
|
||||
link: '/pages/layout/stepper',
|
||||
title: 'Manual Lookup',
|
||||
link: '/pages/identity/manual-lookup',
|
||||
},
|
||||
{
|
||||
title: 'List',
|
||||
link: '/pages/layout/list',
|
||||
},
|
||||
{
|
||||
title: 'Infinite List',
|
||||
link: '/pages/layout/infinite-list',
|
||||
},
|
||||
{
|
||||
title: 'Accordion',
|
||||
link: '/pages/layout/accordion',
|
||||
},
|
||||
{
|
||||
title: 'Tabs',
|
||||
pathMatch: 'prefix',
|
||||
link: '/pages/layout/tabs',
|
||||
title: 'Results History',
|
||||
link: '/pages/identity/results-history',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Forms',
|
||||
icon: 'edit-2-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Form Inputs',
|
||||
link: '/pages/forms/inputs',
|
||||
},
|
||||
{
|
||||
title: 'Form Layouts',
|
||||
link: '/pages/forms/layouts',
|
||||
},
|
||||
{
|
||||
title: 'Buttons',
|
||||
link: '/pages/forms/buttons',
|
||||
},
|
||||
{
|
||||
title: 'Datepicker',
|
||||
link: '/pages/forms/datepicker',
|
||||
},
|
||||
],
|
||||
title: 'Countries',
|
||||
icon: 'globe-outline',
|
||||
link: '/pages/countries',
|
||||
},
|
||||
{
|
||||
title: 'UI Features',
|
||||
icon: 'keypad-outline',
|
||||
link: '/pages/ui-features',
|
||||
title: 'Account',
|
||||
icon: 'settings-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Grid',
|
||||
link: '/pages/ui-features/grid',
|
||||
title: 'Profile',
|
||||
link: '/pages/account/profile',
|
||||
},
|
||||
{
|
||||
title: 'Icons',
|
||||
link: '/pages/ui-features/icons',
|
||||
},
|
||||
{
|
||||
title: 'Typography',
|
||||
link: '/pages/ui-features/typography',
|
||||
},
|
||||
{
|
||||
title: 'Animated Searches',
|
||||
link: '/pages/ui-features/search-fields',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Modal & Overlays',
|
||||
icon: 'browser-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Dialog',
|
||||
link: '/pages/modal-overlays/dialog',
|
||||
},
|
||||
{
|
||||
title: 'Window',
|
||||
link: '/pages/modal-overlays/window',
|
||||
},
|
||||
{
|
||||
title: 'Popover',
|
||||
link: '/pages/modal-overlays/popover',
|
||||
},
|
||||
{
|
||||
title: 'Toastr',
|
||||
link: '/pages/modal-overlays/toastr',
|
||||
},
|
||||
{
|
||||
title: 'Tooltip',
|
||||
link: '/pages/modal-overlays/tooltip',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Extra Components',
|
||||
icon: 'message-circle-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Calendar',
|
||||
link: '/pages/extra-components/calendar',
|
||||
},
|
||||
{
|
||||
title: 'Progress Bar',
|
||||
link: '/pages/extra-components/progress-bar',
|
||||
},
|
||||
{
|
||||
title: 'Spinner',
|
||||
link: '/pages/extra-components/spinner',
|
||||
},
|
||||
{
|
||||
title: 'Alert',
|
||||
link: '/pages/extra-components/alert',
|
||||
},
|
||||
{
|
||||
title: 'Calendar Kit',
|
||||
link: '/pages/extra-components/calendar-kit',
|
||||
},
|
||||
{
|
||||
title: 'Chat',
|
||||
link: '/pages/extra-components/chat',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Maps',
|
||||
icon: 'map-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Google Maps',
|
||||
link: '/pages/maps/gmaps',
|
||||
},
|
||||
{
|
||||
title: 'Leaflet Maps',
|
||||
link: '/pages/maps/leaflet',
|
||||
},
|
||||
{
|
||||
title: 'Bubble Maps',
|
||||
link: '/pages/maps/bubble',
|
||||
},
|
||||
{
|
||||
title: 'Search Maps',
|
||||
link: '/pages/maps/searchmap',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Charts',
|
||||
icon: 'pie-chart-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Echarts',
|
||||
link: '/pages/charts/echarts',
|
||||
},
|
||||
{
|
||||
title: 'Charts.js',
|
||||
link: '/pages/charts/chartjs',
|
||||
},
|
||||
{
|
||||
title: 'D3',
|
||||
link: '/pages/charts/d3',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Editors',
|
||||
icon: 'text-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'TinyMCE',
|
||||
link: '/pages/editors/tinymce',
|
||||
},
|
||||
{
|
||||
title: 'CKEditor',
|
||||
link: '/pages/editors/ckeditor',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Tables & Data',
|
||||
icon: 'grid-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Smart Table',
|
||||
link: '/pages/tables/smart-table',
|
||||
},
|
||||
{
|
||||
title: 'Tree Grid',
|
||||
link: '/pages/tables/tree-grid',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Miscellaneous',
|
||||
icon: 'shuffle-2-outline',
|
||||
children: [
|
||||
{
|
||||
title: '404',
|
||||
link: '/pages/miscellaneous/404',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Auth',
|
||||
icon: 'lock-outline',
|
||||
children: [
|
||||
{
|
||||
title: 'Login',
|
||||
link: '/auth/login',
|
||||
},
|
||||
{
|
||||
title: 'Register',
|
||||
link: '/auth/register',
|
||||
},
|
||||
{
|
||||
title: 'Request Password',
|
||||
link: '/auth/request-password',
|
||||
},
|
||||
{
|
||||
title: 'Reset Password',
|
||||
link: '/auth/reset-password',
|
||||
title: 'Settings',
|
||||
link: '/pages/account/settings',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import { NgModule } from '@angular/core';
|
|||
|
||||
import { PagesComponent } from './pages.component';
|
||||
import { DashboardComponent } from './dashboard/dashboard.component';
|
||||
import { ECommerceComponent } from './e-commerce/e-commerce.component';
|
||||
import { NotFoundComponent } from './miscellaneous/not-found/not-found.component';
|
||||
|
||||
const routes: Routes = [{
|
||||
|
|
@ -12,61 +11,22 @@ const routes: Routes = [{
|
|||
children: [
|
||||
{
|
||||
path: 'dashboard',
|
||||
component: ECommerceComponent,
|
||||
},
|
||||
{
|
||||
path: 'iot-dashboard',
|
||||
component: DashboardComponent,
|
||||
},
|
||||
{
|
||||
path: 'layout',
|
||||
loadChildren: () => import('./layout/layout.module')
|
||||
.then(m => m.LayoutModule),
|
||||
path: 'identity',
|
||||
loadChildren: () => import('./identity/identity.module')
|
||||
.then(m => m.IdentityModule),
|
||||
},
|
||||
{
|
||||
path: 'forms',
|
||||
loadChildren: () => import('./forms/forms.module')
|
||||
.then(m => m.FormsModule),
|
||||
path: 'countries',
|
||||
loadChildren: () => import('./countries/countries.module')
|
||||
.then(m => m.CountriesModule),
|
||||
},
|
||||
{
|
||||
path: 'ui-features',
|
||||
loadChildren: () => import('./ui-features/ui-features.module')
|
||||
.then(m => m.UiFeaturesModule),
|
||||
},
|
||||
{
|
||||
path: 'modal-overlays',
|
||||
loadChildren: () => import('./modal-overlays/modal-overlays.module')
|
||||
.then(m => m.ModalOverlaysModule),
|
||||
},
|
||||
{
|
||||
path: 'extra-components',
|
||||
loadChildren: () => import('./extra-components/extra-components.module')
|
||||
.then(m => m.ExtraComponentsModule),
|
||||
},
|
||||
{
|
||||
path: 'maps',
|
||||
loadChildren: () => import('./maps/maps.module')
|
||||
.then(m => m.MapsModule),
|
||||
},
|
||||
{
|
||||
path: 'charts',
|
||||
loadChildren: () => import('./charts/charts.module')
|
||||
.then(m => m.ChartsModule),
|
||||
},
|
||||
{
|
||||
path: 'editors',
|
||||
loadChildren: () => import('./editors/editors.module')
|
||||
.then(m => m.EditorsModule),
|
||||
},
|
||||
{
|
||||
path: 'tables',
|
||||
loadChildren: () => import('./tables/tables.module')
|
||||
.then(m => m.TablesModule),
|
||||
},
|
||||
{
|
||||
path: 'miscellaneous',
|
||||
loadChildren: () => import('./miscellaneous/miscellaneous.module')
|
||||
.then(m => m.MiscellaneousModule),
|
||||
path: 'account',
|
||||
loadChildren: () => import('./account/account.module')
|
||||
.then(m => m.AccountModule),
|
||||
},
|
||||
{
|
||||
path: '',
|
||||
|
|
|
|||
|
|
@ -4,9 +4,8 @@ import { NbMenuModule } from '@nebular/theme';
|
|||
import { ThemeModule } from '../@theme/theme.module';
|
||||
import { PagesComponent } from './pages.component';
|
||||
import { DashboardModule } from './dashboard/dashboard.module';
|
||||
import { ECommerceModule } from './e-commerce/e-commerce.module';
|
||||
import { PagesRoutingModule } from './pages-routing.module';
|
||||
import { MiscellaneousModule } from './miscellaneous/miscellaneous.module';
|
||||
import { PagesRoutingModule } from './pages-routing.module';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
|
|
@ -14,7 +13,6 @@ import { MiscellaneousModule } from './miscellaneous/miscellaneous.module';
|
|||
ThemeModule,
|
||||
NbMenuModule,
|
||||
DashboardModule,
|
||||
ECommerceModule,
|
||||
MiscellaneousModule,
|
||||
],
|
||||
declarations: [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue