/* * Copyright ETH 2023 Zürich, Scientific IT Services * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ import React from 'react' import { withStyles } from '@material-ui/core/styles' import Button from '@material-ui/core/Button' import autoBind from 'auto-bind' const styles = () => ({ invisible: { display: 'none' } }) class UploadButton extends React.Component { constructor(props) { super(props); autoBind(this) // Using the callback ref approach to ensure we have access to the input element this.fileInputRef = React.createRef(); } componentDidMount() { this.updateDirectoryAttributes(); } componentDidUpdate(prevProps) { if (this.props.folderSelector !== prevProps.folderSelector) { this.updateDirectoryAttributes(); } } updateDirectoryAttributes() { const { folderSelector } = this.props; const input = this.fileInputRef.current; if (input) { if (folderSelector) { // If folderSelector is true, add the attributes input.setAttribute('webkitdirectory', ''); input.setAttribute('directory', ''); } else { // If folderSelector is false, remove the attributes input.removeAttribute('webkitdirectory'); input.removeAttribute('directory'); } } }; render () { const { children, classes, size, variant, color, onClick, startIcon } = this.props; return ( <> {/* Hidden file input */} <input type="file" ref={this.fileInputRef} className={classes.invisible} onChange={onClick} /> {/* Button to trigger the file input */} <Button classes={{ root: classes.button }} color={color} size={size} variant={variant} startIcon={startIcon} onClick={() => this.fileInputRef.current && this.fileInputRef.current.click()} > {children} </Button> </> ); } } export default withStyles(styles)(UploadButton)