Skip to content

Commit 11aed82

Browse files
committed
MOBILE-4575 user: Sort user initials depending on translation
1 parent e439a22 commit 11aed82

File tree

3 files changed

+77
-13
lines changed

3 files changed

+77
-13
lines changed

src/core/features/user/lang.json

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"emailagain": "Email (again)",
1919
"errorloaduser": "Error loading user.",
2020
"firstname": "First name",
21+
"fullnamedisplay": "{{$a.firstname}} {{$a.lastname}}",
2122
"idnumber": "ID number",
2223
"institution": "Institution",
2324
"interests": "Interests",

src/core/features/user/services/user-helper.ts

+18-10
Original file line numberDiff line numberDiff line change
@@ -108,27 +108,35 @@ export class CoreUserHelperProvider {
108108
* @returns User initials.
109109
*/
110110
async getUserInitialsFromParts(parts: CoreUserNameParts): Promise<string> {
111+
const nameFields = ['firstname', 'lastname'];
112+
const dummyUser = {
113+
firstname: 'firstname',
114+
lastname: 'lastname',
115+
};
116+
const nameFormat = Translate.instant('core.user.fullnamedisplay', { $a:dummyUser });
117+
const availableFieldsSorted = nameFields
118+
.filter((field) => nameFormat.indexOf(field) >= 0)
119+
.sort((a, b) => nameFormat.indexOf(a) - nameFormat.indexOf(b));
120+
111121
if (!parts.firstname && !parts.lastname) {
112-
if (!parts.fullname && parts.userId) {
122+
if (parts.userId) {
113123
const user = await CoreUser.getProfile(parts.userId, undefined, true);
114-
parts.fullname = user.fullname || '';
115-
}
116-
117-
if (parts.fullname) {
124+
parts.firstname = user.firstname || '';
125+
parts.lastname = user.lastname || '';
126+
} else if (parts.fullname) {
127+
// It's a complete workaround.
118128
const split = parts.fullname.split(' ');
119-
120129
parts.firstname = split[0];
121130
if (split.length > 1) {
122131
parts.lastname = split[split.length - 1];
123132
}
124133
}
125134
}
126135

127-
if (!parts.firstname && !parts.lastname) {
128-
return 'UNK';
129-
}
136+
const initials = availableFieldsSorted.reduce((initials, fieldName) =>
137+
initials + (parts[fieldName]?.charAt(0) ?? ''), '');
130138

131-
return (parts.firstname?.charAt(0) || '') + (parts.lastname?.charAt(0) || '');
139+
return initials || 'UNK';
132140
}
133141

134142
/**

src/core/features/user/tests/user-helper.test.ts

+58-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,17 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
import { mockSingleton, mockTranslate } from '@/testing/utils';
1516
import { CoreUserHelper } from '../services/user-helper';
17+
import { CoreUser } from '../services/user';
1618

1719
describe('getUserInitialsFromParts', () => {
20+
beforeEach(() => {
21+
mockTranslate({
22+
'core.user.fullnamedisplay': '{{$a.firstname}} {{$a.lastname}}',
23+
});
24+
});
25+
1826
it('should return initials based on firstname and lastname', async () => {
1927
const parts = {
2028
firstname: 'John',
@@ -23,13 +31,53 @@ describe('getUserInitialsFromParts', () => {
2331
userId: 123,
2432
};
2533

26-
const result = await CoreUserHelper.getUserInitialsFromParts(parts);
34+
let result = await CoreUserHelper.getUserInitialsFromParts(parts);
2735

2836
expect(result).toEqual('JD');
37+
38+
mockTranslate({
39+
'core.user.fullnamedisplay': '{{$a.lastname}} {{$a.firstname}}',
40+
});
41+
42+
result = await CoreUserHelper.getUserInitialsFromParts(parts);
43+
44+
expect(result).toEqual('DJ');
45+
46+
mockTranslate({
47+
'core.user.fullnamedisplay': '{{$a.lastname}}',
48+
});
49+
50+
result = await CoreUserHelper.getUserInitialsFromParts(parts);
51+
52+
expect(result).toEqual('D');
53+
54+
mockTranslate({
55+
'core.user.fullnamedisplay': '{{$a.firstname}}',
56+
});
57+
58+
result = await CoreUserHelper.getUserInitialsFromParts(parts);
59+
60+
expect(result).toEqual('J');
61+
62+
mockTranslate({
63+
'core.user.fullnamedisplay': '{{$a.noname}}',
64+
});
65+
66+
result = await CoreUserHelper.getUserInitialsFromParts(parts);
67+
68+
expect(result).toEqual('UNK');
2969
});
3070

3171
it('should return initials based on fullname if firstname and lastname are missing', async () => {
32-
let parts = {
72+
mockSingleton(CoreUser, {
73+
getProfile: () => Promise.resolve({
74+
firstname: 'John',
75+
lastname: 'Doe',
76+
fullname: 'John Doe',
77+
id: 123,
78+
}) });
79+
80+
let parts: { firstname?: string; lastname?: string; fullname?: string; userId?: number } = {
3381
firstname: '',
3482
lastname: '',
3583
fullname: 'John Doe',
@@ -44,12 +92,19 @@ describe('getUserInitialsFromParts', () => {
4492
firstname: '',
4593
lastname: '',
4694
fullname: 'John Fitzgerald Doe',
47-
userId: 123,
4895
};
4996

5097
result = await CoreUserHelper.getUserInitialsFromParts(parts);
5198

5299
expect(result).toEqual('JD');
100+
101+
mockTranslate({
102+
'core.user.fullnamedisplay': '{{$a.lastname}} {{$a.firstname}}',
103+
});
104+
105+
result = await CoreUserHelper.getUserInitialsFromParts(parts);
106+
107+
expect(result).toEqual('DJ');
53108
});
54109

55110
it('should return UNK string if empty parts', async () => {

0 commit comments

Comments
 (0)