Skip to content

Commit

Permalink
Merge branch 'dev' into feature/sidebar-patches
Browse files Browse the repository at this point in the history
  • Loading branch information
Shzmj committed Jul 8, 2024
2 parents c7f7a5c + 543dbec commit 7a969a0
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 82 deletions.
93 changes: 93 additions & 0 deletions client/src/components/StyledDialog.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import React from 'react';
import { Dialog, DialogTitle, DialogContent, DialogActions, Button, IconButton } from '@mui/material';
import { Close as CloseIcon } from '@mui/icons-material';
import { styled } from '@mui/system';

const ContentContainer = styled('div')`
display: flex;
flex-direction: column;
justify-content: space-between;
height: 100%;
width: 100%;
padding-top: 10px;
`;

const StyledDialogTitleFont = styled('div')`
font-size: 18px;
font-weight: 500;
`;

const StyledDialogContent = styled(DialogContent)`
padding-bottom: 20px;
`;

const StyledDialogButtons = styled(DialogActions)`
display: flex;
flex-direction: row;
justify-content: flex-end;
align-items: flex-end;
gap: 12px;
padding-bottom: 20px;
padding-right: 24px;
`;

export const StyledDialogTitle = styled(DialogTitle)`
display: flex;
flex-direction: row;
padding: 8px 12px 8px 24px;
justify-content: space-between;
align-items: center;
`;

const CustomCloseIconButton = styled(IconButton)`
width: 40px;
height: 40px;
border-radius: 8px;
`;

// Props definition
interface StyledDialogProps {
open: boolean;
onClose: () => void;
onConfirm: () => void;
title: string;
content: string;
confirmButtonText: string;
cancelButtonText?: string;
disableConfirm?: boolean;
confirmButtonId?: string;
}

const StyledDialog: React.FC<StyledDialogProps> = ({
open,
onClose,
onConfirm,
title,
content,
confirmButtonText,
cancelButtonText = 'Cancel',
disableConfirm = false,
confirmButtonId,
}) => (
<Dialog maxWidth="xs" onClose={onClose} open={open}>
<ContentContainer>
<StyledDialogTitle>
<StyledDialogTitleFont>{title}</StyledDialogTitleFont>
<CustomCloseIconButton onClick={onClose}>
<CloseIcon />
</CustomCloseIconButton>
</StyledDialogTitle>
<StyledDialogContent>{content}</StyledDialogContent>
</ContentContainer>
<StyledDialogButtons>
<Button onClick={onClose} variant="outlined">
{cancelButtonText}
</Button>
<Button id={confirmButtonId} onClick={onConfirm} variant="contained" disabled={disableConfirm}>
{confirmButtonText}
</Button>
</StyledDialogButtons>
</Dialog>
);

export default StyledDialog;
49 changes: 15 additions & 34 deletions client/src/components/controls/History.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
extractHistoryInfo,
TimetableActions,
} from '../../utils/timetableHelpers';
import StyledDialog from '../StyledDialog';

