feat: Client & CKYC UI improvements — filters, KYC management, image crop+merge

- Clients list: CKYC icon, CKYC Number column, status/legal form/CKYC filters
- CKYC: SFTP upload logs, date formatting, modal z-index fix, non-dismissible dialogs
- KYC Management: new standalone module with alert dashboard, notification scheduler, audit inventory, account status
- Image cropper: ngx-image-cropper integration for front+back document merge into single PNG
- Sidebar: KYC Management menu entry after CKYC

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-04-16 13:51:11 +05:30
co-authored by Claude Opus 4.6
parent 79e455c4ed
commit d72e969dc3
210 changed files with 14273 additions and 1139 deletions
@@ -14,11 +14,13 @@
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.subtitle {
margin: 4px 0 0;
color: #666;
@@ -73,9 +75,11 @@
.result-card {
border-left: 4px solid #ccc;
}
.result-flagged {
border-left-color: #ef4444;
}
.result-clear {
border-left-color: #10b981;
}
@@ -83,6 +87,7 @@
.warn-icon {
color: #ef4444;
}
.clear-icon {
color: #10b981;
}
@@ -100,9 +105,11 @@
color: #666;
font-weight: 500;
}
.info-value {
font-weight: 600;
}
.ml-24 {
margin-left: 24px;
}
@@ -110,9 +117,11 @@
.full-width {
width: 100%;
}
.mr-05 {
margin-right: 0.5rem;
}
.mono {
font-family: 'Roboto Mono', monospace;
}
@@ -152,6 +161,7 @@
font-size: 13px;
color: #7f1d1d;
border-bottom: 1px solid #fee2e2;
&:last-child {
border-bottom: none;
}
@@ -162,6 +172,7 @@
text-align: center;
padding: 24px;
color: #065f46;
p {
margin-top: 12px;
font-size: 15px;
@@ -54,7 +54,7 @@
gap: 24px;
align-items: start;
@media (max-width: 1280px) {
@media (width <= 1280px) {
grid-template-columns: 1fr;
}
}
@@ -58,9 +58,11 @@
&.pending {
background: #f59e0b;
}
&.active {
background: #1e88e5;
}
&.resolved {
background: #10b981;
}
@@ -35,7 +35,7 @@
gap: 20px;
margin-bottom: 24px;
@media (max-width: 1280px) {
@media (width <= 1280px) {
grid-template-columns: repeat(2, 1fr);
}
}
@@ -80,36 +80,47 @@
&.stat-total {
border-color: #1e88e5;
.stat-icon {
background: #1e88e5;
}
.stat-value {
color: #1e88e5;
}
}
&.stat-pending {
border-color: #f59e0b;
.stat-icon {
background: #f59e0b;
}
.stat-value {
color: #f59e0b;
}
}
&.stat-lien {
border-color: #eab308;
.stat-icon {
background: #eab308;
}
.stat-value {
color: #92400e;
}
}
&.stat-recovered {
border-color: #10b981;
.stat-icon {
background: #10b981;
}
.stat-value {
color: #10b981;
}
@@ -122,7 +133,7 @@
gap: 20px;
margin-bottom: 24px;
@media (max-width: 1280px) {
@media (width <= 1280px) {
grid-template-columns: 1fr;
}
}
@@ -35,7 +35,7 @@
gap: 24px;
align-items: start;
@media (max-width: 1280px) {
@media (width <= 1280px) {
grid-template-columns: 1fr;
}
}
@@ -11,70 +11,88 @@
max-width: 1200px;
margin: 0 auto;
}
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.subtitle {
margin: 4px 0 0;
color: #666;
font-size: 14px;
}
}
.report-layout {
display: flex;
gap: 24px;
}
.report-card {
flex: 1;
max-width: 700px;
}
.wide-card {
max-width: 900px;
}
.full-width {
width: 100%;
}
.half-width {
flex: 1;
}
.form-row {
display: flex;
gap: 16px;
}
.mr-05 {
margin-right: 0.5rem;
}
.mt-16 {
margin-top: 16px;
}
.submit-btn {
margin-top: 8px;
height: 48px;
font-size: 16px;
}
.inline-spinner {
display: inline-block;
margin-right: 8px;
}
.checkbox-row {
margin: 8px 0 16px;
}
.success-result {
text-align: center;
padding: 32px 16px;
.success-icon {
color: #10b981;
margin-bottom: 16px;
}
h3 {
color: #10b981;
margin-bottom: 24px;
}
}
.result-details {
text-align: left;
max-width: 500px;
@@ -83,25 +101,31 @@
border-radius: 8px;
padding: 16px;
}
.result-row {
display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;
&:last-child {
border-bottom: none;
}
}
.result-label {
color: #666;
font-weight: 500;
}
.result-value {
font-weight: 600;
}
.mono {
font-family: 'Roboto Mono', monospace;
}
.status-submitted {
color: #1e88e5;
font-weight: 700;
@@ -14,11 +14,13 @@
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.subtitle {
margin: 4px 0 0;
color: #666;
@@ -43,6 +45,7 @@
.mr-05 {
margin-right: 0.5rem;
}
.mt-16 {
margin-top: 16px;
}
@@ -61,10 +64,12 @@
.success-result {
text-align: center;
padding: 32px 16px;
.success-icon {
color: #10b981;
margin-bottom: 16px;
}
h3 {
color: #10b981;
margin-bottom: 24px;
@@ -85,6 +90,7 @@
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;
&:last-child {
border-bottom: none;
}
@@ -94,9 +100,11 @@
color: #666;
font-weight: 500;
}
.result-value {
font-weight: 600;
}
.mono {
font-family: 'Roboto Mono', monospace;
}
@@ -14,11 +14,13 @@
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.subtitle {
margin: 4px 0 0;
color: #666;
@@ -43,6 +45,7 @@
.mr-05 {
margin-right: 0.5rem;
}
.mt-16 {
margin-top: 16px;
}
@@ -61,10 +64,12 @@
.success-result {
text-align: center;
padding: 32px 16px;
.success-icon {
color: #10b981;
margin-bottom: 16px;
}
h3 {
color: #10b981;
margin-bottom: 24px;
@@ -85,6 +90,7 @@
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;
&:last-child {
border-bottom: none;
}
@@ -94,12 +100,15 @@
color: #666;
font-weight: 500;
}
.result-value {
font-weight: 600;
}
.mono {
font-family: 'Roboto Mono', monospace;
}
.status-flagged {
color: #ef4444;
font-weight: 700;
@@ -14,11 +14,13 @@
.page-header {
margin-bottom: 24px;
h2 {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.subtitle {
margin: 4px 0 0;
color: #666;
@@ -43,6 +45,7 @@
.mr-05 {
margin-right: 0.5rem;
}
.mt-16 {
margin-top: 16px;
}
@@ -61,10 +64,12 @@
.success-result {
text-align: center;
padding: 32px 16px;
.success-icon {
color: #10b981;
margin-bottom: 16px;
}
h3 {
color: #10b981;
margin-bottom: 24px;
@@ -85,6 +90,7 @@
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid #eee;
&:last-child {
border-bottom: none;
}
@@ -94,9 +100,11 @@
color: #666;
font-weight: 500;
}
.result-value {
font-weight: 600;
}
.mono {
font-family: 'Roboto Mono', monospace;
}