import { CircularProgress, Grid, Paper, Table, TableBody, TableCell, TableHead, TableRow, Typography, withStyles, } from "@material-ui/core"; import TableSortLabel from "@material-ui/core/TableSortLabel"; import classNames from "classnames"; import PropTypes from "prop-types"; import React, { Component } from "react"; import { configure, GlobalHotKeys } from "react-hotkeys"; import { connect } from "react-redux"; import { withRouter } from "react-router-dom"; import explorer, { changeContextMenu, navigateTo, navigateUp, openRemoveDialog, setSelectedTarget } from "../../redux/explorer"; import { isMac } from "../../utils"; import pathHelper from "../../utils/page"; import ContextMenu from "./ContextMenu"; import ImgPreivew from "./ImgPreview"; import ObjectIcon from "./ObjectIcon"; import Nothing from "../Placeholder/Nothing"; const styles = (theme) => ({ paper: { padding: theme.spacing(2), textAlign: "center", color: theme.palette.text.secondary, margin: "10px", }, root: { flexGrow: 1, padding: "10px", overflowY: "auto", height: "calc(100vh - 113px)", [theme.breakpoints.up("sm")]: { overflowY: "auto", height: "calc(100vh - 113px)", }, [theme.breakpoints.down("sm")]: { height: "100%", }, }, rootTable: { padding: "0px", backgroundColor: theme.palette.background.paper.white, [theme.breakpoints.up("sm")]: { overflowY: "auto", height: "calc(100vh - 113px)", }, [theme.breakpoints.down("sm")]: { height: "100%", }, }, typeHeader: { margin: "10px 25px", color: "#6b6b6b", fontWeight: "500", }, loading: { justifyContent: "center", display: "flex", marginTop: "40px", }, errorBox: { padding: theme.spacing(4), }, errorMsg: { marginTop: "10px", }, hideAuto: { [theme.breakpoints.down("sm")]: { display: "none", }, }, flexFix: { minWidth: 0, }, upButton: { marginLeft: "20px", marginTop: "10px", marginBottom: "10px", }, clickAway: { height: "100%", width: "100%", }, rootShare: { height: "100%", minHeight: 500, }, visuallyHidden: { border: 0, clip: "rect(0 0 0 0)", height: 1, margin: -1, overflow: "hidden", padding: 0, position: "absolute", top: 20, width: 1, }, gridContainer: { [theme.breakpoints.down("sm")]: { gridTemplateColumns: "repeat(auto-fill,minmax(180px,1fr))", }, [theme.breakpoints.up("md")]: { gridTemplateColumns: "repeat(auto-fill,minmax(220px,1fr))", }, display: "grid", }, gridItem: { flex: "1 1 220px", }, }); const mapStateToProps = (state) => { return { path: state.navigator.path, drawerDesktopOpen: state.viewUpdate.open, viewMethod: state.viewUpdate.explorerViewMethod, sortMethod: state.viewUpdate.sortMethod, fileList: state.explorer.fileList, dirList: state.explorer.dirList, loading: state.viewUpdate.navigatorLoading, navigatorError: state.viewUpdate.navigatorError, navigatorErrorMsg: state.viewUpdate.navigatorErrorMsg, keywords: state.explorer.keywords, selected: state.explorer.selected, }; }; const mapDispatchToProps = (dispatch) => { return { navigateToPath: (path) => { dispatch(navigateTo(path)); }, changeContextMenu: (type, open) => { dispatch(changeContextMenu(type, open)); }, navigateUp: () => { dispatch(navigateUp()); }, setSelectedTarget: (targets) => { dispatch(setSelectedTarget(targets)); }, openRemoveDialog: () => { dispatch(openRemoveDialog()); }, changeSort: (method) => { dispatch(explorer.actions.changeSortMethod(method)); }, }; }; class ExplorerCompoment extends Component { constructor() { super(); this.keyMap = { DELETE_FILE: "del", SELECT_ALL: `${isMac() ? "command" : "ctrl"}+a`, DESELECT_ALL: "esc", }; this.handlers = { DELETE_FILE: () => { if (this.props.selected.length > 0 && !this.props.share) { this.props.openRemoveDialog(); } }, SELECT_ALL: (e) => { e.preventDefault(); if ( this.props.selected.length >= this.props.dirList.length + this.props.fileList.length ) { this.props.setSelectedTarget([]); } else { this.props.setSelectedTarget([ ...this.props.dirList, ...this.props.fileList, ]); } }, DESELECT_ALL: (e) => { e.preventDefault(); this.props.setSelectedTarget([]); }, }; configure({ ignoreTags: ["input", "select", "textarea"], }); } contextMenu = (e) => { e.preventDefault(); if ( this.props.keywords === "" && !pathHelper.isSharePage(this.props.location.pathname) ) { if (!this.props.loading) { this.props.changeContextMenu("empty", true); } } }; componentDidUpdate() { this.away = 0; } ClickAway = (e) => { const element = e.target; if (element.dataset.clickaway) { this.props.setSelectedTarget([]); } }; render() { const { classes } = this.props; const isHomePage = pathHelper.isHomePage(this.props.location.pathname); const showView = !this.props.loading && (this.props.dirList.length !== 0 || this.props.fileList.length !== 0); const listView = (