Files
cbsnexora/src/app/letter-mgmt/notice/call-contact-dialog/call-contact-dialog.component.scss
T
AdityaandClaude Opus 4.7 325228c514 feat: letter-mgmt module + digital UPI/IMPS/ATM-POS reports + header redesign
letter-mgmt (new module):
- Notice page: overdue loan list with filters, KPI strip, bulk actions,
  call disposition logging (Promise-to-Pay, Not Reachable, etc.), Speed
  Post dispatch dialog with consignment + post-office tracking,
  PDF preview + download, call-contact dialog with primary / alt /
  family / nominee numbers and per-contact disposition history.
- Certificates: Loan Interest, Share, Balance, Form 60 (no-PAN flow),
  Form 15G/H (auto age-based), Hypothecation, NOC - each with shared
  preview dialog (six tone variants) and jsPDF generator using a
  common letterhead / summary-grid / signature-seal helper.

digital:
- IMPS module: report (P2A/P2P/Aadhaar tabs) + entry form with
  MMID/mobile lookup, NPCI switch resolve-to-A/C+IFSC BANL flow,
  sender autocomplete, hide sender field for P2P/Aadhaar, charges +
  18% GST + waive checkbox, per-sender today-only history dialog.
- UPI report with app-mix tab and full transaction filtering.
- ATM/POS/ECOM hub with three ticket cards routing to today/status/cycle.
- NEFT/RTGS entry: sender-account autocomplete, charges + GST + waive,
  field reorder (sender before amount), NEFT cap / RTGS floor
  validation, History button opening per-sender today's transactions.
- NEFT/RTGS report: horizontal-bar trend leaderboard replacing tall bars.

shell + theme:
- Header redesigned with IBM Plex Sans 12/500 typography, 11-column grid
  per row, top-accent hover indicator, bordered cells via grid-gap.
- Live KPI ticker below menu (CASH, TXN TODAY, CLEARING IN/OUT, NPA,
  CASA, CD RATIO, RBI CIRC, REPO) with marquee scroll, pause-on-hover,
  brand-blue gradient, amber bottom strip, pulsing red LIVE chip.
- Sidebar 'KYC Management' -> 'KYC & ReKYC Management'.
- Letter Mgmt / certificate menu items wired with green icon hints for
  items that have a working page.

access-control:
- MFA card layout compacted; method header inlines back button + title.

icons:
- Register faTruck/TruckFast, faEllipsisV/H, faCommentDots.
- Add IBM Plex Sans Google Fonts import to index.html.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 10:09:06 +05:30

766 lines
13 KiB
SCSS

