Skip to content

Commit 1b397b4

Browse files
committed
Application dates configurable
1 parent 0fe9532 commit 1b397b4

9 files changed

Lines changed: 45 additions & 16 deletions

File tree

backend/src/controllers/dto.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ export class ApplicationSettingsDTO implements DTO<ApplicationSettings> {
9191
@IsNumber()
9292
@Expose()
9393
public hoursToConfirm!: number;
94+
}
95+
96+
export class ProjectSettingsDTO implements DTO<ProjectSettings> {
9497
@IsBoolean()
9598
@Expose()
9699
public allowRatingProjects!: boolean;

backend/src/entities/application-settings.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ export class ApplicationSettings {
2929
public allowProfileFormUntil!: Date;
3030
@Column()
3131
public hoursToConfirm!: number;
32-
@Column({ default: false })
33-
public allowRatingProjects!: boolean;
32+
@Column()
33+
public fillProfileFormFrom: Date;
34+
@Column()
35+
public fillProfileFormTo: Date;
36+
@Column()
37+
public acceptanceDeadline: Date;
38+
@Column()
39+
public confirmSpotUntil: Date;
3440
}

backend/src/entities/settings.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ export class EmailSettings {
4848
public forgotPasswordEmail!: EmailTemplate;
4949
}
5050

51+
export class ProjectSettings {
52+
@Column({ default: false })
53+
public allowRatingProjects!: boolean;
54+
}
55+
5156
@Entity()
5257
export class Settings {
5358
@PrimaryGeneratedColumn()
@@ -64,6 +69,9 @@ export class Settings {
6469
@Type(() => EmailSettings)
6570
@Column(() => EmailSettings)
6671
public email!: EmailSettings;
72+
@Type(() => ProjectSettings)
73+
@Column(() => ProjectSettings)
74+
public rating!: ProjectSettings;
6775
}
6876

6977
/**

backend/src/services/project-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export class ProjectService implements IProjectService {
7272
.map((team) => team.id);
7373

7474
const [settings] = await this._settings.find();
75-
const allowRatingProjects = settings.application.allowRatingProjects;
75+
const allowRatingProjects = settings.project.allowRatingProjects;
7676
const isAdmin = user.role === UserRole.Root;
7777

7878
const projects = await this._projects.find();

backend/src/services/rating-service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,9 @@ export class RatingService implements IRatingService {
236236
}
237237

238238
const settings = await this._settings.getSettings();
239-
if (!settings.application.allowRatingProjects) {
239+
if (!settings.project.allowRatingProjects) {
240240
throw new ForbiddenError(
241-
"Rating is not allowed due to application settings",
241+
"Rating is not allowed due to settings",
242242
);
243243
}
244244

backend/src/services/settings-service.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,18 @@ export class SettingsService implements ISettingsService {
115115
applicationSettings.allowProfileFormFrom = new Date();
116116
applicationSettings.allowProfileFormUntil = new Date();
117117
applicationSettings.hoursToConfirm = 24;
118-
applicationSettings.allowRatingProjects = false;
119118
return applicationSettings;
120119
}
121120

121+
/**
122+
* Creates an application settings object with default values.
123+
*/
124+
private getDefaultProjectSettings(): ProjectSettings {
125+
const projectSettings = new ProjectSettings();
126+
projectSettings.allowRatingProjects = false;
127+
return projectSettings;
128+
}
129+
122130
/**
123131
* Creates a form settings object with default values.
124132
*/

frontend/src/components/pages/settings.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Heading } from "../base/headings";
55
import { ApplicationSettings } from "../settings/application/application-settings";
66
import { EmailSettings } from "../settings/mail-settings/email-settings";
77
import { FrontendSettings } from "../settings/appearance/frontend-settings";
8-
import { ProjectRatingSettings } from "../settings/project-rating/rating-criteria-settings";
8+
import { ProjectProjectSettings } from "../settings/project-rating/rating-criteria-settings";
99
import { SettingsSaveButton } from "../settings/save-button";
1010
import { Page } from "./page";
1111
import { SimpleCard } from "../base/simple-card";
@@ -40,7 +40,7 @@ export const Settings = () => (
4040
<EmailSettings />
4141
</SimpleCard>
4242
<SimpleCard>
43-
<ProjectRatingSettings />
43+
<ProjectProjectSettings />
4444
</SimpleCard>
4545
</Page>
4646
);

frontend/src/components/pages/status.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ export const Status = () => {
2929
const { user, updateUser } = useLoginContext();
3030

3131
const confirmationDays = Math.floor(settings.application.hoursToConfirm / 24);
32+
const fillProfileFormFrom = settings.application.fillProfileFormFrom;
33+
const fillProfileFormTo = settings.application.fillProfileFormTo;
34+
const acceptanceDeadline = settings.application.acceptanceDeadline;
35+
const confirmSpotUntil = settings.application.confirmSpotUntil;
3236
const isExpired = user == null ? false : isConfirmationExpired(user);
3337
const isNotAttending = isExpired || user?.declined;
3438
const deadline = user?.confirmationExpiresAt;
@@ -98,7 +102,7 @@ export const Status = () => {
98102
<InternalLink to={Routes.ProfileForm}>
99103
profile form
100104
</InternalLink>
101-
, any time between <b>01.03.2026 - 31.04.2026</b>
105+
, any time between <b>{fillProfileFormFrom} - {fillProfileFormTo}</b>
102106
</Text>
103107
</>
104108
)}
@@ -145,7 +149,7 @@ export const Status = () => {
145149
<>
146150
<Text style={{ fontSize: "1.15rem" }}>
147151
We will come back to you and send you a acceptance mail until{" "}
148-
<b>01.05.2026</b>.
152+
<b>{acceptanceDeadline}</b>.
149153
</Text>
150154
</>
151155
)}
@@ -173,7 +177,7 @@ export const Status = () => {
173177
<>
174178
<Text style={{ fontSize: "1.15rem" }}>
175179
If you got accepted, you need to confirm your spot until{" "}
176-
<b>08.05.2026</b>
180+
<b>{confirmSpotUntil}</b>
177181
{user?.admitted && (
178182
<>
179183
{" "}

frontend/src/components/settings/project-rating/rating-criteria-settings.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ const CriterionEditor = React.memo(
7171
/**
7272
* A component to edit criteria for rating projects.
7373
*/
74-
export const ProjectRatingSettings = () => {
74+
export const ProjectProjectSettings = () => {
7575
// Load all criteria and render them
7676
const [allCriteria, setAllCriteria] = useState<CriterionDTO[]>([]);
7777
const [settings, setSettings] = useState<Partial<SettingsDTO>>({});
@@ -91,7 +91,7 @@ export const ProjectRatingSettings = () => {
9191

9292
useEffect(() => {
9393
// Only update if settings are loaded
94-
if (settings.application) {
94+
if (settings.rating) {
9595
api.updateSettings(settings as SettingsDTO);
9696
}
9797
}, [settings]);
@@ -138,8 +138,8 @@ export const ProjectRatingSettings = () => {
138138
setSettings((prev) => {
139139
const changedSettings = {
140140
...prev,
141-
application: {
142-
...prev.application,
141+
rating: {
142+
...prev.rating,
143143
allowRatingProjects: value,
144144
},
145145
};
@@ -155,7 +155,7 @@ export const ProjectRatingSettings = () => {
155155
<FormControlLabel
156156
control={
157157
<Switch
158-
checked={settings?.application?.allowRatingProjects}
158+
checked={settings?.project?.allowRatingProjects}
159159
onChange={onSwitchChange}
160160
/>
161161
}

0 commit comments

Comments
 (0)