Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add slot descriptions, matcher randomness #480

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
export interface Slot {
id?: number;
times: Time[];
description?: string;
[key: string]: any;

Check warning on line 13 in csm_web/frontend/src/components/enrollment_automation/EnrollmentAutomationTypes.tsx

View workflow job for this annotation

GitHub Actions / ESLint

csm_web/frontend/src/components/enrollment_automation/EnrollmentAutomationTypes.tsx#L13

Unexpected any. Specify a different type (@typescript-eslint/no-explicit-any)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ export function MentorSectionPreferences({
id: slot.id,
// replace single quotes for JSON
times: times,
preference: 0
preference: 0,
description: slot.description
};
newSlots.push(parsed_slot);
}
Expand Down Expand Up @@ -169,7 +170,7 @@ export function MentorSectionPreferences({
const event = selectedEvents[0];
sidebarContents = (
<div className="matcher-sidebar-selected">
<div className="mathcer-sidebar-selected-top">
<div className="matcher-sidebar-selected-top">
{selectedEvents.length === 1 ? (
// exactly one selected event
<React.Fragment>
Expand All @@ -188,6 +189,14 @@ export function MentorSectionPreferences({
// multiple selected events
<div className="matcher-sidebar-header">Multiple selected events</div>
)}
<div className="matcher-sidebar-metadata-container">
{event.description !== "" && (
<>
<div className="matcher-sidebar-subheader">Description:</div>
<div className="matcher-description-text">{event.description}</div>
</>
)}
</div>
<label className="matcher-pref-input-label">
Preference:
<input
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export function CoordinatorMatcherForm({
}

// convert times to numbers
const new_slots: Slot[] = jsonSlots.slots.map((slot: { id: number; times: StrTime[] }) => {
const new_slots: Slot[] = jsonSlots.slots.map((slot: { id: number; times: StrTime[]; description: string }) => {
const new_times: Time[] = slot.times.map((time: StrTime) => {
return {
interval: Interval.fromDateTimes(parseTime(time.startTime), parseTime(time.endTime)),
Expand All @@ -71,7 +71,8 @@ export function CoordinatorMatcherForm({
});
return {
id: slot.id,
times: new_times
times: new_times,
description: slot.description
};
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
length: Duration.fromObject({ hours: 1 })
});

const [curSlotDescription, setCurSlotDescription] = useState<string>("");

/**
* Whether or not anything has been edited
*/
Expand Down Expand Up @@ -275,6 +277,7 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
} else {
setCurCreatedTimes([]);
}
setCurSlotDescription("");
setCreatingTiledEvents(checked);
};

Expand Down Expand Up @@ -325,7 +328,7 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
const newSlots = [];
for (let t = tileDetails.start; t <= tileDetails.end.minus(tileDetails.length); t = t.plus(tileDetails.length)) {
if (tileDetails.daysLinked) {
const newEvent: CalendarEvent = { times: [] };
const newEvent: CalendarEvent = { times: [], description: curSlotDescription };
for (const day of tileDetails.days) {
newEvent.times.push({
day: day,
Expand All @@ -337,7 +340,14 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
} else {
for (const day of tileDetails.days) {
newSlots.push({
times: [{ day: day, interval: Interval.fromDateTimes(t, t.plus(tileDetails.length)), isLinked: false }]
times: [
{
day: day,
interval: Interval.fromDateTimes(t, t.plus(tileDetails.length)),
isLinked: false
}
],
description: curSlotDescription
});
}
}
Expand All @@ -352,8 +362,9 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
* Save the newly created event and times
*/
const saveEvent = () => {
const newEvent = { times: curCreatedTimes };
const newEvent = { times: curCreatedTimes, description: curSlotDescription };
setSlots([...slots, newEvent]);
setCurSlotDescription("");
setCurCreatedTimes([]);
setSavedExistingEvent(null);
setSelectedEvents([]);
Expand All @@ -379,6 +390,7 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
setCurCreatedTimes([]);
setSelectedEvents([]);
setSelectedEventIndices([]);
setCurSlotDescription("");
};

/**
Expand All @@ -389,6 +401,7 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
const event = selectedEvents[0];
// copy event
setCurCreatedTimes(_.cloneDeep(event.times));
setCurSlotDescription(event.description);
setSavedExistingEvent(_.cloneDeep(event)); // duplicate event
// delete event
deleteSelectedEvent();
Expand Down Expand Up @@ -619,6 +632,17 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
mins
</div>
</div>
<div className="matcher-tiling-metadata-container">
<div className="matcher-tiling-subheader">Description:</div>
<div className="matcher-tiling-description-input-container">
<input
className="matcher-tiling-description-input form-input light"
type="text"
value={curSlotDescription}
onChange={e => setCurSlotDescription(e.target.value)}
/>
</div>
</div>
</div>
</div>
<div className="matcher-sidebar-tiling-bottom">
Expand Down Expand Up @@ -677,6 +701,17 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
))}
</div>
</div>
<div className="matcher-sidebar-metadata-container">
<div className="matcher-sidebar-subheader">Description:</div>
<div className="matcher-sidebar-description-input-container">
<input
className="matcher-sidebar-description-input form-input light"
type="text"
value={curSlotDescription}
onChange={e => setCurSlotDescription(e.target.value)}
/>
</div>
</div>
<div className="matcher-sidebar-create-bottom">
<div className="matcher-sidebar-create-bottom-row">
<button className="secondary-btn" onClick={cancelEvent}>
Expand Down Expand Up @@ -713,6 +748,14 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro
</li>
))}
</ul>
<div className="matcher-sidebar-metadata-container">
{selectedEvents[0].description !== "" && (
<>
<div className="matcher-sidebar-subheader">Description:</div>
<div className="matcher-sidebar-description-text">{selectedEvents[0].description}</div>
</>
)}
</div>
</React.Fragment>
) : (
// multiple selected events
Expand Down
17 changes: 16 additions & 1 deletion csm_web/frontend/src/css/enrollment_matcher.scss
Original file line number Diff line number Diff line change
Expand Up @@ -361,7 +361,8 @@
color: $csm-danger-darkened;
}

.matcher-tiling-subheader {
.matcher-tiling-subheader,
.matcher-sidebar-subheader {
/* font-style: italic; */
font-weight: 600;
}
Expand Down Expand Up @@ -432,6 +433,19 @@
max-width: 250px;
}

.matcher-tiling-metadata-container,
.matcher-sidebar-metadata-container {
padding-top: 5px;
}

.matcher-description-text {
max-width: 350px;
margin-top: 5px;
margin-left: 5px;

overflow-wrap: break-word;
}

.matcher-unsaved-changes-container {
height: fit-content;
margin-right: 15px;
Expand Down Expand Up @@ -620,6 +634,7 @@
gap: 8px;
align-items: center;
margin-top: 8px;
font-weight: bold;
}

/* ConfigureStage.tsx */
Expand Down
1 change: 1 addition & 0 deletions csm_web/frontend/src/utils/queries/matcher.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ interface MatcherSlotsResponse {
slots: Array<{
id: number;
times: MatcherSlotsResponseTime[];
description: string;
}>;
}

Expand Down
17 changes: 17 additions & 0 deletions csm_web/scheduler/migrations/0033_matcherslot_description.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2024-08-12 04:12

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("scheduler", "0032_word_of_the_day"),
]

operations = [
migrations.AddField(
model_name="matcherslot",
name="description",
field=models.TextField(blank=True, default=""),
),
]
13 changes: 5 additions & 8 deletions csm_web/scheduler/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,19 +260,15 @@ def save(self, *args, **kwargs):
):
if settings.DJANGO_ENV != settings.DEVELOPMENT:
logger.info(
(
"<SectionOccurrence> SO automatically created for student"
" %s in course %s for date %s"
),
"<SectionOccurrence> SO automatically created for student"
" %s in course %s for date %s",
self.user.email,
course.name,
now.date(),
)
logger.info(
(
"<Attendance> Attendance automatically created for student"
" %s in course %s for date %s"
),
"<Attendance> Attendance automatically created for student"
" %s in course %s for date %s",
self.user.email,
course.name,
now.date(),
Expand Down Expand Up @@ -575,6 +571,7 @@ class MatcherSlot(ValidatingModel):
times = models.JSONField()
min_mentors = models.PositiveSmallIntegerField()
max_mentors = models.PositiveSmallIntegerField()
description = models.TextField(default="", blank=True)

def clean(self):
super().clean()
Expand Down
2 changes: 1 addition & 1 deletion csm_web/scheduler/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,7 @@ class Meta:
class MatcherSlotSerializer(serializers.ModelSerializer):
class Meta:
model = MatcherSlot
fields = ["id", "matcher", "times"]
fields = ["id", "matcher", "times", "description"]


class MatcherPreferenceSerializer(serializers.ModelSerializer):
Expand Down
Loading
Loading