/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
:host {
--ccd-blue: #1d4ed8;
--ccd-blue-d: #1e40af;
--ccd-blue-l: #eff6ff;
--ccd-blue-tint: #dbeafe;
--ccd-teal: #0d9488;
--ccd-teal-l: #ccfbf1;
--ccd-amber: #d97706;
--ccd-amber-l: #fef3c7;
--ccd-red: #b91c1c;
--ccd-red-l: #fee2e2;
--ccd-red-tint: #fecaca;
--ccd-green: #15803d;
--ccd-green-l: #dcfce7;
--ccd-purple: #6d28d9;
--ccd-purple-l: #ede9fe;
--ccd-g50: #f8fafc;
--ccd-g100: #f1f5f9;
--ccd-g200: #e2e8f0;
--ccd-g300: #cbd5e1;
--ccd-g500: #64748b;
--ccd-g700: #334155;
--ccd-g900: #0f172a;
display: block;
}
.ccd-root {
background: #fff;
padding: 14px 18px 18px;
width: 100%;
max-height: 86vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* ───────── Header ───────── */
.ccd-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
padding-bottom: 12px;
margin-bottom: 12px;
border-bottom: 1px solid var(--ccd-g200);
}
.ccd-head-l {
display: flex;
align-items: center;
gap: 12px;
}
.ccd-head-ic {
width: 38px;
height: 38px;
flex-shrink: 0;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 12px;
background: var(--ccd-green);
color: #fff;
font-size: 15px;
}
.ccd-head-t {
margin: 0;
font-size: 16px;
font-weight: 800;
color: var(--ccd-g900);
line-height: 1.2;
}
.ccd-head-s {
margin-top: 3px;
font-size: 11.5px;
color: var(--ccd-g500);
}
.ccd-x {
width: 32px;
height: 32px;
border-radius: 999px;
border: 1px solid var(--ccd-g200);
background: #fff;
color: var(--ccd-g500);
cursor: pointer;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 13px;
flex-shrink: 0;
transition: all 0.12s ease;
&:hover {
background: var(--ccd-red-l);
color: var(--ccd-red);
border-color: var(--ccd-red-tint);
}
}
.mono {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
/* ───────── Body ───────── */
.ccd-body {
flex: 1;
display: flex;
flex-direction: column;
gap: 8px;
overflow-y: auto;
padding-right: 2px;
}
/* ───────── Contact row ───────── */
.ccd-row {
position: relative;
display: grid;
grid-template-columns: 44px 1fr auto;
align-items: center;
gap: 12px;
padding: 12px 14px 12px 18px;
background: #fff;
border: 1px solid var(--ccd-g200);
border-radius: 12px;
transition:
border-color 0.15s ease,
box-shadow 0.15s ease;
overflow: hidden;
&:hover {
border-color: var(--ccd-blue-tint);
box-shadow: 0 4px 14px -8px rgb(15 23 42 / 18%);
}
}
.ccd-row-strip {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4px;
.accent-blue & {
background: var(--ccd-blue);
}
.accent-teal & {
background: var(--ccd-teal);
}
.accent-amber & {
background: var(--ccd-amber);
}
.accent-purple & {
background: var(--ccd-purple);
}
}
.ccd-row-icon {
width: 38px;
height: 38px;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 14px;
flex-shrink: 0;
.accent-blue & {
background: var(--ccd-blue-l);
color: var(--ccd-blue-d);
}
.accent-teal & {
background: var(--ccd-teal-l);
color: var(--ccd-teal);
}
.accent-amber & {
background: var(--ccd-amber-l);
color: var(--ccd-amber);
}
.accent-purple & {
background: var(--ccd-purple-l);
color: var(--ccd-purple);
}
}
.ccd-row-text {
min-width: 0;
display: flex;
flex-direction: column;
gap: 1px;
line-height: 1.25;
}
.ccd-row-label {
font-size: 9.5px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ccd-g500);
}
.ccd-row-name {
font-size: 13px;
font-weight: 700;
color: var(--ccd-g900);
}
.ccd-row-mobile {
font-size: 12.5px;
font-weight: 600;
color: var(--ccd-g700);
font-variant-numeric: tabular-nums;
letter-spacing: 0.02em;
}
/* ───────── Row actions ───────── */
.ccd-row-actions {
display: inline-flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.ccd-act {
display: inline-flex;
align-items: center;
gap: 6px;
height: 34px;
padding: 0 11px;
border-radius: 8px;
border: 1px solid var(--ccd-g200);
background: #fff;
color: var(--ccd-g700);
font-size: 12.5px;
font-weight: 700;
cursor: pointer;
transition: all 0.12s ease;
fa-icon {
font-size: 12px;
color: var(--ccd-g500);
}
span {
letter-spacing: 0.02em;
}
&:hover {
background: var(--ccd-blue-l);
border-color: var(--ccd-blue-tint);
color: var(--ccd-blue-d);
fa-icon {
color: var(--ccd-blue-d);
}
}
&:focus-visible {
outline: 2px solid var(--ccd-blue);
outline-offset: 2px;
}
}
/* Primary "Call" button → solid green so it pops as the recommended action. */
.ccd-act.ccd-act--primary {
background: var(--ccd-green);
color: #fff;
border-color: var(--ccd-green);
fa-icon {
color: #fff;
}
&:hover {
background: #14532d;
border-color: #14532d;
color: #fff;
fa-icon {
color: #fff;
}
}
}
/* "Log call outcome" toggle button. */
.ccd-act.ccd-act--log {
width: 34px;
padding: 0;
justify-content: center;
&.is-on {
background: var(--ccd-blue-d);
border-color: var(--ccd-blue-d);
color: #fff;
fa-icon {
color: #fff;
}
}
}
/* "Save call log" — primary blue when enabled. */
.ccd-act.ccd-act--save {
background: var(--ccd-blue-d);
color: #fff;
border-color: var(--ccd-blue-d);
fa-icon {
color: #fff;
}
&:hover:not(:disabled) {
background: var(--ccd-blue);
border-color: var(--ccd-blue);
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
/* ───────── Latest-log strip on the contact row ───────── */
.ccd-row-group {
display: flex;
flex-direction: column;
gap: 0;
}
.ccd-row.is-logging {
border-color: var(--ccd-blue-tint);
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.ccd-row-lastlog {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 4px;
padding: 3px 9px;
border-radius: 999px;
font-size: 10.5px;
font-weight: 700;
letter-spacing: 0.02em;
align-self: flex-start;
fa-icon {
font-size: 10px;
}
&.tone-green {
background: var(--ccd-green-l);
color: var(--ccd-green);
}
&.tone-blue {
background: var(--ccd-blue-l);
color: var(--ccd-blue-d);
}
&.tone-amber {
background: var(--ccd-amber-l);
color: var(--ccd-amber);
}
&.tone-red {
background: var(--ccd-red-l);
color: var(--ccd-red);
}
}
.ccd-lastlog-m {
font-weight: 500;
color: inherit;
opacity: 0.85;
}
.ccd-lastlog-ptp {
margin-left: 6px;
padding-left: 6px;
border-left: 1px solid currentcolor;
opacity: 0.85;
}
/* ───────── Inline disposition picker ───────── */
.ccd-log {
border: 1px solid var(--ccd-blue-tint);
border-top: 0;
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
background: linear-gradient(180deg, #f8fafc 0%, #fff 100%);
padding: 12px 14px 14px;
display: flex;
flex-direction: column;
gap: 10px;
margin-bottom: 8px;
}
.ccd-log-h {
display: flex;
align-items: center;
gap: 8px;
font-size: 12.5px;
font-weight: 800;
color: var(--ccd-g900);
padding-bottom: 8px;
border-bottom: 1px dashed var(--ccd-g200);
}
.ccd-log-h-ic {
width: 22px;
height: 22px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: 7px;
background: var(--ccd-blue-d);
color: #fff;
font-size: 11px;
}
.ccd-log-h-sub {
margin-left: auto;
font-size: 11px;
font-weight: 600;
color: var(--ccd-g500);
letter-spacing: 0.01em;
}
.ccd-log-l {
font-size: 10px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ccd-g500);
}
/* Outcome chip group */
.ccd-chips {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.ccd-chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 5px 11px;
border-radius: 999px;
border: 1px solid var(--ccd-g200);
background: #fff;
color: var(--ccd-g700);
font-size: 11.5px;
font-weight: 700;
letter-spacing: 0.01em;
cursor: pointer;
transition: all 0.12s ease;
fa-icon {
font-size: 11px;
color: var(--ccd-g500);
}
&:hover:not(.is-on) {
background: var(--ccd-g50);
border-color: var(--ccd-g300);
}
&.is-on {
color: #fff;
fa-icon {
color: #fff;
}
&.tone-green {
background: var(--ccd-green);
border-color: var(--ccd-green);
}
&.tone-blue {
background: var(--ccd-blue-d);
border-color: var(--ccd-blue-d);
}
&.tone-amber {
background: var(--ccd-amber);
border-color: var(--ccd-amber);
}
&.tone-red {
background: var(--ccd-red);
border-color: var(--ccd-red);
}
}
}
/* Promise-to-pay fields */
.ccd-ptp {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
padding: 10px 12px;
background: var(--ccd-green-l);
border: 1px solid #bbf7d0;
border-radius: 10px;
}
.ccd-field {
display: flex;
flex-direction: column;
gap: 4px;
label {
font-size: 10px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ccd-g500);
}
input,
textarea {
box-sizing: border-box;
width: 100%;
border: 1px solid var(--ccd-g200);
border-radius: 8px;
padding: 8px 11px;
background: #fff;
font-size: 12.5px;
color: var(--ccd-g900);
font-family: inherit;
outline: none;
transition: border-color 0.15s ease;
resize: vertical;
&:focus {
border-color: var(--ccd-blue);
}
}
textarea {
min-height: 50px;
}
}
.ccd-log-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 4px;
}
/* ───────── Recent-calls history list ───────── */
.ccd-history {
margin-top: 14px;
padding-top: 14px;
border-top: 1px dashed var(--ccd-g200);
}
.ccd-history-h {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
font-weight: 800;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ccd-g500);
margin-bottom: 8px;
fa-icon {
font-size: 11px;
color: var(--ccd-blue);
}
}
.ccd-history-c {
margin-left: 4px;
padding: 2px 8px;
border-radius: 999px;
background: var(--ccd-g100);
color: var(--ccd-g500);
font-size: 9.5px;
font-weight: 800;
}
.ccd-history-list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 6px;
}
.ccd-history-item {
padding: 8px 10px 8px 14px;
border: 1px solid var(--ccd-g200);
border-radius: 9px;
background: #fff;
position: relative;
&.tone-green {
border-left: 4px solid var(--ccd-green);
}
&.tone-blue {
border-left: 4px solid var(--ccd-blue);
}
&.tone-amber {
border-left: 4px solid var(--ccd-amber);
}
&.tone-red {
border-left: 4px solid var(--ccd-red);
}
}
.ccd-history-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
font-size: 11.5px;
}
.ccd-history-outcome {
display: inline-flex;
align-items: center;
gap: 5px;
font-weight: 800;
color: var(--ccd-g900);
fa-icon {
font-size: 10.5px;
}
.tone-green & fa-icon {
color: var(--ccd-green);
}
.tone-blue & fa-icon {
color: var(--ccd-blue-d);
}
.tone-amber & fa-icon {
color: var(--ccd-amber);
}
.tone-red & fa-icon {
color: var(--ccd-red);
}
}
.ccd-history-kind {
font-size: 10.5px;
font-weight: 600;
color: var(--ccd-g500);
}
.ccd-history-num {
font-size: 11.5px;
font-weight: 600;
color: var(--ccd-g700);
font-variant-numeric: tabular-nums;
}
.ccd-history-meta {
margin-left: auto;
font-size: 11px;
color: var(--ccd-g500);
}
.ccd-history-ptp {
margin-top: 6px;
padding: 4px 9px;
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-weight: 700;
color: var(--ccd-green);
background: var(--ccd-green-l);
border-radius: 8px;
fa-icon {
font-size: 10px;
}
}
.ccd-history-notes {
margin-top: 6px;
font-size: 11.5px;
font-style: italic;
color: var(--ccd-g500);
line-height: 1.45;
}
/* ───────── Empty state ───────── */
.ccd-empty {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 18px 16px;
border: 1px dashed var(--ccd-g300);
border-radius: 10px;
background: var(--ccd-g50);
color: var(--ccd-g700);
fa-icon {
color: var(--ccd-blue);
font-size: 18px;
margin-top: 2px;
}
p {
margin: 4px 0 0;
font-size: 12.5px;
color: var(--ccd-g500);
}
}
@media (width <= 540px) {
.ccd-row {
grid-template-columns: 38px 1fr;
grid-template-areas:
'icon text'
'actions actions';
row-gap: 8px;
}
.ccd-row-icon {
grid-area: icon;
}
.ccd-row-text {
grid-area: text;
}
.ccd-row-actions {
grid-area: actions;
justify-content: flex-end;
}
}