fix(clients): block Alternate Mobile No from matching Mobile No
Same number in both fields defeats the point of having a second contact route, and re-running DIP on an identical number is pointless. Added a cross-field validator on alternateMobileNo, re-checked whenever mobileNo changes, with a matching error message and the Verify-with-DIP button disabled while the clash exists. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+10
-1
@@ -969,6 +969,11 @@
|
|||||||
createClientForm.get('alternateMobileNo')?.touched
|
createClientForm.get('alternateMobileNo')?.touched
|
||||||
) {
|
) {
|
||||||
<mat-error>Enter valid 10-digit number (starts with 6-9)</mat-error>
|
<mat-error>Enter valid 10-digit number (starts with 6-9)</mat-error>
|
||||||
|
} @else if (
|
||||||
|
createClientForm.get('alternateMobileNo')?.hasError('sameAsMobile') &&
|
||||||
|
createClientForm.get('alternateMobileNo')?.touched
|
||||||
|
) {
|
||||||
|
<mat-error>Alternate number can't be the same as Mobile No</mat-error>
|
||||||
}
|
}
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
@@ -979,7 +984,11 @@
|
|||||||
color="primary"
|
color="primary"
|
||||||
type="button"
|
type="button"
|
||||||
class="verify-btn"
|
class="verify-btn"
|
||||||
[disabled]="readOnly || createClientForm.get('alternateMobileNo')?.value?.length !== 10"
|
[disabled]="
|
||||||
|
readOnly ||
|
||||||
|
createClientForm.get('alternateMobileNo')?.value?.length !== 10 ||
|
||||||
|
createClientForm.get('alternateMobileNo')?.hasError('sameAsMobile')
|
||||||
|
"
|
||||||
(click)="verifyAlternateDIP()"
|
(click)="verifyAlternateDIP()"
|
||||||
>
|
>
|
||||||
<fa-icon icon="shield-alt" class="m-r-10"></fa-icon>
|
<fa-icon icon="shield-alt" class="m-r-10"></fa-icon>
|
||||||
|
|||||||
+20
-2
@@ -25,7 +25,10 @@ import {
|
|||||||
UntypedFormGroup,
|
UntypedFormGroup,
|
||||||
Validators,
|
Validators,
|
||||||
UntypedFormControl,
|
UntypedFormControl,
|
||||||
ReactiveFormsModule
|
ReactiveFormsModule,
|
||||||
|
ValidatorFn,
|
||||||
|
AbstractControl,
|
||||||
|
ValidationErrors
|
||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import { Subject, Subscription, merge } from 'rxjs';
|
import { Subject, Subscription, merge } from 'rxjs';
|
||||||
import { filter, switchMap, takeUntil } from 'rxjs/operators';
|
import { filter, switchMap, takeUntil } from 'rxjs/operators';
|
||||||
@@ -922,6 +925,16 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Alternate Mobile No must differ from Mobile No — the same number saved in both fields is
|
||||||
|
* meaningless (there's no second contact route) and the DIP checks would just repeat. */
|
||||||
|
private notSameAsMobileNoValidator(): ValidatorFn {
|
||||||
|
return (control: AbstractControl): ValidationErrors | null => {
|
||||||
|
const value = control.value;
|
||||||
|
const mobileNo = control.parent?.get('mobileNo')?.value;
|
||||||
|
return value && mobileNo && value === mobileNo ? { sameAsMobile: true } : null;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates the client form.
|
* Creates the client form.
|
||||||
*/
|
*/
|
||||||
@@ -961,7 +974,8 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges
|
|||||||
'',
|
'',
|
||||||
[
|
[
|
||||||
Validators.pattern(/^[6-9]\d{9}$/),
|
Validators.pattern(/^[6-9]\d{9}$/),
|
||||||
Validators.maxLength(10)
|
Validators.maxLength(10),
|
||||||
|
this.notSameAsMobileNoValidator()
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
emailAddress: [
|
emailAddress: [
|
||||||
@@ -1334,6 +1348,10 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges
|
|||||||
// invalid) and its own reset never had a chance to run.
|
// invalid) and its own reset never had a chance to run.
|
||||||
this.mobileOtpVerified = false;
|
this.mobileOtpVerified = false;
|
||||||
this.mobileNewOtpId = null;
|
this.mobileNewOtpId = null;
|
||||||
|
// Alternate Mobile No's "not same as Mobile No" validator reads mobileNo's current
|
||||||
|
// value, so re-run it here too — otherwise fixing mobileNo away from a clash leaves
|
||||||
|
// the alternate field's error stuck until the user also edits that field.
|
||||||
|
this.createClientForm.get('alternateMobileNo')?.updateValueAndValidity({ emitEvent: false });
|
||||||
});
|
});
|
||||||
|
|
||||||
this.createClientForm
|
this.createClientForm
|
||||||
|
|||||||
Reference in New Issue
Block a user