+
{loading &&
加载中...
}
{store.showFilter && (
)}
-
+
{routes.map((route: RouteItem) => {
const isExpanded = expandedIds.has(route.id);
const isIdVisible = visibleIds.has(route.id);
@@ -192,7 +207,7 @@ export const App = () => {
return (
{/* ID and Path/Key in one line */}
@@ -226,6 +241,43 @@ export const App = () => {
onClick={() => run(route, 'custom')}>
+
+
+
+
+
+
+ {
+ e.stopPropagation();
+ // TODO: 实现显示详情功能
+ console.log('显示详情', route);
+ }}
+ >
+
+ 显示详情
+
+ {
+ e.stopPropagation();
+ store.setExportRoutes([route]);
+ store.setShowExportDialog(true);
+ }}
+ >
+
+ 导出代码
+
+
+
+
@@ -278,6 +330,18 @@ export const App = () => {
);
})}
+
+
+
);
}
\ No newline at end of file
diff --git a/web/src/app/studio/store.ts b/web/src/app/studio/store.ts
index 0881ae3..dea152c 100644
--- a/web/src/app/studio/store.ts
+++ b/web/src/app/studio/store.ts
@@ -7,10 +7,9 @@ import { use } from '@kevisual/context'
// import { MyCache } from '@kevisual/cache'
import { persist } from 'zustand/middleware';
import { app } from '@/agent/index.ts'
-import { cloneDeep, random } from 'es-toolkit'
+import { cloneDeep } from 'es-toolkit'
import { nanoid } from 'nanoid';
-import { filter } from '@kevisual/js-filter';
-import Fuse from 'fuse.js';
+import { Result } from '@kevisual/query';
const historyReplace = (url: string) => {
if (window.history.replaceState) {
window.history.replaceState(null, '', url);
@@ -26,6 +25,17 @@ type RouteItem = {
type RouteViewList = Array
;
+type MessageAction = {
+ path?: string;
+ key?: string;
+ [key: string]: any;
+}
+export type Message = RouterViewItem<{
+ _id: string;
+ action: MessageAction;
+ description?: string;
+ response?: Result;
+}>
interface StudioState {
loading: boolean;
@@ -50,12 +60,16 @@ interface StudioState {
setShowFilter: (show: boolean) => void;
showRightPanel: boolean;
setShowRightPanel: (show: boolean) => void;
- messages: any[];
- setMessages: (messages: any[]) => void;
- addMessage: (message: any) => void;
- deleteMessage: (message: any) => void;
+ messages: Message[];
+ setMessages: (messages: Message[]) => void;
+ addMessage: (message: Message) => void;
+ deleteMessage: (message: Message) => void;
searchKeyword?: string;
setSearchKeyword?: (keyword: string) => void;
+ showExportDialog: boolean;
+ setShowExportDialog: (show: boolean) => void;
+ exportRoutes?: RouteItem[];
+ setExportRoutes: (routes?: RouteItem[]) => void;
}
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));
@@ -192,6 +206,7 @@ export const useStudioStore = create()(
}
}
}
+ console.log('运行结果 route', route);
if (showRightPanel) {
if (route.metadata && route.metadata?.viewItem) {
const messages = get().messages
@@ -201,7 +216,7 @@ export const useStudioStore = create()(
viewItem.description = route.description || viewItem.description;
// @ts-ignore
viewItem._id = nanoid(16);
- set({ messages: [...messages, viewItem] });
+ set({ messages: [...messages, viewItem as Message] });
}
}
},
@@ -293,7 +308,11 @@ export const useStudioStore = create()(
addMessage: (message: any) => {
const messages = get().messages;
set({ messages: [...messages, message] });
- }
+ },
+ showExportDialog: false,
+ setShowExportDialog: (show: boolean) => set({ showExportDialog: show }),
+ exportRoutes: undefined,
+ setExportRoutes: (routes?: RouteItem[]) => set({ exportRoutes: routes })
}),
{
name: 'studio-storage',
diff --git a/web/src/app/view/components/ViewEditor.tsx b/web/src/app/view/components/ViewEditor.tsx
index e379b92..34ae036 100644
--- a/web/src/app/view/components/ViewEditor.tsx
+++ b/web/src/app/view/components/ViewEditor.tsx
@@ -117,7 +117,7 @@ export const ViewEditor = ({ open, onOpenChange, data, onSave }: ViewEditorProps
return (