From 5fa4546ed427862706524ea356df085caa341254 Mon Sep 17 00:00:00 2001 From: Stefan Verhoeven Date: Fri, 22 Mar 2024 08:22:52 +0100 Subject: [PATCH 1/3] When upload has errors show them to user --- packages/core/src/WorkflowUploadButton.tsx | 77 ++++++++++++++++------ 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/packages/core/src/WorkflowUploadButton.tsx b/packages/core/src/WorkflowUploadButton.tsx index 8be0502..68a4c6d 100644 --- a/packages/core/src/WorkflowUploadButton.tsx +++ b/packages/core/src/WorkflowUploadButton.tsx @@ -1,40 +1,77 @@ import React, { useRef } from 'react' import { toast } from 'react-toastify' import { useWorkflow } from './store' +import { ValidationError } from './validate' + +function flattenValidationErrors (error: ValidationError): Array { + return error.errors.filter(e => e.workflowPath !== undefined && e.message !=== undefined).map((e) => { + let message = e.message + message = `Error in ${e.workflowPath}${e.instancePath}: ${message}` + if (e.params.additionalProperty) { + message += `: ${e.params.additionalProperty}` + } + if (e.params.allowedValues) { + message += `: ${e.params.allowedValues.join(', ')}` + } + return message + }) +} + +function ErrorsList ({ error }: { error: ValidationError }): JSX.Element { + return ( + <> +
Workflow archive failed to load.
+ + + ) +} export const WorkflowUploadButton = (): JSX.Element => { const uploadRef = useRef(null) const { loadWorkflowArchive } = useWorkflow() - async function uploadWorkflow (event: React.ChangeEvent): Promise { + async function uploadWorkflow ( + event: React.ChangeEvent + ): Promise { if (event.target.files == null) { return } const file = event.target.files[0] const url = URL.createObjectURL(file) - await toast.promise( - async () => { - try { - await loadWorkflowArchive(url) - } finally { - URL.revokeObjectURL(url) - } - }, - { - pending: 'Loading workfow ...', - success: 'Workflow loaded', - error: { - render ({ data }) { - console.error(data) - return 'Workflow archive failed to load. See DevTools (F12) console for errors.' - } - } + const toastId = toast.loading('Loading workfow ...') + try { + await loadWorkflowArchive(url) + toast.update(toastId, { type: 'success', render: 'Workflow loaded' }) + } catch (error) { + if (error instanceof ValidationError) { + toast.update(toastId, { + type: 'error', + render: , + autoClose: false + }) + } else { + console.error(error) + toast.update(toastId, { + type: 'error', + render: + 'Workflow archive failed to load. See DevTools (F12) console for errors.' + }) } - ) + } finally { + URL.revokeObjectURL(url) + } } return ( -