From bc2d9785ae2a75eddc5e7af50a5cf0c46aa272a5 Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:56:49 +0800 Subject: [PATCH 1/9] Install `clsx` and `es-toolkit` --- package.json | 2 ++ yarn.lock | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/package.json b/package.json index a0113308b8..d766fdd229 100644 --- a/package.json +++ b/package.json @@ -53,9 +53,11 @@ "array-move": "^4.0.0", "browserfs": "^1.4.3", "classnames": "^2.3.2", + "clsx": "^2.1.1", "conductor": "https://github.com/source-academy/conductor.git#0.2.1", "dayjs": "^1.11.13", "dompurify": "^3.2.4", + "es-toolkit": "^1.39.9", "flexboxgrid": "^6.3.1", "flexboxgrid-helpers": "^1.1.3", "hastscript": "^9.0.0", diff --git a/yarn.lock b/yarn.lock index 25641adc70..8f6546dbb4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6868,6 +6868,18 @@ __metadata: languageName: node linkType: hard +"es-toolkit@npm:^1.39.9": + version: 1.39.9 + resolution: "es-toolkit@npm:1.39.9" + dependenciesMeta: + "@trivago/prettier-plugin-sort-imports@4.3.0": + unplugged: true + prettier-plugin-sort-re-exports@0.0.1: + unplugged: true + checksum: 10c0/98921f79dc8f24982ed3265e10267dc64b0e9384925005d645b0a893848eacef3b1646a91e19fd962e8c0527361dbe9aa1dddf01fbc6b816f2345201624d2474 + languageName: node + linkType: hard + "esbuild@npm:^0.25.0": version: 0.25.8 resolution: "esbuild@npm:0.25.8" @@ -7587,12 +7599,14 @@ __metadata: buffer: "npm:^6.0.3" canvas: "npm:^3.1.0" classnames: "npm:^2.3.2" + clsx: "npm:^2.1.1" conductor: "https://github.com/source-academy/conductor.git#0.2.1" constants-browserify: "npm:^1.0.0" coveralls: "npm:^3.1.1" cross-env: "npm:^10.0.0" dayjs: "npm:^1.11.13" dompurify: "npm:^3.2.4" + es-toolkit: "npm:^1.39.9" eslint: "npm:^9.9.0" eslint-plugin-react: "npm:^7.35.0" eslint-plugin-react-hooks: "npm:^5.2.0" From 1cfcd6a83e6a980aa67a16d635f4e45a3581df4a Mon Sep 17 00:00:00 2001 From: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Sat, 16 Aug 2025 22:03:35 +0800 Subject: [PATCH 2/9] Update most files to use clsx --- src/commons/Markdown.tsx | 4 ++-- src/commons/application/ApplicationWrapper.tsx | 4 ++-- src/commons/assessment/AssessmentNotFound.tsx | 4 ++-- .../assessment/AssessmentOverviewCard.tsx | 6 +++--- .../assessmentWorkspace/AssessmentWorkspace.tsx | 6 +++--- src/commons/controlBar/ControlBar.tsx | 10 ++++------ src/commons/dialogs/ConfirmDialog.tsx | 6 +++--- .../editingWorkspace/EditingWorkspace.tsx | 6 +++--- src/commons/editor/tabs/EditorTab.tsx | 4 ++-- .../fileSystemView/FileSystemViewContextMenu.tsx | 4 ++-- src/commons/gitHubOverlay/FileExplorerDialog.tsx | 6 +++--- src/commons/gitHubOverlay/RepositoryDialog.tsx | 4 ++-- src/commons/grading/GradingText.tsx | 4 ++-- .../mobileSideContent/MobileSideContent.tsx | 4 ++-- src/commons/repl/Repl.tsx | 4 ++-- src/commons/repl/ReplInput.tsx | 4 ++-- src/commons/sideBar/SideBar.tsx | 4 ++-- .../content/SideContentContestVoting.tsx | 6 +++--- .../content/SideContentCseMachine.tsx | 4 ++-- .../content/SideContentDataVisualizer.tsx | 6 +++--- .../content/SideContentLeaderboardCard.tsx | 4 ++-- .../content/SideContentResultCard.tsx | 4 ++-- .../content/SideContentSessionManagement.tsx | 12 ++++++------ .../content/SideContentTestcaseCard.tsx | 4 ++-- .../content/SideContentToneMatrix.tsx | 4 ++-- .../SideContentEditableTestcaseCard.tsx | 4 ++-- .../SideContentRemoteExecution.tsx | 4 ++-- .../remoteExecution/PeripheralContainer.tsx | 4 ++-- .../RemoteExecutionDeviceDialog.tsx | 8 ++++---- src/pages/academy/Academy.tsx | 4 ++-- .../grading/subcomponents/GradingBadges.tsx | 4 ++-- .../subcomponents/GradingSubmissionsTable.tsx | 6 +++--- .../grading/subcomponents/GradingWorkspace.tsx | 6 +++--- .../gradingSubmissionsTableUtils.tsx | 16 ++++++++-------- .../subcomponents/GroundControlDropzone.tsx | 4 ++-- src/pages/academy/sourcereel/Sourcereel.tsx | 4 ++-- src/pages/githubCallback/GitHubCallback.tsx | 6 +++--- src/pages/login/LoginCallback.tsx | 4 ++-- src/pages/login/LoginPage.tsx | 4 ++-- src/pages/login/LoginVscodeCallback.tsx | 6 +++--- src/pages/login/NusLogin.tsx | 12 ++++++------ src/pages/missionControl/MissionControl.tsx | 4 ++-- src/pages/notFound/NotFound.tsx | 4 ++-- src/pages/playground/Playground.tsx | 6 +++--- src/pages/sicp/Sicp.tsx | 4 ++-- src/pages/sourcecast/Sourcecast.tsx | 4 ++-- src/pages/stories/Story.tsx | 4 ++-- 47 files changed, 124 insertions(+), 126 deletions(-) diff --git a/src/commons/Markdown.tsx b/src/commons/Markdown.tsx index 0a15c40e9a..c59d7a0180 100644 --- a/src/commons/Markdown.tsx +++ b/src/commons/Markdown.tsx @@ -1,5 +1,5 @@ import { Classes } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import DOMPurify from 'dompurify'; import React from 'react'; import { Converter } from 'showdown'; @@ -24,7 +24,7 @@ const Markdown: React.FC = props => { return (
{ if (!isApiHealthy) { return ( -
+
( -
+
= ({ return (
-
+
= ({ src={overview.coverImage ? overview.coverImage : defaultCoverImage} />
-
+
= props => { if (!assessment?.questions.length) { return ( } /> @@ -1042,7 +1042,7 @@ It is safe to close this window.`} mobileSideContentProps: mobileSideContentProps(questionId) }; return ( -
+
{submissionOverlay} {overlay} {resetTemplateOverlay} diff --git a/src/commons/controlBar/ControlBar.tsx b/src/commons/controlBar/ControlBar.tsx index ad8eff695f..9b26f0f2e7 100644 --- a/src/commons/controlBar/ControlBar.tsx +++ b/src/commons/controlBar/ControlBar.tsx @@ -1,5 +1,5 @@ import { Classes } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; export type ControlBarProps = { @@ -10,17 +10,15 @@ export type ControlBarProps = { const ControlBar: React.FC = props => { const editorControl = ( -
- {props.editorButtons} -
+
{props.editorButtons}
); const flowControl = props.flowButtons && ( -
{props.flowButtons}
+
{props.flowButtons}
); const editingWorkspaceControl = ( -
+
{props.editingWorkspaceButtons}
); diff --git a/src/commons/dialogs/ConfirmDialog.tsx b/src/commons/dialogs/ConfirmDialog.tsx index 81f2dfbad9..281746988c 100644 --- a/src/commons/dialogs/ConfirmDialog.tsx +++ b/src/commons/dialogs/ConfirmDialog.tsx @@ -9,7 +9,7 @@ import { IconName, Intent } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; import classes from 'src/styles/ConfirmDialog.module.scss'; @@ -34,7 +34,7 @@ export function ConfirmDialog( onClick={() => props.onResponse && props.onResponse(choice.key)} intent={choice.intent} fill={props.largeButtons} - className={classNames(props.largeButtons && classes['large-button'])} + className={clsx(props.largeButtons && classes['large-button'])} {...choice.props} > {choice.label} @@ -47,7 +47,7 @@ export function ConfirmDialog( : () => props.onResponse && props.onResponse(escapeResponse); return ( = props => { if (assessment === null || assessment!.questions.length === 0) { return ( } /> @@ -707,7 +707,7 @@ const EditingWorkspace: React.FC = props => { } }; return ( -
+
{resetTemplateOverlay()}
diff --git a/src/commons/editor/tabs/EditorTab.tsx b/src/commons/editor/tabs/EditorTab.tsx index 9eabde9332..e8d0c97abb 100644 --- a/src/commons/editor/tabs/EditorTab.tsx +++ b/src/commons/editor/tabs/EditorTab.tsx @@ -1,6 +1,6 @@ import { Card, Icon } from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; type Props = { @@ -19,7 +19,7 @@ const EditorTab: React.FC = ({ filePath, isActive, setActive, remove }) = return ( = ({
{children} toggleMenu(false)} diff --git a/src/commons/gitHubOverlay/FileExplorerDialog.tsx b/src/commons/gitHubOverlay/FileExplorerDialog.tsx index 6afffd2236..c611a605a8 100644 --- a/src/commons/gitHubOverlay/FileExplorerDialog.tsx +++ b/src/commons/gitHubOverlay/FileExplorerDialog.tsx @@ -12,7 +12,7 @@ import { } from '@blueprintjs/core'; import { Octokit } from '@octokit/rest'; import { GetResponseTypeFromEndpointMethod } from '@octokit/types'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import { @@ -46,7 +46,7 @@ const FileExplorerDialog: React.FC = props => { return ( -
+

Select a File

@@ -55,7 +55,7 @@ const FileExplorerDialog: React.FC = props => { onNodeClick={handleNodeClick} onNodeCollapse={handleNodeCollapse} onNodeExpand={handleNodeExpand} - className={classNames('FileTree', Classes.ELEVATION_0)} + className={clsx('FileTree', Classes.ELEVATION_0)} /> {props.pickerType === 'Save' && (
diff --git a/src/commons/gitHubOverlay/RepositoryDialog.tsx b/src/commons/gitHubOverlay/RepositoryDialog.tsx index 97e539c753..fad3616051 100644 --- a/src/commons/gitHubOverlay/RepositoryDialog.tsx +++ b/src/commons/gitHubOverlay/RepositoryDialog.tsx @@ -9,7 +9,7 @@ import { Radio, RadioGroup } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { useState } from 'react'; import { showWarningMessage } from '../utils/notifications/NotificationsHelper'; @@ -24,7 +24,7 @@ const RepositoryDialog: React.FC = props => { return ( -
+

Select a Repository

diff --git a/src/commons/grading/GradingText.tsx b/src/commons/grading/GradingText.tsx index a96d7bb75a..0b61f0e4b3 100644 --- a/src/commons/grading/GradingText.tsx +++ b/src/commons/grading/GradingText.tsx @@ -1,5 +1,5 @@ import { Classes, Text } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; const defaultStyles: React.CSSProperties = { @@ -17,7 +17,7 @@ type Props = { const GradingText: React.FC = ({ children, style, isSecondaryText, className }) => { return ( {children} diff --git a/src/commons/mobileWorkspace/mobileSideContent/MobileSideContent.tsx b/src/commons/mobileWorkspace/mobileSideContent/MobileSideContent.tsx index 08646a28c5..956bc9df96 100644 --- a/src/commons/mobileWorkspace/mobileSideContent/MobileSideContent.tsx +++ b/src/commons/mobileWorkspace/mobileSideContent/MobileSideContent.tsx @@ -1,5 +1,5 @@ import { Classes, Icon, Tab, Tabs, Tooltip } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; import { SideContentProps } from 'src/commons/sideContent/SideContent'; import { generateIconId } from 'src/commons/sideContent/SideContentHelper'; @@ -106,7 +106,7 @@ const MobileSideContent: React.FC = ({ onChange={onChange} renderActiveTabPanelOnly={renderActiveTabPanelOnly} selectedTabId={selectedTab} - className={classNames(Classes.DARK, 'mobile-side-content')} + className={clsx(Classes.DARK, 'mobile-side-content')} > {allTabs.map(tab => renderTab(tab, isIOS))} diff --git a/src/commons/repl/Repl.tsx b/src/commons/repl/Repl.tsx index 2a8416c6b5..17cf12470b 100644 --- a/src/commons/repl/Repl.tsx +++ b/src/commons/repl/Repl.tsx @@ -1,6 +1,6 @@ import { Card, Pre } from '@blueprintjs/core'; import { Ace } from 'ace-builds'; -import classNames from 'classnames'; +import clsx from 'clsx'; import { parseError } from 'js-slang'; import { Chapter, Variant } from 'js-slang/dist/types'; import { stringify } from 'js-slang/dist/utils/stringify'; @@ -52,7 +52,7 @@ const Repl: React.FC = props => {
{cards} {!props.inputHidden && ( - + )} diff --git a/src/commons/repl/ReplInput.tsx b/src/commons/repl/ReplInput.tsx index dc2a4e4bbc..770ba51484 100644 --- a/src/commons/repl/ReplInput.tsx +++ b/src/commons/repl/ReplInput.tsx @@ -1,6 +1,6 @@ import { Classes } from '@blueprintjs/core'; import { Ace } from 'ace-builds'; -import classNames from 'classnames'; +import clsx from 'clsx'; import { Chapter, Variant } from 'js-slang/dist/types'; import React from 'react'; import AceEditor from 'react-ace'; @@ -139,7 +139,7 @@ export const ReplInput: React.FC = props => { }} ref={replInput} /> -
{replButtons()}
+
{replButtons()}
{isDesktopBreakpoint &&
} ); diff --git a/src/commons/sideBar/SideBar.tsx b/src/commons/sideBar/SideBar.tsx index 39c9813dae..c516f4fd16 100644 --- a/src/commons/sideBar/SideBar.tsx +++ b/src/commons/sideBar/SideBar.tsx @@ -1,5 +1,5 @@ import { Card, Icon, IconName } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; import { SideContentType } from '../sideContent/SideContentTypes'; @@ -52,7 +52,7 @@ const SideBar: React.FC = ({ tabs, isExpanded, expandSideBar, collapseSid {tabs.map((tab, index) => ( handleTabSelection(index)} diff --git a/src/commons/sideContent/content/SideContentContestVoting.tsx b/src/commons/sideContent/content/SideContentContestVoting.tsx index 2af8989e25..8b9d8790f6 100644 --- a/src/commons/sideContent/content/SideContentContestVoting.tsx +++ b/src/commons/sideContent/content/SideContentContestVoting.tsx @@ -1,6 +1,6 @@ import { Button, Card, Classes, Collapse, Elevation, Icon, Pre, Tooltip } from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { ContestEntry } from '../../assessment/AssessmentTypes'; @@ -103,7 +103,7 @@ const SideContentContestVoting: React.FC = ({ const tierBoard = useMemo(() => { return TIERS.map((tier, index) => (
= ({ > {sortedContestEntries.map((contestEntry: ContestEntry, index) => (
overflow: this.state.visualization ? 'hidden' : 'auto' }} > -
+
-
+
{this.state.steps.length > 1 ? (
{step.length > 1 && (
Structure {i + 1} diff --git a/src/commons/sideContent/content/SideContentLeaderboardCard.tsx b/src/commons/sideContent/content/SideContentLeaderboardCard.tsx index f96b7b457c..3e330bef00 100644 --- a/src/commons/sideContent/content/SideContentLeaderboardCard.tsx +++ b/src/commons/sideContent/content/SideContentLeaderboardCard.tsx @@ -1,5 +1,5 @@ import { Card, Classes, Elevation, Pre } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; import { ContestEntry } from '../../assessment/AssessmentTypes'; @@ -21,7 +21,7 @@ const SideContentLeaderboardCard: React.FC = ({ rank }) => { return ( -
+
= ({ index, result }) => { return (
diff --git a/src/commons/sideContent/content/SideContentSessionManagement.tsx b/src/commons/sideContent/content/SideContentSessionManagement.tsx index 99c1f307ba..6bc87e04fe 100644 --- a/src/commons/sideContent/content/SideContentSessionManagement.tsx +++ b/src/commons/sideContent/content/SideContentSessionManagement.tsx @@ -1,7 +1,7 @@ import { Classes, HTMLTable, Icon, Switch } from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; import { CollabEditingAccess, type SharedbAceUser } from '@sourceacademy/sharedb-ace/types'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { useEffect, useState } from 'react'; import CopyToClipboard from 'react-copy-to-clipboard'; import { useDispatch } from 'react-redux'; @@ -73,7 +73,7 @@ function AdminView({ users, playgroundCode }: AdminViewProps) { alignIndicator="left" checked={toggleAll} onChange={event => handleAllToggleAccess(event.target.checked)} - className={classNames(classes['switch'], classes['default-switch'])} + className={clsx(classes['switch'], classes['default-switch'])} />
@@ -84,7 +84,7 @@ function AdminView({ users, playgroundCode }: AdminViewProps) { alignIndicator="left" checked={defaultRole} onChange={event => handleDefaultToggleAccess(event.target.checked)} - className={classNames(classes['switch'], classes['default-switch'])} + className={clsx(classes['switch'], classes['default-switch'])} /> @@ -97,7 +97,7 @@ function AdminView({ users, playgroundCode }: AdminViewProps) { {Object.entries(users).map(([userId, user], index) => ( - +
{user.name}
@@ -184,14 +184,14 @@ const SideContentSessionManagement: React.FC = ({ {Object.values(users).map((user, index) => { return ( - +
{user.name}
- + {user.role === CollabEditingAccess.OWNER ? 'Admin' : user.role.charAt(0).toUpperCase() + user.role.slice(1)} diff --git a/src/commons/sideContent/content/SideContentTestcaseCard.tsx b/src/commons/sideContent/content/SideContentTestcaseCard.tsx index a8342d6cb2..e66dfd2a80 100644 --- a/src/commons/sideContent/content/SideContentTestcaseCard.tsx +++ b/src/commons/sideContent/content/SideContentTestcaseCard.tsx @@ -1,5 +1,5 @@ import { Card, Classes, Elevation, Pre } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import { parseError } from 'js-slang'; import { stringify } from 'js-slang/dist/utils/stringify'; import React from 'react'; @@ -61,7 +61,7 @@ const SideContentTestcaseCard: React.FC = props => * be rendered in the GitHubAssessmentWorkspace for students. */ return ( -
+
{testcase.type === TestcaseTypes.opaque && props.workspaceLocation === 'assessment' ? ( // Render a placeholder cell in place of the actual testcase data for opaque testcases diff --git a/src/commons/sideContent/content/SideContentToneMatrix.tsx b/src/commons/sideContent/content/SideContentToneMatrix.tsx index 4c4a307d20..1991c1d0a2 100644 --- a/src/commons/sideContent/content/SideContentToneMatrix.tsx +++ b/src/commons/sideContent/content/SideContentToneMatrix.tsx @@ -1,5 +1,5 @@ import { Button, Classes } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { useEffect, useRef } from 'react'; const SideContentToneMatrix: React.FC = () => { @@ -22,7 +22,7 @@ const SideContentToneMatrix: React.FC = () => { return (
-
+
diff --git a/src/commons/sideContent/content/githubAssessments/SideContentEditableTestcaseCard.tsx b/src/commons/sideContent/content/githubAssessments/SideContentEditableTestcaseCard.tsx index 2407f595eb..1a7afc4431 100644 --- a/src/commons/sideContent/content/githubAssessments/SideContentEditableTestcaseCard.tsx +++ b/src/commons/sideContent/content/githubAssessments/SideContentEditableTestcaseCard.tsx @@ -1,6 +1,6 @@ import { Button, Card, Classes, Elevation, InputGroup } from '@blueprintjs/core'; import { IconNames } from '@blueprintjs/icons'; -import classNames from 'classnames'; +import clsx from 'clsx'; import { parseError } from 'js-slang'; import { stringify } from 'js-slang/dist/utils/stringify'; import React from 'react'; @@ -72,7 +72,7 @@ const SideContentEditableTestcaseCard: React.FC +
{ <> diff --git a/src/commons/sideContent/content/remoteExecution/SideContentRemoteExecution.tsx b/src/commons/sideContent/content/remoteExecution/SideContentRemoteExecution.tsx index 6f5c04d1d0..55ae7372d6 100644 --- a/src/commons/sideContent/content/remoteExecution/SideContentRemoteExecution.tsx +++ b/src/commons/sideContent/content/remoteExecution/SideContentRemoteExecution.tsx @@ -7,7 +7,7 @@ import { NonIdealState, Spinner } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React, { SetStateAction, useCallback } from 'react'; import { useDispatch } from 'react-redux'; import { NavLink } from 'react-router'; @@ -150,7 +150,7 @@ const SideContentRemoteExecution: React.FC = pr
- + dispatch(actions.remoteExecDisconnect())} diff --git a/src/features/remoteExecution/PeripheralContainer.tsx b/src/features/remoteExecution/PeripheralContainer.tsx index a02f8af07c..41f4053abe 100644 --- a/src/features/remoteExecution/PeripheralContainer.tsx +++ b/src/features/remoteExecution/PeripheralContainer.tsx @@ -1,5 +1,5 @@ import { Classes } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; type PeripheralContainerProps = { src: string | React.ReactElement; @@ -11,7 +11,7 @@ const PeripheralContainer: React.FC = ({ src, alt = 'I return (
{typeof src == 'string' ? {alt} : src} diff --git a/src/features/remoteExecution/RemoteExecutionDeviceDialog.tsx b/src/features/remoteExecution/RemoteExecutionDeviceDialog.tsx index 9b16045e64..ac42cc4c24 100644 --- a/src/features/remoteExecution/RemoteExecutionDeviceDialog.tsx +++ b/src/features/remoteExecution/RemoteExecutionDeviceDialog.tsx @@ -10,7 +10,7 @@ import { InputGroup, Tooltip } from '@blueprintjs/core'; -import classNames from 'classnames'; +import clsx from 'clsx'; import React from 'react'; import { QrReader } from 'react-qr-reader'; import { useDispatch } from 'react-redux'; @@ -112,7 +112,7 @@ const RemoteExecutionDeviceDialog: React.FC = ({ > = ({ void (typeField.ref.current = element)} disabled={isSubmitting || !!deviceToEdit} {...(deviceToEdit ? { value: deviceToEdit.type } : undefined)} @@ -144,7 +144,7 @@ const RemoteExecutionDeviceDialog: React.FC = ({ { ) : routeCourseId === courseId ? ( ) : ( -
+
= props => { return (
= ({ "Hmm... we didn't find any submissions, you might want to debug your filter() function.", pageSize: pageSize, pagination: true, - rowClass: classNames(classes['grading-left-align'], classes['grading-table-rows']), + rowClass: clsx(classes['grading-left-align'], classes['grading-table-rows']), rowHeight: ROW_HEIGHT, suppressMenuHide: true, suppressPaginationPanel: true, @@ -374,7 +374,7 @@ const GradingSubmissionTable: React.FC = ({