Merge pull request 'third part registration' (#24) from mazdak/UX-1814 into dev-pending-01-01-2026

Reviewed-on: https://ct.mfsys.com.pk/aConnect/aConnect-UX/pulls/24
mazdak/UX-1887
Naeem Ullah 4 weeks ago
commit 2756a3faa5

@ -22,7 +22,7 @@
{{'thirdPartyRegistration' | translate}}
</div>
<div class="card-body">
<form>
<form [formGroup]="thirdPartyRegForm">
<div class="row g-3 mb-3">
<div class="col-md-6">
<div class="d-flex align-items-center gap-2">
@ -30,14 +30,17 @@
{{ 'ThirdPartyID' | translate }}<span
class="mandatory">*</span>
</label>
<div class="d-flex flex-column w-100">
<div class="password-wrapper position-relative w-100">
<input type="text" id="renewalDate"
formControlName="thirdPartyId"
class="form-control"
placeholder="{{ 'ThirdPartyID' | translate }}" />
<!-- <div *ngIf="vacForm.get('renewalDate')?.invalid && (vacForm.get('renewalDate')?.touched || isSubmitted)"
class="text-danger">
{{ 'requiredField' | translate }}
</div> -->
<div class="text-danger"
*ngIf="thirdPartyRegForm.get('thirdPartyId')?.touched && thirdPartyRegForm.get('thirdPartyId')?.invalid">
{{ 'fieldRequired' | translate }}
</div>
</div>
</div>
</div>
@ -51,7 +54,12 @@
<div class="d-flex flex-column w-100">
<input type="text" id="renewalDate"
class="form-control"
formControlName="thirdPartyName"
placeholder="{{ 'thirdPartyNamePlaceholder' | translate }}" />
<div class="text-danger" *ngIf="thirdPartyRegForm.get('thirdPartyName')?.touched && thirdPartyRegForm.get('thirdPartyName')?.invalid">
{{ 'fieldRequired' | translate }}
</div>
</div>
</div>
</div>
@ -67,11 +75,18 @@
<div class="d-flex flex-column w-100">
<input type="text" id="renewalDate"
class="form-control"
formControlName="email"
placeholder="{{ 'Email' | translate }}" />
<!-- <div *ngIf="vacForm.get('renewalDate')?.invalid && (vacForm.get('renewalDate')?.touched || isSubmitted)"
class="text-danger">
{{ 'requiredField' | translate }}
</div> -->
<div class="text-danger" *ngIf="thirdPartyRegForm.get('email')?.errors?.['required']
&& thirdPartyRegForm.get('email')?.touched">
{{ 'fieldRequired' | translate }}
</div>
<div class="text-danger" *ngIf="thirdPartyRegForm.get('email')?.errors?.['email']
&& thirdPartyRegForm.get('email')?.touched">
{{"invalidEmail" | translate}}
</div>
</div>
</div>
</div>
@ -85,8 +100,14 @@
<div class="d-flex flex-column w-100">
<input type="text" id="renewalDate"
class="form-control"
formControlName="address"
placeholder="{{ 'Address' | translate }}" />
<div class="text-danger" *ngIf="thirdPartyRegForm.get('address')?.touched && thirdPartyRegForm.get('address')?.invalid">
{{ 'fieldRequired' | translate }}
</div>
</div>
</div>
</div>
@ -101,11 +122,18 @@
<div class="d-flex flex-column w-100">
<input type="text" id="renewalDate"
class="form-control"
formControlName="phoneNumber"
placeholder="{{ 'phoneNumberPlaceholder' | translate }}" />
<!-- <div *ngIf="vacForm.get('renewalDate')?.invalid && (vacForm.get('renewalDate')?.touched || isSubmitted)"
class="text-danger">
{{ 'requiredField' | translate }}
</div> -->
<div class="text-danger"
*ngIf="thirdPartyRegForm.get('phoneNumber')?.touched && thirdPartyRegForm.get('phoneNumber')?.errors?.['required']">
{{ 'fieldRequired' | translate }}
</div>
<div class="text-danger" *ngIf="thirdPartyRegForm.get('phoneNumber')?.touched
&& thirdPartyRegForm.get('phoneNumber')?.errors?.['pattern']">
{{"regPhoneNo"|translate}}
</div>
</div>
</div>
</div>
@ -119,7 +147,12 @@
<div class="d-flex flex-column w-100">
<input type="text" id="renewalDate"
class="form-control"
formControlName="newNumberOfAccounts"
placeholder="{{ 'newNoOfAccountsPlaceholder' | translate }}" />
<div class="text-danger" *ngIf="thirdPartyRegForm.get('newNumberOfAccounts')?.touched && thirdPartyRegForm.get('newNumberOfAccounts')?.invalid">
{{ 'fieldRequired' | translate }}
</div>
</div>
</div>
</div>
@ -133,17 +166,20 @@
{{ 'password' | translate }}<span
class="mandatory">*</span>
</label>
<div
class="password-wrapper position-relative w-100">
<input [type]="passwordType"
autocomplete="new-password"
class="form-control pe-5"
<div class="password-wrapper position-relative w-100">
<input [type]="passwordType" autocomplete="new-password" class="form-control pe-5" formControlName="password"
placeholder="{{ 'password' | translate }}">
<app-password-hide-show class="password-eye"
[showPassword]="true"
(onEyeClick)="togglePasswordType()">
<app-password-hide-show class="password-eye" [showPassword]="true" (onEyeClick)="togglePasswordType()">
</app-password-hide-show>
<div class="text-danger"
*ngIf="thirdPartyRegForm.get('password')?.touched && thirdPartyRegForm.get('password')?.errors?.['required']">
{{ 'fieldRequired' | translate }}
</div>
<div class="text-danger" *ngIf="passwordError">
{{ 'passwordTooShort' | translate }}
</div>
</div>
</div>
@ -152,18 +188,10 @@
</div>
<div class="row g-3 mb-3">
<div class="col-md-6 ms-auto text-end">
<button
class="btn btn-primary waves-effect waves-light">{{'save'
<button class="btn btn-primary waves-effect waves-light" (click)=" onSubmit()">{{'save'
|
translate}}</button>
<!-- <button
class="btn btn-primary waves-effect waves-light"
>{{'update' |
translate}}</button>
<button
class="btn btn-primary waves-effect waves-light"
>{{'cancel' |
translate}}</button> -->
</div>
</div>
</form>

@ -1,28 +1,70 @@
import { CommonModule } from '@angular/common';
import { Component, ViewChild } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { Component, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { TranslateModule } from '@ngx-translate/core';
import { NgSelectModule } from '@ng-select/ng-select';
import { PasswordHideShowComponent } from '../../shared/components/password-hide-show/password-hide-show.component';
import { pageSizeOptions } from '../../utils/app.constants';
import { URIKey } from '../../utils/uri-enums';
import { HttpURIService } from '../../app.http.uri.service';
@Component({
selector: 'app-third-party-registration',
imports: [TranslateModule, CommonModule, FormsModule, PasswordHideShowComponent, NgSelectModule ],
imports: [TranslateModule, CommonModule, FormsModule, ReactiveFormsModule, PasswordHideShowComponent, NgSelectModule ],
templateUrl: './third-party-registration.component.html',
styleUrl: './third-party-registration.component.scss'
})
export class ThirdPartyRegistrationComponent {
export class ThirdPartyRegistrationComponent implements OnInit {
thirdPartyRegForm! : FormGroup;
searchText: string = '';
passwordType: string = 'password';
renewalDataExpanded = true;
pageSizeOptions = pageSizeOptions;
itemsPerPage: number = 5;
constructor(private fb: FormBuilder, private httpURIService: HttpURIService){}
@ViewChild(PasswordHideShowComponent) passwordHideShow?: PasswordHideShowComponent;
togglePasswordType() {
this.passwordType = this.passwordHideShow?.showPassword ? 'password' : 'text';
}
ngOnInit(): void{
this.thirdPartyRegForm = this.fb.group({
thirdPartyId: ['', [Validators.required]],
thirdPartyName: ['',[Validators.required]],
email: ['',[Validators.required, Validators.email]],
address: ['',[Validators.required]],
phoneNumber: ['',[Validators.required, Validators.pattern('^[0-9]{10}$') ], ],
newNumberOfAccounts: ['',[Validators.required]],
password: ['',[Validators.required, Validators.minLength(6)]],
});
}
get passwordError(){
const control = this.thirdPartyRegForm.get('password');
if (!control || !control.touched) return null;
if (control.hasError('minlength')) return 'passwordTooShort';
return null;
}
onSubmit(){
if(this.thirdPartyRegForm.invalid){return}
const payload = {
thirdPartyId: this.thirdPartyRegForm.value.thirdPartyId,
thirdPartyName: this.thirdPartyRegForm.value.thirdPartyName,
email: this.thirdPartyRegForm.value.email,
address: this.thirdPartyRegForm.value.address,
phoneNumber: this.thirdPartyRegForm.value.phoneNumber,
newNumberOfAccounts: this.thirdPartyRegForm.value.newNumberOfAccounts,
password: this.thirdPartyRegForm.value.password
};
this.httpURIService.requestPOST(URIKey.THIRD_PARTY_REGISTER_URI, payload)
.subscribe();
}
}

@ -10,5 +10,6 @@ export enum URIKey {
USER_GET_PERMISSIONS = "USER_GET_PERMISSIONS",
GET_ALL_USER_URI = "GET_ALL_USER_URI",
RESET_PASSWORD_URI = "RESET_PASSWORD_URI",
CHANGE_PASSWORD_URI = "CHANGE_PASSWORD_URI"
CHANGE_PASSWORD_URI = "CHANGE_PASSWORD_URI",
THIRD_PARTY_REGISTER_URI = "THIRD_PARTY_REGISTER_URI"
}

@ -49,7 +49,7 @@
},
{
"Id" : "ENTITY_RESET_PASSWORD_URI",
"URI": "/user/reset-password",
"URI": "/user/resetPassword",
"UUID": "RESET_PASSWORD_URI"
},
{
@ -61,6 +61,11 @@
"Id" : "ENTITY_USER_SAVE_PERMISSION",
"URI": "/user/updatePermissions",
"UUID": "USER_SAVE_PERMISSION"
},
{
"Id" : "ENTITY_THIRD_PARTY_REGISTER_URI",
"URI": "/user/thirdPartyRegisteration",
"UUID": "THIRD_PARTY_REGISTER_URI"
}
]
}

@ -84,9 +84,11 @@
"name":"اسم",
"EnterThirdPartyName":"أدخل اسم الطرف الثالث",
"Email":"البريد الإلكتروني",
"invalidEmail": "أدخل بريدًا إلكترونيًا صالحًا يحتوي على @",
"Address":"تبوك",
"phoneNumber":"رقم الهاتف",
"PhoneNumberPlaceHolder":"أدخل رقم الهاتف",
"regPhoneNo": "يجب أن يتكون رقم الهاتف من 10 أرقام",
"NewNoOfAccounts":"عدد جديد من الحسابات",
"EnterNewNumberOfAccounts":"أدخل عددًا جديدًا من الحسابات",
"TotalNoOfAccounts":"العدد الإجمالي للحسابات",

@ -87,6 +87,7 @@
"Address":"Address",
"phoneNumber":"Phone Number",
"PhoneNumberPlaceHolder":"Enter Phone Number",
"regPhoneNo": "Phone number must be 10 digits",
"NewNoOfAccounts":"New No of Accounts",
"EnterNewNumberOfAccounts":"Enter New Number of Accounts",
"TotalNoOfAccounts":"Total No of Accounts",
@ -176,6 +177,7 @@
"emailLabel": "Email",
"emailRequiredError": "Email is required.",
"invalidEmailFormatError": "Invalid email format.",
"invalidEmail": "Enter a valid email with @",
"passNotMatch": "Password does not match",
"POR_ORGACODE": "Organization ID",
"purposeSetup": "Configure Transaction Purpose",

Loading…
Cancel
Save