Skip to content

Commit 67a71e3

Browse files
committed
Fix restriction and form related bugs
1 parent 8de4414 commit 67a71e3

File tree

5 files changed

+71
-16
lines changed

5 files changed

+71
-16
lines changed

course-matrix/frontend/src/components/time-picker-hr.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export function TimePickerHr({ date, setDate }: TimePickerHrProps) {
6060
</div> */}
6161
<div className="grid gap-1 text-center">
6262
<Label htmlFor="period" className="text-xs">
63-
Period
63+
AM/PM
6464
</Label>
6565
<TimePeriodSelect
6666
period={period}

course-matrix/frontend/src/models/timetable-form.ts

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export const RestrictionSchema = z
8383
{
8484
message: "Start time must be before end time",
8585
path: ["startTime"],
86-
},
86+
}
8787
)
8888
.refine(
8989
(data) => {
@@ -98,7 +98,7 @@ export const RestrictionSchema = z
9898
{
9999
message: "Must choose time",
100100
path: ["endTime"],
101-
},
101+
}
102102
)
103103
.refine(
104104
(data) => {
@@ -113,7 +113,7 @@ export const RestrictionSchema = z
113113
{
114114
message: "Must choose time",
115115
path: ["startTime"],
116-
},
116+
}
117117
)
118118
.refine(
119119
(data) => {
@@ -129,7 +129,7 @@ export const RestrictionSchema = z
129129
{
130130
message: "Cannot block all days",
131131
path: ["days"],
132-
},
132+
}
133133
)
134134
.refine(
135135
(data) => {
@@ -145,7 +145,7 @@ export const RestrictionSchema = z
145145
{
146146
message: "Must choose at least 1 day",
147147
path: ["days"],
148-
},
148+
}
149149
)
150150
.refine(
151151
(data) => {
@@ -161,7 +161,7 @@ export const RestrictionSchema = z
161161
{
162162
message: "Cannot block all days",
163163
path: ["numDays"],
164-
},
164+
}
165165
)
166166
.refine(
167167
(data) => {
@@ -176,7 +176,41 @@ export const RestrictionSchema = z
176176
{
177177
message: "Number must be at least 1",
178178
path: ["numDays"],
179+
}
180+
)
181+
.refine(
182+
(data) => {
183+
if (
184+
data.type &&
185+
data.type === "Restrict Before" &&
186+
data.endTime?.getHours() === 0 &&
187+
data.endTime?.getMinutes() === 0
188+
) {
189+
return false;
190+
}
191+
return true;
192+
},
193+
{
194+
message: "Cannot restrict whole day",
195+
path: ["endTime"],
196+
}
197+
)
198+
.refine(
199+
(data) => {
200+
if (
201+
data.type &&
202+
data.type === "Restrict After" &&
203+
data.startTime?.getHours() === 0 &&
204+
data.startTime?.getMinutes() === 0
205+
) {
206+
return false;
207+
}
208+
return true;
179209
},
210+
{
211+
message: "Cannot restrict whole day",
212+
path: ["startTime"],
213+
}
180214
);
181215

182216
export const TimetableFormSchema: ZodType<TimetableForm> = z
@@ -198,7 +232,7 @@ export const TimetableFormSchema: ZodType<TimetableForm> = z
198232
{
199233
message: "Must pick at least 1 course",
200234
path: ["search"],
201-
},
235+
}
202236
)
203237
.refine(
204238
(data) => {
@@ -207,7 +241,18 @@ export const TimetableFormSchema: ZodType<TimetableForm> = z
207241
{
208242
message: "Cannot pick more than 8 courses",
209243
path: ["search"],
244+
}
245+
)
246+
.refine(
247+
(data) => {
248+
return !(
249+
data.restrictions.filter((r) => r.type === "Days Off").length > 1
250+
);
210251
},
252+
{
253+
message: "Already added minimum days off per week",
254+
path: ["restrictions"],
255+
}
211256
);
212257

213258
export const baseTimetableForm: TimetableForm = {

course-matrix/frontend/src/pages/TimetableBuilder/CourseSearch.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ const CourseSearch = ({
8181
const handleAddCourse = (item: CourseModel) => {
8282
if (!form) return;
8383
const currentList = form.getValues("courses") || [];
84+
if (currentList.length > 7) return; // ensure max courses added is 8
8485
if (currentList.find((c) => c.id === item.id)) return; // ensure uniqueness
8586
const newList = [...currentList, item];
8687
console.log(newList);

course-matrix/frontend/src/pages/TimetableBuilder/CreateCustomSetting.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ const CreateCustomSetting = ({
9696
closeHandler();
9797
};
9898

99+
const form = useContext(FormContext)
100+
101+
const isDaysOffRestrictionApplied = () => {
102+
const val = form?.getValues("restrictions").some(r => r.type === "Days Off")
103+
console.log(val)
104+
return val
105+
}
106+
99107
const getRestrictionType = (value: string) => {
100108
if (
101109
value === "Restrict Before" ||
@@ -166,7 +174,7 @@ const CreateCustomSetting = ({
166174
<SelectItem value="Restrict Day">
167175
Restrict Entire Day
168176
</SelectItem>
169-
<SelectItem value="Days Off">
177+
<SelectItem value="Days Off" disabled={isDaysOffRestrictionApplied()}>
170178
Enforce Minimum Days Off Per Week
171179
</SelectItem>
172180
</SelectContent>

course-matrix/frontend/src/pages/TimetableBuilder/TimetableBuilder.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ const TimetableBuilder = () => {
292292
</div>
293293
<div className="flex flex-col">
294294
<p className="text-sm pb-2">
295-
Selected courses: {selectedCourses.length}
295+
Selected courses: {selectedCourses.length} (Max 8)
296296
</p>
297297
<div className="flex gap-2 flex-col">
298298
{selectedCourses.map((course, index) => (
@@ -372,18 +372,19 @@ const TimetableBuilder = () => {
372372

373373
<Button type="submit">Generate</Button>
374374
</form>
375+
376+
{isCustomSettingsOpen && (
377+
<CreateCustomSetting
378+
submitHandler={handleAddRestriction}
379+
closeHandler={() => setIsCustomSettingsOpen(false)}
380+
/>
381+
)}
375382
</FormContext.Provider>
376383
</Form>
377384
</div>
378385
<div className="w-3/5">
379386
<Calendar courseEvents={courseEvents} userEvents={userEvents} />
380387
</div>
381-
{isCustomSettingsOpen && (
382-
<CreateCustomSetting
383-
submitHandler={handleAddRestriction}
384-
closeHandler={() => setIsCustomSettingsOpen(false)}
385-
/>
386-
)}
387388

388389
{showFilters && (
389390
<SearchFilters

0 commit comments

Comments
 (0)