98 lines
2.2 KiB
TypeScript
98 lines
2.2 KiB
TypeScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
*/
|
|
|
|
import {
|
|
DOMConversionMap,
|
|
EditorConfig,
|
|
ElementNode,
|
|
LexicalNode,
|
|
NodeKey,
|
|
SerializedElementNode,
|
|
Spread,
|
|
} from 'lexical'
|
|
|
|
type SerializedCollapsibleContainerNode = Spread<
|
|
{
|
|
type: 'collapsible-container'
|
|
version: 1
|
|
open: boolean
|
|
},
|
|
SerializedElementNode
|
|
>
|
|
|
|
export class CollapsibleContainerNode extends ElementNode {
|
|
__open: boolean
|
|
|
|
constructor(open: boolean, key?: NodeKey) {
|
|
super(key)
|
|
this.__open = open ?? false
|
|
}
|
|
|
|
static override getType(): string {
|
|
return 'collapsible-container'
|
|
}
|
|
|
|
static override clone(node: CollapsibleContainerNode): CollapsibleContainerNode {
|
|
return new CollapsibleContainerNode(node.__open, node.__key)
|
|
}
|
|
|
|
override createDOM(_: EditorConfig): HTMLElement {
|
|
const dom = document.createElement('details')
|
|
dom.classList.add('Collapsible__container')
|
|
dom.open = this.__open
|
|
return dom
|
|
}
|
|
|
|
override updateDOM(prevNode: CollapsibleContainerNode, dom: HTMLDetailsElement): boolean {
|
|
if (prevNode.__open !== this.__open) {
|
|
dom.open = this.__open
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
static importDOM(): DOMConversionMap | null {
|
|
return {}
|
|
}
|
|
|
|
static override importJSON(serializedNode: SerializedCollapsibleContainerNode): CollapsibleContainerNode {
|
|
const node = $createCollapsibleContainerNode(serializedNode.open)
|
|
return node
|
|
}
|
|
|
|
override exportJSON(): SerializedCollapsibleContainerNode {
|
|
return {
|
|
...super.exportJSON(),
|
|
type: 'collapsible-container',
|
|
version: 1,
|
|
open: this.__open,
|
|
}
|
|
}
|
|
|
|
setOpen(open: boolean): void {
|
|
const writable = this.getWritable()
|
|
writable.__open = open
|
|
}
|
|
|
|
getOpen(): boolean {
|
|
return this.__open
|
|
}
|
|
|
|
toggleOpen(): void {
|
|
this.setOpen(!this.getOpen())
|
|
}
|
|
}
|
|
|
|
export function $createCollapsibleContainerNode(open: boolean): CollapsibleContainerNode {
|
|
return new CollapsibleContainerNode(open)
|
|
}
|
|
|
|
export function $isCollapsibleContainerNode(node: LexicalNode | null | undefined): node is CollapsibleContainerNode {
|
|
return node instanceof CollapsibleContainerNode
|
|
}
|