- {{ 'labels.inputs.accounting.' + taxComponentData.creditAccountType.value | translate }}
+ {{ taxComponentData.creditAccountType.value | translateCatalog }}
diff --git a/src/app/savings/savings-account-view/savings-account-view.component.html b/src/app/savings/savings-account-view/savings-account-view.component.html
index b4f997636..f9b336c7b 100644
--- a/src/app/savings/savings-account-view/savings-account-view.component.html
+++ b/src/app/savings/savings-account-view/savings-account-view.component.html
@@ -19,8 +19,9 @@
[matTooltip]="savingsAccountData.status.value" *ngIf="!savingsAccountData.subStatus.block">
- {{'labels.inputs.Savings Product' | translate}} : {{savingsAccountData.savingsProductName}}
-
+
{{'labels.inputs.Savings Product' | translate}} :
+
+
{{'labels.text.' + entityType | translate}} {{"labels.inputs.name" | translate}}: {{savingsAccountData.clientName ||
diff --git a/src/app/search/search-page/search-page.component.ts b/src/app/search/search-page/search-page.component.ts
index e5666613c..ad10c6f30 100644
--- a/src/app/search/search-page/search-page.component.ts
+++ b/src/app/search/search-page/search-page.component.ts
@@ -51,6 +51,9 @@ export class SearchPageComponent {
case 'CLIENT':
this.router.navigate(['clients', entity.entityId, 'general']);
break;
+ case 'CLIENTIDENTIFIER':
+ this.router.navigate(['clients', entity.parentId, 'general']);
+ break;
case 'CENTER':
this.router.navigate(['centers', entity.entityId]);
break;
diff --git a/src/app/shared/change-password-dialog/change-password-dialog.component.ts b/src/app/shared/change-password-dialog/change-password-dialog.component.ts
index d193021b1..64a710056 100644
--- a/src/app/shared/change-password-dialog/change-password-dialog.component.ts
+++ b/src/app/shared/change-password-dialog/change-password-dialog.component.ts
@@ -3,6 +3,7 @@ import { Component, OnInit, Inject } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { UntypedFormBuilder, Validators, ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';
import { Subscription } from 'rxjs';
+import { PasswordsUtility } from 'app/core/utils/passwords-utility';
/**
* Change Password Dialog component.
@@ -23,7 +24,8 @@ export class ChangePasswordDialogComponent implements OnInit {
*/
constructor(public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: any,
- private formBuilder: UntypedFormBuilder) { }
+ private formBuilder: UntypedFormBuilder,
+ private passwordsUtility: PasswordsUtility) { }
ngOnInit() {
this.createChangePasswordForm();
@@ -32,7 +34,7 @@ export class ChangePasswordDialogComponent implements OnInit {
/** Change Password form */
createChangePasswordForm() {
this.changePasswordForm = this.formBuilder.group({
- 'password': ['', [Validators.required, Validators.pattern('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*[#$@$!%*?&])[A-Za-z\d#$@$!%*?&].{8,}$'), Validators.maxLength(50), Validators.minLength(8)]],
+ 'password': ['', this.passwordsUtility.getPasswordValidators()],
'repeatPassword': ['', [Validators.required, this.confirmPassword('password')]]
});
}
diff --git a/src/app/shared/long-text/long-text.component.html b/src/app/shared/long-text/long-text.component.html
new file mode 100644
index 000000000..6fe828561
--- /dev/null
+++ b/src/app/shared/long-text/long-text.component.html
@@ -0,0 +1,5 @@
+
+
+ {{ textValue | truncateText:chars }}...
+ {{ textValue }}
+
\ No newline at end of file
diff --git a/src/app/shared/long-text/long-text.component.scss b/src/app/shared/long-text/long-text.component.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/shared/long-text/long-text.component.spec.ts b/src/app/shared/long-text/long-text.component.spec.ts
new file mode 100644
index 000000000..c3b27fd69
--- /dev/null
+++ b/src/app/shared/long-text/long-text.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { LongTextComponent } from './long-text.component';
+
+describe('LongTextComponent', () => {
+ let component: LongTextComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ declarations: [ LongTextComponent ]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(LongTextComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/shared/long-text/long-text.component.ts b/src/app/shared/long-text/long-text.component.ts
new file mode 100644
index 000000000..1bfa9e438
--- /dev/null
+++ b/src/app/shared/long-text/long-text.component.ts
@@ -0,0 +1,37 @@
+import { Component, Input, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'mifosx-long-text',
+ templateUrl: './long-text.component.html',
+ styleUrls: ['./long-text.component.scss']
+})
+export class LongTextComponent implements OnInit {
+ @Input() textValue: string;
+ @Input() chars = 30;
+
+ iconVisible = false;
+ displayL = false;
+ displayR = true;
+ emptyValue = false;
+
+ constructor() { }
+
+ ngOnInit(): void {
+ this.emptyValue = (!this.textValue || this.textValue === '');
+ }
+
+ isLongValue(): boolean {
+ if (this.textValue == null) {
+ return false;
+ }
+ return (this.textValue.length > 25);
+ }
+
+ mouseEnter() {
+ this.iconVisible = true;
+ }
+
+ mouseLeave() {
+ this.iconVisible = false;
+ }
+}
diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts
index 1040f0fac..de960d999 100644
--- a/src/app/shared/shared.module.ts
+++ b/src/app/shared/shared.module.ts
@@ -47,6 +47,7 @@ import { GlAccountSelectorComponent } from './accounting/gl-account-selector/gl-
import { GlAccountDisplayComponent } from './accounting/gl-account-display/gl-account-display.component';
import { ViewSavingsAccountingDetailsComponent } from './accounting/view-savings-accounting-details/view-savings-accounting-details.component';
import { ThemeToggleComponent } from './theme-toggle/theme-toggle.component';
+import { LongTextComponent } from './long-text/long-text.component';
/**
* Shared Module
@@ -100,7 +101,8 @@ import { ThemeToggleComponent } from './theme-toggle/theme-toggle.component';
GlAccountSelectorComponent,
GlAccountDisplayComponent,
ViewSavingsAccountingDetailsComponent,
- ThemeToggleComponent
+ ThemeToggleComponent,
+ LongTextComponent
],
exports: [
FileUploadComponent,
@@ -132,7 +134,8 @@ import { ThemeToggleComponent } from './theme-toggle/theme-toggle.component';
GlAccountSelectorComponent,
GlAccountDisplayComponent,
ViewSavingsAccountingDetailsComponent,
- ThemeToggleComponent
+ ThemeToggleComponent,
+ LongTextComponent
]
})
export class SharedModule { }
diff --git a/src/app/users/create-user/create-user.component.html b/src/app/users/create-user/create-user.component.html
index e56e0388b..6cccf7f0f 100644
--- a/src/app/users/create-user/create-user.component.html
+++ b/src/app/users/create-user/create-user.component.html
@@ -67,6 +67,15 @@
{{'labels.inputs.Password' | translate}} {{"labels.commons.is" | translate}} {{"labels.commons.required" | translate}}
+
+ {{'labels.commons.Password should be at least' | translate }} {{'labels.commons.8 characters long' | translate }}
+
+
+ {{'labels.commons.Password should not be more than' | translate }} {{'labels.commons.50 characters long' | translate }}
+
+
+ {{'labels.commons.Password should include a' | translate }} {{'labels.commons.numeral' | translate }} {{'labels.commons.and at' | translate }} {{'labels.commons.least one uppercase' | translate }} ,{{'labels.commons.lowercase and special character' | translate }}
+
@@ -79,7 +88,7 @@
- {{'labels.inputs.Passwords' | translate}} {{"labels.commons.do not match' | translate}}
+ {{'labels.inputs.Passwords' | translate}} {{'labels.commons.do not match' | translate}}
diff --git a/src/app/users/create-user/create-user.component.ts b/src/app/users/create-user/create-user.component.ts
index bce97913b..9a8bd47b2 100644
--- a/src/app/users/create-user/create-user.component.ts
+++ b/src/app/users/create-user/create-user.component.ts
@@ -8,13 +8,12 @@ import { MatDialog } from '@angular/material/dialog';
/** Custom Services */
import { UsersService } from '../users.service';
import { PopoverService } from '../../configuration-wizard/popover/popover.service';
-import { ConfigurationWizardService } from '../../configuration-wizard/configuration-wizard.service';
-
-/** Custom Validators */
-import { confirmPasswordValidator } from '../../login/reset-password/confirm-password.validator';
/** Custom Dialog Component */
-import { ContinueSetupDialogComponent } from '../../configuration-wizard/continue-setup-dialog/continue-setup-dialog.component';
+import { PasswordsUtility } from 'app/core/utils/passwords-utility';
+import { confirmPasswordValidator } from 'app/login/reset-password/confirm-password.validator';
+import { ConfigurationWizardService } from 'app/configuration-wizard/configuration-wizard.service';
+import { ContinueSetupDialogComponent } from 'app/configuration-wizard/continue-setup-dialog/continue-setup-dialog.component';
/**
* Create user component.
@@ -55,7 +54,8 @@ export class CreateUserComponent implements OnInit, AfterViewInit {
private router: Router,
private popoverService: PopoverService,
private configurationWizardService: ConfigurationWizardService,
- public dialog: MatDialog) {
+ private dialog: MatDialog,
+ private passwordsUtility: PasswordsUtility) {
this.route.data.subscribe((data: {
usersTemplate: any
}) => {
@@ -112,8 +112,8 @@ export class CreateUserComponent implements OnInit, AfterViewInit {
this.userForm.removeControl('repeatPassword');
this.userForm.get('email').setValidators([Validators.required, Validators.email]);
} else {
- this.userForm.addControl('password', new UntypedFormControl('', Validators.required));
- this.userForm.addControl('repeatPassword', new UntypedFormControl('', Validators.required));
+ this.userForm.addControl('password', new UntypedFormControl('', this.passwordsUtility.getPasswordValidators()));
+ this.userForm.addControl('repeatPassword', new UntypedFormControl('', [Validators.required, this.passwordsUtility.confirmPassword('password')]));
this.userForm.get('email').setValidators([Validators.email]);
}
this.userForm.get('email').updateValueAndValidity();
diff --git a/src/assets/translations/cs-CS.json b/src/assets/translations/cs-CS.json
index 8646d4466..75c5f9c53 100644
--- a/src/assets/translations/cs-CS.json
+++ b/src/assets/translations/cs-CS.json
@@ -644,6 +644,8 @@
"THURSDAY": "ČTVRTEK",
"FRIDAY": "PÁTEK",
"SATURDAY": "SOBOTA",
+ "Interest posting": "Zveřejnění zájmu",
+ "Amount on hold": "Částka na počkání",
"Invalid": "Neplatný"
},
"commons": {
diff --git a/src/assets/translations/de-DE.json b/src/assets/translations/de-DE.json
index 24a9a749c..803581877 100644
--- a/src/assets/translations/de-DE.json
+++ b/src/assets/translations/de-DE.json
@@ -644,6 +644,8 @@
"THURSDAY": "DONNERSTAG",
"FRIDAY": "FREITAG",
"SATURDAY": "SAMSTAG",
+ "Interest posting": "Zinsbuchung",
+ "Amount on hold": "Zurückgestellter Betrag",
"Invalid": "Ungültig"
},
"commons": {
diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json
index b4738595a..7cee3b6a0 100644
--- a/src/assets/translations/en-US.json
+++ b/src/assets/translations/en-US.json
@@ -644,6 +644,8 @@
"THURSDAY": "THURSDAY",
"FRIDAY": "FRIDAY",
"SATURDAY": "SATURDAY",
+ "Interest posting": "Interest posting",
+ "Amount on hold": "Amount on hold",
"Invalid": "Invalid"
},
"commons": {
diff --git a/src/assets/translations/es-MX.json b/src/assets/translations/es-MX.json
index ea0cc91a2..b9482eac8 100644
--- a/src/assets/translations/es-MX.json
+++ b/src/assets/translations/es-MX.json
@@ -644,6 +644,8 @@
"THURSDAY": "JUEVES",
"FRIDAY": "VIERNES",
"SATURDAY": "SÁBADO",
+ "Interest posting": "Intereses",
+ "Amount on hold": "Retención",
"Invalid": "Inválido"
},
"commons": {
diff --git a/src/assets/translations/fr-FR.json b/src/assets/translations/fr-FR.json
index 22b6f6b01..d862f57dd 100644
--- a/src/assets/translations/fr-FR.json
+++ b/src/assets/translations/fr-FR.json
@@ -644,6 +644,8 @@
"THURSDAY": "JEUDI",
"FRIDAY": "VENDREDI",
"SATURDAY": "SAMEDI",
+ "Interest posting": "Publication d'intérêt",
+ "Amount on hold": "Montant retenu",
"Invalid": "Invalide"
},
"commons": {
diff --git a/src/assets/translations/it-IT.json b/src/assets/translations/it-IT.json
index a0f859321..5d74dd800 100644
--- a/src/assets/translations/it-IT.json
+++ b/src/assets/translations/it-IT.json
@@ -644,6 +644,8 @@
"THURSDAY": "GIOVEDÌ",
"FRIDAY": "VENERDÌ",
"SATURDAY": "SABATO",
+ "Interest posting": "Pubblicazione di interessi",
+ "Amount on hold": "Importo sospeso",
"Invalid": "Non valido"
},
"commons": {
diff --git a/src/assets/translations/ko-KO.json b/src/assets/translations/ko-KO.json
index d91d7a37b..8b2686b58 100644
--- a/src/assets/translations/ko-KO.json
+++ b/src/assets/translations/ko-KO.json
@@ -644,6 +644,8 @@
"THURSDAY": "목요일",
"FRIDAY": "금요일",
"SATURDAY": "토요일",
+ "Interest posting": "관심 게시",
+ "Amount on hold": "보류 금액",
"Invalid": "유효하지 않은"
},
"commons": {
diff --git a/src/assets/translations/lt-LT.json b/src/assets/translations/lt-LT.json
index e328c1e5f..b3ab6c9b9 100644
--- a/src/assets/translations/lt-LT.json
+++ b/src/assets/translations/lt-LT.json
@@ -644,6 +644,8 @@
"THURSDAY": "KETVIRTADIENIS",
"FRIDAY": "PENKTADIENIS",
"SATURDAY": "ŠEŠTADIENIS",
+ "Interest posting": "Interesų skelbimas",
+ "Amount on hold": "Sulaikyta suma",
"Invalid": "Neteisinga"
},
"commons": {
diff --git a/src/assets/translations/lv-LV.json b/src/assets/translations/lv-LV.json
index d7dea0ab1..1dd7dc04f 100644
--- a/src/assets/translations/lv-LV.json
+++ b/src/assets/translations/lv-LV.json
@@ -644,6 +644,8 @@
"THURSDAY": "CETURTDIENA",
"FRIDAY": "PIEKTDIENA",
"SATURDAY": "SESTDIENA",
+ "Interest posting": "Interešu publicēšana",
+ "Amount on hold": "Aizturētā summa",
"Invalid": "Nederīgs"
},
"commons": {
diff --git a/src/assets/translations/ne-NE.json b/src/assets/translations/ne-NE.json
index bd2883c3f..3644e327c 100644
--- a/src/assets/translations/ne-NE.json
+++ b/src/assets/translations/ne-NE.json
@@ -644,6 +644,8 @@
"THURSDAY": "बिहीबार",
"FRIDAY": "शुक्रबार",
"SATURDAY": "शनिबार",
+ "Interest posting": "चासो पोस्टिंग",
+ "Amount on hold": "होल्डमा रहेको रकम",
"Invalid": "अवैध"
},
"commons": {
diff --git a/src/assets/translations/pt-PT.json b/src/assets/translations/pt-PT.json
index 77be5199e..b537cd2a0 100644
--- a/src/assets/translations/pt-PT.json
+++ b/src/assets/translations/pt-PT.json
@@ -644,6 +644,8 @@
"THURSDAY": "QUINTA-FEIRA",
"FRIDAY": "SEXTA-FEIRA",
"SATURDAY": "SÁBADO",
+ "Interest posting": "Postagem de interesse",
+ "Amount on hold": "Valor retido",
"Invalid": "Inválido"
},
"commons": {
diff --git a/src/assets/translations/sw-SW.json b/src/assets/translations/sw-SW.json
index 5d8c05a6b..beab022d4 100644
--- a/src/assets/translations/sw-SW.json
+++ b/src/assets/translations/sw-SW.json
@@ -644,6 +644,8 @@
"THURSDAY": "ALHAMISI",
"FRIDAY": "IJUMAA",
"SATURDAY": "JUMAMOSI",
+ "Interest posting": "Nia ya kuchapisha",
+ "Amount on hold": "Kiasi kilichohifadhiwa",
"Invalid": "Batili"
},
"commons": {