main
mula.liu 2026-09-20 16:37:42 +08:00
parent f61a0bb913
commit a31e280bc3
2 changed files with 58 additions and 5 deletions

View File

@ -94,7 +94,7 @@ export default function KnowledgeGraph() {
const { data, loading, error, reload } = useApi(api.knowledgeGraph); const { data, loading, error, reload } = useApi(api.knowledgeGraph);
const coursesState = useApi(api.courses); const coursesState = useApi(api.courses);
const [domain, setDomain] = useState("初等"); const [domain, setDomain] = useState("初等");
const [viewMode, setViewMode] = useState<GraphViewMode>("graph"); const [viewMode, setViewMode] = useState<GraphViewMode>("tree");
const [selected, setSelected] = useState<KnowledgeGraphNode | null>(null); const [selected, setSelected] = useState<KnowledgeGraphNode | null>(null);
const [editOpen, setEditOpen] = useState(false); const [editOpen, setEditOpen] = useState(false);
const [editing, setEditing] = useState<KnowledgeGraphNode | null>(null); const [editing, setEditing] = useState<KnowledgeGraphNode | null>(null);
@ -536,23 +536,37 @@ export default function KnowledgeGraph() {
key={resource.id} key={resource.id}
color={tagColor.info} color={tagColor.info}
closable closable
className="graph-resource-tag"
onClose={(event) => { onClose={(event) => {
event.preventDefault(); event.preventDefault();
removeResource(resource.id); removeResource(resource.id);
}} }}
>
<span
className="graph-resource-name"
title={resource.title || resource.url}
> >
{resource.title || resource.url} {resource.title || resource.url}
</span>
</Tag> </Tag>
))} ))}
{(selected.resources ?? []).length === 0 && <Hint>{t("graph.none")}</Hint>} {(selected.resources ?? []).length === 0 && <Hint>{t("graph.none")}</Hint>}
</Space> </Space>
<Space.Compact style={{ marginTop: 8, width: "100%" }}> {/*
不能再用 Space.Compact + width:100%:选中长课程名时,
Select 的 min-content 会把整个控件撑长、把「关联」挤出面板。
改成 flex 行,Select 占剩余宽度且允许收缩,按钮宽度固定。
*/}
<Flex gap={8} align="center" style={{ marginTop: 8 }}>
<Select <Select
allowClear allowClear
style={{ width: "100%" }} style={{ flex: 1, minWidth: 0 }}
placeholder={courses.length ? t("graph.coursePlaceholder") : t("graph.coursePlaceholderEmpty")} placeholder={courses.length ? t("graph.coursePlaceholder") : t("graph.coursePlaceholderEmpty")}
value={courseId} value={courseId}
onChange={setCourseId} onChange={setCourseId}
popupMatchSelectWidth={false}
classNames={{ popup: { root: "long-option-select" } }}
styles={{ popup: { root: { minWidth: 260, maxWidth: 420 } } }}
options={courses.map((course) => ({ options={courses.map((course) => ({
value: course.id, value: course.id,
label: course.name, label: course.name,
@ -561,7 +575,7 @@ export default function KnowledgeGraph() {
<Button type="primary" onClick={() => addResource(selected)}> <Button type="primary" onClick={() => addResource(selected)}>
{t("graph.link")} {t("graph.link")}
</Button> </Button>
</Space.Compact> </Flex>
</div> </div>
</Space> </Space>
</> </>

View File

@ -1090,6 +1090,45 @@ body {
top: 76px; top: 76px;
} }
/*
* 详情面板里的课程/资源标签:课程名可能很长,antd 的 Tag 默认 nowrap 会撑出面板。
* 这里让它占满一行、在标签内部换行,关闭按钮留在右上角。
*/
.graph-detail .ant-tag.graph-resource-tag {
display: inline-flex;
/* 居中:关闭按钮跟着整块标签垂直居中,不再贴首行顶部 */
align-items: center;
gap: 6px;
max-width: 100%;
height: auto;
padding-block: 2px;
white-space: normal;
}
/* 关闭按钮自带 7px 左边距,与 flex 的 gap 叠加会偏右:间距统一交给 gap */
.graph-detail .ant-tag.graph-resource-tag .ant-tag-close-icon {
margin-inline-start: 0;
line-height: 1;
}
.graph-resource-name {
min-width: 0;
line-height: 1.7;
overflow-wrap: anywhere;
word-break: break-word;
}
/*
* 长选项下拉(课程名等):下拉框按内容自适应、最宽 420px,
* 名字再长就在选项里折行,而不是被裁成一句省略号。
*/
.long-option-select .ant-select-item-option-content {
white-space: normal;
overflow-wrap: anywhere;
line-height: 1.7;
padding-block: 2px;
}
/* 树视图:和画布同一块高度,长了在自己内部滚 */ /* 树视图:和画布同一块高度,长了在自己内部滚 */
.graph-tree { .graph-tree {
max-height: 560px; max-height: 560px;