mirror of https://github.com/halo-dev/halo
pref: add folding function to code blocks (#6177)
#### What type of PR is this? /kind improvement /area editor /milestone 2.17.x #### What this PR does / why we need it: 为默认编辑器代码块增加折叠功能。 <img width="892" alt="image" src="https://github.com/halo-dev/halo/assets/31335418/8325cba9-08ce-4bd7-98b6-6bc28fe52daf"> #### How to test it? 测试折叠功能是否可用。 测试重新打开文章之后代码块是否仍旧处于折叠状态。 #### Which issue(s) this PR fixes: Fixes #6166 #### Does this PR introduce a user-facing change? ```release-note 为默认编辑器代码块增加折叠功能 ```pull/6185/head
parent
556e65a618
commit
ab14157def
|
@ -6,6 +6,8 @@ import { NodeViewContent, NodeViewWrapper } from "@/tiptap/vue-3";
|
||||||
import { useTimeout } from "@vueuse/core";
|
import { useTimeout } from "@vueuse/core";
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
import BxBxsCopy from "~icons/bx/bxs-copy";
|
import BxBxsCopy from "~icons/bx/bxs-copy";
|
||||||
|
import RiArrowDownSFill from "~icons/ri/arrow-down-s-fill";
|
||||||
|
import RiArrowRightSFill from "~icons/ri/arrow-right-s-fill";
|
||||||
import IconCheckboxCircle from "~icons/ri/checkbox-circle-line";
|
import IconCheckboxCircle from "~icons/ri/checkbox-circle-line";
|
||||||
import lowlight from "./lowlight";
|
import lowlight from "./lowlight";
|
||||||
|
|
||||||
|
@ -33,6 +35,15 @@ const selectedLanguage = computed({
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const collapsed = computed<boolean>({
|
||||||
|
get: () => {
|
||||||
|
return props.node.attrs.collapsed || false;
|
||||||
|
},
|
||||||
|
set: (collapsed: boolean) => {
|
||||||
|
props.updateAttributes({ collapsed: collapsed });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const { ready, start } = useTimeout(2000, { controls: true, immediate: false });
|
const { ready, start } = useTimeout(2000, { controls: true, immediate: false });
|
||||||
|
|
||||||
const handleCopyCode = () => {
|
const handleCopyCode = () => {
|
||||||
|
@ -44,14 +55,29 @@ const handleCopyCode = () => {
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<node-view-wrapper as="div" class="code-node border-[1px] rounded mt-3">
|
<node-view-wrapper
|
||||||
|
as="div"
|
||||||
|
class="code-node border-[1px] rounded mt-3 overflow-hidden"
|
||||||
|
>
|
||||||
<div
|
<div
|
||||||
class="bg-neutral-100 border-b-[1px] border-b-gray-100 py-1 flex items-center justify-between rounded-t"
|
contenteditable="false"
|
||||||
|
class="bg-neutral-100 border-b-[1px] border-b-gray-100 py-1 flex items-center justify-between"
|
||||||
>
|
>
|
||||||
<div class="flex-1 flex items-center pl-3">
|
<div
|
||||||
|
class="flex-1 flex items-center pl-3"
|
||||||
|
@click.self="collapsed ? (collapsed = false) : null"
|
||||||
|
>
|
||||||
|
<div class="pr-3 flex items-center">
|
||||||
|
<div
|
||||||
|
class="w-8 h-8 cursor-pointer rounded flex items-center justify-center hover:bg-zinc-200"
|
||||||
|
@click.stop="collapsed = !collapsed"
|
||||||
|
>
|
||||||
|
<RiArrowRightSFill v-if="collapsed" />
|
||||||
|
<RiArrowDownSFill v-else />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<select
|
<select
|
||||||
v-model="selectedLanguage"
|
v-model="selectedLanguage"
|
||||||
contenteditable="false"
|
|
||||||
class="block !leading-8 text-sm text-gray-900 border select-none border-transparent rounded-md bg-transparent focus:ring-blue-500 focus:border-blue-500 cursor-pointer hover:bg-zinc-200"
|
class="block !leading-8 text-sm text-gray-900 border select-none border-transparent rounded-md bg-transparent focus:ring-blue-500 focus:border-blue-500 cursor-pointer hover:bg-zinc-200"
|
||||||
>
|
>
|
||||||
<option :value="null">auto</option>
|
<option :value="null">auto</option>
|
||||||
|
@ -80,6 +106,6 @@ const handleCopyCode = () => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<pre><node-view-content as="code" class="hljs" /></pre>
|
<pre v-show="!collapsed"><node-view-content as="code" class="hljs" /></pre>
|
||||||
</node-view-wrapper>
|
</node-view-wrapper>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -105,6 +105,25 @@ export default CodeBlockLowlight.extend<
|
||||||
// otherwise the Mod-a shortcut key will be overridden.
|
// otherwise the Mod-a shortcut key will be overridden.
|
||||||
priority: 110,
|
priority: 110,
|
||||||
fakeSelection: true,
|
fakeSelection: true,
|
||||||
|
|
||||||
|
addAttributes() {
|
||||||
|
return {
|
||||||
|
...this.parent?.(),
|
||||||
|
collapsed: {
|
||||||
|
default: false,
|
||||||
|
parseHTML: (element) => !!element.getAttribute("collapsed"),
|
||||||
|
renderHTML: (attributes) => {
|
||||||
|
if (attributes.collapsed) {
|
||||||
|
return {
|
||||||
|
collapsed: attributes.collapsed,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
addCommands() {
|
addCommands() {
|
||||||
return {
|
return {
|
||||||
...this.parent?.(),
|
...this.parent?.(),
|
||||||
|
|
Loading…
Reference in New Issue