summaryrefslogtreecommitdiff
path: root/frontend/src/components/document/nodes/ContractBlockNode.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/components/document/nodes/ContractBlockNode.tsx')
-rw-r--r--frontend/src/components/document/nodes/ContractBlockNode.tsx106
1 files changed, 106 insertions, 0 deletions
diff --git a/frontend/src/components/document/nodes/ContractBlockNode.tsx b/frontend/src/components/document/nodes/ContractBlockNode.tsx
new file mode 100644
index 0000000..86e4c9d
--- /dev/null
+++ b/frontend/src/components/document/nodes/ContractBlockNode.tsx
@@ -0,0 +1,106 @@
+import {
+ DecoratorNode,
+ DOMExportOutput,
+ LexicalNode,
+ NodeKey,
+ SerializedLexicalNode,
+ Spread,
+} from 'lexical';
+import React from 'react';
+import { ContractBlockComponent } from './ContractBlockComponent';
+
+export type SerializedContractBlockNode = Spread<
+ {
+ contractId: string;
+ contractName: string;
+ },
+ SerializedLexicalNode
+>;
+
+export class ContractBlockNode extends DecoratorNode<JSX.Element> {
+ __contractId: string;
+ __contractName: string;
+
+ static getType(): string {
+ return 'contract-block';
+ }
+
+ static clone(node: ContractBlockNode): ContractBlockNode {
+ return new ContractBlockNode(node.__contractId, node.__contractName, node.__key);
+ }
+
+ constructor(contractId: string, contractName: string, key?: NodeKey) {
+ super(key);
+ this.__contractId = contractId;
+ this.__contractName = contractName;
+ }
+
+ createDOM(): HTMLElement {
+ const div = document.createElement('div');
+ div.className = 'contract-block-wrapper';
+ return div;
+ }
+
+ updateDOM(): boolean {
+ return false;
+ }
+
+ decorate(): JSX.Element {
+ return (
+ <ContractBlockComponent
+ contractId={this.__contractId}
+ contractName={this.__contractName}
+ />
+ );
+ }
+
+ exportJSON(): SerializedContractBlockNode {
+ return {
+ ...super.exportJSON(),
+ type: 'contract-block',
+ contractId: this.__contractId,
+ contractName: this.__contractName,
+ version: 1,
+ };
+ }
+
+ static importJSON(serializedNode: SerializedContractBlockNode): ContractBlockNode {
+ return $createContractBlockNode(
+ serializedNode.contractId,
+ serializedNode.contractName
+ );
+ }
+
+ isInline(): boolean {
+ return false;
+ }
+
+ canInsertTextBefore(): boolean {
+ return false;
+ }
+
+ canInsertTextAfter(): boolean {
+ return false;
+ }
+
+ exportDOM(): DOMExportOutput {
+ const element = document.createElement('div');
+ element.className = 'contract-block-wrapper';
+ element.setAttribute('data-contract-id', this.__contractId);
+ element.textContent = `[Contract: ${this.__contractName}]`;
+ return { element };
+ }
+}
+
+export function $createContractBlockNode(
+ contractId: string,
+ contractName: string
+): ContractBlockNode {
+ return new ContractBlockNode(contractId, contractName);
+}
+
+export function $isContractBlockNode(
+ node: LexicalNode | null | undefined,
+): node is ContractBlockNode {
+ return node instanceof ContractBlockNode;
+}