// Two actions are created when the page first loads
// One, when selectedClasses is initialised, and two, when createdEvents is initialised
Expand Down Expand Up @@ -290,40 +291,20 @@ const History: React.FC = () => {
return (
<>
{/* Clear timetable(s) Dialog */}
<Dialog maxWidth="xs" onClose={() => setClearOpen(false)} open={clearOpen}>
<StyledTitleContainer>
<StyledDialogTitle>
<StyledDialogTitleFont>Confirm Clear</StyledDialogTitleFont>
<StyledCloseIcon
onClick={() => {
setClearOpen(false);
}}
/>
</StyledDialogTitle>
<StyledDialogContent>Are you sure you want to clear all timetables?</StyledDialogContent>
</StyledTitleContainer>
<StyledDialogButtons>
<Button
onClick={() => {
setClearOpen(false);
}}
variant="outlined"
>
CANCEL
</Button>
<Button
disabled={disableReset.all}
id="confirm-delete-button"
onClick={() => {
clearAll();
setClearOpen(false);
}}
variant="contained"
>
CLEAR
</Button>
</StyledDialogButtons>
</Dialog>
<StyledDialog
open={clearOpen}
onClose={() => setClearOpen(false)}
onConfirm={() => {
clearAll();
setClearOpen(false);
}}
title="Confirm Clear"
content="Are you sure you want to clear all timetables?"
confirmButtonText="Clear"
cancelButtonText="Cancel"
disableConfirm={disableReset.all}
confirmButtonId="confirm-delete-button"
/>
<Tooltip title={clearTooltip}>
<IconButton disabled={disableReset.all} color="inherit" onClick={() => setClearOpen(true)} size="large">
<Delete />
Expand Down
57 changes: 36 additions & 21 deletions client/src/components/sidebar/UserAccount.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import React, { useEffect, useState } from 'react';
import { AccountCircle, LoginRounded, LogoutRounded } from '@mui/icons-material';
import { Button, IconButton, Tooltip } from '@mui/material';
import { styled } from '@mui/system';
import React, { useEffect, useState } from 'react';

import { API_URL } from '../../api/config';
import StyledDialog from '../StyledDialog';

interface UserAccountProps {
collapsed: boolean;
Expand Down Expand Up @@ -50,6 +50,8 @@ const UserAccount: React.FC<UserAccountProps> = ({ collapsed }) => {
const [login, setLogin] = useState(false);
const [windowLocation, setWindowLocation] = useState('');
const [user, setUser] = useState<User>({ zid: '' });
const [logoutDialog, setLogoutDialog] = useState(false);

useEffect(() => {
async function runAsync() {
try {
Expand Down Expand Up @@ -114,29 +116,42 @@ const UserAccount: React.FC<UserAccountProps> = ({ collapsed }) => {
}

return (
<UserAuth>
{collapsed ? (
<Tooltip title="Log out" placement="right">
<StyledIconButton onClick={logoutCall}>
<LogoutRounded />
</StyledIconButton>
</Tooltip>
) : (
<>
<UserInfo>
<StyledAccountIcon />
{/* TODO: handle user's name */}
<p>{user.zid}</p>
</UserInfo>
<>
<StyledDialog
open={logoutDialog}
onClose={() => setLogoutDialog(false)}
onConfirm={() => {
logoutCall();
setLogoutDialog(false);
}}
title='Confirm Log out'
content='Are you sure you want to log out?'
confirmButtonText='Log out'
/>
<UserAuth>
{collapsed ? (
<Tooltip title="Log out" placement="right">
{/* TODO: error handling for when logging out */}
<StyledIconButton color="inherit" onClick={logoutCall}>
<StyledIconButton onClick={() => setLogoutDialog(true)}>
<LogoutRounded />
</StyledIconButton>
</Tooltip>
</>
)}
</UserAuth>
) : (
<>
<UserInfo>
<StyledAccountIcon />
{/* TODO: handle user's name */}
<p>{user.zid}</p>
</UserInfo>
<Tooltip title="Log out" placement="right">
{/* TODO: error handling for when logging out */}
<StyledIconButton color="inherit" onClick={logoutCall}>
<LogoutRounded />
</StyledIconButton>
</Tooltip>
</>
)}
</UserAuth>
</>
);
};

Expand Down
39 changes: 12 additions & 27 deletions client/src/components/timetableTabs/TimetableTabContextMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,16 @@ import { CourseContext } from '../../context/CourseContext';
import { CourseData, CreatedEvents, SelectedClasses, TimetableData } from '../../interfaces/Periods';
import { TimetableTabContextMenuProps } from '../../interfaces/PropTypes';
import {
StyledCloseIcon,
StyledDialogButtons,
StyledDialogContent,
StyledDialogTitle,
StyledDialogTitleFont,
StyledTitleContainer,
StyledTopIcons,
} from '../../styles/ControlStyles';
import { ExecuteButton, RedDeleteIcon, RedListItemText, StyledMenu } from '../../styles/CustomEventStyles';
import { StyledSnackbar } from '../../styles/TimetableTabStyles';
import storage from '../../utils/storage';
import { duplicateClasses, duplicateEvents } from '../../utils/timetableHelpers';
import StyledDialog from '../StyledDialog';

const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ anchorElement, setAnchorElement }) => {
const TIMETABLE_LIMIT = 13;
Expand Down Expand Up @@ -405,30 +403,17 @@ const TimetableTabContextMenu: React.FC<TimetableTabContextMenuProps> = ({ ancho
</Dialog>

{/* Delete timetable Dialog */}
<Dialog maxWidth="xs" open={deleteOpen} onClose={handleMenuClose}>
<StyledTitleContainer>
<StyledDialogTitle>
<StyledDialogTitleFont>Confirm Deletion</StyledDialogTitleFont>
<StyledCloseIcon onClick={handleMenuClose} />
</StyledDialogTitle>
<StyledDialogContent>Are you sure you want to delete this current timetable?</StyledDialogContent>
</StyledTitleContainer>
<StyledDialogButtons>
<Button onClick={handleMenuClose} variant="outlined">
Cancel
</Button>
<Button
id="confirm-delete-button"
onClick={() => {
handleDeleteTimetable(selectedTimetable);
handleMenuClose();
}}
variant="contained"
>
Delete
</Button>
</StyledDialogButtons>
</Dialog>
<StyledDialog
open={deleteOpen}
onClose={handleMenuClose}
onConfirm={() => {
handleDeleteTimetable(selectedTimetable);
handleMenuClose();
}}
title="Confirm Deletion"
content="Are you sure you want to delete this current timetable?"
confirmButtonText="Delete"
/>
{/* Restore deleted timetable Alert */}
<StyledSnackbar
open={openRestoreAlert}
Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 7a969a0

Please sign in to comment.