Path: blob/master/src/packages/frontend/course/common/copy-run-all.tsx
10799 views
/*1* This file is part of CoCalc: Copyright © 2020 Sagemath, Inc.2* License: MS-RSL – see LICENSE.md for details3*/45import { Alert, Button, Input, Space } from "antd";6import { useEffect, useState } from "react";7import { useIntl } from "react-intl";89import { Icon } from "@cocalc/frontend/components";10import type { AssignmentCopyStep, CopyStep } from "../types";11import {12copyConfirmAllCaution,13handoutCopyConfirmAllCaution,14} from "./course-unit-strings";15import {16allStudents,17commonMsgs,18remainingStudents,19runAllIntro,20} from "./copy-run-all-messages";2122interface CopyRunAllAlertProps {23id: string;24step: CopyStep;25status: { done: number; not_done: number; total: number };26onRun: (opts: { scope: "remaining" | "all"; overwrite?: boolean }) => void;27hasStudentSubdir?: boolean;28}2930export function CopyRunAllAlert({31id,32step,33status,34onRun,35hasStudentSubdir = false,36}: CopyRunAllAlertProps) {37const intl = useIntl();38const overwriteToken = "OVERWRITE";39const [confirmAll, setConfirmAll] = useState<boolean>(false);40const [confirmOverwrite, setConfirmOverwrite] = useState<boolean>(false);41const [confirmOverwriteText, setConfirmOverwriteText] = useState<string>("");4243useEffect(() => {44setConfirmAll(false);45setConfirmOverwrite(false);46setConfirmOverwriteText("");47}, [id]);4849const { done, not_done, total } = status;50const cautionContent =51step === "distribution"52? handoutCopyConfirmAllCaution(intl)53: copyConfirmAllCaution(intl, step as AssignmentCopyStep);54const allowOverwrite = step === "assignment" || step === "distribution";55const possible = done + not_done;56const showNewButton = not_done > 0 && !confirmAll;57const alertType = confirmAll58? "error"59: showNewButton60? "warning"61: "success";62const msg = commonMsgs(intl, overwriteToken);6364function render_confirm_overwrite() {65if (!confirmOverwrite) return null;66return (67<Space direction="vertical">68{msg.typeOverwrite}69<Input70autoFocus71onChange={(e) => setConfirmOverwriteText((e.target as any).value)}72/>73<Button74disabled={confirmOverwriteText !== overwriteToken}75icon={<Icon name="exclamation-triangle" />}76danger77type="primary"78onClick={() => {79onRun({ scope: "all", overwrite: true });80setConfirmOverwrite(false);81setConfirmOverwriteText("");82}}83>84{msg.confirmWithoutBackup}85</Button>86</Space>87);88}8990function render_confirm_all() {91return (92<Space direction="vertical" key="confirm-all">93{cautionContent}94<Space wrap>95<Button96key="all"97type="primary"98disabled={confirmOverwrite}99onClick={() => onRun({ scope: "all" })}100>101{msg.withBackup}102</Button>103{allowOverwrite ? (104<Button105key="all-overwrite"106danger107onClick={() => setConfirmOverwrite(true)}108disabled={confirmOverwrite}109>110{msg.withoutBackup}111</Button>112) : undefined}113<Button114key="back"115onClick={() => {116setConfirmAll(false);117setConfirmOverwrite(false);118}}119>120{msg.back}121</Button>122</Space>123{render_confirm_overwrite()}124</Space>125);126}127128const message = (129<Space130direction="vertical"131style={{ display: "inline-flex", alignItems: "stretch" }}132>133{step === "assignment" && hasStudentSubdir ? (134<Alert135type="info"136message={137<span>138{msg.studentSubdirInfo}{" "}139<a140rel="noopener noreferrer"141target="_blank"142href="https://doc.cocalc.com/teaching-nbgrader.html#student-version"143>144{msg.nbgraderDocs}145</a>146</span>147}148/>149) : null}150<div>{runAllIntro(intl, step)}</div>151{showNewButton ? (152<Button153key="new"154type="primary"155onClick={() => onRun({ scope: "remaining" })}156>157{not_done === total ? (158<>{allStudents(intl, step, total)}</>159) : (160<>{remainingStudents(intl, step, not_done)}</>161)}162</Button>163) : undefined}164{not_done !== possible ? (165<Button166key="all"167danger168disabled={confirmAll}169onClick={() => setConfirmAll(true)}170>171{allStudents(intl, step, possible)}...172</Button>173) : undefined}174{confirmAll ? render_confirm_all() : undefined}175</Space>176);177178return <Alert key={id} type={alertType} message={message} />;179}180181182