Path: blob/master/src/packages/frontend/course/commands.ts
1503 views
/*1* This file is part of CoCalc: Copyright © 2024 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { defineMessage } from "react-intl";67import { IconName } from "@cocalc/frontend/components";8import type { CourseEditorActions } from "@cocalc/frontend/frame-editors/course-editor/actions";9import { course, IntlMessage, labels } from "@cocalc/frontend/i18n";10import { ENV_VARS_ICON } from "@cocalc/frontend/project/settings/environment";1112// ATTN: the COMMANDS configuration is not only used in the menu (using ManageCommands),13// but also directly in some dialogs. Hence this is a subset from the Command type.14type Command = {15title: string | IntlMessage;16label: string | IntlMessage;17onClick: (arg: { props: { actions: CourseEditorActions } }) => void;18icon: IconName;19button: string | IntlMessage;20};2122export const COMMANDS: { [name: string]: Command } = {23"add-students": {24icon: "users",25label: course.add_students,26button: defineMessage({27id: "course.commands.add-students.button",28defaultMessage: "+Student",29description:30"Adding Students in a course. A short label on a button, starting with a + sign.",31}),32title: course.add_students_tooltip,33onClick: ({ props }) => {34const { actions } = props;35actions.setModal("add-students");36},37},38"add-assignments": {39icon: "share-square",40label: course.add_assignments,41button: defineMessage({42id: "course.commands.add-assignments.button",43defaultMessage: "+Assignment",44description:45"Adding an assignment in a course. A short label on a button, starting with a + sign.",46}),47title: defineMessage({48id: "course.commands.add-assignments.tooltip",49defaultMessage: "Add one or more assignments to this course.",50}),51onClick: ({ props }) => {52const { actions } = props;53actions.setModal("add-assignments");54},55},56"add-handouts": {57icon: "text1",58label: defineMessage({59id: "course.commands.add-handouts.label",60defaultMessage: "Add Handouts",61description: "Adding a handout in a course.",62}),63button: defineMessage({64id: "course.commands.add-handouts.button",65defaultMessage: "+Handouts",66description:67"Adding a handout in a course. A short label on a button, starting with a + sign.",68}),69title: defineMessage({70id: "course.commands.add-handouts.tooltip",71defaultMessage: "Add one or more handouts to this course.",72}),73onClick: ({ props }) => {74const { actions } = props;75actions.setModal("add-handouts");76},77},78"title-and-description": {79icon: "header",80label: course.title_and_description_label,81button: labels.title,82title: defineMessage({83id: "course.commands.title-and-description.tooltip",84defaultMessage: "Set the course title and description.",85description: "title and description of a course for students.",86}),87onClick: ({ props }) => {88const { actions } = props;89actions.setModal("title-and-description");90},91},92"email-invitation": {93icon: "mail",94label: course.email_invitation_label,95button: labels.invite,96title: defineMessage({97id: "course.commands.email-invitation.tooltip",98defaultMessage:99"If you add a student to this course using their email address, and they do not have a CoCalc account, then they will receive this email invitation.",100}),101onClick: ({ props }) => {102const { actions } = props;103actions.setModal("email-invitation");104},105},106"copy-limit": {107icon: "users",108label: defineMessage({109id: "course.commands.copy-limit.label",110defaultMessage: "Parallel Copy Limit",111}),112button: labels.limit,113title: defineMessage({114id: "course.commands.copy-limit.tooltip",115defaultMessage:116"Max number of students to copy and collect files from in parallel.",117}),118onClick: ({ props }) => {119const { actions } = props;120actions.setModal("copy-limit");121},122},123"collaborator-policy": {124icon: "mail",125label: course.collaborator_policy,126button: defineMessage({127id: "course.commands.collaborator-policy.button",128defaultMessage: "Collab",129description: "Short label on a button, abbrivation of 'Collaborators'",130}),131title: defineMessage({132id: "course.commands.collaborator-policy.tooltip",133defaultMessage:134"Control if the owner and any collaborator on this student project may add collaborators to this project.",135}),136onClick: ({ props }) => {137const { actions } = props;138actions.setModal("collaborator-policy");139},140},141"restrict-student-projects": {142icon: "lock",143label: course.restrict_student_projects,144button: labels.restrict,145title: defineMessage({146id: "course.commands.restrict-student-projects.toolteip",147defaultMessage: "Remove functionality from student projects",148}),149onClick: ({ props }) => {150const { actions } = props;151actions.setModal("restrict-student-projects");152},153},154nbgrader: {155icon: "graduation-cap",156label: defineMessage({157id: "course.commands.nbgrader.label",158defaultMessage: "Configure Nbgrader",159}),160button: labels.nbgrader,161title: defineMessage({162id: "course.commands.nbgrader.tooltip",163defaultMessage: "Configure how nbgrader works.",164}),165onClick: ({ props }) => {166const { actions } = props;167actions.setModal("nbgrader");168},169},170"software-environment": {171icon: "laptop",172label: labels.software_environment,173button: labels.software,174title: defineMessage({175id: "course.commands.software-environment.tooltip",176defaultMessage:177"Configure the software environment that all student projects will use.",178}),179onClick: ({ props }) => {180const { actions } = props;181actions.setModal("software-environment");182},183},184"network-file-systems": {185icon: "database",186label: labels.cloud_storage_remote_filesystems,187button: "Nbgrader",188title: defineMessage({189id: "course.commands.network-file-systems.tooltip",190defaultMessage:191"Give all student projects read-only access to the same cloud stores and remote file systems as this instructor project.",192}),193onClick: ({ props }) => {194const { actions } = props;195actions.setModal("network-file-systems");196},197},198"env-variables": {199icon: ENV_VARS_ICON,200label: defineMessage({201id: "course.commands.env-variables.label",202defaultMessage: "Configure Environment Variables",203}),204button: labels.environment,205title: defineMessage({206id: "course.commands.env-variables.tooltip",207defaultMessage:208"Configure whether or not student projects inherit the environment variables of this instructor project.",209}),210onClick: ({ props }) => {211const { actions } = props;212actions.setModal("env-variables");213},214},215"configuration-copying": {216icon: "copy",217label: defineMessage({218id: "course.commands.configuration-copying.label",219defaultMessage: "Copy Course Configuration",220}),221button: labels.config,222title: defineMessage({223id: "course.commands.configuration-copying.tooltip",224defaultMessage: "Copy configuration from this course to other courses.",225}),226onClick: ({ props }) => {227const { actions } = props;228actions.setModal("configuration-copying");229},230},231upgrades: {232icon: "gears",233label: defineMessage({234id: "course.commands.upgrades.label",235defaultMessage: "Configure Upgrades (Student or Instructor Pay)",236}),237button: labels.upgrades,238title: defineMessage({239id: "course.commands.upgrades.tooltip",240defaultMessage:241"Use a license to upgrade all projects, or require your students to purchase a specific license.",242}),243onClick: ({ props }) => {244const { actions } = props;245actions.setModal("upgrades");246},247},248"start-all-projects": {249icon: "bolt",250label: defineMessage({251id: "course.commands.start-all-projects.label",252defaultMessage: "Start or Stop all Student Projects",253}),254button: labels.start_all,255title: defineMessage({256id: "course.commands.start-all-projects.tooltip",257defaultMessage:258"You can start all projects associated with this course so they are immediately ready for your students to use.",259}),260onClick: ({ props }) => {261const { actions } = props;262actions.setModal("start-all-projects");263},264},265"terminal-command": {266icon: "terminal",267label: defineMessage(course.run_terminal_command_title),268button: labels.terminal,269title: defineMessage({270id: "course.commands.terminal-command.tooltip",271defaultMessage:272"Run a bash terminal command in the home directory of all student projects. Up to 30 commands run in parallel, with a timeout of 1 minutes.",273}),274onClick: ({ props }) => {275const { actions } = props;276actions.setModal("terminal-command");277},278},279"reconfigure-all-projects": {280icon: "mail",281label: course.reconfigure_all_projects,282button: labels.reconfigure,283title: defineMessage({284id: "course.commands.reconfigure-all-projects.tooltip",285defaultMessage:286"Update all projects with correct students, descriptions, etc.",287}),288onClick: ({ props }) => {289const { actions } = props;290actions.setModal("reconfigure-all-projects");291},292},293"export-grades": {294icon: "table",295label: course.export_grades,296button: course.grades,297title: defineMessage({298id: "course.commands.export-grades.tooltip",299defaultMessage:300"Export all the grades you have recorded for students in your course to a csv or Python file.",301}),302onClick: ({ props }) => {303const { actions } = props;304actions.setModal("export-grades");305},306},307"resend-invites": {308icon: "mail",309label: course.resend_invites,310button: labels.invites,311title: defineMessage({312id: "course.commands.resend-invites.tooltip",313defaultMessage:314"Send another email to every student who didn't sign up yet. This sends a maximum of one email every 1 day.",315}),316onClick: ({ props }) => {317const { actions } = props;318actions.setModal("resend-invites");319},320},321"copy-missing-handouts-and-assignments": {322icon: "graph",323label: course.copy_missing_handouts_assignments,324button: defineMessage({325id: "course.commands.copy-missing-handouts-and-assignments.button",326defaultMessage: "Copy Missing",327}),328title: defineMessage({329id: "course.commands.copy-missing-handouts-and-assignments.tooltip",330defaultMessage:331"If you add new students to your course, you can ensure they have all the assignments and handouts that you have already assigned to other students in the course.",332}),333onClick: ({ props }) => {334const { actions } = props;335actions.setModal("copy-missing-handouts-and-assignments");336},337},338"empty-trash": {339icon: "trash",340label: labels.empty_trash,341button: labels.trash,342title: defineMessage({343id: "course.commands.empty-trash.tooltip",344defaultMessage:345"Empty trash by purging deleted students, assignments, and handouts.",346}),347onClick: ({ props }) => {348const { actions } = props;349actions.setModal("empty-trash");350},351},352"delete-student-projects": {353icon: "trash",354label: defineMessage(course.delete_student_projects),355button: labels.delete,356title: defineMessage({357id: "course.commands.delete-student-projects.tooltip",358defaultMessage:359"If for some reason you would like to delete all the student projects created for this course, you may do so by clicking above.",360}),361onClick: ({ props }) => {362const { actions } = props;363actions.setModal("delete-student-projects");364},365},366"delete-students": {367icon: "trash",368label: defineMessage({369id: "course.commands.delete-students.label",370defaultMessage: "Delete Students",371}),372button: labels.delete,373title: defineMessage({374id: "course.commands.delete-students.tooltip",375defaultMessage:376"Student projects will not be deleted. If you make a mistake, students can still be undeleted from the Student tab or using TimeTravel.",377}),378onClick: ({ props }) => {379const { actions } = props;380actions.setModal("delete-students");381},382},383"delete-shared-project": {384icon: "trash",385label: course.delete_shared_project,386button: labels.delete,387title: defineMessage({388id: "course.commands.delete-shared-project.tooltip",389defaultMessage:390"If it exists, delete the common shared project, which everybody has access to.",391}),392onClick: ({ props }) => {393const { actions } = props;394actions.setModal("delete-shared-project");395},396},397"create-shared-project": {398icon: "users",399label: course.create_shared_project,400button: defineMessage({401id: "course.commands.create-shared-project.button",402defaultMessage: "Shared",403}),404title: defineMessage({405id: "course.commands.create-shared-project.tooltip",406defaultMessage:407"Create a single common shared project, which everybody – students and all collaborators on this project (your TAs and other instructors) – have write access to.",408}),409onClick: ({ props }) => {410const { actions } = props;411actions.setModal("create-shared-project");412},413},414} as const;415416417