Skip to content
Snippets Groups Projects
Select Git revision
  • b2310c31ae80add8ae9ba2870ca0fa3a7dfdfa1d
  • master default protected
  • merl-112-python-release-the-gil
  • integrate_predict_library
  • gec-94-total-bda-factor
  • gec-94-changelog
  • svp_cobalt
  • merl-105-dp3-python-move-not-copy
  • rap-1132-create-dynspec-step
  • padre-filestream-input
  • ast-1238-use-xtensor-char
  • gec-110-step-infoin
  • new-everybeam-interface
  • rap-1044-data-interpolation-step
  • fix-ddecal-docs
  • two-step-faraday-constraint
  • line-search
  • azelgeo-revised
  • SVP
  • test_everybeam_multifreq
  • clipper_baseline_selection
  • v6.4.1
  • v6.4
  • v6.3
  • v6.2.1
  • v6.2
  • v6.1
  • v6.0.1
  • v6.0
  • v5.3
  • v5.2
  • v5.1
  • v5.0
  • v4.2
  • v4.1
  • v4.0
  • LOFAR-Release-3_1_0
  • LOFAR-Release-3_1_1
  • LOFAR-Release-3_1_2
  • LOFAR-Release-3_1_3
  • LOFAR-Release-3_1_4
41 results

InputStep.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    FileInput.tsx 1.60 KiB
    import {
      ChangeEvent,
      Dispatch,
      SetStateAction,
      useEffect,
      useRef,
      InputHTMLAttributes,
      useId,
    } from "react";
    import Typography from "src/components/Typography";
    
    interface Props extends InputHTMLAttributes<HTMLInputElement> {
      label: string;
      files: File[];
      onFilesChange: Dispatch<SetStateAction<File[]>>;
    }
    
    /**
     * Controlled File Input component
     * @param props
     * @constructor
     */
    const FileInput = (props: Props) => {
      const inputRef = useRef<HTMLInputElement>(null);
      const inputId = useId();
    
      const { files, onFilesChange, label, ...rest } = props;
    
      /**
       * Workaround for not being able to set the value directly on <input type="file">
       *   Using the https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer
       *   API to construct a valid file list; not available in IE!
       */
      useEffect(() => {
        const dataTransfer = new DataTransfer();
        files.forEach((file: File) => dataTransfer.items.add(file));
        if (inputRef.current) inputRef.current.files = dataTransfer.files;
      }, [files]);
    
      const handleChange = (evt: ChangeEvent<HTMLInputElement>) => {
        const fileList = evt.currentTarget.files;
        if (!fileList) {
          onFilesChange([]);
        } else {
          onFilesChange(Array.from(fileList));
        }
      };
    
      return (
        <div className="flex flex-col">
          <label htmlFor={inputId} className="-mt-3.5">
            <Typography text={label} variant="paragraph" />
          </label>
          <input
            className="mt-3"
            id={inputId}
            ref={inputRef}
            type="file"
            onChange={handleChange}
            {...rest}
          />
        </div>
      );
    };
    
    export default FileInput;