From d2a2cfbd10fa4ea8ae3dedf18c55f49d0cd86912 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Thu, 12 Feb 2026 00:41:30 +0100
Subject: [PATCH] =?UTF-8?q?Fixed=20issues:=20AdminAutomationEventsPage.tsx?=
=?UTF-8?q?=20=E2=80=94=20removed=20the=20unused=20=5Fevent=20variable=20e?=
=?UTF-8?q?ntirely=20(it=20was=20never=20referenced).=20AutomationTemplate?=
=?UTF-8?q?sPage.tsx=20=E2=80=94=20removed=20FaCopy=20from=20the=20import?=
=?UTF-8?q?=20(no=20longer=20used=20after=20switching=20to=20type:=20'copy?=
=?UTF-8?q?').=20AutomationsPage.tsx=20=E2=80=94=20same,=20removed=20the?=
=?UTF-8?q?=20now-unused=20FaCopy=20import.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/hooks/playground/useDashboardInputForm.ts | 74 ++++++++++++++++---
src/pages/admin/AdminAutomationEventsPage.tsx | 1 -
.../workflows/AutomationTemplatesPage.tsx | 2 +-
src/pages/workflows/AutomationsPage.tsx | 2 +-
4 files changed, 64 insertions(+), 15 deletions(-)
diff --git a/src/hooks/playground/useDashboardInputForm.ts b/src/hooks/playground/useDashboardInputForm.ts
index 712ae6e..fcfee74 100644
--- a/src/hooks/playground/useDashboardInputForm.ts
+++ b/src/hooks/playground/useDashboardInputForm.ts
@@ -5,7 +5,7 @@ import { useFileContext } from '../../contexts/FileContext';
import { MessageDocument } from '../../components/UiComponents/Messages/MessagesTypes';
import { usePrompts } from '../usePrompts';
import { usePermissions } from '../usePermissions';
-import { deleteFileFromMessageApi } from '../../api/workflowApi';
+import { deleteFileFromMessageApi, deleteMessageApi } from '../../api/workflowApi';
import type { Workflow, WorkflowMessage } from '../../api/workflowApi';
import { useWorkflowLifecycle } from './useWorkflowLifecycle';
import { useWorkflows } from './useWorkflows';
@@ -31,6 +31,9 @@ export function useDashboardInputForm(instanceId: string) {
const [selectedPromptId, setSelectedPromptId] = useState(null);
const [workflowMode, setWorkflowMode] = useState<'Dynamic' | 'Automation' | null>(null);
const [selectedProviders, setSelectedProviders] = useState([]); // AI provider selection (multiselect)
+ const [deletedDocumentFileIds, setDeletedDocumentFileIds] = useState>(new Set());
+ const [deletedMessageIds, setDeletedMessageIds] = useState>(new Set());
+ const [deletingMessages, setDeletingMessages] = useState>(new Set());
const { checkPermission } = usePermissions();
const [playgroundUIPermission, setPlaygroundUIPermission] = useState(true);
@@ -294,19 +297,28 @@ export function useDashboardInputForm(instanceId: string) {
}, [messages, optimisticMessage]);
const displayMessages = useMemo(() => {
- const processedMessages = (messages || []).map((message: WorkflowMessage) => {
- const files = (message as any).files as any[] | undefined;
- const documents = (message as any).documents as MessageDocument[] | undefined;
-
- if (files && Array.isArray(files) && (!documents || documents.length === 0)) {
+ const processedMessages = (messages || [])
+ // Filter out locally deleted messages
+ .filter((message: WorkflowMessage) => !deletedMessageIds.has(message.id))
+ .map((message: WorkflowMessage) => {
+ const files = (message as any).files as any[] | undefined;
+ const documents = (message as any).documents as MessageDocument[] | undefined;
+
+ let processedDocs = documents;
+ if (files && Array.isArray(files) && (!documents || documents.length === 0)) {
+ processedDocs = convertFilesToDocuments(files, message.id);
+ }
+
+ // Filter out locally deleted documents
+ if (processedDocs && deletedDocumentFileIds.size > 0) {
+ processedDocs = processedDocs.filter(doc => !deletedDocumentFileIds.has(doc.fileId));
+ }
+
return {
...message,
- documents: convertFilesToDocuments(files, message.id)
+ documents: processedDocs
};
- }
-
- return message;
- });
+ });
// If optimistic message is still active (backend "first" message not yet polled),
// show the optimistic message instead of any backend user messages to avoid duplicates.
@@ -324,7 +336,7 @@ export function useDashboardInputForm(instanceId: string) {
}
return allMessages.sort(sortMessages);
- }, [messages, optimisticMessage, workflowId]);
+ }, [messages, optimisticMessage, workflowId, deletedDocumentFileIds, deletedMessageIds]);
const handleFileUpload = useCallback(async (file: File): Promise<{ success: boolean; data: any }> => {
const result = await fileContext.handleFileUpload(file, workflowId || undefined);
@@ -414,6 +426,9 @@ export function useDashboardInputForm(instanceId: string) {
const handleFileDelete = useCallback(async (file: WorkflowFile) => {
if (!file.fileId) return;
+ // Immediately remove document from UI for instant feedback
+ setDeletedDocumentFileIds(prev => new Set([...prev, file.fileId]));
+
const success = await fileContext.handleFileDelete(file.fileId, () => {
setPendingFiles(prev => prev.filter(f => f.fileId !== file.fileId));
});
@@ -434,6 +449,13 @@ export function useDashboardInputForm(instanceId: string) {
}
}
}
+ } else {
+ // Restore document in UI on failure
+ setDeletedDocumentFileIds(prev => {
+ const next = new Set(prev);
+ next.delete(file.fileId);
+ return next;
+ });
}
}, [workflowId, messages, fileContext, request]);
@@ -447,6 +469,32 @@ export function useDashboardInputForm(instanceId: string) {
if (!file.fileId) return;
await fileContext.handleFileDownload(file.fileId, file.fileName);
}, [fileContext]);
+
+ const handleMessageDelete = useCallback(async (messageId: string) => {
+ if (!workflowId || !messageId) return;
+
+ // Immediately remove message from UI for instant feedback
+ setDeletedMessageIds(prev => new Set([...prev, messageId]));
+ setDeletingMessages(prev => new Set([...prev, messageId]));
+
+ try {
+ await deleteMessageApi(request, workflowId, messageId);
+ } catch (error: any) {
+ // Restore message in UI on failure
+ setDeletedMessageIds(prev => {
+ const next = new Set(prev);
+ next.delete(messageId);
+ return next;
+ });
+ console.error('Failed to delete message:', error);
+ } finally {
+ setDeletingMessages(prev => {
+ const next = new Set(prev);
+ next.delete(messageId);
+ return next;
+ });
+ }
+ }, [workflowId, request]);
const onInputChange = useCallback((value: string) => {
setInputValue(value);
@@ -780,6 +828,8 @@ export function useDashboardInputForm(instanceId: string) {
previewingFiles: fileContext.previewingFiles,
downloadingFiles: fileContext.downloadingFiles,
handleFileDownload,
+ handleMessageDelete,
+ deletingMessages,
isFileAttachmentPopupOpen,
setIsFileAttachmentPopupOpen,
allUserFiles: fileContext.files || [],
diff --git a/src/pages/admin/AdminAutomationEventsPage.tsx b/src/pages/admin/AdminAutomationEventsPage.tsx
index eecf72c..aef57ce 100644
--- a/src/pages/admin/AdminAutomationEventsPage.tsx
+++ b/src/pages/admin/AdminAutomationEventsPage.tsx
@@ -83,7 +83,6 @@ export const AdminAutomationEventsPage: React.FC = () => {
const _handleDelete = useCallback(async (eventId: string) => {
try {
setError(null);
- const _event = events.find(e => e.eventId === eventId);
const encodedId = encodeURIComponent(eventId);
await api.post(`/api/admin/automation-events/${encodedId}/remove`);
setEvents(prev => prev.filter(e => e.eventId !== eventId));
diff --git a/src/pages/workflows/AutomationTemplatesPage.tsx b/src/pages/workflows/AutomationTemplatesPage.tsx
index f6d0bfd..d199d1d 100644
--- a/src/pages/workflows/AutomationTemplatesPage.tsx
+++ b/src/pages/workflows/AutomationTemplatesPage.tsx
@@ -10,7 +10,7 @@ import React, { useState, useMemo, useEffect } from 'react';
import { useAutomationTemplates, type AutomationTemplate } from '../../hooks/useAutomations';
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
import { AutomationEditor } from '../../components/AutomationEditor';
-import { FaSync, FaPlus, FaFileAlt, FaCopy, FaLock } from 'react-icons/fa';
+import { FaSync, FaPlus, FaFileAlt, FaLock } from 'react-icons/fa';
import { useToast } from '../../contexts/ToastContext';
import { useCurrentUser } from '../../hooks/useUsers';
import styles from '../admin/Admin.module.css';
diff --git a/src/pages/workflows/AutomationsPage.tsx b/src/pages/workflows/AutomationsPage.tsx
index b7aa3d0..2784328 100644
--- a/src/pages/workflows/AutomationsPage.tsx
+++ b/src/pages/workflows/AutomationsPage.tsx
@@ -9,7 +9,7 @@ import React, { useState, useMemo, useEffect, useCallback, useRef } from 'react'
import { useAutomations, useAutomationOperations, AutomationTemplate, Automation } from '../../hooks/useAutomations';
import { FormGeneratorTable } from '../../components/FormGenerator/FormGeneratorTable';
import { AutomationEditor } from '../../components/AutomationEditor';
-import { FaSync, FaRobot, FaRocket, FaPlus, FaFileAlt, FaStop, FaList, FaTimes, FaCheck, FaExclamationCircle, FaSpinner, FaCopy } from 'react-icons/fa';
+import { FaSync, FaRobot, FaRocket, FaPlus, FaFileAlt, FaStop, FaList, FaTimes, FaCheck, FaExclamationCircle, FaSpinner } from 'react-icons/fa';
import { useToast } from '../../contexts/ToastContext';
import { useApiRequest } from '../../hooks/useApi';
import { useFeatureStore } from '../../stores/featureStore';