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
+53 -56
View File
@@ -62,8 +62,8 @@ $accent-2: #10b981;
flex-direction: column;
padding: 3px 40px;
background: #f8f9fa;
border-top: 1px solid rgba(0, 0, 0, 0.06);
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
border-top: 1px solid rgb(0 0 0 / 6%);
border-bottom: 1px solid rgb(0 0 0 / 6%);
margin-top: 0;
}
@@ -91,7 +91,7 @@ $accent-2: #10b981;
align-items: center;
gap: 10px;
padding-right: 20px;
border-right: 1px solid rgba(0, 0, 0, 0.1);
border-right: 1px solid rgb(0 0 0 / 10%);
margin-right: 0;
}
@@ -116,7 +116,7 @@ $accent-2: #10b981;
.sec-brand-delimiter {
font-size: 12px;
color: rgba(0, 0, 0, 0.2);
color: rgb(0 0 0 / 20%);
margin: 0 6px;
font-weight: 300;
}
@@ -200,7 +200,7 @@ $accent-2: #10b981;
.ls-label {
font-size: 11px;
font-weight: 700;
color: rgba(255, 255, 255, 0.5);
color: rgb(255 255 255 / 50%);
text-transform: uppercase;
letter-spacing: 0.8px;
white-space: nowrap;
@@ -222,34 +222,34 @@ $accent-2: #10b981;
white-space: nowrap;
&.green {
background: rgba(16, 185, 129, 0.15);
background: rgb(16 185 129 / 15%);
color: #6ee7b7;
border: 1px solid rgba(16, 185, 129, 0.3);
border: 1px solid rgb(16 185 129 / 30%);
}
&.blue {
background: rgba(14, 165, 233, 0.15);
background: rgb(14 165 233 / 15%);
color: #7dd3fc;
border: 1px solid rgba(14, 165, 233, 0.3);
border: 1px solid rgb(14 165 233 / 30%);
}
&.gold {
background: rgba(245, 158, 11, 0.15);
background: rgb(245 158 11 / 15%);
color: #fcd34d;
border: 1px solid rgba(245, 158, 11, 0.3);
border: 1px solid rgb(245 158 11 / 30%);
}
&.white {
background: rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.75);
border: 1px solid rgba(255, 255, 255, 0.15);
background: rgb(255 255 255 / 8%);
color: rgb(255 255 255 / 75%);
border: 1px solid rgb(255 255 255 / 15%);
}
}
// ===== Default Mode (Shell Footer) =====
.app-footer {
background: $brand-dark;
color: rgba(255, 255, 255, 0.85);
color: rgb(255 255 255 / 85%);
padding: 0;
margin-top: 0;
position: relative;
@@ -258,10 +258,7 @@ $accent-2: #10b981;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
inset: 0;
background: repeating-linear-gradient(
108deg, transparent 0, transparent 80px,
rgb(255 255 255 / 2.2%) 80px, rgb(255 255 255 / 2.2%) 160px
@@ -323,7 +320,7 @@ $accent-2: #10b981;
.footer-tagline {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
color: rgb(255 255 255 / 50%);
line-height: 1.5;
margin: 0;
}
@@ -355,13 +352,13 @@ $accent-2: #10b981;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.45);
color: rgb(255 255 255 / 45%);
margin: 0 0 2px;
}
.footer-link {
font-size: 12px;
color: rgba(255, 255, 255, 0.75);
color: rgb(255 255 255 / 75%);
text-decoration: none;
transition: color 0.15s;
line-height: 1.5;
@@ -383,7 +380,7 @@ $accent-2: #10b981;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.45);
color: rgb(255 255 255 / 45%);
margin: 0 0 2px;
}
@@ -398,13 +395,13 @@ $accent-2: #10b981;
align-items: center;
gap: 6px;
padding: 4px 10px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgb(255 255 255 / 4%);
border: 1px solid rgb(255 255 255 / 8%);
border-radius: 5px;
transition: background 0.15s;
&:hover {
background: rgba(255, 255, 255, 0.08);
background: rgb(255 255 255 / 8%);
}
}
@@ -421,13 +418,13 @@ $accent-2: #10b981;
.reg-label {
font-size: 11px;
color: rgba(255, 255, 255, 0.75);
color: rgb(255 255 255 / 75%);
font-weight: 500;
}
.reg-link {
font-size: 11px;
color: rgba(255, 255, 255, 0.75);
color: rgb(255 255 255 / 75%);
text-decoration: none;
font-weight: 500;
transition: color 0.15s;
@@ -447,21 +444,21 @@ $accent-2: #10b981;
flex-shrink: 0;
&.rbi {
background: rgba(14, 165, 233, 0.2);
background: rgb(14 165 233 / 20%);
color: #7dd3fc;
border: 1px solid rgba(14, 165, 233, 0.3);
border: 1px solid rgb(14 165 233 / 30%);
}
&.circular {
background: rgba(245, 158, 11, 0.15);
background: rgb(245 158 11 / 15%);
color: #fcd34d;
border: 1px solid rgba(245, 158, 11, 0.3);
border: 1px solid rgb(245 158 11 / 30%);
}
&.mandatory {
background: rgba(239, 68, 68, 0.15);
background: rgb(239 68 68 / 15%);
color: #fca5a5;
border: 1px solid rgba(239, 68, 68, 0.3);
border: 1px solid rgb(239 68 68 / 30%);
}
}
@@ -477,7 +474,7 @@ $accent-2: #10b981;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.45);
color: rgb(255 255 255 / 45%);
margin: 0 0 4px;
}
@@ -492,14 +489,14 @@ $accent-2: #10b981;
align-items: center;
gap: 6px;
padding: 4px 12px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgb(255 255 255 / 4%);
border: 1px solid rgb(255 255 255 / 8%);
border-radius: 6px;
text-decoration: none;
transition: background 0.15s;
&:hover {
background: rgba(255, 255, 255, 0.1);
background: rgb(255 255 255 / 10%);
.qn-label {
color: #5ec9f8;
@@ -515,7 +512,7 @@ $accent-2: #10b981;
.qn-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
color: rgb(255 255 255 / 80%);
font-weight: 500;
transition: color 0.15s;
}
@@ -527,9 +524,9 @@ $accent-2: #10b981;
border-radius: 3px;
letter-spacing: 0.5px;
text-transform: uppercase;
background: rgba(14, 165, 233, 0.2);
background: rgb(14 165 233 / 20%);
color: #7dd3fc;
border: 1px solid rgba(14, 165, 233, 0.3);
border: 1px solid rgb(14 165 233 / 30%);
flex-shrink: 0;
}
@@ -545,7 +542,7 @@ $accent-2: #10b981;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.8px;
color: rgba(255, 255, 255, 0.45);
color: rgb(255 255 255 / 45%);
margin: 0 0 4px;
}
@@ -561,14 +558,14 @@ $accent-2: #10b981;
align-items: center;
gap: 6px;
padding: 5px 12px;
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
background: rgb(255 255 255 / 4%);
border: 1px solid rgb(255 255 255 / 8%);
border-radius: 5px;
transition: background 0.15s;
white-space: nowrap;
&:hover {
background: rgba(255, 255, 255, 0.08);
background: rgb(255 255 255 / 8%);
}
&.sc-chat {
@@ -594,13 +591,13 @@ $accent-2: #10b981;
.sc-label {
font-size: 10px;
color: rgba(255, 255, 255, 0.45);
color: rgb(255 255 255 / 45%);
font-weight: 500;
}
.sc-val {
font-size: 11px;
color: rgba(255, 255, 255, 0.85);
color: rgb(255 255 255 / 85%);
font-weight: 600;
&.highlight {
@@ -611,7 +608,7 @@ $accent-2: #10b981;
// ── Divider ──
.footer-divider {
height: 1px;
background: rgba(255, 255, 255, 0.1);
background: rgb(255 255 255 / 10%);
margin: 0 40px;
position: relative;
z-index: 1;
@@ -630,7 +627,7 @@ $accent-2: #10b981;
.fb-copy {
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
color: rgb(255 255 255 / 40%);
white-space: nowrap;
}
@@ -641,7 +638,7 @@ $accent-2: #10b981;
a {
font-size: 11px;
color: rgba(255, 255, 255, 0.5);
color: rgb(255 255 255 / 50%);
text-decoration: none;
padding: 2px 6px;
border-radius: 3px;
@@ -649,7 +646,7 @@ $accent-2: #10b981;
&:hover {
color: #5ec9f8;
background: rgba(255, 255, 255, 0.06);
background: rgb(255 255 255 / 6%);
}
}
}
@@ -659,18 +656,18 @@ $accent-2: #10b981;
align-items: center;
gap: 4px;
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
color: rgb(255 255 255 / 35%);
margin-left: auto;
strong {
color: rgba(255, 255, 255, 0.55);
color: rgb(255 255 255 / 55%);
font-weight: 600;
}
}
.fb-powered {
font-size: 10px;
color: rgba(255, 255, 255, 0.35);
color: rgb(255 255 255 / 35%);
strong {
color: #5ec9f8;
@@ -679,7 +676,7 @@ $accent-2: #10b981;
}
// ===== Responsive =====
@media (max-width: 768px) {
@media (width <= 768px) {
.security-bar {
flex-direction: column;
gap: 8px;
@@ -747,7 +744,7 @@ $accent-2: #10b981;
}
}
@media (max-width: 480px) {
@media (width <= 480px) {
.footer-compact {
font-size: 0.7rem;
@@ -175,7 +175,7 @@ $white: #fff;
}
// Responsive
@media (max-width: 600px) {
@media (width <= 600px) {
.fd-grid--cols-2,
.fd-grid--cols-3 {
grid-template-columns: 1fr;
+32 -2
View File
@@ -173,7 +173,22 @@ import {
faCalendarTimes,
faStar,
faCrop,
faStamp
faStamp,
faSpinner,
faPhone,
faHashtag,
faMapMarkerAlt,
faHourglassHalf,
faCheckSquare,
faCheckDouble,
faClipboardCheck,
faFileArchive,
faSyncAlt,
faIdCardAlt,
faCube,
faLongArrowAltRight,
faStream,
faThLarge
} from '@fortawesome/free-solid-svg-icons';
/**
@@ -353,7 +368,22 @@ export class IconsModule {
faCalendarTimes,
faStar,
faCrop,
faStamp
faStamp,
faSpinner,
faPhone,
faHashtag,
faMapMarkerAlt,
faHourglassHalf,
faCheckSquare,
faCheckDouble,
faClipboardCheck,
faFileArchive,
faSyncAlt,
faIdCardAlt,
faCube,
faLongArrowAltRight,
faStream,
faThLarge
);
}
}
+65
View File
@@ -229,6 +229,60 @@ $mono: 'Roboto Mono', 'DM Mono', monospace;
flex-wrap: wrap;
}
.table-header-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
}
.table-filters {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
padding: 10px 12px;
background: #f8fafc;
border: 1px solid $border;
border-radius: 10px;
.table-search {
margin: 0;
}
}
.table-filter {
min-width: 150px;
max-width: 180px;
margin: 0;
::ng-deep {
.mat-mdc-form-field-flex {
height: 38px;
background: #fff;
}
.mat-mdc-form-field-infix {
padding: 6px 0;
min-height: 38px;
}
.mdc-notched-outline__leading {
border-radius: 8px 0 0 8px;
}
.mdc-notched-outline__trailing {
border-radius: 0 8px 8px 0;
}
.mat-mdc-select-value,
.mat-mdc-select-placeholder {
font-size: 13px;
}
}
}
.table-search {
flex: 1;
min-width: 200px;
@@ -268,6 +322,8 @@ $mono: 'Roboto Mono', 'DM Mono', monospace;
.table-checkbox {
flex-shrink: 0;
font-size: 13px;
margin-left: auto;
white-space: nowrap;
}
.table-buttons {
@@ -484,6 +540,15 @@ $mono: 'Roboto Mono', 'DM Mono', monospace;
}
}
.row-ckyc-icon {
font-size: 16px;
width: 16px;
height: 16px;
vertical-align: middle;
margin-left: 6px;
color: #16a34a;
}
.legal-form-badge {
display: inline-flex;
align-items: center;