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:
co-authored by
Claude Opus 4.6
parent
79e455c4ed
commit
d72e969dc3
@@ -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;
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user