From 3cea5a13ea5837ae5939b80573342d05cdcf2d82 Mon Sep 17 00:00:00 2001 From: Youngster_yj <907985037@qq.com> Date: Wed, 14 Aug 2024 15:46:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=A1=E8=AE=A1=E6=8F=90=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../YakRunner/AuditCode/AuditCode.module.scss | 6 +- .../pages/YakRunner/AuditCode/AuditCode.tsx | 123 ++++++++++++++---- .../src/pages/YakRunner/FileTree/FileTree.tsx | 1 + .../RightAuditDetail.module.scss | 11 +- .../RightAuditDetail/RightAuditDetail.tsx | 78 +++++++---- .../RunnerFileTree/RunnerFileTree.tsx | 44 +++---- .../pages/YakRunner/RunnerTabs/RunnerTabs.tsx | 59 ++++++--- .../main/src/pages/YakRunner/YakRunner.tsx | 9 +- .../src/main/src/pages/YakRunner/utils.ts | 24 ++++ 9 files changed, 256 insertions(+), 99 deletions(-) diff --git a/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.module.scss b/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.module.scss index f585c27e7e..0c4d6f04f5 100644 --- a/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.module.scss +++ b/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.module.scss @@ -268,7 +268,7 @@ font-weight: 600; line-height: 16px; position: fixed; - width: calc(100% - 40px); + width: calc(100% - 32px); background: #ffffff; z-index: 1; border-bottom: 1px solid #eaecf3; @@ -276,7 +276,7 @@ flex: 1; display: flex; flex-direction: row; - gap: 8px; + gap: 4px; align-items: center; } .audit-path { @@ -303,7 +303,7 @@ flex: 1; display: flex; flex-direction: row; - gap: 8px; + gap: 4px; align-items: center; } .audit-path { diff --git a/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.tsx b/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.tsx index 2c2cf3141d..8524befde4 100644 --- a/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/AuditCode/AuditCode.tsx @@ -3,7 +3,7 @@ import {AuditCodeProps, AuditNodeProps, AuditTreeNodeProps, AuditTreeProps, Audi import classNames from "classnames" import styles from "./AuditCode.module.scss" import {YakScript} from "@/pages/invoker/schema" -import {Divider, Form, FormInstance, Tree} from "antd" +import {Divider, Form, FormInstance, Tooltip, Tree} from "antd" import {YakitSpin} from "@/components/yakitUI/YakitSpin/YakitSpin" import {ExtraParamsNodeByType} from "@/pages/plugins/operator/localPluginExecuteDetailHeard/PluginExecuteExtraParams" import {ExecuteEnterNodeByPluginParams} from "@/pages/plugins/operator/localPluginExecuteDetailHeard/LocalPluginExecuteDetailHeard" @@ -25,7 +25,7 @@ import {randomString} from "@/utils/randomUtil" import {CustomPluginExecuteFormValue} from "@/pages/plugins/operator/localPluginExecuteDetailHeard/LocalPluginExecuteDetailHeardType" import {defPluginExecuteFormValue} from "@/pages/plugins/operator/localPluginExecuteDetailHeard/constants" import useStore from "../hooks/useStore" -import {getNameByPath, grpcFetchAuditTree, loadAuditFromYakURLRaw} from "../utils" +import {getNameByPath, grpcFetchAuditTree, grpcFetchDeleteAudit, loadAuditFromYakURLRaw} from "../utils" import {YakitEmpty} from "@/components/yakitUI/YakitEmpty/YakitEmpty" import { OutlinCompileIcon, @@ -46,11 +46,14 @@ import {SolidExclamationIcon, SolidInformationcircleIcon, SolidXcircleIcon} from import {AuditEmiterYakUrlProps, OpenFileByPathProps} from "../YakRunnerType" import {FileNodeMapProps} from "../FileTree/FileTreeType" import {YakitCheckbox} from "@/components/yakitUI/YakitCheckbox/YakitCheckbox" -import {RequestYakURLResponse} from "@/pages/yakURLTree/data" +import {RequestYakURLResponse, YakURLResource} from "@/pages/yakURLTree/data" import {YakitPopconfirm} from "@/components/yakitUI/YakitPopconfirm/YakitPopconfirm" import {YakitInput} from "@/components/yakitUI/YakitInput/YakitInput" import {CodeRangeProps} from "../RightAuditDetail/RightAuditDetail" import {JumpToEditorProps} from "../BottomEditorDetails/BottomEditorDetailsType" +import {formatTimestamp} from "@/utils/timeUtil" +import {QuestionMarkCircleIcon} from "@/assets/newIcon" +import useDispatcher from "../hooks/useDispatcher" const {ipcRenderer} = window.require("electron") @@ -374,17 +377,17 @@ export const AuditCode: React.FC = (props) => { emiter.emit("onRefreshAuditTree") }) - useEffect(()=>{ - if(loadTreeType==="file"){ + useEffect(() => { + if (loadTreeType === "file") { setValue("") resetMap() } - },[loadTreeType]) + }, [loadTreeType]) - useUpdateEffect(()=>{ + useUpdateEffect(() => { setValue("") resetMap() - },[projectNmae]) + }, [projectNmae]) const onSubmit = useMemoizedFn(async () => { resetMap() @@ -689,19 +692,32 @@ interface AuditHistoryTableProps { export const AuditHistoryTable: React.FC = memo((props) => { const {visible, onClose} = props + const {projectNmae} = useStore() + const {setFileTree, setLoadTreeType} = useDispatcher() const [aduitData, setAduitData] = useState() const [selected, setSelected] = useState([]) + const [search, setSearch] = useState() useEffect(() => { if (visible) { getAduitList() } - }, [visible]) + }, [visible, search]) const getAduitList = useMemoizedFn(async () => { try { const {res} = await grpcFetchAuditTree("/") console.log("getAduitList***", res) - setAduitData(res) + if (search && search.length > 0) { + const newResources = res.Resources.filter((item) => JSON.stringify(item).includes(search)) + const obj: RequestYakURLResponse = { + ...res, + Resources: newResources, + Total: newResources.length + } + setAduitData(obj) + } else { + setAduitData(res) + } } catch (error) {} }) @@ -710,8 +726,54 @@ export const AuditHistoryTable: React.FC = memo((props) // 数组去重 const filterItem = (arr) => arr.filter((item, index) => arr.indexOf(item) === index) + const getAuditPath = useMemoizedFn((val: YakURLResource) => { + let path: string = "-" + let time: string = "-" + let description: string = "" + let language: string = "" + val.Extra.forEach((item) => { + switch (item.Key) { + case "Path": + path = item.Value + break + case "Description": + description = item.Value + break + case "Language": + language = item.Value + break + case "CreateAt": + time = formatTimestamp(parseInt(item.Value)) + break + } + }) + + return { + path, + time, + description, + language + } + }) + + const onDelete = useMemoizedFn(async (path: string) => { + try { + await grpcFetchDeleteAudit(path) + getAduitList() + console.log("ooo",path,projectNmae); + + if (path === `/${projectNmae}`) { + setLoadTreeType && setLoadTreeType("file") + setFileTree && setFileTree([]) + emiter.emit("onResetAuditStatus") + } + } catch (error) { + fail("删除失败") + } + }) + return ( -
+
event.stopPropagation()}>
已编译项目
@@ -719,22 +781,26 @@ export const AuditHistoryTable: React.FC = memo((props)
Total
{aduitData?.Total}
- + {/*
Selected
{selected.length}
-
+
*/}
} placeholder='请输入关键词搜索' size='small' + value={search} + onChange={(e) => { + setSearch(e.target.value) + }} /> - + {/* {selected.length === aduitData?.Total ? "清空" : "删除"} - + */} } onClick={onClose} />
@@ -743,7 +809,7 @@ export const AuditHistoryTable: React.FC = memo((props)
- { if (e.target.checked) { @@ -752,7 +818,7 @@ export const AuditHistoryTable: React.FC = memo((props) setSelected([]) } }} - /> + /> */} 项目名称
存储路径
@@ -762,10 +828,11 @@ export const AuditHistoryTable: React.FC = memo((props)
{aduitData && aduitData.Resources.map((item, index) => { + const obj = getAuditPath(item) return (
- { if (e.target.checked) { @@ -776,16 +843,21 @@ export const AuditHistoryTable: React.FC = memo((props) setSelected(newArr) } }} - /> + /> */} {item.ResourceName} + {obj.description && ( + + + + )}
-
-
-
-
+
{obj.path}
+
{obj.time}
} - onClick={()=>{ + onClick={() => { emiter.emit("onOpenAuditTree", item.ResourceName) onClose() }} @@ -799,7 +871,12 @@ export const AuditHistoryTable: React.FC = memo((props) } onConfirm={onRemove} > */} - } /> + } + onClick={() => onDelete(item.Path)} + />
) diff --git a/app/renderer/src/main/src/pages/YakRunner/FileTree/FileTree.tsx b/app/renderer/src/main/src/pages/YakRunner/FileTree/FileTree.tsx index 9e2f19694d..69869ab024 100644 --- a/app/renderer/src/main/src/pages/YakRunner/FileTree/FileTree.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/FileTree/FileTree.tsx @@ -729,6 +729,7 @@ const FileTreeNode: React.FC = (props) => { } }, [info, copyPath]) + // 此处关闭文件夹由于审计树没有树右键 因此只有文件树存在 const closeFolder = useMemoizedFn(() => { setFileTree && setFileTree([]) }) diff --git a/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.module.scss b/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.module.scss index 8487ae4edc..b37236b97f 100644 --- a/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.module.scss +++ b/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.module.scss @@ -24,6 +24,9 @@ font-size: 12px; font-weight: 600; line-height: 16px; + display: flex; + align-items: center; + gap: 4px; } } } @@ -39,7 +42,7 @@ flex-direction: column; gap: 8px; .url-box { - color: #f28b44; + color: rgb(136, 99, 247); font-size: 12px; font-weight: 400; line-height: 16px; @@ -112,6 +115,12 @@ fill: var(--yakit-primary-5); } } + .node-main text { + cursor: unset; + &:hover { + fill: #31343f; + } + } } } } diff --git a/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.tsx b/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.tsx index 619733559b..0ad2faef2f 100644 --- a/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/RightAuditDetail/RightAuditDetail.tsx @@ -13,14 +13,16 @@ import {instance} from "@viz-js/viz" import {failed} from "@/utils/notification" import emiter from "@/utils/eventBus/eventBus" import {JumpToEditorProps} from "../BottomEditorDetails/BottomEditorDetailsType" +import {QuestionMarkCircleIcon} from "@/assets/newIcon" interface FlowChartBoxProps { onDetail: (data: CodeRangeProps) => void graph?: string graphInfo?: GraphInfoProps[] + node_id?: string } export const FlowChartBox: React.FC = (props) => { - const {onDetail, graph, graphInfo} = props + const {onDetail, graph, graphInfo, node_id} = props const svgBoxRef = useRef(null) const svgRef = useRef(null) const [nodeId, setNodeId] = useState() @@ -29,6 +31,8 @@ export const FlowChartBox: React.FC = (props) => { const onElementStyle = useMemoizedFn((id, stroke, fill) => { // 获取 id 为 node 的元素 const nodeElement = document.getElementById(id) + console.log("ooo", nodeElement) + if (nodeElement) { // 查找该元素下的所有 ellipse 标签 const ellipses = nodeElement.getElementsByTagName("ellipse") @@ -41,6 +45,32 @@ export const FlowChartBox: React.FC = (props) => { } }) + // 初始默认样式 + const onInitSvgStyle = useMemoizedFn((id?: string) => { + if (id) { + const titles = document.getElementsByTagName("title") + // 遍历所有 元素 + for (let i = 0; i < titles.length; i++) { + if (titles[i].textContent === "n1") { + // 获取匹配的 <title> 元素的父元素 + const parentElement = titles[i].parentElement + if (parentElement) { + // 新增class用于屏蔽通用hover样式 + parentElement.classList.add("node-main") + // 查找该元素下的所有 ellipse 标签 + const ellipses = parentElement.getElementsByTagName("ellipse") + // 遍历所有找到的 ellipse 标签,并添加样式 + for (let i = 0; i < ellipses.length; i++) { + ellipses[i].style.stroke = "#8863F7" + ellipses[i].style.fill = "rgba(136, 99, 247, 0.10)" + } + } + break // 找到匹配的元素后停止遍历 + } + } + } + }) + // 更改SVG样式 const onChangeSvgStyle = useMemoizedFn((id?: string) => { if (styleNodeRef.current) { @@ -59,7 +89,9 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { const titleElement = target.parentNode.querySelector("title") if (titleElement) { const titleText = titleElement.textContent - console.log("click---", titleText, nodeId) + console.log("click---", titleText, node_id) + // 本身节点不用点击展开详情 + if (titleText === node_id) return if (titleText === nodeId) { setNodeId(undefined) onChangeSvgStyle() @@ -88,7 +120,7 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { } // 新增svg子元素 svgBoxRef.current.appendChild(svg) - console.log("ppp", svg) + onInitSvgStyle(node_id) } }) }, [graph]) @@ -106,7 +138,6 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { const [scale, setScale] = useState(1) // 初始缩放比例为1 const [dragging, setDragging] = useState(false) // 是否正在拖动 const [offset, setOffset] = useState({x: 0, y: 0}) // 鼠标拖动的偏移量 - const [isAllowHand, setAllowHand] = useState<boolean>(false) //是否允许拖动 // 放大 const handleZoomIn = useMemoizedFn(() => { @@ -122,9 +153,7 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { if (svgRef.current && svgBoxRef.current) { const svg = svgRef.current as SVGSVGElement svg.style.transform = `scale(${scale})` - if (isAllowHand) { - svgBoxRef.current.style.cursor = dragging ? "grabbing" : "grab" - } + svgBoxRef.current.style.cursor = dragging ? "grabbing" : "grab" // console.log("uuu", offset) svg.style.position = "relative" svg.style.left = `${offset.x}px` @@ -134,7 +163,6 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { // 处理鼠标按下事件 const handleMouseDown = (e) => { - if (!isAllowHand) return setDragging(true) firstOffsetRef.current = { x: e.nativeEvent.offsetX, @@ -144,7 +172,6 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { // 处理鼠标抬起事件 const handleMouseUp = () => { - if (!isAllowHand) return setDragging(false) firstOffsetRef.current = undefined } @@ -152,7 +179,6 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { // 处理鼠标移动事件 const handleMouseMove = useThrottleFn( (e) => { - if (!isAllowHand) return if (dragging && firstOffsetRef.current) { const newOffsetX = e.nativeEvent.offsetX const newOffsetY = e.nativeEvent.offsetY @@ -167,22 +193,26 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { {wait: 200} ).run - const handleHand = useMemoizedFn(() => { - setAllowHand(!isAllowHand) - }) - return ( <div className={styles["flow-chart-box"]}> <div className={styles["header"]}> <div className={styles["relative-box"]}> <div className={styles["absolute-box"]}> - <div className={styles["title"]}>Syntax Flow 审计过程</div> + <div className={styles["title"]}> + Syntax Flow 审计过程 + <Tooltip + title={ + <div> + <div>黑色箭头代表数据流分析路径</div> + <div>红色箭头代表跨数据流分析路径</div> + <div>紫色节点代表审计结果</div> + </div> + } + > + <QuestionMarkCircleIcon /> + </Tooltip> + </div> <div className={styles["extra"]}> - <YakitButton - type={isAllowHand ? "text" : "text2"} - icon={<OutlineHandIcon />} - onClick={handleHand} - /> <YakitButton type='text2' icon={<OutlineZoominIcon />} onClick={handleZoomIn} /> <YakitButton type='text2' icon={<OutlineZoomoutIcon />} onClick={handleZoomOut} /> </div> @@ -190,7 +220,7 @@ export const FlowChartBox: React.FC<FlowChartBoxProps> = (props) => { </div> </div> <div - style={isAllowHand ? {cursor: "grab"} : {cursor: "unset"}} + style={{cursor: "grab"} } className={styles["svg-box"]} onMouseDown={handleMouseDown} onMouseUp={handleMouseUp} @@ -329,7 +359,7 @@ export const RightAuditDetail: React.FC<RightSideBarProps> = (props) => { <div className={styles["header"]}> <div className={styles["relative-box"]}> <div className={styles["absolute-box"]}> - <div className={styles["title"]}>审计详情</div> + <div className={styles["title"]}>审计结果</div> <div className={styles["extra"]}> <YakitButton type='text2' @@ -368,7 +398,9 @@ export const RightAuditDetail: React.FC<RightSideBarProps> = (props) => { {contentInfo && <div className={styles["ir-code-box"]}>{contentInfo?.ir_code}</div>} </div> } - secondNode={<FlowChartBox onDetail={onDetail} graph={graph} graphInfo={graphInfo} />} + secondNode={ + <FlowChartBox onDetail={onDetail} graph={graph} graphInfo={graphInfo} node_id={nodeId} /> + } /> </div> </div> diff --git a/app/renderer/src/main/src/pages/YakRunner/RunnerFileTree/RunnerFileTree.tsx b/app/renderer/src/main/src/pages/YakRunner/RunnerFileTree/RunnerFileTree.tsx index d46faf0821..33a496c341 100644 --- a/app/renderer/src/main/src/pages/YakRunner/RunnerFileTree/RunnerFileTree.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/RunnerFileTree/RunnerFileTree.tsx @@ -147,7 +147,7 @@ export const RunnerFileTree: React.FC<RunnerFileTreeProps> = (props) => { const getAduitList = useMemoizedFn(async () => { try { const {res} = await grpcFetchAuditTree("/") - console.log("getAduitList","/", res) + console.log("getAduitList", "/", res) const arr = res.Resources.map(({Path, ResourceName}) => ({ path: Path, name: ResourceName @@ -225,31 +225,23 @@ export const RunnerFileTree: React.FC<RunnerFileTreeProps> = (props) => { }) } if (aduitList.length > 0) { - if (aduitList.length <= 10) { - newMenu.push({ - key: "auditHistory", - label: "最近编译", - children: aduitList.map((item) => ({key: `aduit-${item.name}`, label: item.name})) - }) - } else { - let children: any = [ - ...aduitList.slice(0, 10).map((item) => ({key: `aduit-${item.name}`, label: item.name})), - { - type: "divider" - }, - { - key: "aduitAllList", - label: "查看全部", - type: "text" - } - ] + let children: any = [ + ...aduitList.slice(0, 10).map((item) => ({key: `aduit-${item.name}`, label: item.name})), + { + type: "divider" + }, + { + key: "aduitAllList", + label: "查看全部", + type: "text" + } + ] - newMenu.push({ - key: "auditHistory", - label: "最近编译", - children - }) - } + newMenu.push({ + key: "auditHistory", + label: "最近编译", + children + }) } return newMenu @@ -741,7 +733,7 @@ export const RunnerFileTree: React.FC<RunnerFileTreeProps> = (props) => { <div className={styles["extra"]}> <Tooltip title={"编译当前项目"}> <YakitButton - disabled={loadTreeType === "audit"} + disabled={loadTreeType === "audit" || fileTree.length === 0} type='text2' icon={<OutlinCompileIcon />} onClick={() => emiter.emit("onOpenAuditModal", "init")} diff --git a/app/renderer/src/main/src/pages/YakRunner/RunnerTabs/RunnerTabs.tsx b/app/renderer/src/main/src/pages/YakRunner/RunnerTabs/RunnerTabs.tsx index c99b92f022..b246da7f46 100644 --- a/app/renderer/src/main/src/pages/YakRunner/RunnerTabs/RunnerTabs.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/RunnerTabs/RunnerTabs.tsx @@ -969,10 +969,20 @@ const RunnerTabPane: React.FC<RunnerTabPaneProps> = memo((props) => { } ) + // 优化性能 减少卡顿 + const updateAreaFun = useDebounceFn( + (content: string) => { + const newAreaInfo = updateAreaFileInfo(areaInfo, {code: content}, editorInfo?.path) + console.log("更新编辑器文件内容", newAreaInfo) + setAreaInfo && setAreaInfo(newAreaInfo) + }, + { + wait: 200 + } + ).run + // 更新编辑器文件内容(activeFile-code字段在光标位置改变时就已更新,为减少渲染,则不更新) const updateAreaInputInfo = useMemoizedFn((content: string) => { - const newAreaInfo = updateAreaFileInfo(areaInfo, {code: content}, editorInfo?.path) - // console.log("更新编辑器文件内容", newAreaInfo) if (editorInfo) { const newEditorInfo = {...editorInfo, code: content} // 未保存文件不用自动保存 审计树不用自动保存 @@ -981,29 +991,36 @@ const RunnerTabPane: React.FC<RunnerTabPaneProps> = memo((props) => { } setEditorInfo(newEditorInfo) } - setAreaInfo && setAreaInfo(newAreaInfo) + updateAreaFun(content) }) // 更新当前底部展示信息 - const updateBottomEditorDetails = useMemoizedFn(async () => { - if (!editorInfo) return - let newActiveFile = editorInfo - // 注入语法检查结果 - newActiveFile = await getDefaultActiveFile(newActiveFile) - // 更新位置信息 - if (positionRef.current) { - // 此处还需要将位置信息记录至areaInfo用于下次打开时直接定位光标 - newActiveFile = {...newActiveFile, position: positionRef.current} - } - if (selectionRef.current) { - // 此处还需要将位置信息记录至areaInfo用于下次打开时直接定位光标 - newActiveFile = {...newActiveFile, selections: selectionRef.current} + const updateBottomEditorDetails = useDebounceFn( + async () => { + console.log("更新当前底部展示信息---") + + if (!editorInfo) return + let newActiveFile = editorInfo + // 注入语法检查结果 + newActiveFile = await getDefaultActiveFile(newActiveFile) + // 更新位置信息 + if (positionRef.current) { + // 此处还需要将位置信息记录至areaInfo用于下次打开时直接定位光标 + newActiveFile = {...newActiveFile, position: positionRef.current} + } + if (selectionRef.current) { + // 此处还需要将位置信息记录至areaInfo用于下次打开时直接定位光标 + newActiveFile = {...newActiveFile, selections: selectionRef.current} + } + setActiveFile && setActiveFile(newActiveFile) + const newAreaInfo = updateAreaFileInfo(areaInfo, newActiveFile, newActiveFile.path) + // console.log("更新当前底部展示信息", newActiveFile, newAreaInfo) + setAreaInfo && setAreaInfo(newAreaInfo) + }, + { + wait: 200 } - setActiveFile && setActiveFile(newActiveFile) - const newAreaInfo = updateAreaFileInfo(areaInfo, newActiveFile, newActiveFile.path) - // console.log("更新当前底部展示信息", newActiveFile, newAreaInfo) - setAreaInfo && setAreaInfo(newAreaInfo) - }) + ).run // 聚焦时校验是否更新活跃文件 const onSetActiveFileByFocus = useMemoizedFn(() => { diff --git a/app/renderer/src/main/src/pages/YakRunner/YakRunner.tsx b/app/renderer/src/main/src/pages/YakRunner/YakRunner.tsx index 1cae687b38..6520d18d29 100644 --- a/app/renderer/src/main/src/pages/YakRunner/YakRunner.tsx +++ b/app/renderer/src/main/src/pages/YakRunner/YakRunner.tsx @@ -133,7 +133,7 @@ export const YakRunner: React.FC<YakRunnerProps> = (props) => { if (callback) callback(res) }) .catch((error) => { - yakitNotify("error", `获取文件列表失败: ${error}`) + yakitNotify("error", `获取文件项目失败: ${error}`) if (callback) callback([]) }) } else { @@ -142,7 +142,12 @@ export const YakRunner: React.FC<YakRunnerProps> = (props) => { if (callback) callback(res.data) }) .catch((error) => { - yakitNotify("error", `获取审计列表失败: ${error}`) + if(error.toString().includes("record not found")){ + yakitNotify("error", `获取审计项目:该项目 ${path} 已被删除。`) + } + else{ + yakitNotify("error", `获取审计项目失败: ${error}`) + } if (callback) callback([]) }) } diff --git a/app/renderer/src/main/src/pages/YakRunner/utils.ts b/app/renderer/src/main/src/pages/YakRunner/utils.ts index ba8f3fbd3d..a0dd8acdaf 100644 --- a/app/renderer/src/main/src/pages/YakRunner/utils.ts +++ b/app/renderer/src/main/src/pages/YakRunner/utils.ts @@ -236,6 +236,30 @@ export const grpcFetchDeleteFile: (path: string) => Promise<FileNodeMapProps[]> }) } +/** + * @name 删除已编译项目 + */ +export const grpcFetchDeleteAudit: (path: string) => Promise<FileNodeMapProps[]> = (path) => { + return new Promise(async (resolve, reject) => { + const params = { + Method: "DELETE", + Url: { + Schema: "ssadb", + Path: path, + Query: [{Key: "trash", Value: "true"}] + } + } + try { + const list: RequestYakURLResponse = await ipcRenderer.invoke("RequestYakURL", params) + console.log("删除已编译项目", params, list) + const data: FileNodeMapProps[] = initFileTreeData(list, path) + resolve(data) + } catch (error) { + reject(error) + } + }) +} + /** * @name 粘贴文件 */