frontend/app/Master/DailyMotionMasterForm.tsx (259 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { Button, Checkbox, FormControlLabel, Grid, IconButton, InputLabel, TextField, Tooltip, } from "@material-ui/core"; import DailyMotionChannelSelector from "./DailymotionChannelSelector"; import { formStyles } from "./MetadataStyles"; import { MasterFormProps } from "./MasterForm"; import clsx from "clsx"; import FileCopyIcon from "@material-ui/icons/FileCopy"; import ChipInput from "../Form/ChipInput"; import { Cancel, SaveAlt } from "@material-ui/icons"; const DailyMotionMasterForm: React.FC<MasterFormProps< DailymotionMaster, YoutubeMaster >> = (props) => { const { isEditing } = props; const classes = formStyles(); const [isDirty, setIsDirty] = useState(false); const [title, setTitle] = useState(""); useEffect(() => { setTitle(props.master.daily_motion_title); }, [props.master]); const [description, setDescription] = useState(""); useEffect(() => { setDescription(props.master.daily_motion_description); }, [props.master]); const [tags, setTags] = useState<string[]>([]); useEffect(() => { setTags(props.master.daily_motion_tags); }, [props.master]); const [adult, setAdult] = useState(false); useEffect(() => { if (props.master) { setAdult(props.master.daily_motion_contains_adult_content); } else { setAdult(false); } }, [props.master]); const [noMobile, setNoMobile] = useState(false); useEffect(() => { if (props.master) { setNoMobile(props.master.daily_motion_no_mobile_access); } else { setNoMobile(false); } }, [props.master]); const [category, setCategory] = useState(""); useEffect(() => { if (props.master) { setCategory(props.master.daily_motion_category); } else { setCategory(""); } }, [props.master]); const doSave = () => { const update: DailymotionMaster = { daily_motion_category: category, daily_motion_contains_adult_content: adult, daily_motion_description: description, daily_motion_no_mobile_access: noMobile, daily_motion_tags: tags, daily_motion_title: title, daily_motion_url: props.master.daily_motion_url, publication_date: props.master.publication_date, upload_status: props.master.upload_status, etag: props.master.etag, }; props.saveRequested(update); }; return ( <ul className={classes.listContainer}> <li className={clsx(classes.listItem, classes.root)}> <TextField label="Upload Status" id="dm-upload-status" value={props.master.upload_status} disabled /> </li> <li className={clsx(classes.listItem, classes.root)}> <TextField label="Publication Date" id="dm-publication-date" value={props.master.publication_date} disabled /> </li> <li className={clsx(classes.listItem, classes.root)}> <TextField label="Dailymotion URL" id="dm-url" value={props.master.daily_motion_url} disabled /> </li> <li className={clsx(classes.listItem, classes.root)}> <Grid container justifyContent="space-between"> <Grid item className={classes.expandable}> <TextField label="Daily Motion title" id="dm-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="Daily Motion description" multiline id="dm-description" 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)}> <DailyMotionChannelSelector id="dm-channel-selector" label="Channel" onChanged={(newValue) => setCategory(newValue)} value={category} classes={classes} disabled={!isEditing} /> </li> <li className={clsx(classes.listItem, classes.root)}> <FormControlLabel control={ <Checkbox checked={noMobile} id="dm-no-mobile" onChange={(event) => setNoMobile(event.target.checked)} name="no-mobile-access" color="primary" disabled={!isEditing} /> } label="No mobile access" /> </li> <li className={clsx(classes.listItem, classes.root)}> <FormControlLabel control={ <Checkbox checked={adult} id="dm-restricted" onChange={(event) => setAdult(event.target.checked)} name="contains-adult-content" color="primary" disabled={!isEditing} /> } label="Contains adult content" /> </li> {isEditing ? ( <li className={classes.listItem}> <Grid container justifyContent="space-between"> <Grid item> <Button startIcon={<Cancel />} onClick={() => { setIsDirty(false); setTitle(props.master.daily_motion_title); setDescription(props.master.daily_motion_description); setTags(props.master.daily_motion_tags); setCategory(props.master.daily_motion_category); setAdult(props.master.daily_motion_contains_adult_content); setNoMobile(props.master.daily_motion_no_mobile_access); 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 DailyMotionMasterForm;