Skip to content

Commit 944e65a

Browse files
Development: Implement quality of life improvements for applications (#462)
* fix: cv get correct file name * fix: desired start date in application form not required anymore * feat: added nationalities * fix: removed arrow for future grade translation feature * feat: filter for nationality * feat: application detail page for applicants links to edit page and shows state
1 parent 65c26e0 commit 944e65a

14 files changed

Lines changed: 291 additions & 88 deletions

src/main/java/de/tum/cit/aet/application/service/ApplicationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ public void uploadCV(MultipartFile cv, Application application) {
326326
UUID userId = currentUserService.getUserId();
327327
User user = userRepository.findById(userId).orElseThrow(() -> EntityNotFoundException.forId("User", userId));
328328
Document document = documentService.upload(cv, user);
329-
updateDocumentDictionaries(application, DocumentType.CV, Set.of(Pair.of(document, cv.getName())));
329+
updateDocumentDictionaries(application, DocumentType.CV, Set.of(Pair.of(document, cv.getOriginalFilename())));
330330
}
331331

332332
/**

src/main/webapp/app/application/application-creation/application-creation-page1/application-creation-page1.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
id="nationality"
5757
[(selected)]="data().nationality"
5858
(selectedChange)="emitChanged()"
59+
[filter]="true"
5960
/>
6061
</div>
6162
</div>

src/main/webapp/app/application/application-creation/application-creation-page1/application-creation-page1.component.ts

Lines changed: 2 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { SelectComponent, SelectOption } from '../../../shared/components/atoms/
1010
import { DatePickerComponent } from '../../../shared/components/atoms/datepicker/datepicker.component';
1111
import { StringInputComponent } from '../../../shared/components/atoms/string-input/string-input.component';
1212

13+
import { selectNationality } from './nationalities';
14+
1315
export type ApplicationCreationPage1Data = {
1416
firstName: string;
1517
lastName: string;
@@ -38,59 +40,6 @@ export const selectLanguage: SelectOption[] = [
3840
{ value: 'en', name: 'English' },
3941
];
4042

41-
export const selectNationality: SelectOption[] = [
42-
{ value: 'al', name: 'Albanian' },
43-
{ value: 'ad', name: 'Andorran' },
44-
{ value: 'am', name: 'Armenian' },
45-
{ value: 'at', name: 'Austrian' },
46-
{ value: 'az', name: 'Azerbaijani' },
47-
{ value: 'by', name: 'Belarusian' },
48-
{ value: 'be', name: 'Belgian' },
49-
{ value: 'ba', name: 'Bosnian' },
50-
{ value: 'bg', name: 'Bulgarian' },
51-
{ value: 'hr', name: 'Croatian' },
52-
{ value: 'cy', name: 'Cypriot' },
53-
{ value: 'cz', name: 'Czech' },
54-
{ value: 'dk', name: 'Danish' },
55-
{ value: 'nl', name: 'Dutch' },
56-
{ value: 'ee', name: 'Estonian' },
57-
{ value: 'fi', name: 'Finnish' },
58-
{ value: 'fr', name: 'French' },
59-
{ value: 'ge', name: 'Georgian' },
60-
{ value: 'de', name: 'German' },
61-
{ value: 'gr', name: 'Greek' },
62-
{ value: 'hu', name: 'Hungarian' },
63-
{ value: 'is', name: 'Icelandic' },
64-
{ value: 'ie', name: 'Irish' },
65-
{ value: 'it', name: 'Italian' },
66-
{ value: 'kz', name: 'Kazakh' },
67-
{ value: 'xk', name: 'Kosovar' },
68-
{ value: 'lv', name: 'Latvian' },
69-
{ value: 'li', name: 'Liechtensteiner' },
70-
{ value: 'lt', name: 'Lithuanian' },
71-
{ value: 'lu', name: 'Luxembourgish' },
72-
{ value: 'mt', name: 'Maltese' },
73-
{ value: 'md', name: 'Moldovan' },
74-
{ value: 'mc', name: 'Monégasque' },
75-
{ value: 'me', name: 'Montenegrin' },
76-
{ value: 'mk', name: 'North Macedonian' },
77-
{ value: 'no', name: 'Norwegian' },
78-
{ value: 'pl', name: 'Polish' },
79-
{ value: 'pt', name: 'Portuguese' },
80-
{ value: 'ro', name: 'Romanian' },
81-
{ value: 'ru', name: 'Russian' },
82-
{ value: 'sm', name: 'San Marinese' },
83-
{ value: 'rs', name: 'Serbian' },
84-
{ value: 'sk', name: 'Slovak' },
85-
{ value: 'si', name: 'Slovenian' },
86-
{ value: 'es', name: 'Spanish' },
87-
{ value: 'se', name: 'Swedish' },
88-
{ value: 'ch', name: 'Swiss' },
89-
{ value: 'tr', name: 'Turkish' },
90-
{ value: 'ua', name: 'Ukrainian' },
91-
{ value: 'va', name: 'Vatican' },
92-
];
93-
9443
export const getPage1FromApplication = (application: ApplicationForApplicantDTO): ApplicationCreationPage1Data => {
9544
return {
9645
firstName: application.applicant?.user.firstName ?? '',
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
import { SelectOption } from 'app/shared/components/atoms/select/select.component';
2+
3+
export const selectNationality: SelectOption[] = [
4+
{ value: 'af', name: 'Afghan' },
5+
{ value: 'al', name: 'Albanian' },
6+
{ value: 'dz', name: 'Algerian' },
7+
{ value: 'ad', name: 'Andorran' },
8+
{ value: 'ao', name: 'Angolan' },
9+
{ value: 'ag', name: 'Antiguan/Barbudan' },
10+
{ value: 'ar', name: 'Argentine' },
11+
{ value: 'am', name: 'Armenian' },
12+
{ value: 'au', name: 'Australian' },
13+
{ value: 'at', name: 'Austrian' },
14+
{ value: 'az', name: 'Azerbaijani' },
15+
{ value: 'bs', name: 'Bahamian' },
16+
{ value: 'bh', name: 'Bahraini' },
17+
{ value: 'bd', name: 'Bangladeshi' },
18+
{ value: 'bb', name: 'Barbadian' },
19+
{ value: 'by', name: 'Belarusian' },
20+
{ value: 'be', name: 'Belgian' },
21+
{ value: 'bz', name: 'Belizean' },
22+
{ value: 'bj', name: 'Beninese' },
23+
{ value: 'bt', name: 'Bhutanese' },
24+
{ value: 'bo', name: 'Bolivian' },
25+
{ value: 'ba', name: 'Bosnian/Herzegovinian' },
26+
{ value: 'bw', name: 'Botswanan' },
27+
{ value: 'br', name: 'Brazilian' },
28+
{ value: 'bn', name: 'Bruneian' },
29+
{ value: 'bg', name: 'Bulgarian' },
30+
{ value: 'bf', name: 'Burkinabe' },
31+
{ value: 'bi', name: 'Burundian' },
32+
{ value: 'kh', name: 'Cambodian' },
33+
{ value: 'cm', name: 'Cameroonian' },
34+
{ value: 'ca', name: 'Canadian' },
35+
{ value: 'cv', name: 'Cape Verdean' },
36+
{ value: 'cf', name: 'Central African' },
37+
{ value: 'td', name: 'Chadian' },
38+
{ value: 'cl', name: 'Chilean' },
39+
{ value: 'cn', name: 'Chinese' },
40+
{ value: 'co', name: 'Colombian' },
41+
{ value: 'km', name: 'Comoran' },
42+
{ value: 'cg', name: 'Congolese' },
43+
{ value: 'cd', name: 'Congolese (DRC)' },
44+
{ value: 'cr', name: 'Costa Rican' },
45+
{ value: 'ci', name: 'Ivorian' },
46+
{ value: 'hr', name: 'Croatian' },
47+
{ value: 'cu', name: 'Cuban' },
48+
{ value: 'cy', name: 'Cypriot' },
49+
{ value: 'cz', name: 'Czech' },
50+
{ value: 'dk', name: 'Danish' },
51+
{ value: 'dj', name: 'Djiboutian' },
52+
{ value: 'dm', name: 'Dominican (DM)' },
53+
{ value: 'do', name: 'Dominican (DO)' },
54+
{ value: 'tl', name: 'Timorese' },
55+
{ value: 'ec', name: 'Ecuadorian' },
56+
{ value: 'eg', name: 'Egyptian' },
57+
{ value: 'sv', name: 'Salvadoran' },
58+
{ value: 'gq', name: 'Equatorial Guinean' },
59+
{ value: 'er', name: 'Eritrean' },
60+
{ value: 'ee', name: 'Estonian' },
61+
{ value: 'et', name: 'Ethiopian' },
62+
{ value: 'fj', name: 'Fijian' },
63+
{ value: 'fi', name: 'Finnish' },
64+
{ value: 'fr', name: 'French' },
65+
{ value: 'ga', name: 'Gabonese' },
66+
{ value: 'gm', name: 'Gambian' },
67+
{ value: 'ge', name: 'Georgian' },
68+
{ value: 'de', name: 'German' },
69+
{ value: 'gh', name: 'Ghanaian' },
70+
{ value: 'gr', name: 'Greek' },
71+
{ value: 'gd', name: 'Grenadian' },
72+
{ value: 'gt', name: 'Guatemalan' },
73+
{ value: 'gn', name: 'Guinean' },
74+
{ value: 'gw', name: 'Bissau-Guinean' },
75+
{ value: 'gy', name: 'Guyanese' },
76+
{ value: 'ht', name: 'Haitian' },
77+
{ value: 'hn', name: 'Honduran' },
78+
{ value: 'hu', name: 'Hungarian' },
79+
{ value: 'is', name: 'Icelander' },
80+
{ value: 'in', name: 'Indian' },
81+
{ value: 'id', name: 'Indonesian' },
82+
{ value: 'ir', name: 'Iranian' },
83+
{ value: 'iq', name: 'Iraqi' },
84+
{ value: 'ie', name: 'Irish' },
85+
{ value: 'il', name: 'Israeli' },
86+
{ value: 'it', name: 'Italian' },
87+
{ value: 'jm', name: 'Jamaican' },
88+
{ value: 'jp', name: 'Japanese' },
89+
{ value: 'jo', name: 'Jordanian' },
90+
{ value: 'kz', name: 'Kazakhstani' },
91+
{ value: 'ke', name: 'Kenyan' },
92+
{ value: 'ki', name: 'I-Kiribati' },
93+
{ value: 'xk', name: 'Kosovar' },
94+
{ value: 'kw', name: 'Kuwaiti' },
95+
{ value: 'kg', name: 'Kyrgyz or Kyrgyzstani' },
96+
{ value: 'la', name: 'Lao or Laotian' },
97+
{ value: 'lv', name: 'Latvian' },
98+
{ value: 'lb', name: 'Lebanese' },
99+
{ value: 'ls', name: 'Mosotho (Basotho plural)' },
100+
{ value: 'lr', name: 'Liberian' },
101+
{ value: 'ly', name: 'Libyan' },
102+
{ value: 'li', name: 'Liechtensteiner' },
103+
{ value: 'lt', name: 'Lithuanian' },
104+
{ value: 'lu', name: 'Luxembourger' },
105+
{ value: 'mk', name: 'Macedonian' },
106+
{ value: 'mg', name: 'Malagasy' },
107+
{ value: 'mw', name: 'Malawian' },
108+
{ value: 'my', name: 'Malaysian' },
109+
{ value: 'mv', name: 'Maldivian' },
110+
{ value: 'ml', name: 'Malian' },
111+
{ value: 'mt', name: 'Maltese' },
112+
{ value: 'mh', name: 'Marshallese' },
113+
{ value: 'mr', name: 'Mauritanian' },
114+
{ value: 'mu', name: 'Mauritian' },
115+
{ value: 'mx', name: 'Mexican' },
116+
{ value: 'fm', name: 'Micronesian' },
117+
{ value: 'md', name: 'Moldovan' },
118+
{ value: 'mc', name: 'Monégasque' },
119+
{ value: 'mn', name: 'Mongolian' },
120+
{ value: 'me', name: 'Montenegrin' },
121+
{ value: 'ma', name: 'Moroccan' },
122+
{ value: 'mz', name: 'Mozambican' },
123+
{ value: 'mm', name: 'Burmese' },
124+
{ value: 'na', name: 'Namibian' },
125+
{ value: 'nr', name: 'Nauruan' },
126+
{ value: 'np', name: 'Nepali' },
127+
{ value: 'nl', name: 'Dutch' },
128+
{ value: 'nz', name: 'New Zealander' },
129+
{ value: 'ni', name: 'Nicaraguan' },
130+
{ value: 'ne', name: 'Nigerien' },
131+
{ value: 'ng', name: 'Nigerian' },
132+
{ value: 'kp', name: 'North Korean' },
133+
{ value: 'no', name: 'Norwegian' },
134+
{ value: 'om', name: 'Omani' },
135+
{ value: 'pk', name: 'Pakistani' },
136+
{ value: 'pw', name: 'Palauan' },
137+
{ value: 'ps', name: 'Palestinian' },
138+
{ value: 'pa', name: 'Panamanian' },
139+
{ value: 'pg', name: 'Papua New Guinean' },
140+
{ value: 'py', name: 'Paraguayan' },
141+
{ value: 'pe', name: 'Peruvian' },
142+
{ value: 'ph', name: 'Filipino' },
143+
{ value: 'pl', name: 'Polish' },
144+
{ value: 'pt', name: 'Portuguese' },
145+
{ value: 'qa', name: 'Qatari' },
146+
{ value: 'ro', name: 'Romanian' },
147+
{ value: 'ru', name: 'Russian' },
148+
{ value: 'rw', name: 'Rwandan' },
149+
{ value: 'kn', name: 'Kittitian and Nevisian' },
150+
{ value: 'lc', name: 'Saint Lucian' },
151+
{ value: 'vc', name: 'Saint Vincentian' },
152+
{ value: 'ws', name: 'Samoan' },
153+
{ value: 'sm', name: 'Sammarinese' },
154+
{ value: 'st', name: 'São Toméan' },
155+
{ value: 'sa', name: 'Saudi' },
156+
{ value: 'sn', name: 'Senegalese' },
157+
{ value: 'rs', name: 'Serbian' },
158+
{ value: 'sc', name: 'Seychellois' },
159+
{ value: 'sl', name: 'Sierra Leonean' },
160+
{ value: 'sg', name: 'Singaporean' },
161+
{ value: 'sk', name: 'Slovak' },
162+
{ value: 'si', name: 'Slovenian' },
163+
{ value: 'sb', name: 'Solomon Islander' },
164+
{ value: 'so', name: 'Somali' },
165+
{ value: 'za', name: 'South African' },
166+
{ value: 'kr', name: 'South Korean' },
167+
{ value: 'ss', name: 'South Sudanese' },
168+
{ value: 'es', name: 'Spanish' },
169+
{ value: 'lk', name: 'Sri Lankan' },
170+
{ value: 'sd', name: 'Sudanese' },
171+
{ value: 'sr', name: 'Surinamese' },
172+
{ value: 'sz', name: 'Swazi' },
173+
{ value: 'se', name: 'Swedish' },
174+
{ value: 'ch', name: 'Swiss' },
175+
{ value: 'sy', name: 'Syrian' },
176+
{ value: 'tw', name: 'Taiwanese' },
177+
{ value: 'tj', name: 'Tajik' },
178+
{ value: 'tz', name: 'Tanzanian' },
179+
{ value: 'th', name: 'Thai' },
180+
{ value: 'tg', name: 'Togolese' },
181+
{ value: 'to', name: 'Tongan' },
182+
{ value: 'tt', name: 'Trinidadian/Tobagonian' },
183+
{ value: 'tn', name: 'Tunisian' },
184+
{ value: 'tr', name: 'Turk' },
185+
{ value: 'tm', name: 'Turkmen' },
186+
{ value: 'tv', name: 'Tuvaluan' },
187+
{ value: 'ug', name: 'Ugandan' },
188+
{ value: 'ua', name: 'Ukrainian' },
189+
{ value: 'ae', name: 'Emirati' },
190+
{ value: 'gb', name: 'British' },
191+
{ value: 'us', name: 'American' },
192+
{ value: 'uy', name: 'Uruguayan' },
193+
{ value: 'uz', name: 'Uzbek or Uzbekistani' },
194+
{ value: 'vu', name: 'Ni-Vanuatu' },
195+
{ value: 'va', name: 'Vatican citizen' },
196+
{ value: 've', name: 'Venezuelan' },
197+
{ value: 'vn', name: 'Vietnamese' },
198+
{ value: 'ye', name: 'Yemeni' },
199+
{ value: 'zm', name: 'Zambian' },
200+
{ value: 'zw', name: 'Zimbabwean' },
201+
];

src/main/webapp/app/application/application-creation/application-creation-page3/application-creation-page3.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<form [formGroup]="form">
33
<div class="flex flex-col w-1/2">
44
<label>
5-
<span [jhiTranslate]="'entity.applicationPage3.label.desiredStartDate'"></span><span class="text-red-600">*</span>
5+
<span jhiTranslate="entity.applicationPage3.label.desiredStartDate"></span>
66
<fa-icon
77
class="icon"
88
[icon]="['fas', 'circle-info']"

src/main/webapp/app/application/application-creation/application-creation-page3/application-creation-page3.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export default class ApplicationCreationPage3Component {
7272
experiences: [currentData.experiences, Validators.required],
7373
motivation: [currentData.motivation, Validators.required],
7474
skills: [currentData.skills, Validators.required],
75-
desiredStartDate: [currentData.desiredStartDate, Validators.required],
75+
desiredStartDate: [currentData.desiredStartDate],
7676
});
7777
});
7878

src/main/webapp/app/application/application-detail-for-applicant/application-detail-for-applicant.component.html

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
<jhi-toast />
22
<div class="px-4 py-4 text-primary w-full h-remaining-viewheight flex flex-col">
33
@if (application(); as application) {
4-
<header class="header">
4+
<header class="header flex justify-between items-center">
55
<h1
66
jhiTranslate="entity.application_detail.applicant.header"
77
[translateValues]="{ jobTitle: application.jobTitle }"
88
class="h1-text"
99
></h1>
10+
<jhi-application-state-for-applicants [state]="application.applicationState" />
1011
</header>
1112
<jhi-application-detail-card [application]="application">
1213
<div class="slot-right-width" slot-vertical-right>
@@ -15,6 +16,16 @@
1516
}
1617
</div>
1718
</jhi-application-detail-card>
19+
<div class="w-full flex justify-end">
20+
@if (application.applicationState === 'SAVED') {
21+
<jhi-button
22+
[label]="'entity.applicationOverview.actions.update' | translate"
23+
severity="primary"
24+
icon="arrow-right"
25+
(click)="onUpdateApplication()"
26+
/>
27+
}
28+
</div>
1829
} @else {
1930
<p class="text-center">Application not found</p>
2031
}

src/main/webapp/app/application/application-detail-for-applicant/application-detail-for-applicant.component.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
import { Component, inject, signal } from '@angular/core';
2-
import { ActivatedRoute } from '@angular/router';
2+
import { ActivatedRoute, Router } from '@angular/router';
33
import { ApplicationDetailDTO, ApplicationDocumentIdsDTO, ApplicationResourceService } from 'app/generated';
44
import DocumentGroupComponent from 'app/shared/components/molecules/document-group/document-group.component';
55
import { ApplicationDetailCardComponent } from 'app/shared/components/organisms/application-detail-card/application-detail-card.component';
66
import { ToastComponent } from 'app/shared/toast/toast.component';
77
import { ToastService } from 'app/service/toast-service';
88
import SharedModule from 'app/shared/shared.module';
99
import { firstValueFrom } from 'rxjs';
10+
import { ButtonComponent } from 'app/shared/components/atoms/button/button.component';
11+
12+
import { ApplicationStateForApplicantsComponent } from '../application-state-for-applicants/application-state-for-applicants.component';
1013

1114
@Component({
1215
selector: 'jhi-application-detail-for-applicant',
13-
imports: [ApplicationDetailCardComponent, DocumentGroupComponent, SharedModule, ToastComponent],
16+
imports: [
17+
ApplicationDetailCardComponent,
18+
DocumentGroupComponent,
19+
SharedModule,
20+
ToastComponent,
21+
ApplicationStateForApplicantsComponent,
22+
ButtonComponent,
23+
],
1424
templateUrl: './application-detail-for-applicant.component.html',
1525
styleUrl: './application-detail-for-applicant.component.scss',
1626
})
@@ -22,6 +32,7 @@ export default class ApplicationDetailForApplicantComponent {
2232
private applicationService = inject(ApplicationResourceService);
2333
private route = inject(ActivatedRoute);
2434
private toastService = inject(ToastService);
35+
private readonly router = inject(Router);
2536

2637
constructor() {
2738
this.init();
@@ -43,4 +54,8 @@ export default class ApplicationDetailForApplicantComponent {
4354
})
4455
.catch(() => this.toastService.showError({ summary: 'Error', detail: 'fetching the document ids for this application' }));
4556
}
57+
58+
onUpdateApplication(): void {
59+
this.router.navigate([`/application/edit/${this.applicationId()}`]);
60+
}
4661
}

0 commit comments

Comments
 (0)