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
@@ -144,6 +144,54 @@
<div class="cv-cell__value">{{ clientViewData.occupation.name }}</div>
</div>
}
@if (clientViewData.mobileNo && clientViewData.dipVerified != null) {
<div class="cv-cell">
<div class="cv-cell__label">DIP Status</div>
<div class="cv-cell__value">
<span class="cv-badge"
[class.cv-badge--green]="clientViewData.dipVerified === true || clientViewData.dipVerified === 'true' || clientViewData.dipVerified === 1"
[class.cv-badge--yellow]="clientViewData.dipVerified !== true && clientViewData.dipVerified !== 'true' && clientViewData.dipVerified !== 1">
{{ (clientViewData.dipVerified === true || clientViewData.dipVerified === 'true' || clientViewData.dipVerified === 1) ? 'Verified' : 'Pending' }}
</span>
</div>
</div>
}
@if (clientViewData.nameVerified != null) {
<div class="cv-cell">
<div class="cv-cell__label">Sanctions Screening</div>
<div class="cv-cell__value">
<span class="cv-badge"
[class.cv-badge--green]="clientViewData.nameVerified === true || clientViewData.nameVerified === 'true' || clientViewData.nameVerified === 1"
[class.cv-badge--red]="clientViewData.nameVerified === false || clientViewData.nameVerified === 'false' || clientViewData.nameVerified === 0">
{{ (clientViewData.nameVerified === true || clientViewData.nameVerified === 'true' || clientViewData.nameVerified === 1) ? 'Clear' : 'Pending' }}
</span>
</div>
</div>
}
@if (clientViewData.nationality) {
<div class="cv-cell">
<div class="cv-cell__label">Nationality</div>
<div class="cv-cell__value">{{ clientViewData.nationality.name || clientViewData.nationality }}</div>
</div>
}
@if (clientViewData.maritalStatus) {
<div class="cv-cell">
<div class="cv-cell__label">Marital Status</div>
<div class="cv-cell__value">{{ clientViewData.maritalStatus.name }}</div>
</div>
}
@if (clientViewData.monthlyIncome != null && clientViewData.monthlyIncome !== '') {
<div class="cv-cell">
<div class="cv-cell__label">Monthly Income</div>
<div class="cv-cell__value">&#8377; {{ clientViewData.monthlyIncome | number }}</div>
</div>
}
@if (clientViewData.annualTurnover != null && clientViewData.annualTurnover !== '') {
<div class="cv-cell">
<div class="cv-cell__label">Annual Turnover</div>
<div class="cv-cell__value">&#8377; {{ clientViewData.annualTurnover | number }}</div>
</div>
}
@if (clientViewData.groups?.length > 0) {
<div class="cv-cell">
<div class="cv-cell__label">{{ 'labels.inputs.Member Of' | translate }}</div>
@@ -355,90 +403,48 @@
</span>
}
</mat-menu>
</mat-menu>
<div>
<nav mat-tab-nav-bar class="navigation-tabs" [tabPanel]="tabPanel">
<a
mat-tab-link
[routerLink]="['./general']"
routerLinkActive
#general="routerLinkActive"
[active]="general.isActive"
>
{{ 'labels.inputs.General' | translate }}
<nav mat-tab-nav-bar class="cv-tabs" [tabPanel]="tabPanel">
<a mat-tab-link [routerLink]="['./general']" routerLinkActive #general="routerLinkActive" [active]="general.isActive">
<i class="fa fa-tachometer cv-tab-icon"></i> {{ 'labels.inputs.General' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./personal-data']"
routerLinkActive
#personalData="routerLinkActive"
[active]="personalData.isActive"
>
{{ 'labels.inputs.Personal Data' | translate }}
<a mat-tab-link [routerLink]="['./personal-data']" routerLinkActive #personalData="routerLinkActive" [active]="personalData.isActive">
<i class="fa fa-user cv-tab-icon"></i> {{ 'labels.inputs.Personal Data' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./address']"
routerLinkActive
#address="routerLinkActive"
[active]="address.isActive"
>
{{ 'labels.inputs.Address' | translate }}
<a mat-tab-link [routerLink]="['./address']" routerLinkActive #address="routerLinkActive" [active]="address.isActive">
<i class="fa fa-map-marker cv-tab-icon"></i> {{ 'labels.inputs.Address' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./family-members']"
routerLinkActive
#familyMembers="routerLinkActive"
[active]="familyMembers.isActive"
>
{{ 'labels.inputs.Family Members' | translate }}
@if (clientViewData?.legalForm?.id !== 2) {
<a mat-tab-link [routerLink]="['./family-members']" routerLinkActive #familyMembers="routerLinkActive" [active]="familyMembers.isActive">
<i class="fa fa-users cv-tab-icon"></i> Family Members
</a>
}
<a mat-tab-link [routerLink]="['./nominees']" routerLinkActive #nomineesTab="routerLinkActive" [active]="nomineesTab.isActive">
<i class="fa fa-shield cv-tab-icon"></i> Nominee
</a>
<a
mat-tab-link
[routerLink]="['./identities']"
routerLinkActive
#identities="routerLinkActive"
[active]="identities.isActive"
*mifosxHasPermission="'READ_CLIENTIDENTIFIER'"
>
{{ 'labels.inputs.Identities' | translate }}
<a mat-tab-link [routerLink]="['./identities']" routerLinkActive #identities="routerLinkActive" [active]="identities.isActive" *mifosxHasPermission="'READ_CLIENTIDENTIFIER'">
<i class="fa fa-id-card cv-tab-icon"></i> {{ 'labels.inputs.Identities' | translate }}
</a>
<a mat-tab-link [routerLink]="['./kyc']" routerLinkActive #kyc="routerLinkActive" [active]="kyc.isActive">
{{ 'labels.inputs.KYC' | translate }}
<i class="fa fa-check-circle cv-tab-icon"></i> {{ 'labels.inputs.KYC' | translate }}
</a>
@if (clientViewData.legalForm?.id !== 1) {
<a mat-tab-link [routerLink]="['./entity-classification']" routerLinkActive #ecTab="routerLinkActive" [active]="ecTab.isActive">
<i class="fa fa-building cv-tab-icon"></i> Scheme &amp; Sector
</a>
}
<a mat-tab-link [routerLink]="['./ckyc']" routerLinkActive #ckyc="routerLinkActive" [active]="ckyc.isActive">
{{ 'labels.inputs.CKYC' | translate }}
<i class="fa fa-shield cv-tab-icon"></i> {{ 'labels.inputs.CKYC' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./form60']"
routerLinkActive
#form60="routerLinkActive"
[active]="form60.isActive"
>
{{ 'labels.inputs.Form 60' | translate }}
<a mat-tab-link [routerLink]="['./form60']" routerLinkActive #form60="routerLinkActive" [active]="form60.isActive">
<i class="fa fa-file-text cv-tab-icon"></i> {{ 'labels.inputs.Form 60' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./documents']"
routerLinkActive
#documents="routerLinkActive"
[active]="documents.isActive"
*mifosxHasPermission="'READ_DOCUMENT'"
>
{{ 'labels.inputs.Documents' | translate }}
<a mat-tab-link [routerLink]="['./documents']" routerLinkActive #documents="routerLinkActive" [active]="documents.isActive" *mifosxHasPermission="'READ_DOCUMENT'">
<i class="fa fa-folder-open cv-tab-icon"></i> {{ 'labels.inputs.Documents' | translate }}
</a>
<a
mat-tab-link
[routerLink]="['./notes']"
routerLinkActive
#notes="routerLinkActive"
[active]="notes.isActive"
*mifosxHasPermission="'READ_CLIENTNOTE'"
>
{{ 'labels.inputs.Notes' | translate }}
<a mat-tab-link [routerLink]="['./notes']" routerLinkActive #notes="routerLinkActive" [active]="notes.isActive" *mifosxHasPermission="'READ_CLIENTNOTE'">
<i class="fa fa-sticky-note cv-tab-icon"></i> {{ 'labels.inputs.Notes' | translate }}
</a>
@for (clientDatatable of clientDatatables; track clientDatatable) {
<a