Files
cbsnexora/src/app/cfcfrms/i4c/i4c-shell/i4c-shell.component.html
T
niteshandClaude Opus 5.5 fca550f4c4 feat(cfcfrms): I4C Live screens for the I4C-MHA integration
New CFCFRMS > I4C Live section backed by /v1/i4c/admin and /v1/i4c/cases
(the demo mock interceptor does not match these paths):

- Dashboard, complaints from I4C, holds register, approvals, responses and
  API log, bank code master, intimation settings.
- Hold popup: overview, hold transactions, customer intimation (automatic and
  manual), maker request (full / partial release, freeze, unfreeze), GRM / MRM
  and documents, request history.
- GRM grievances, MRM restorations and MRM balance report pages; shared date
  range filter (today, yesterday, week, month, custom), server-side paging and
  filters on every list; document upload / download.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 11:43:30 +05:30

216 lines
8.7 KiB
HTML

<!--
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/.
-->
<div class="i4c-shell">
<!-- Modern Navigation Bar with Live Status and Quick Actions -->
<header class="i4c-navbar">
<div class="i4c-navbar__brand">
<div class="i4c-navbar__icon-wrap">
<fa-icon icon="shield-alt"></fa-icon>
</div>
<div>
<div class="i4c-navbar__title">
<span>I4C Portal</span>
<span class="live-pill">
<span class="live-pill__dot"></span>
Live MHA Gateway
</span>
</div>
<div class="i4c-navbar__sub">National Cyber Crime Reporting &amp; Account Holds System</div>
</div>
</div>
<!-- Quick Actions -->
<div class="i4c-navbar__actions">
<button class="quick-lookup-btn" (click)="openLookup()">
<fa-icon icon="search"></fa-icon>
<span>Quick Lookup</span>
</button>
</div>
</header>
<!-- Modern Pill-Style Subnavigation Bar -->
<nav class="i4c-subnav">
<div class="i4c-subnav__links">
@for (link of links; track link.path) {
<a class="i4c-subnav__link" [routerLink]="['./', link.path]" routerLinkActive="i4c-subnav__link--active">
<fa-icon [icon]="link.icon" class="link-ic"></fa-icon>
<span>{{ link.label }}</span>
@if (link.path === 'approvals' && pendingApprovals > 0) {
<span class="pill-badge pill-badge--amber">{{ pendingApprovals }}</span>
}
@if (link.path === 'holds' && activeHolds > 0) {
<span class="pill-badge pill-badge--blue">{{ activeHolds }}</span>
}
</a>
}
</div>
</nav>
<!-- Outlet for child views -->
<main class="i4c-content">
<router-outlet></router-outlet>
</main>
<!-- ========================================================
MODERN POPUP WINDOW: QUICK LOOKUP MODAL
======================================================== -->
@if (showLookupModal) {
<div class="i4c-modal-backdrop" (click)="closeLookup()">
<div class="i4c-modal-window i4c-modal-window--wide" (click)="$event.stopPropagation()">
<div class="i4c-modal-header">
<div class="i4c-modal-header__title">
<fa-icon icon="search"></fa-icon>
<div>
<span>Quick Search &amp; Lookup</span>
<div class="i4c-modal-header__sub">Instant search across I4C Complaints and Account Holds Register</div>
</div>
</div>
<button class="modal-close-btn" (click)="closeLookup()" aria-label="Close">
<fa-icon icon="times"></fa-icon>
</button>
</div>
<div class="i4c-modal-body">
<div class="lookup-search-box">
<div class="search-input-wrap">
<fa-icon icon="search" class="search-icon"></fa-icon>
<input
type="text"
class="modern-input"
placeholder="Enter acknowledgement no., customer account no., or job ID..."
[(ngModel)]="lookupQuery"
(keyup.enter)="performLookup()"
autofocus
/>
@if (lookupQuery) {
<button class="clear-btn" (click)="lookupQuery = ''">
<fa-icon icon="times"></fa-icon>
</button>
}
</div>
<button
class="search-submit-btn"
(click)="performLookup()"
[disabled]="lookupLoading || !lookupQuery.trim()"
>
@if (lookupLoading) {
<fa-icon icon="sync" animation="spin"></fa-icon>
<span>Searching...</span>
} @else {
<fa-icon icon="search"></fa-icon>
<span>Search</span>
}
</button>
</div>
@if (lookupError) {
<div class="i4c-error">{{ lookupError }}</div>
}
<!-- Search Results -->
@if (lookupSearched) {
<div class="lookup-results">
<!-- Complaints Section -->
<div class="results-section">
<div class="results-section__head">
<fa-icon icon="inbox"></fa-icon>
<span>Complaints from I4C</span>
<span class="count-badge">{{ lookupResults.complaints.length }}</span>
</div>
@if (lookupResults.complaints.length > 0) {
<div class="results-list">
@for (c of lookupResults.complaints; track c.id) {
<div class="result-item" (click)="goToComplaint(c.id)">
<div class="result-item__main">
<div class="result-item__title">
<span class="ack-code">{{ c.acknowledgement_no }}</span>
<span class="status-pill status-pill--{{ c.status?.toLowerCase() }}">{{ c.status }}</span>
</div>
<div class="result-item__sub">
<span
>Account: <b>{{ c.payer_account_number }}</b></span
>
<span>•</span>
<span>Job: {{ c.job_id }}</span>
<span>•</span>
<span>Sub-cat: {{ c.sub_category }}</span>
</div>
</div>
<div class="result-item__side">
<span class="held-amt">Held: ₹{{ c.amount_held | number: '1.2-2' }}</span>
<span class="open-link">Open Complaint <fa-icon icon="arrow-right"></fa-icon></span>
</div>
</div>
}
</div>
} @else {
<div class="no-res">No complaints matched "{{ lookupQuery }}".</div>
}
</div>
<!-- Holds Section -->
<div class="results-section">
<div class="results-section__head">
<fa-icon icon="lock"></fa-icon>
<span>Holds Register</span>
<span class="count-badge">{{ lookupResults.holds.length }}</span>
</div>
@if (lookupResults.holds.length > 0) {
<div class="results-list">
@for (h of lookupResults.holds; track h.id) {
<div class="result-item" (click)="goToHold(h.account_no)">
<div class="result-item__main">
<div class="result-item__title">
<span class="ack-code">Account: {{ h.account_no }}</span>
<span class="status-pill status-pill--{{ h.status?.toLowerCase() }}">{{ h.status }}</span>
@if (h.debit_frozen) {
<span class="freeze-tag">DEBIT FROZEN</span>
}
</div>
<div class="result-item__sub">
<span
>Customer: <b>{{ h.client_name || 'N/A' }}</b></span
>
<span>•</span>
<span>Ack: {{ h.acknowledgement_no }}</span>
<span>•</span>
<span>Layer: {{ h.layer }}</span>
</div>
</div>
<div class="result-item__side">
<span class="held-amt">Held: ₹{{ h.amount_held | number: '1.2-2' }}</span>
<span class="open-link">View in Holds <fa-icon icon="arrow-right"></fa-icon></span>
</div>
</div>
}
</div>
} @else {
<div class="no-res">No holds matched "{{ lookupQuery }}".</div>
}
</div>
</div>
} @else {
<div class="lookup-hint">
<fa-icon icon="lightbulb" class="hint-icon"></fa-icon>
<span
>Type a 14-digit acknowledgement number, customer bank account number, or job ID to quickly locate
complaints or hold records.</span
>
</div>
}
</div>
<div class="i4c-modal-footer">
<button class="footer-btn-close" (click)="closeLookup()">Close</button>
</div>
</div>
</div>
}
</div>