frontend/app/Master/MainstreamMasterForm.tsx (195 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { Button, Checkbox, FormControlLabel, Grid, IconButton, TextField, Tooltip, } from "@material-ui/core"; import { MasterFormProps } from "./MasterForm"; import { formStyles } from "./MetadataStyles"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import ChipInput from "../Form/ChipInput"; import clsx from "clsx"; import { Cancel, SaveAlt } from "@material-ui/icons"; const MainstreamMasterForm: React.FC<MasterFormProps< MainstreamMaster, YoutubeMaster >> = (props) => { const { isEditing, master, isReadOnly, saveRequested } = props; const classes = formStyles(); const [isDirty, setIsDirty] = useState(false); const [title, setTitle] = useState(""); useEffect(() => { setTitle(master.mainstream_title); }, [master]); const [description, setDescription] = useState(""); useEffect(() => { setDescription(master.mainstream_description); }, [master]); const [tags, setTags] = useState<string[]>([]); useEffect(() => { setTags(master.mainstream_tags); }, [master]); const [adult, setAdult] = useState(false); useEffect(() => { setAdult(master.mainstream_rules_contains_adult_content); }, [master]); const doSave = () => { const update: MainstreamMaster = { mainstream_description: description, mainstream_rules_contains_adult_content: adult, mainstream_tags: tags, mainstream_title: title, publication_date: master.publication_date, upload_status: master.upload_status, etag: master.etag, }; saveRequested(update); }; return ( <ul className={classes.listContainer}> <li className={clsx(classes.listItem, classes.root)}> <TextField label="Upload Status" id="ms-upload-status" value={master.upload_status || ""} disabled className={classes.root} /> </li> <li className={clsx(classes.listItem, classes.root)}> <Grid container justifyContent="space-between"> <Grid item className={classes.expandable}> <TextField label="Mainstream title" id="ms-title" value={title} onChange={(evt) => setTitle(evt.target.value)} disabled={!isEditing} required={isEditing} error={!title || title == ""} helperText={ title && title != "" ? undefined : "You must specify a title" } className={classes.root} /> </Grid> {props.copySource && isEditing ? ( <Grid item> <Tooltip title="Copy from youtube master"> <IconButton onClick={() => setTitle(props.copySource?.youtube_title ?? "") } > <FileCopyIcon /> </IconButton> </Tooltip> </Grid> ) : undefined} </Grid> </li> <li className={clsx(classes.listItem, classes.root)}> <Grid container justifyContent="space-between"> <Grid item className={classes.expandable}> <TextField label="Mainstream description" id="ms-description" multiline rows={4} value={description} className={classes.root} onChange={(evt) => setDescription(evt.target.value)} disabled={!isEditing} /> </Grid> {props.copySource && isEditing ? ( <Grid item> <Tooltip title="Copy from youtube master"> <IconButton onClick={() => setDescription(props.copySource?.youtube_description ?? "") } > <FileCopyIcon /> </IconButton> </Tooltip> </Grid> ) : undefined} </Grid> </li> <li className={clsx(classes.listItem, classes.root)}> <Grid container justifyContent="space-between"> <Grid item className={classes.expandable}> <ChipInput label={"Tags"} value={tags} onChange={(newValue) => setTags(newValue)} disabled={!isEditing} /> </Grid> {props.copySource && isEditing ? ( <Grid item> <Tooltip title="Copy from youtube master"> <IconButton onClick={() => setTags(props.copySource?.youtube_tags ?? [])} > <FileCopyIcon /> </IconButton> </Tooltip> </Grid> ) : undefined} </Grid> </li> <li className={clsx(classes.listItem, classes.root)}> <FormControlLabel control={ <Checkbox checked={adult} id="ms-restricted" onChange={(event) => setAdult(event.target.checked)} disabled={!isEditing} name="contains-adult-content" color="primary" /> } label="Contains adult content" /> </li> {isEditing ? ( <li className={classes.listItem}> <Grid container justifyContent="space-between"> <Grid item> <Button startIcon={<Cancel />} onClick={() => { setIsDirty(false); setTitle(master.mainstream_title); setDescription(master.mainstream_description); setTags(master.mainstream_tags); setAdult(master.mainstream_rules_contains_adult_content); if (props.editCancelled) props.editCancelled(); }} > Cancel </Button> </Grid> <Grid item> <Button startIcon={<SaveAlt />} onClick={doSave} variant="contained" > Save </Button> </Grid> </Grid> </li> ) : undefined} </ul> ); }; export default MainstreamMasterForm;