feat: complete UI redesign — client creation tabs, footer, home page, CIF & occupation fields

- Client creation: replaced vertical stepper with 3-tab layout (General, KYC & Nominee, Preview)
- All form fields redesigned with appearance="outline" and section grouping
- Preview tab with profile card, info tables, KYC details, family members
- Footer redesigned: security bar, LincShield certifications, regulatory & legal, quick navigation, support & contact, LincPay branding
- Home page redesigned: welcome banner, quick action cards, info row
- Client view header redesigned: ID chips row (Account No, CIF Number, External Id), 4-column details grid
- Added CIF Number column to clients list table
- Added CIF Number display to client view sidebar and personal data tab
- Added occupationCategoryId and occupationId dropdowns to client creation form
- Added occupation fields to client view sidebar, personal data tab, and preview
- Added 51+ missing translation keys to en-US.json
- Toolbar: added Last login chip
- Registered faUserPlus icon

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-03-20 19:19:47 +05:30
co-authored by Claude Opus 4.6
parent b3a4cce0cf
commit 7b1f2e8ad7
81 changed files with 8384 additions and 3923 deletions
+113 -102
View File
@@ -1,132 +1,143 @@
<!--
<!--
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/.
-->
<!-- Modern Material Design 3 Login Layout -->
<!-- Modern Glassmorphism Login with Animated Gradient Background -->
<div class="login-wrapper">
<!-- Left Panel - Hero Section (Hidden on tablet and mobile) -->
<div class="hero-panel hide-lt-lg" [class.production-mode]="productionMode">
<div class="hero-overlay"></div>
<div class="hero-content">
<!-- Default Mode: Full content -->
@if (!productionMode) {
<div class="hero-text">
<h1 class="hero-title">{{ 'APP_NAME' | translate }}</h1>
<p class="hero-subtitle">
{{ 'labels.text.A' | translate }}
<span class="hero-highlight">{{ 'labels.text.global community' | translate }}</span>
{{ 'labels.text.elimination of poverty' | translate }}
</p>
<div class="hero-features">
<div class="feature-item">
<fa-icon icon="shield-alt" class="feature-icon"></fa-icon>
<span class="feature-text">{{ 'labels.heading.Secure & Reliable' | translate }}</span>
</div>
<div class="feature-item">
<fa-icon icon="users" class="feature-icon"></fa-icon>
<span class="feature-text">{{ 'labels.heading.Community Driven' | translate }}</span>
</div>
<div class="feature-item">
<fa-icon icon="globe" class="feature-icon"></fa-icon>
<span class="feature-text">{{ 'labels.heading.Global Impact' | translate }}</span>
</div>
</div>
</div>
}
<!-- Production Mode: Minimal branding at bottom -->
@if (productionMode) {
<div class="hero-branding-bottom">
<h1 class="hero-title-minimal">{{ 'APP_NAME' | translate }}</h1>
</div>
}
</div>
<!-- Animated Gradient Background -->
<div class="gradient-bg">
<div class="gradient-orb orb-1"></div>
<div class="gradient-orb orb-2"></div>
<div class="gradient-orb orb-3"></div>
<div class="gradient-orb orb-4"></div>
</div>
<!-- Right Panel - Login Form -->
<div class="login-panel">
<!-- Header Controls -->
<div class="login-header">
@if (allowServerSwitch()) {
<mifosx-server-selector class="header-control" appearance="outline" [showLabel]="false">
</mifosx-server-selector>
}
<mifosx-theme-toggle class="header-control theme-toggle"></mifosx-theme-toggle>
<mifosx-language-selector class="header-control" appearance="outline" [showLabel]="false">
</mifosx-language-selector>
</div>
<!-- Settings Icon - Top Right -->
<button
class="settings-trigger"
(click)="toggleSettingsPanel()"
matTooltip="Settings"
attr.aria-label="Settings"
>
<mifosx-m3-icon [name]="settingsPanelOpen ? 'close' : 'settings'"></mifosx-m3-icon>
</button>
<!-- Main Login Card -->
<div class="login-card-container">
<div class="login-card">
<!-- Logo Section -->
<div class="logo-section">
@if (!themeDarkEnabled) {
<img [src]="logoPath" (error)="onLogoError()" alt="{{ 'APP_NAME' | translate }} Logo" class="logo-image" />
} @else {
<img
[src]="logoPathDark"
(error)="onLogoErrorDark()"
alt="{{ 'APP_NAME' | translate }} Logo"
class="logo-image"
/>
}
<!-- Settings Popup Panel -->
@if (settingsPanelOpen) {
<div class="settings-overlay" (click)="toggleSettingsPanel()"></div>
<div class="settings-panel" @settingsAnimation>
<div class="settings-panel-header">
<h3 class="settings-title">
<mifosx-m3-icon name="tune"></mifosx-m3-icon>
{{ 'labels.heading.Settings' | translate }}
</h3>
</div>
<div class="settings-panel-body">
<!-- Theme Toggle -->
<div class="settings-item">
<span class="settings-label">
<mifosx-m3-icon name="dark_mode"></mifosx-m3-icon>
{{ 'labels.heading.Theme' | translate }}
</span>
<mifosx-theme-toggle></mifosx-theme-toggle>
</div>
<!-- Form Section -->
<div class="form-section">
<!-- Tenant Selector -->
@if (showTenantSelector) {
<div class="tenant-section">
<mifosx-tenant-selector></mifosx-tenant-selector>
</div>
}
<!-- Login Forms -->
@if (!resetPassword && !twoFactorAuthenticationRequired) {
<mifosx-login-form></mifosx-login-form>
}
@if (resetPassword) {
<mifosx-reset-password></mifosx-reset-password>
}
@if (twoFactorAuthenticationRequired) {
<mifosx-two-factor-authentication></mifosx-two-factor-authentication>
}
<!-- Language Selector -->
<div class="settings-item">
<span class="settings-label">
<mifosx-m3-icon name="language"></mifosx-m3-icon>
{{ 'labels.heading.Language' | translate }}
</span>
<mifosx-language-selector appearance="outline" [showLabel]="false"></mifosx-language-selector>
</div>
<!-- Version Info Section -->
<div class="login-version-info" *ngIf="displayBackendInfo"></div>
<!-- Resources Links (hidden in production mode) -->
@if (!productionMode) {
<div class="resources-section">
<div class="resources-branding"></div>
<!-- Server Selector -->
@if (allowServerSwitch()) {
<div class="settings-item">
<span class="settings-label">
<mifosx-m3-icon name="dns"></mifosx-m3-icon>
{{ 'labels.heading.Server' | translate }}
</span>
<mifosx-server-selector appearance="outline" [showLabel]="false"></mifosx-server-selector>
</div>
}
</div>
<!-- Footer -->
<div class="login-footer">
<div class="settings-panel-footer">
<button
mat-icon-button
mat-button
(click)="reloadSettings()"
class="reload-button"
title="Reload Settings"
matTooltip="Reload Settings"
attr.aria-label="Reload Settings"
class="reload-settings-btn"
>
<mifosx-m3-icon name="refresh"></mifosx-m3-icon>
{{ 'labels.buttons.Reload' | translate }}
</button>
</div>
</div>
}
<!-- Floating Glass Login Card -->
<div class="glass-card-container">
<div class="glass-card" @cardAnimation>
<!-- Logo Section -->
<div class="logo-section">
@if (!themeDarkEnabled) {
<img [src]="logoPath" (error)="onLogoError()" alt="{{ 'APP_NAME' | translate }} Logo" class="logo-image" />
} @else {
<img
[src]="logoPathDark"
(error)="onLogoErrorDark()"
alt="{{ 'APP_NAME' | translate }} Logo"
class="logo-image"
/>
}
</div>
<!-- Welcome Text -->
<div class="welcome-section">
<h1 class="welcome-title">{{ 'labels.heading.Welcome Back' | translate }}</h1>
<p class="welcome-subtitle">{{ 'labels.text.Sign in to continue' | translate }}</p>
</div>
<!-- Tenant Selector -->
@if (showTenantSelector) {
<div class="tenant-section">
<mifosx-tenant-selector></mifosx-tenant-selector>
</div>
}
<!-- Login Forms -->
@if (!resetPassword && !twoFactorAuthenticationRequired) {
<mifosx-login-form></mifosx-login-form>
}
@if (resetPassword) {
<mifosx-reset-password></mifosx-reset-password>
}
@if (twoFactorAuthenticationRequired) {
<mifosx-two-factor-authentication></mifosx-two-factor-authentication>
}
<!-- Version Info Section -->
<div class="login-version-info" *ngIf="displayBackendInfo"></div>
<!-- Branding Footer -->
@if (!productionMode) {
<div class="card-footer">
<span class="footer-text">
{{ 'APP_NAME' | translate }}
</span>
</div>
}
</div>
</div>
</div>
<!-- Resource Menus -->
<!-- Resource Menus (kept for compatibility) -->
<mat-menu #resourcesMenu="matMenu" class="modern-menu">
<a [href]="'userManual' | documentationLink" target="_blank" rel="noopener noreferrer" mat-menu-item>
<fa-icon icon="book-open" class="menu-icon"></fa-icon>