Path: blob/master/src/packages/frontend/course/modals.tsx
1503 views
/*1* This file is part of CoCalc: Copyright © 2024 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { Alert, Modal } from "antd";6import { useIntl } from "react-intl";78import { AppRedux } from "@cocalc/frontend/app-framework";9import { Icon, IconName } from "@cocalc/frontend/components/icon";10import { AddAssignments } from "@cocalc/frontend/course/assignments/assignments-panel";11import { COMMANDS } from "@cocalc/frontend/course/commands";12import { DeleteAllStudentProjects } from "@cocalc/frontend/course/configuration//delete-all-student-projects";13import { DeleteAllStudents } from "@cocalc/frontend/course/configuration//delete-all-students";14import {15CopyMissingHandoutsAndAssignments,16ExportGrades,17ReconfigureAllProjects,18ResendInvites,19StartAllProjects,20} from "@cocalc/frontend/course/configuration/actions-panel";21import ConfigurationCopying from "@cocalc/frontend/course/configuration/configuration-copying";22import {23CollaboratorPolicy,24ConfigureSoftwareEnvironment,25EmailInvitation,26EnvVariables,27NetworkFilesystem,28RestrictStudentProjects,29TitleAndDescription,30UpgradeConfiguration,31} from "@cocalc/frontend/course/configuration/configuration-panel";32import EmptyTrash from "@cocalc/frontend/course/configuration/empty-trash";33import { Nbgrader } from "@cocalc/frontend/course/configuration/nbgrader";34import { Parallel } from "@cocalc/frontend/course/configuration/parallel";35import { TerminalCommandPanel } from "@cocalc/frontend/course/configuration/terminal-command";36import { AddHandouts } from "@cocalc/frontend/course/handouts/handouts-panel";37import { DeleteSharedProjectPanel } from "@cocalc/frontend/course/shared-project/delete-shared-project";38import { SharedProjectPanel } from "@cocalc/frontend/course/shared-project/shared-project-panel";39import AddStudents from "@cocalc/frontend/course/students/add-students";40import { course, IntlMessage, isIntlMessage } from "@cocalc/frontend/i18n";41import type { ProjectMap, UserMap } from "@cocalc/frontend/todo-types";42import { CourseEditorActions } from "../frame-editors/course-editor/actions";43import { CourseActions } from "./actions";44import type { CourseSettingsRecord, StudentsMap } from "./store";4546interface Props {47frameActions: CourseEditorActions;48actions: CourseActions;49modal?: string;50name: string;51students?: StudentsMap;52user_map?: UserMap;53project_map?: ProjectMap;54project_id: string;55path: string;56configuring_projects?: boolean;57reinviting_students?: boolean;58settings?: CourseSettingsRecord;59redux: AppRedux;60}6162export default function Modals(props: Props) {63const intl = useIntl();64const { students, user_map, project_map, modal } = props;65if (students == null || user_map == null || project_map == null || !modal) {66return null;67}68const close = () => {69props.frameActions.setState({ modal: "" });70};71const { title, Body, icon } = getModal(modal);7273return (74<Modal75onCancel={close}76onOk={close}77cancelButtonProps={{ style: { display: "none" } }}78okText="Close"79open80title={81title ? (82<>83{icon && <Icon name={icon} />}{" "}84{isIntlMessage(title) ? intl.formatMessage(title) : title}85</>86) : undefined87}88width={800}89>90<br />91<Body92{...props}93students={students}94user_map={user_map}95project_map={project_map}96close={close}97/>98</Modal>99);100}101102function getModal(modal: string): {103Body: (props) => React.JSX.Element;104title?: string | IntlMessage;105icon?: IconName;106} {107const { label: title, icon } = COMMANDS[modal] ?? {};108switch (modal) {109case "add-students":110return { Body: AddStudents, title, icon };111case "add-assignments":112return {113Body: AddAssignments,114title: course.add_assignments,115icon: "share-square",116};117case "add-handouts":118return { Body: AddHandouts, title, icon };119120case "start-all-projects":121return {122Body: StartAllProjects,123};124125case "terminal-command":126return { Body: TerminalCommandPanel };127128case "reconfigure-all-projects":129return {130Body: ReconfigureAllProjects,131};132133case "export-grades":134return { Body: ExportGrades };135136case "resend-invites":137return { Body: ResendInvites };138139case "copy-missing-handouts-and-assignments":140return { Body: CopyMissingHandoutsAndAssignments };141142case "empty-trash":143return { Body: EmptyTrash };144145case "delete-student-projects":146return { Body: DeleteAllStudentProjects };147148case "delete-students":149return { Body: DeleteAllStudents };150151case "delete-shared-project":152return { Body: DeleteSharedProjectPanel };153154case "create-shared-project":155return { Body: SharedProjectPanel };156157case "title-and-description":158return { Body: TitleAndDescription };159160case "email-invitation":161return { Body: EmailInvitation };162case "copy-limit":163return { Body: Parallel };164case "collaborator-policy":165return { Body: CollaboratorPolicy };166case "restrict-student-projects":167return { Body: RestrictStudentProjects };168case "nbgrader":169return { Body: Nbgrader };170case "network-file-systems":171return { Body: NetworkFilesystem };172case "env-variables":173return { Body: EnvVariables };174case "upgrades":175return { Body: UpgradeConfiguration };176case "software-environment":177return { Body: ConfigureSoftwareEnvironment };178case "configuration-copying":179return { Body: ConfigurationCopying };180181default:182return {183Body: () => (184<Alert type="warning" message={<>BUG -- Unknown modal: {modal}</>} />185),186title: "Error",187icon: "bug",188};189}190}191192193