更新ai广场bug
This commit is contained in:
1 parent
26eaf1eddb
commit
9f60450ffa
6 files changed
+482
-132
No files matched your search
@@ -4,7 +4,7 @@
|
||||
<div>
|
||||
<h2>文档图谱</h2>
|
||||
<p>
|
||||
默认展示顶级往下 3 级分类脉络,点击带 ▸ 的分类节点可继续延展 3 级;滚轮缩放,按住空格 + 左键拖拽平移
|
||||
默认展示顶级往下 3 级分类脉络,点击带 ▸ 的分类节点可继续延展 3 级;滚轮缩放,按住右键拖拽平移画布
|
||||
</p>
|
||||
</div>
|
||||
<div class="header-actions">
|
||||
@@ -66,7 +66,12 @@
|
||||
</div>
|
||||
|
||||
<div v-loading="loading" class="chart-wrap">
|
||||
<div ref="chartRef" class="chart" />
|
||||
<div
|
||||
ref="chartRef"
|
||||
class="chart"
|
||||
@contextmenu.prevent
|
||||
@mousedown="onChartMouseDown"
|
||||
/>
|
||||
<el-empty
|
||||
v-if="!loading && !displayNodes.length"
|
||||
description="暂无可展示的分类或文档,请先到文档库新建分类并上传文档"
|
||||
@@ -97,7 +102,8 @@
|
||||
<i class="line dotted" />分类层级
|
||||
</span>
|
||||
<span class="legend-tip"
|
||||
>滚轮缩放 · 空格+左键拖拽平移 · 点击 ▸ 分类展开下级(更深层级循环使用这 3 色)</span
|
||||
>滚轮缩放 · 右键拖拽平移 · 左键拖拽节点 · 点击 ▸ 分类展开下级(更深层级循环使用这 3
|
||||
色)</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -210,8 +216,8 @@ const detailId = ref(0);
|
||||
// 分层展开:默认展示顶级往下 3 级,点击分支节点后在该分支继续延展 3 级
|
||||
const INITIAL_DEPTH = 3;
|
||||
const expandedIds = ref(new Set());
|
||||
// 按住空格 + 鼠标左键拖拽平移
|
||||
const spaceHeld = ref(false);
|
||||
// 按住右键拖拽平移画布(ECharts 原生 roam 只响应左键,右键需自行接管)
|
||||
const panning = ref(false);
|
||||
|
||||
const filters = reactive({
|
||||
keyword: "",
|
||||
@@ -455,10 +461,10 @@ function buildOption() {
|
||||
{
|
||||
type: "graph",
|
||||
layout: filters.layout,
|
||||
// roam: 滚轮缩放 + 拖拽平移;按住空格时禁用节点拖拽,让左键拖拽整体平移
|
||||
// roam: 滚轮缩放 + 左键在空白处拖拽平移;节点左键可拖拽,右键拖拽整体平移
|
||||
roam: true,
|
||||
scaleLimit: { min: 0.15, max: 6 },
|
||||
draggable: !spaceHeld.value,
|
||||
draggable: true,
|
||||
data,
|
||||
links: edgeList,
|
||||
categories: [
|
||||
@@ -540,39 +546,50 @@ function openNode(node) {
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------- 空格 + 鼠标左键拖拽平移 ----------------
|
||||
function isTypingTarget(el) {
|
||||
return (
|
||||
!!el &&
|
||||
(el.tagName === "INPUT" ||
|
||||
el.tagName === "TEXTAREA" ||
|
||||
el.isContentEditable === true)
|
||||
);
|
||||
}
|
||||
// ---------------- 按住右键拖拽平移 ----------------
|
||||
// ECharts 的 roam 会忽略右键(isMiddleOrRightButtonOnMouseUpDown),
|
||||
// 这里自行接管右键拖拽,通过 graphRoam 动作平移,不改动节点数据与布局。
|
||||
let panLastX = 0;
|
||||
let panLastY = 0;
|
||||
|
||||
function applyPanMode(on) {
|
||||
if (chartRef.value) chartRef.value.style.cursor = on ? "grab" : "";
|
||||
try {
|
||||
// 空格按下时禁用节点拖拽,使左键拖拽变为整体平移
|
||||
chart?.setOption({ series: [{ draggable: !on }] });
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
}
|
||||
|
||||
function onSpaceDown(e) {
|
||||
if (e.code !== "Space") return;
|
||||
if (isTypingTarget(e.target)) return;
|
||||
function onChartMouseDown(e) {
|
||||
if (e.button !== 2) return; // 仅响应右键
|
||||
e.preventDefault();
|
||||
if (spaceHeld.value) return;
|
||||
spaceHeld.value = true;
|
||||
applyPanMode(true);
|
||||
panning.value = true;
|
||||
panLastX = e.clientX;
|
||||
panLastY = e.clientY;
|
||||
chartRef.value?.classList.add("is-panning");
|
||||
window.addEventListener("mousemove", onPanMouseMove);
|
||||
window.addEventListener("mouseup", onPanMouseUp);
|
||||
}
|
||||
|
||||
function onSpaceUp(e) {
|
||||
if (e.code !== "Space") return;
|
||||
spaceHeld.value = false;
|
||||
applyPanMode(false);
|
||||
function onPanMouseMove(e) {
|
||||
if (!panning.value) return;
|
||||
// 右键在画布外松开时 mouseup 不会触发,用 buttons 兜底结束拖拽
|
||||
if ((e.buttons & 2) === 0) {
|
||||
stopPan();
|
||||
return;
|
||||
}
|
||||
const dx = e.clientX - panLastX;
|
||||
const dy = e.clientY - panLastY;
|
||||
panLastX = e.clientX;
|
||||
panLastY = e.clientY;
|
||||
if (!dx && !dy) return;
|
||||
e.preventDefault();
|
||||
chart?.dispatchAction({ type: "graphRoam", seriesIndex: 0, dx, dy });
|
||||
}
|
||||
|
||||
function onPanMouseUp(e) {
|
||||
if (e.button !== 2) return;
|
||||
stopPan();
|
||||
}
|
||||
|
||||
function stopPan() {
|
||||
if (!panning.value) return;
|
||||
panning.value = false;
|
||||
chartRef.value?.classList.remove("is-panning");
|
||||
window.removeEventListener("mousemove", onPanMouseMove);
|
||||
window.removeEventListener("mouseup", onPanMouseUp);
|
||||
}
|
||||
|
||||
async function loadCategories() {
|
||||
@@ -677,14 +694,10 @@ onMounted(async () => {
|
||||
attributes: true,
|
||||
attributeFilter: ["class"]
|
||||
});
|
||||
// 空格 + 左键拖拽平移
|
||||
window.addEventListener("keydown", onSpaceDown);
|
||||
window.addEventListener("keyup", onSpaceUp);
|
||||
});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener("keydown", onSpaceDown);
|
||||
window.removeEventListener("keyup", onSpaceUp);
|
||||
stopPan();
|
||||
resizeObserver?.disconnect();
|
||||
themeObserver?.disconnect();
|
||||
chart?.dispose();
|
||||
@@ -752,6 +765,12 @@ onBeforeUnmount(() => {
|
||||
.chart {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
// 右键拖拽平移时强制抓手光标(zrender 会改写 canvas 内联 cursor)
|
||||
&.is-panning,
|
||||
&.is-panning * {
|
||||
cursor: grabbing !important;
|
||||
}
|
||||
}
|
||||
|
||||
.chart-empty {
|
||||
|
||||
Reference in new issue
Block a user