feat: non-individual entity UI improvements — hide individual-only sections, fix legal form display, send extended fields to API

- Hide Family Members tab/section for non-individual entities in client view, create flow, and preview
- Hide Financial & Classification section for non-individual entities in personal data and preview
- Fix legal form column in clients list — fetch legalForm from client API for correct display
- Add person/business icon before client name in list rows
- Remove unsupportedNpd filter — send authorizedSignatory, additionalInfo, dateOfRegistration to API
- Add registration number format hint (mat-hint) based on constitution type
- Add spacing between verification row and constitution type dropdowns
- Reduce table cell padding and prevent action buttons from being clipped
- Add missing MPL-2.0 license headers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-04-04 15:10:51 +05:30
co-authored by Claude Opus 4.6
parent ab01111424
commit b890d24bb7
522 changed files with 51991 additions and 21885 deletions
+89 -47
View File
@@ -25,7 +25,8 @@
<!-- Content -->
<mat-sidenav-content class="sidenav">
<!-- Sidebar Toggle Handle -->
<!-- Sidebar Toggle Handle (hidden on small/handset screens) -->
@if ((isHandset$ | async) === false) {
<div
class="sidebar-handle"
[class.collapsed]="sidenavCollapsed"
@@ -42,99 +43,100 @@
}
</svg>
</div>
}
<!-- Toolbar -->
<mifosx-toolbar [sidenav]="sidenav" (collapse)="toggleCollapse($event)"></mifosx-toolbar>
<!-- Main Header — 2-Row Navigation -->
<div class="main-header">
<!-- Row 1 — 11 items -->
<!-- Row 1 — 11 items (permission-gated) -->
<div class="nav-row r1">
<a class="ni" tabindex="0" [matMenuTriggerFor]="institutionMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="institutionMenu" *mifosxHasPermission="'MENU_INSTITUTION'">
<fa-icon icon="university" class="ni-ico"></fa-icon>Institution
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" routerLink="/checker-inbox-and-tasks/checker-inbox">
<a class="ni" tabindex="0" routerLink="/checker-inbox-and-tasks/checker-inbox" *mifosxHasPermission="'MENU_TASKS'">
<fa-icon icon="check" class="ni-ico"></fa-icon>Tasks
</a>
<a class="ni" tabindex="0" routerLink="/accounting">
<a class="ni" tabindex="0" routerLink="/accounting" *mifosxHasPermission="'MENU_ACCOUNTING'">
<fa-icon icon="money-bill-alt" class="ni-ico"></fa-icon>Accounting
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="reportsMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="reportsMenu" *mifosxHasPermission="'MENU_REPORTS'">
<fa-icon icon="chart-bar" class="ni-ico"></fa-icon>Reports
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="adminMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="adminMenu" *mifosxHasPermission="'MENU_ADMIN'">
<fa-icon icon="shield-alt" class="ni-ico"></fa-icon>Admin
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" (click)="subLedgerOpen = !subLedgerOpen; glMenuOpen = false">
<a class="ni" tabindex="0" (click)="subLedgerOpen = !subLedgerOpen; glMenuOpen = false" *mifosxHasPermission="'MENU_SUB_LEDGER'">
<fa-icon icon="book" class="ni-ico"></fa-icon>Sub Ledger
<fa-icon [icon]="subLedgerOpen ? 'caret-up' : 'caret-down'" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" (click)="glMenuOpen = !glMenuOpen; subLedgerOpen = false">
<a class="ni" tabindex="0" (click)="glMenuOpen = !glMenuOpen; subLedgerOpen = false" *mifosxHasPermission="'MENU_GENERAL_LEDGER'">
<fa-icon icon="book-open" class="ni-ico"></fa-icon>General Ledger
<fa-icon [icon]="glMenuOpen ? 'caret-up' : 'caret-down'" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="cashierMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="cashierMenu" *mifosxHasPermission="'MENU_CASHIER'">
<fa-icon icon="money-bill" class="ni-ico"></fa-icon>Cashier
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0">
<a class="ni" tabindex="0" *mifosxHasPermission="'MENU_OFFICER'">
<fa-icon icon="user-tie" class="ni-ico"></fa-icon>Officer
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="depositsMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="depositsMenu" *mifosxHasPermission="'MENU_DEPOSITS'">
<fa-icon icon="piggy-bank" class="ni-ico"></fa-icon>Deposits
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="clearingMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="clearingMenu" *mifosxHasPermission="'MENU_CLEARING'">
<fa-icon icon="exchange" class="ni-ico"></fa-icon>Clearing
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
</div>
<!-- Row 2 — 11 items -->
<!-- Row 2 — 11 items (permission-gated) -->
<div class="nav-row r2">
<a class="ni" tabindex="0" [matMenuTriggerFor]="hrmMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="hrmMenu" *mifosxHasPermission="'MENU_HRM'">
<fa-icon icon="money-check" class="ni-ico"></fa-icon>HRM
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="shareMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="shareMenu" *mifosxHasPermission="'MENU_SHARE'">
<fa-icon icon="coins" class="ni-ico"></fa-icon>Share
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="othersMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="othersMenu" *mifosxHasPermission="'MENU_OTHERS'">
<fa-icon icon="folder-open" class="ni-ico"></fa-icon>Others
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="npaMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="npaMenu" *mifosxHasPermission="'MENU_NPA'">
<fa-icon icon="exclamation-triangle" class="ni-ico"></fa-icon>NPA
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="advancesMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="advancesMenu" *mifosxHasPermission="'MENU_ADVANCES'">
<fa-icon icon="hand-holding-usd" class="ni-ico"></fa-icon>Advances
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="insuranceMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="insuranceMenu" *mifosxHasPermission="'MENU_INSURANCE'">
<fa-icon icon="shield-alt" class="ni-ico"></fa-icon>Insurance
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" (click)="rbiMenuOpen = !rbiMenuOpen; glMenuOpen = false">
<a class="ni" tabindex="0" (click)="rbiMenuOpen = !rbiMenuOpen; glMenuOpen = false" *mifosxHasPermission="'MENU_RBI'">
<fa-icon icon="university" class="ni-ico"></fa-icon>RBI
<fa-icon [icon]="rbiMenuOpen ? 'caret-up' : 'caret-down'" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="digitalMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="digitalMenu" *mifosxHasPermission="'MENU_DIGITAL'">
<fa-icon icon="mobile-alt" class="ni-ico"></fa-icon>Digital
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" (click)="openConfigWizard()">
<a class="ni" tabindex="0" (click)="openConfigWizard()" *mifosxHasPermission="'MENU_CONFIG_WIZARD'">
<fa-icon icon="cog" class="ni-ico"></fa-icon>Config Wizard
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="ckycMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="ckycMenu" *mifosxHasPermission="'MENU_CKYC_MGMT'">
<fa-icon icon="fingerprint" class="ni-ico"></fa-icon>CKYC Mgmt
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
<a class="ni" tabindex="0" [matMenuTriggerFor]="letterMgmtMenu">
<a class="ni" tabindex="0" [matMenuTriggerFor]="letterMgmtMenu" *mifosxHasPermission="'MENU_LETTER_MGMT'">
<fa-icon icon="envelope" class="ni-ico"></fa-icon>Letter Mgmt
<fa-icon icon="caret-down" class="ni-caret"></fa-icon>
</a>
@@ -142,33 +144,65 @@
</div>
<!-- Row 1 Menus -->
<mat-menu #institutionMenu="matMenu" [overlapTrigger]="false">
<button mat-menu-item routerLink="/clients" tabindex="0">Clients</button>
<button mat-menu-item routerLink="/groups" tabindex="0">Groups</button>
<button mat-menu-item routerLink="/centers" tabindex="0">Centers</button>
<mat-menu #institutionMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item routerLink="/clients" tabindex="0">
<i class="fa fa-users menu-item-icon"></i> Clients
</button>
<button mat-menu-item routerLink="/groups" tabindex="0">
<i class="fa fa-object-group menu-item-icon"></i> Groups
</button>
<button mat-menu-item routerLink="/centers" tabindex="0">
<i class="fa fa-building menu-item-icon"></i> Centers
</button>
</mat-menu>
<mat-menu #reportsMenu="matMenu" [overlapTrigger]="false">
<button mat-menu-item [routerLink]="['/reports']" tabindex="0">All</button>
<button mat-menu-item [routerLink]="['/reports', 'Client']" tabindex="0">Clients</button>
<button mat-menu-item [routerLink]="['/reports', 'Loan']" tabindex="0">Loans</button>
<button mat-menu-item [routerLink]="['/reports', 'Savings']" tabindex="0">Savings</button>
<button mat-menu-item [routerLink]="['/reports', 'Fund']" tabindex="0">Funds</button>
<button mat-menu-item [routerLink]="['/reports', 'Accounting']" tabindex="0">Accounting</button>
<mat-menu #reportsMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item [routerLink]="['/reports']" tabindex="0">
<i class="fa fa-th-list menu-item-icon"></i> All Reports
</button>
<button mat-menu-item [routerLink]="['/reports', 'Client']" tabindex="0">
<i class="fa fa-user menu-item-icon"></i> Clients
</button>
<button mat-menu-item [routerLink]="['/reports', 'Loan']" tabindex="0">
<i class="fa fa-credit-card menu-item-icon"></i> Loans
</button>
<button mat-menu-item [routerLink]="['/reports', 'Savings']" tabindex="0">
<i class="fa fa-piggy-bank menu-item-icon"></i> Savings
</button>
<button mat-menu-item [routerLink]="['/reports', 'Fund']" tabindex="0">
<i class="fa fa-hand-holding-usd menu-item-icon"></i> Funds
</button>
<button mat-menu-item [routerLink]="['/reports', 'Accounting']" tabindex="0">
<i class="fa fa-calculator menu-item-icon"></i> Accounting
</button>
</mat-menu>
<mat-menu #adminMenu="matMenu" [overlapTrigger]="false">
<button mat-menu-item [routerLink]="['/appusers']" tabindex="0">Users</button>
<button mat-menu-item [routerLink]="['/organization']" tabindex="0">Organization</button>
<button mat-menu-item [routerLink]="['/system']" tabindex="0">System</button>
<button mat-menu-item [routerLink]="['/products']" tabindex="0">Products</button>
<button mat-menu-item routerLink="/templates" tabindex="0">Templates</button>
<mat-menu #adminMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item [routerLink]="['/appusers']" tabindex="0">
<i class="fa fa-user-cog menu-item-icon"></i> Users
</button>
<button mat-menu-item [routerLink]="['/organization']" tabindex="0">
<i class="fa fa-sitemap menu-item-icon"></i> Organization
</button>
<button mat-menu-item [routerLink]="['/system']" tabindex="0">
<i class="fa fa-server menu-item-icon"></i> System
</button>
<button mat-menu-item [routerLink]="['/products']" tabindex="0">
<i class="fa fa-box menu-item-icon"></i> Products
</button>
<button mat-menu-item routerLink="/templates" tabindex="0">
<i class="fa fa-file-alt menu-item-icon"></i> Templates
</button>
</mat-menu>
<!-- Sub Ledger Mega Menu -->
@if (subLedgerOpen) {
<div class="gl-backdrop" (click)="subLedgerOpen = false"></div>
<div class="gl-mega-menu">
<div class="gl-mega-menu-header">
<fa-icon icon="book" class="gl-mega-menu-header-icon"></fa-icon>
<span>Sub Ledger</span>
</div>
<input
type="text"
class="gl-search"
@@ -323,6 +357,10 @@
@if (glMenuOpen) {
<div class="gl-backdrop" (click)="glMenuOpen = false"></div>
<div class="gl-mega-menu">
<div class="gl-mega-menu-header">
<fa-icon icon="book-open" class="gl-mega-menu-header-icon"></fa-icon>
<span>General Ledger</span>
</div>
<input
type="text"
class="gl-search"
@@ -392,7 +430,7 @@
}
<!-- Sub Menu Dropdowns -->
<mat-menu #cashierMenu="matMenu" [overlapTrigger]="false">
<mat-menu #cashierMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item tabindex="0">
<fa-icon icon="exchange" class="menu-item-icon"></fa-icon> Cash Exchange Entry
</button>
@@ -467,7 +505,7 @@
</div>
</mat-menu>
<mat-menu #clearingMenu="matMenu" [overlapTrigger]="false">
<mat-menu #clearingMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item tabindex="0">
<fa-icon icon="check-circle" class="menu-item-icon"></fa-icon> Cheque Honoured
</button>
@@ -698,7 +736,7 @@
</div>
</mat-menu>
<mat-menu #ckycMenu="matMenu" [overlapTrigger]="false">
<mat-menu #ckycMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item tabindex="0"><fa-icon icon="camera" class="menu-item-icon"></fa-icon> Photo</button>
<button mat-menu-item tabindex="0"><fa-icon icon="pen" class="menu-item-icon"></fa-icon> Sign Upload</button>
<button mat-menu-item tabindex="0">
@@ -819,7 +857,7 @@
</div>
</mat-menu>
<mat-menu #insuranceMenu="matMenu" [overlapTrigger]="false">
<mat-menu #insuranceMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item tabindex="0"><fa-icon icon="building" class="menu-item-icon"></fa-icon> DICGC</button>
<button mat-menu-item tabindex="0"><fa-icon icon="heart" class="menu-item-icon"></fa-icon> PMJBY</button>
<button mat-menu-item tabindex="0"><fa-icon icon="heart" class="menu-item-icon"></fa-icon> PMSBY</button>
@@ -840,7 +878,7 @@
</button>
</mat-menu>
<mat-menu #digitalMenu="matMenu" [overlapTrigger]="false">
<mat-menu #digitalMenu="matMenu" [overlapTrigger]="false" class="nav-dropdown">
<button mat-menu-item tabindex="0"><fa-icon icon="exchange" class="menu-item-icon"></fa-icon> NEFT / RTGS</button>
<button mat-menu-item tabindex="0"><fa-icon icon="bolt" class="menu-item-icon"></fa-icon> IMPS / BANL</button>
<button mat-menu-item tabindex="0"><fa-icon icon="mobile-alt" class="menu-item-icon"></fa-icon> UPI</button>
@@ -863,6 +901,10 @@
@if (rbiMenuOpen) {
<div class="gl-backdrop" (click)="rbiMenuOpen = false"></div>
<div class="gl-mega-menu rbi-mega-menu">
<div class="gl-mega-menu-header">
<fa-icon icon="university" class="gl-mega-menu-header-icon"></fa-icon>
<span>RBI</span>
</div>
<input
type="text"
class="gl-search"
+56 -3
View File
@@ -187,10 +187,42 @@ $gray-700: #334155;
}
.menu-item-icon {
margin-right: 10px;
margin-right: 8px;
width: 16px;
color: #667085;
font-size: 14px;
text-align: center;
color: $brand;
font-size: 12px;
opacity: 0.7;
}
// ===== Nav Dropdown Menus =====
::ng-deep .nav-dropdown {
border-radius: 8px !important;
border: 1px solid $gray-200 !important;
box-shadow: 0 6px 24px rgb(0 0 0 / 10%) !important;
min-width: 180px !important;
padding: 4px 0 !important;
margin-top: 2px !important;
.mat-mdc-menu-item {
font-size: 12.5px !important;
font-weight: 500 !important;
height: 34px !important;
min-height: 34px !important;
padding: 0 14px !important;
color: $gray-700 !important;
font-family: 'DM Sans', 'Roboto', sans-serif !important;
&:hover {
background: $brand-hover !important;
color: $brand !important;
.menu-item-icon {
opacity: 1;
color: $brand;
}
}
}
}
/* Deposits Mega Panel (inside mat-menu overlay) */
@@ -240,6 +272,27 @@ $gray-700: #334155;
border-top: 3px solid #0d47a1;
}
.gl-mega-menu-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px solid #e5e7eb;
span {
font-size: 18px;
font-weight: 700;
color: #0d47a1;
letter-spacing: 0.02em;
}
}
.gl-mega-menu-header-icon {
font-size: 18px;
color: #0d47a1;
}
.gl-search {
width: 100%;
padding: 10px 14px;
@@ -32,6 +32,7 @@
matTooltip="{{ 'tooltips.Dashboard' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'SIDEBAR_DASHBOARD'"
>
<mat-icon matListIcon>
<fa-icon icon="tachometer-alt" size="sm"></fa-icon>
@@ -44,7 +45,7 @@
matTooltip="{{ 'tooltips.Navigation' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_CLIENT'"
*mifosxHasPermission="'SIDEBAR_NAVIGATION'"
>
<mat-icon matListIcon>
<fa-icon icon="location-arrow" size="sm"></fa-icon>
@@ -57,20 +58,33 @@
matTooltip="{{ 'tooltips.CKYC' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_CLIENT'"
*mifosxHasPermission="'SIDEBAR_CKYC'"
>
<mat-icon matListIcon>
<fa-icon icon="id-card" size="sm"></fa-icon>
</mat-icon>
<a matLine>{{ 'labels.menus.CKYC' | translate }}</a>
</mat-list-item>
<mat-list-item
[routerLink]="['/bank-calendar']"
[matTooltipPosition]="tooltipPosition"
matTooltip="Bank Calendar"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'SIDEBAR_CALENDAR'"
>
<mat-icon matListIcon>
<fa-icon icon="calendar-alt" size="sm"></fa-icon>
</mat-icon>
<a matLine>Calendar</a>
</mat-list-item>
<mat-list-item
[routerLink]="['/checker-inbox-and-tasks/checker-inbox']"
[matTooltipPosition]="tooltipPosition"
matTooltip="{{ 'tooltips.Checker Inbox and Tasks' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_MAKERCHECKER'"
*mifosxHasPermission="'SIDEBAR_CHECKER_INBOX'"
>
<mat-icon matListIcon>
<i class="fa fa-check"></i>
@@ -83,7 +97,7 @@
matTooltip="{{ 'labels.menus.Collection Sheet' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_COLLECTIONSHEET'"
*mifosxHasPermission="'SIDEBAR_COLLECTION_SHEET'"
>
<mat-icon matListIcon>
<i class="fa fa-tasks"></i>
@@ -96,13 +110,14 @@
matTooltip="{{ 'tooltips.Individual Collection Sheet' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_COLLECTIONSHEET'"
*mifosxHasPermission="'SIDEBAR_COLLECTION_SHEET'"
>
<mat-icon matListIcon>
<i class="fa fa-tasks"></i>
</mat-icon>
<a matLine>{{ 'labels.menus.Individual Collection Sheet' | translate }}</a>
</mat-list-item>
<ng-container *mifosxHasPermission="'SIDEBAR_REMITTANCES'">
<mat-list-item
*ngIf="mifosRemittanceEnabled"
[routerLink]="['/remittances/process']"
@@ -116,6 +131,8 @@
</mat-icon>
<a matLine>{{ 'labels.menus.Remittances' | translate }}</a>
</mat-list-item>
</ng-container>
<ng-container *mifosxHasPermission="'SIDEBAR_ANALYTICS'">
<mat-list-item
*ngIf="supersetEnabled"
[routerLink]="['/analytics']"
@@ -129,7 +146,9 @@
</mat-icon>
<a matLine>{{ 'labels.menus.Analytics' | translate }}</a>
</mat-list-item>
</ng-container>
<!-- CFCFRMS Section -->
<ng-container *mifosxHasPermission="'SIDEBAR_CFCFRMS'">
<div class="nav-item-sep mt-1">
<mat-divider></mat-divider>
<span class="text-muted">{{ 'labels.menus.CFCFRMS' | translate }}</span>
@@ -206,8 +225,10 @@
</mat-icon>
<a matLine>{{ 'labels.menus.Report Fraud Txn' | translate }}</a>
</mat-list-item>
</ng-container>
<!-- RBI Integration Section -->
<ng-container *mifosxHasPermission="'SIDEBAR_RBI_INTEGRATION'">
<div class="nav-item-sep mt-1">
<mat-divider></mat-divider>
<span class="text-muted">{{ 'labels.menus.RBI Integration' | translate }}</span>
@@ -236,6 +257,7 @@
</mat-icon>
<a matLine>{{ 'labels.menus.CFR Lookup' | translate }}</a>
</mat-list-item>
</ng-container>
<div class="nav-item-sep mt-1">
<mat-divider></mat-divider>
@@ -248,6 +270,7 @@
matTooltip="{{ 'tooltips.RBI Circulars' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'SIDEBAR_RBI_CIRCULARS'"
>
<mat-icon matListIcon>
<fa-icon icon="newspaper" size="sm"></fa-icon>
@@ -260,7 +283,7 @@
matTooltip="{{ 'tooltips.Notifications' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_NOTIFICATION'"
*mifosxHasPermission="'SIDEBAR_NOTIFICATIONS'"
>
<mat-icon matListIcon>
<fa-icon icon="bell" size="sm"></fa-icon>
@@ -273,7 +296,7 @@
matTooltip="{{ 'tooltips.Frequent Postings' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'CREATE_JOURNALENTRY'"
*mifosxHasPermission="'SIDEBAR_FREQUENT_POSTINGS'"
>
<mat-icon matListIcon>
<fa-icon icon="sync" size="sm"></fa-icon>
@@ -286,7 +309,7 @@
matTooltip="{{ 'tooltips.Create Journal Entry' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'CREATE_JOURNALENTRY'"
*mifosxHasPermission="'SIDEBAR_JOURNAL_ENTRY'"
>
<mat-icon matListIcon>
<fa-icon icon="plus" size="sm"></fa-icon>
@@ -299,7 +322,7 @@
matTooltip="{{ 'tooltips.Chart Of Accounts' | translate }}"
routerLinkActive="active-menu"
[routerLinkActiveOptions]="{ exact: false }"
*mifosxHasPermission="'READ_GLACCOUNT'"
*mifosxHasPermission="'SIDEBAR_CHART_OF_ACCOUNTS'"
>
<mat-icon matListIcon>
<fa-icon icon="sitemap" size="sm"></fa-icon>
@@ -20,6 +20,10 @@
<div class="t-chip">Branch:&nbsp;<strong>HO</strong></div>
<div class="t-chip">Date:&nbsp;<strong>{{ today | date:'dd MMM yyyy' }}</strong></div>
<div class="t-chip">Last login:&nbsp;<strong>{{ lastLoginTime }}</strong></div>
<div class="t-sep"></div>
<div class="t-chip t-chip--secure"><i class="fas fa-lock t-chip-icon t-chip-icon--green"></i>SSL/TLS&nbsp;<strong>256-bit</strong></div>
<div class="t-chip t-chip--secure"><i class="fas fa-certificate t-chip-icon t-chip-icon--blue"></i>ISO 27001&nbsp;<strong>Certified</strong></div>
<div class="t-chip t-chip--timer"><i class="fas fa-clock t-chip-icon t-chip-icon--amber"></i>Session&nbsp;<strong>{{ sessionTimer }}</strong></div>
</div>
<!-- Right Actions -->
@@ -48,6 +52,10 @@
@if (subLedgerOpen) {
<div class="subledger-backdrop" (click)="subLedgerOpen = false"></div>
<div class="subledger-mega-menu">
<div class="subledger-mega-menu-header">
<fa-icon icon="book" class="subledger-mega-menu-header-icon"></fa-icon>
<span>Sub Ledger</span>
</div>
<input
type="text"
class="subledger-search"
@@ -164,6 +172,10 @@
@if (glMenuOpen) {
<div class="subledger-backdrop" (click)="glMenuOpen = false"></div>
<div class="subledger-mega-menu">
<div class="subledger-mega-menu-header">
<fa-icon icon="book-open" class="subledger-mega-menu-header-icon"></fa-icon>
<span>General Ledger</span>
</div>
<input
type="text"
class="subledger-search"
@@ -104,6 +104,32 @@ $top-h: 32px;
}
}
.t-sep {
width: 1px;
height: 16px;
background: rgb(255 255 255 / 15%);
margin: 0 4px;
flex-shrink: 0;
}
.t-chip-icon {
font-size: 9px;
&--green { color: #34d399; }
&--blue { color: #60a5fa; }
&--amber { color: #fbbf24; }
}
.t-chip--secure {
color: rgb(255 255 255 / 55%);
}
.t-chip--timer {
color: rgb(255 255 255 / 55%);
strong { color: #fbbf24 !important; font-weight: 600; }
}
.t-live {
width: 5px;
height: 5px;
@@ -265,6 +291,27 @@ $icon-hover-bg: rgb(255 255 255 / 10%);
animation: slideDown 0.13s ease;
}
.subledger-mega-menu-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
padding-bottom: 12px;
border-bottom: 1px solid #e5e7eb;
span {
font-size: 18px;
font-weight: 700;
color: #0d47a1;
letter-spacing: 0.02em;
}
}
.subledger-mega-menu-header-icon {
font-size: 18px;
color: #0d47a1;
}
@keyframes slideDown {
from { opacity: 0; transform: translateX(-50%) translateY(-4px); }
to { opacity: 1; transform: translateX(-50%) translateY(0); }
@@ -116,6 +116,11 @@ export class ToolbarComponent implements OnInit, AfterViewInit, AfterContentChec
return `Today, ${h}:${m} ${ampm}`;
}
/** Session timer */
sessionTimer = '15:00';
private sessionSeconds = 15 * 60;
private sessionInterval: any;
/** Sub Ledger mega menu state */
subLedgerOpen = false;
subLedgerSearch = '';
@@ -143,6 +148,21 @@ export class ToolbarComponent implements OnInit, AfterViewInit, AfterContentChec
this.toggleSidenavCollapse(false);
}
});
this.startSessionTimer();
}
private startSessionTimer() {
this.sessionInterval = setInterval(() => {
if (this.sessionSeconds > 0) {
this.sessionSeconds--;
const m = Math.floor(this.sessionSeconds / 60);
const s = this.sessionSeconds % 60;
this.sessionTimer = `${m}:${s < 10 ? '0' + s : s}`;
} else {
clearInterval(this.sessionInterval);
this.sessionTimer = '0:00';
}
}, 1000);
}
ngAfterContentChecked(): void {