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