Skip to content

Commit e6a3e9e

Browse files
committed
#2136 - pretty much done
1 parent f3e20d8 commit e6a3e9e

11 files changed

Lines changed: 297 additions & 198 deletions

File tree

src/backend/src/controllers/design-reviews.controllers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export default class DesignReviewsController {
6969
try {
7070
const {
7171
dateScheduled,
72-
teamType,
72+
teamTypeId,
7373
requiredMembersIds,
7474
optionalMembersIds,
7575
isOnline,
@@ -91,7 +91,7 @@ export default class DesignReviewsController {
9191
user,
9292
designReviewId,
9393
dateScheduled,
94-
teamType.teamTypeId,
94+
teamTypeId,
9595
requiredMembersIds,
9696
optionalMembersIds,
9797
isOnline,

src/backend/src/services/users.services.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
RoleEnum,
1111
isHead,
1212
UserSecureSettings,
13-
UserScheduleSettings
13+
UserScheduleSettings,
14+
UserWithScheduleSettings
1415
} from 'shared';
1516
import authUserQueryArgs from '../prisma-query-args/auth-user.query-args';
1617
import prisma from '../prisma/prisma';
@@ -23,17 +24,22 @@ import projectQueryArgs from '../prisma-query-args/projects.query-args';
2324
import userSecureSettingsTransformer from '../transformers/user-secure-settings.transformer';
2425
import { validateUserIsPartOfFinanceTeam } from '../utils/reimbursement-requests.utils';
2526
import userScheduleSettingsTransformer from '../transformers/user-schedule-settings.transformer';
27+
import userWithScheduleSettingsTransformer from '../transformers/designReviewUser.transformer';
2628

2729
export default class UsersService {
2830
/**
2931
* Gets all of the users from the database
3032
* @returns a list of all the users
3133
*/
32-
static async getAllUsers(): Promise<User[]> {
33-
const users = await prisma.user.findMany();
34+
static async getAllUsers(): Promise<UserWithScheduleSettings[]> {
35+
const users = await prisma.user.findMany({
36+
include: {
37+
drScheduleSettings: true
38+
}
39+
});
3440
users.sort((a, b) => a.firstName.localeCompare(b.firstName));
3541

36-
return users.map(userTransformer);
42+
return users.map(userWithScheduleSettingsTransformer);
3743
}
3844

3945
/**

src/frontend/src/hooks/design-reviews.hooks.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ export interface EditDesignReviewPayload {
5656
optionalMembersIds: number[];
5757
isOnline: boolean;
5858
isInPerson: boolean;
59-
zoomLink: string | null;
60-
location: string | null;
61-
docTemplateLink: string | null;
59+
zoomLink?: string;
60+
location?: string;
61+
docTemplateLink?: string;
6262
status: DesignReviewStatus;
6363
attendees: number[];
6464
meetingTimes: number[];

src/frontend/src/hooks/users.hooks.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import {
2626
UpdateUserRolePayload,
2727
Project,
2828
UserSecureSettings,
29-
UserScheduleSettings
29+
UserScheduleSettings,
30+
UserWithScheduleSettings
3031
} from 'shared';
3132
import { useAuth } from './auth.hooks';
3233
import { useContext } from 'react';
@@ -45,7 +46,7 @@ export const useCurrentUser = (): AuthenticatedUser => {
4546
* Custom React Hook to supply all users.
4647
*/
4748
export const useAllUsers = () => {
48-
return useQuery<User[], Error>(['users'], async () => {
49+
return useQuery<UserWithScheduleSettings[], Error>(['users'], async () => {
4950
const { data } = await getAllUsers();
5051
return data;
5152
});

src/frontend/src/pages/CalendarPage/CalendarPage.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ const CalendarPage = () => {
4747

4848
confirmedDesignReviews.forEach((designReview) => {
4949
// Accessing the date actually converts it to local time, which causes the date to be off. This is a workaround.
50-
const date = datePipe(
51-
new Date(designReview.dateScheduled.getTime() - designReview.dateScheduled.getTimezoneOffset() * -60000)
52-
);
50+
const date = datePipe(designReview.dateScheduled);
5351
if (eventDict.has(date)) {
5452
eventDict.get(date)?.push(designReview);
5553
} else {
@@ -134,10 +132,7 @@ const CalendarPage = () => {
134132
) : (
135133
<CalendarDayCard
136134
cardDate={cardDate}
137-
events={
138-
eventDict.get(datePipe(new Date(cardDate.getTime() - cardDate.getTimezoneOffset() * -60000))) ??
139-
[]
140-
}
135+
events={eventDict.get(datePipe(cardDate)) ?? []}
141136
teamTypes={allTeamTypes}
142137
/>
143138
)}

src/frontend/src/pages/CalendarPage/DesignReviewCreateModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export const DesignReviewCreateModal: React.FC<DesignReviewCreateModalProps> = (
8383
const onSubmit = async (data: CreateDesignReviewFormInput) => {
8484
const day = data.date.getDay();
8585
const times = [];
86-
for (let i = day * 12 + data.startTime; i <= day * 12 + data.endTime; i++) {
86+
for (let i = day * 12 + data.startTime; i < day * 12 + data.endTime; i++) {
8787
times.push(i);
8888
}
8989
try {

src/frontend/src/pages/CalendarPage/DesignReviewDetailPage/AvailabilityView.tsx

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
import { Grid } from '@mui/material';
2-
import { DesignReview, User } from 'shared';
2+
import { DesignReview, DesignReviewStatus, User, UserWithScheduleSettings } from 'shared';
33
import { useState } from 'react';
44
import AvailabilityScheduleView from './AvailabilityScheduleView';
55
import UserAvailabilites from './UserAvailabilitesView';
66
import { getWeekDateRange } from '../../../utils/design-review.utils';
77
import { dateRangePipe } from '../../../utils/pipes';
8+
import { DesignReviewEditData } from './DesignReviewDetailPage';
89

910
interface AvailabilityViewProps {
10-
usersToAvailabilities: Map<User, number[]>;
1111
designReview: DesignReview;
12-
selectedDate: Date;
1312
allDesignReviews: DesignReview[];
13+
allUsers: UserWithScheduleSettings[];
14+
editPayload: DesignReviewEditData;
1415
}
1516

16-
const AvailabilityView: React.FC<AvailabilityViewProps> = ({
17-
usersToAvailabilities,
18-
designReview,
19-
selectedDate,
20-
allDesignReviews
21-
}) => {
17+
const AvailabilityView: React.FC<AvailabilityViewProps> = ({ designReview, allDesignReviews, allUsers, editPayload }) => {
2218
const availableUsers = new Map<number, User[]>();
2319
const unavailableUsers = new Map<number, User[]>();
2420
const existingMeetingData = new Map<number, string>();
21+
const usersToAvailabilities = new Map<User, number[]>();
22+
23+
const { selectedDate, requiredUserIds, optionalUserIds } = editPayload;
2524

2625
const [currentAvailableUsers, setCurrentAvailableUsers] = useState<User[]>([]);
2726
const [currentUnavailableUsers, setCurrentUnavailableUsers] = useState<User[]>([]);
@@ -35,19 +34,33 @@ const AvailabilityView: React.FC<AvailabilityViewProps> = ({
3534
return drDate >= startRange && drDate <= endRange;
3635
});
3736

38-
const conflictingDesignReviews = allDesignReviews.filter(
39-
(currDr) =>
40-
currDr.dateScheduled.toLocaleDateString() === selectedDate.toLocaleDateString() &&
41-
allDesignReviews.some((designReview) =>
42-
designReview.meetingTimes.some((time) => currDr.meetingTimes.includes(time))
43-
) &&
37+
const conflictingDesignReviews = allDesignReviews.filter((currDr) => {
38+
const day = editPayload.selectedDate.getDay();
39+
const times = [];
40+
for (let i = day * 12 + editPayload.startTime; i <= day * 12 + editPayload.endTime; i++) {
41+
times.push(i);
42+
}
43+
const cleanDate = new Date(currDr.dateScheduled.getTime() - currDr.dateScheduled.getTimezoneOffset() * -60000);
44+
return (
45+
currDr.status === DesignReviewStatus.SCHEDULED &&
46+
cleanDate.toLocaleDateString() === selectedDate.toLocaleDateString() &&
47+
times.some((time) => currDr.meetingTimes.includes(time)) &&
4448
currDr.designReviewId !== designReview.designReviewId
45-
);
49+
);
50+
});
4651

4752
currentWeekDesignReviews.forEach((designReview) =>
48-
designReview.meetingTimes.forEach((meetingTime) => existingMeetingData.set(meetingTime, 'build'))
53+
designReview.meetingTimes.forEach((meetingTime) => {
54+
if (designReview.status === DesignReviewStatus.SCHEDULED) existingMeetingData.set(meetingTime, 'build');
55+
})
4956
);
5057

58+
allUsers
59+
.filter((user) => requiredUserIds.concat(optionalUserIds).includes(user.userId))
60+
.forEach((user: UserWithScheduleSettings) => {
61+
usersToAvailabilities.set(user, user.scheduleSettings?.availability ?? []);
62+
});
63+
5164
return (
5265
<Grid container>
5366
<Grid item xs={9}>
@@ -67,8 +80,8 @@ const AvailabilityView: React.FC<AvailabilityViewProps> = ({
6780
currentUnavailableUsers={currentUnavailableUsers}
6881
usersToAvailabilities={usersToAvailabilities}
6982
designReview={designReview}
70-
selectedDate={selectedDate}
7183
conflictingDesignReviews={conflictingDesignReviews}
84+
editPayload={editPayload}
7285
/>
7386
</Grid>
7487
</Grid>

0 commit comments

Comments
 (0)