import { Dialog } from "@material-ui/core"; import Button from "@material-ui/core/Button"; import Chip from "@material-ui/core/Chip"; import DialogActions from "@material-ui/core/DialogActions"; import DialogTitle from "@material-ui/core/DialogTitle"; import Fade from "@material-ui/core/Fade"; import FormControl from "@material-ui/core/FormControl"; import FormControlLabel from "@material-ui/core/FormControlLabel"; import FormHelperText from "@material-ui/core/FormHelperText"; import Input from "@material-ui/core/Input"; import InputAdornment from "@material-ui/core/InputAdornment"; import InputLabel from "@material-ui/core/InputLabel"; import MenuItem from "@material-ui/core/MenuItem"; import Paper from "@material-ui/core/Paper"; import Popper from "@material-ui/core/Popper"; import Select from "@material-ui/core/Select"; import { makeStyles } from "@material-ui/core/styles"; import Switch from "@material-ui/core/Switch"; import Typography from "@material-ui/core/Typography"; import Alert from "@material-ui/lab/Alert"; import React, { useCallback, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; import { useHistory } from "react-router"; import { toggleSnackbar } from "../../../redux/explorer"; import API from "../../../middleware/Api"; import PathSelector from "../../FileManager/PathSelector"; import { useTranslation } from "react-i18next"; const useStyles = makeStyles((theme) => ({ root: { [theme.breakpoints.up("md")]: { marginLeft: 100, }, marginBottom: 40, }, form: { maxWidth: 400, marginTop: 20, marginBottom: 20, }, formContainer: { [theme.breakpoints.up("md")]: { padding: "0px 24px 0 24px", }, }, userSelect: { width: 400, borderRadius: 0, }, })); function useDebounce(value, delay) { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value]); return debouncedValue; } export default function Import() { const { t } = useTranslation("dashboard", { keyPrefix: "file" }); const { t: tDashboard } = useTranslation("dashboard"); const { t: tCommon } = useTranslation("common"); const classes = useStyles(); const [loading, setLoading] = useState(false); const [options, setOptions] = useState({ policy: 1, userInput: "", src: "", dst: "", recursive: true, }); const [anchorEl, setAnchorEl] = useState(null); const [policies, setPolicies] = useState({}); const [users, setUsers] = useState([]); const [user, setUser] = useState(null); const [selectRemote, setSelectRemote] = useState(false); const [selectLocal, setSelectLocal] = useState(false); const handleChange = (name) => (event) => { setOptions({ ...options, [name]: event.target.value, }); }; const handleCheckChange = (name) => (event) => { setOptions({ ...options, [name]: event.target.checked, }); }; const history = useHistory(); const dispatch = useDispatch(); const ToggleSnackbar = useCallback( (vertical, horizontal, msg, color) => dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); const submit = (e) => { e.preventDefault(); if (user === null) { ToggleSnackbar("top", "right", t("selectTargetUser"), "warning"); return; } setLoading(true); API.post("/admin/task/import", { uid: user.ID, policy_id: parseInt(options.policy), src: options.src, dst: options.dst, recursive: options.recursive, }) .then(() => { setLoading(false); history.push("/admin/file"); ToggleSnackbar( "top", "right", t("importTaskCreated"), "success" ); }) .catch((error) => { setLoading(false); ToggleSnackbar("top", "right", error.message, "error"); }); }; const debouncedSearchTerm = useDebounce(options.userInput, 500); useEffect(() => { if (debouncedSearchTerm !== "") { API.post("/admin/user/list", { page: 1, page_size: 10000, order_by: "id asc", searches: { nick: debouncedSearchTerm, email: debouncedSearchTerm, }, }) .then((response) => { setUsers(response.data.items); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); }); } }, [debouncedSearchTerm]); useEffect(() => { API.post("/admin/policy/list", { page: 1, page_size: 10000, order_by: "id asc", conditions: {}, }) .then((response) => { const res = {}; response.data.items.forEach((v) => { res[v.ID] = v; }); setPolicies(res); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); }); // eslint-disable-next-line }, []); const selectUser = (u) => { setOptions({ ...options, userInput: "", }); setUser(u); }; const setMoveTarget = (setter) => (folder) => { const path = folder.path === "/" ? folder.path + folder.name : folder.path + "/" + folder.name; setter(path === "//" ? "/" : path); }; const openPathSelector = (isSrcSelect) => { if (isSrcSelect) { if ( !policies[options.policy] || policies[options.policy].Type === "local" || policies[options.policy].Type === "remote" ) { ToggleSnackbar( "top", "right", t("manuallyPathOnly"), "warning" ); return; } setSelectRemote(true); } else { if (user === null) { ToggleSnackbar( "top", "right", t("selectTargetUser"), "warning" ); return; } setSelectLocal(true); } }; return (
setSelectRemote(false)} aria-labelledby="form-dialog-title" > {t("selectFolder")} setOptions({ ...options, src: p, }) )} /> setSelectLocal(false)} aria-labelledby="form-dialog-title" > {t("selectFolder")} setOptions({ ...options, dst: p, }) )} />
{t("importExternalFolder")}
{t("importExternalFolderDes")}
{t("storagePolicy")} {t("storagePolicyDes")}
{t("targetUser")} { handleChange("userInput")(e); setAnchorEl(e.currentTarget); }} startAdornment={ user !== null && ( { setUser(null); }} label={user.Nick} /> ) } disabled={user !== null} /> 0 } anchorEl={anchorEl} placement={"bottom"} transition > {({ TransitionProps }) => ( {users.map((u) => ( selectUser(u) } > {u.Nick}{" "} {"<" + u.Email + ">"} ))} )} {t("targetUserDes")}
{t("srcFolderPath")} { handleChange("src")(e); setAnchorEl(e.currentTarget); }} required endAdornment={ } /> {t("selectSrcDes")}
{t("dstFolderPath")} { handleChange("dst")(e); setAnchorEl(e.currentTarget); }} required endAdornment={ } /> {t("dstFolderPathDes")}
} label={t("recursivelyImport")} /> {t("recursivelyImportDes")}
); }