diff --git a/packages/server/src/controllers/chatflows/index.ts b/packages/server/src/controllers/chatflows/index.ts
index f6e90318..f82668a1 100644
--- a/packages/server/src/controllers/chatflows/index.ts
+++ b/packages/server/src/controllers/chatflows/index.ts
@@ -1,11 +1,11 @@
-import { Request, Response, NextFunction } from 'express'
-import chatflowsService from '../../services/chatflows'
-import { ChatFlow } from '../../database/entities/ChatFlow'
-import { createRateLimiter } from '../../utils/rateLimit'
-import { getApiKey } from '../../utils/apiKey'
-import { InternalFlowiseError } from '../../errors/internalFlowiseError'
+import { NextFunction, Request, Response } from 'express'
import { StatusCodes } from 'http-status-codes'
+import { ChatFlow } from '../../database/entities/ChatFlow'
+import { InternalFlowiseError } from '../../errors/internalFlowiseError'
import { ChatflowType } from '../../Interface'
+import chatflowsService from '../../services/chatflows'
+import { getApiKey } from '../../utils/apiKey'
+import { createRateLimiter } from '../../utils/rateLimit'
const checkIfChatflowIsValidForStreaming = async (req: Request, res: Response, next: NextFunction) => {
try {
@@ -105,6 +105,14 @@ const saveChatflow = async (req: Request, res: Response, next: NextFunction) =>
}
}
+const saveChatflows = async (req: Request, res: Response, next: NextFunction) => {
+ try {
+ res.send(req.body)
+ } catch (error) {
+ next(error)
+ }
+}
+
const updateChatflow = async (req: Request, res: Response, next: NextFunction) => {
try {
if (typeof req.params === 'undefined' || !req.params.id) {
@@ -167,6 +175,7 @@ export default {
getChatflowByApiKey,
getChatflowById,
saveChatflow,
+ saveChatflows,
updateChatflow,
getSinglePublicChatflow,
getSinglePublicChatbotConfig
diff --git a/packages/server/src/routes/chatflows/index.ts b/packages/server/src/routes/chatflows/index.ts
index 8fb457fd..ece2a84c 100644
--- a/packages/server/src/routes/chatflows/index.ts
+++ b/packages/server/src/routes/chatflows/index.ts
@@ -4,6 +4,7 @@ const router = express.Router()
// CREATE
router.post('/', chatflowsController.saveChatflow)
+router.post('/all', chatflowsController.saveChatflows)
// READ
router.get('/', chatflowsController.getAllChatflows)
diff --git a/packages/ui/src/api/chatflows.js b/packages/ui/src/api/chatflows.js
index aa305d14..7f670a96 100644
--- a/packages/ui/src/api/chatflows.js
+++ b/packages/ui/src/api/chatflows.js
@@ -10,6 +10,8 @@ const getSpecificChatflowFromPublicEndpoint = (id) => client.get(`/public-chatfl
const createNewChatflow = (body) => client.post(`/chatflows`, body)
+const createNewChatflows = (body) => client.post(`/chatflows/all`, body)
+
const updateChatflow = (id, body) => client.put(`/chatflows/${id}`, body)
const deleteChatflow = (id) => client.delete(`/chatflows/${id}`)
@@ -24,6 +26,7 @@ export default {
getSpecificChatflow,
getSpecificChatflowFromPublicEndpoint,
createNewChatflow,
+ createNewChatflows,
updateChatflow,
deleteChatflow,
getIsChatflowStreaming,
diff --git a/packages/ui/src/layout/MainLayout/Header/ProfileSection/index.jsx b/packages/ui/src/layout/MainLayout/Header/ProfileSection/index.jsx
index 2b09fbfd..2df30c86 100644
--- a/packages/ui/src/layout/MainLayout/Header/ProfileSection/index.jsx
+++ b/packages/ui/src/layout/MainLayout/Header/ProfileSection/index.jsx
@@ -51,6 +51,7 @@ const ProfileSection = ({ username, handleLogout }) => {
const [aboutDialogOpen, setAboutDialogOpen] = useState(false)
const anchorRef = useRef(null)
+ const inputRef = useRef()
// ==============================|| Snackbar ||============================== //
@@ -85,9 +86,46 @@ const ProfileSection = ({ username, handleLogout }) => {
}
})
}
+ const saveAllChatflowsApi = useApi(chatFlowsApi.createNewChatflows)
+ const fileChange = (e) => {
+ if (!e.target.files) return
+ const file = e.target.files[0]
+
+ const reader = new FileReader()
+ reader.onload = (evt) => {
+ if (!evt?.target?.result) {
+ return
+ }
+ const chatflows = JSON.parse(evt.target.result)
+ saveAllChatflowsApi.request(chatflows)
+ }
+ reader.readAsText(file)
+ }
+
+ const saveAllChatflowsSuccess = () => {
+ dispatch({ type: REMOVE_DIRTY })
+ enqueueSnackbar({
+ message: `Save All Chatflows Successful`,
+ options: {
+ key: new Date().getTime() + Math.random(),
+ variant: 'success',
+ action: (key) => (
+
+ )
+ }
+ })
+ }
+ useEffect(() => {
+ if (saveAllChatflowsApi.error) errorFailed(`Failed to save Chatflows: ${saveAllChatflowsApi.error.response.data.message}`)
+ if (saveAllChatflowsApi.data) {
+ saveAllChatflowsSuccess()
+ }
+ }, [saveAllChatflowsApi.error, saveAllChatflowsApi.data])
const importAllChatflows = () => {
- console.log('reach importAllChatflows')
+ inputRef.current.click()
}
const getAllChatflowsApi = useApi(chatFlowsApi.getAllChatflows)
@@ -111,7 +149,7 @@ const ProfileSection = ({ username, handleLogout }) => {
if (getAllChatflowsApi.error) errorFailed(`Failed to retrieve Chatflows: ${getAllChatflowsApi.error.response.data.message}`)
if (getAllChatflowsApi.data) {
const sanitizedChatflows = sanitizeChatflows(getAllChatflowsApi.data)
- const dataStr = JSON.stringify(sanitizedChatflows, null, 2)
+ const dataStr = JSON.stringify({ Chatflows: sanitizedChatflows }, null, 2)
const dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr)
const exportFileDefaultName = 'AllChatflows.json'
@@ -226,6 +264,7 @@ const ProfileSection = ({ username, handleLogout }) => {
Import Chatflows} />
+
{