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