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
@@ -7,9 +7,10 @@
-->
@if (showData) {
<div class="tab-container mat-typography">
<div class="tasks-header">
<mat-form-field class="tasks-search-field">
<div class="cv-tab-content">
<div class="cv-action-bar">
<mat-form-field appearance="outline" class="cv-search-field">
<mat-icon matPrefix>search</mat-icon>
<input
#filterInput
matInput
@@ -17,71 +18,72 @@
(keyup)="applyFilter(filterInput.value)"
/>
</mat-form-field>
<button
mat-raised-button
color="success"
*mifosxHasPermission="'ACTIVATE_CLIENT'"
(click)="approveClients()"
class="tasks-action-btn"
>
<fa-icon icon="check" class="m-r-10"></fa-icon>{{ 'labels.buttons.Approve' | translate }}
</button>
<div class="cv-action-buttons">
<button
mat-stroked-button
class="cv-btn cv-btn-approve"
*mifosxHasPermission="'ACTIVATE_CLIENT'"
(click)="approveClients()"
>
<fa-icon icon="check" class="m-r-10"></fa-icon>{{ 'labels.buttons.Approve' | translate }}
</button>
</div>
</div>
@for (client of groupedClients | keyvalue; track client) {
<h3>{{ client.key }}</h3>
<h3 class="cv-group-title">{{ client.key }}</h3>
@if (client.value.length > 0) {
<table mat-table [dataSource]="client.value | accountsFilter: 'clientApproval'">
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef>
<mat-checkbox
(change)="$event ? masterToggle(client.value) : null"
[checked]="selection.hasValue() && isAllSelected(client.value)"
[indeterminate]="selection.hasValue() && !isAllSelected(client.value)"
[aria-label]="checkboxLabel(client.value)"
>
</mat-checkbox>
</th>
<td mat-cell *matCellDef="let row">
<mat-checkbox
(click)="$event.stopPropagation()"
(change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)"
[aria-label]="checkboxLabel(row)"
>
</mat-checkbox>
</td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.name' | translate }}</th>
<td mat-cell *matCellDef="let element" class="view-details" [routerLink]="['../../clients', element.id]">
{{ element.displayName }}
</td>
</ng-container>
<ng-container matColumnDef="accountNumber">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Account Number' | translate }}</th>
<td mat-cell *matCellDef="let element" class="view-details" [routerLink]="['../../clients', element.id]">
{{ element.accountNo }}
</td>
</ng-container>
<ng-container matColumnDef="staff">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Staff' | translate }}</th>
<td mat-cell *matCellDef="let element" class="view-details" [routerLink]="['../../clients', element.id]">
{{ element.staffName }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns" (click)="selection.toggle(row)"></tr>
</table>
<div class="table-container cv-group-table">
<table mat-table [dataSource]="client.value | accountsFilter: 'clientApproval'" class="modern-table">
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef>
<mat-checkbox
(change)="$event ? masterToggle(client.value) : null"
[checked]="selection.hasValue() && isAllSelected(client.value)"
[indeterminate]="selection.hasValue() && !isAllSelected(client.value)"
[aria-label]="checkboxLabel(client.value)"
>
</mat-checkbox>
</th>
<td mat-cell *matCellDef="let row">
<mat-checkbox
(click)="$event.stopPropagation()"
(change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)"
[aria-label]="checkboxLabel(row)"
>
</mat-checkbox>
</td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.name' | translate }}</th>
<td mat-cell *matCellDef="let element" class="cell-link" [routerLink]="['../../clients', element.id]">
{{ element.displayName }}
</td>
</ng-container>
<ng-container matColumnDef="accountNumber">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Account Number' | translate }}</th>
<td mat-cell *matCellDef="let element" class="cell-mono" [routerLink]="['../../clients', element.id]" style="cursor: pointer;">
{{ element.accountNo }}
</td>
</ng-container>
<ng-container matColumnDef="staff">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Staff' | translate }}</th>
<td mat-cell *matCellDef="let element" [routerLink]="['../../clients', element.id]" style="cursor: pointer;">
{{ element.staffName }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns" (click)="selection.toggle(row)" class="table-row"></tr>
</table>
</div>
}
}
</div>
}
@if (!showData) {
<div class="alert">
<div class="message">
<i class="fa fa-exclamation-circle alert-check"></i>
{{ 'labels.text.No pending loans for approval' | translate }}
</div>
<div class="empty-state">
<i class="fas fa-user-check empty-icon"></i>
<p class="empty-text">{{ 'labels.text.No pending loans for approval' | translate }}</p>
</div>
}