import { DetailsList, DetailsListLayoutMode, DirectionalHint, FontIcon, IColumn, SelectionMode, TooltipHost, getTheme, mergeStyles, mergeStyleSets, } from "@fluentui/react"; import { Upload } from "Common/Upload/Upload"; import { UploadDetailsRecord } from "Contracts/ViewModels"; import { logConsoleError } from "Utils/NotificationConsoleUtils"; import React, { ChangeEvent, FunctionComponent, useState } from "react"; import { getErrorMessage } from "../../Tables/Utilities"; import { useSelectedNode } from "../../useSelectedNode"; import { RightPaneForm, RightPaneFormProps } from "../RightPaneForm/RightPaneForm"; const theme = getTheme(); const iconClass = mergeStyles({ verticalAlign: "middle", maxHeight: "16px", maxWidth: "16px", }); const classNames = mergeStyleSets({ fileIconHeaderIcon: { padding: 0, fontSize: "16px", }, fileIconCell: { textAlign: "center", selectors: { "&:before": { content: ".", display: "inline-block", verticalAlign: "middle", height: "100%", width: "0px", visibility: "hidden", }, }, }, error: [{ color: theme.semanticColors.errorIcon }, iconClass], accept: [{ color: theme.semanticColors.successIcon }, iconClass], warning: [{ color: theme.semanticColors.warningIcon }, iconClass], }); export const UploadItemsPane: FunctionComponent = () => { const [files, setFiles] = useState(); const [uploadFileData, setUploadFileData] = useState([]); const [formError, setFormError] = useState(""); const [isExecuting, setIsExecuting] = useState(); const onSubmit = () => { setFormError(""); if (!files || files.length === 0) { setFormError("No files were specified. Please input at least one file."); logConsoleError("Could not upload items -- No files were specified. Please input at least one file."); return; } const selectedCollection = useSelectedNode.getState().findSelectedCollection(); setIsExecuting(true); selectedCollection ?.uploadFiles(files) .then( (uploadDetails) => { setUploadFileData(uploadDetails.data); setFiles(undefined); }, (error: Error) => { const errorMessage = getErrorMessage(error); setFormError(errorMessage); }, ) .finally(() => { setIsExecuting(false); }); }; const updateSelectedFiles = (event: ChangeEvent): void => { setFiles(event.target.files); }; const props: RightPaneFormProps = { formError, isExecuting: isExecuting, submitButtonText: "Upload", onSubmit, }; const columns: IColumn[] = [ { key: "icons", name: "", fieldName: "", className: classNames.fileIconCell, iconClassName: classNames.fileIconHeaderIcon, isIconOnly: true, minWidth: 16, maxWidth: 16, onRender: (item: UploadDetailsRecord, index: number, column: IColumn) => { if (item.numFailed) { const errorList = (
    {item.errors.map((error, i) => (
  • {error}
  • ))}
); return ( ); } else if (item.numThrottled) { return ; } else { return ; } }, }, { key: "fileName", name: "FILE NAME", fieldName: "fileName", minWidth: 120, maxWidth: 140, onRender: (item: UploadDetailsRecord, index: number, column: IColumn) => { const fieldContent = item.fileName; return ( {fieldContent} ); }, }, { key: "status", name: "STATUS", fieldName: "numSucceeded", minWidth: 120, maxWidth: 140, isRowHeader: true, isResizable: true, data: "string", isPadded: true, onRender: (item: UploadDetailsRecord, index: number, column: IColumn) => { const fieldContent = `${item.numSucceeded} created, ${item.numThrottled} throttled, ${item.numFailed} errors`; return ( {fieldContent} ); }, }, ]; return (
{uploadFileData?.length > 0 && (
File upload status
)}
); };