Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/js/ui/text-editor/src/plugins/file/file/
Upload File :
Current File : /var/www/homesaver/www/bitrix/js/ui/text-editor/src/plugins/file/file/file-node.js

/* eslint-disable no-underscore-dangle, @bitrix24/bitrix24-rules/no-pseudo-private */

import { Type, Dom } from 'main.core';

import {
	TextNode,
	type DOMConversionMap,
	type DOMConversionOutput,
	type DOMExportOutput,
	type EditorConfig,
	type LexicalNode,
	type NodeKey,
	type SerializedDecoratorNode,
	type LexicalEditor,
} from 'ui.lexical.core';

import type { UploaderFileInfo } from 'ui.uploader.core';

export type SerializedFileNode = SerializedDecoratorNode & {
	serverFileId: string | number,
	info: UploaderFileInfo,
};

import './file.css';

/** @memberof BX.UI.TextEditor.Plugins.File */
export class FileNode extends TextNode
{
	__serverFileId: string | number;
	__info: UploaderFileInfo;

	constructor(
		serverFileId: string | number,
		info: UploaderFileInfo,
		key?: NodeKey,
	)
	{
		const fileInfo = Type.isPlainObject(info) ? info : {};

		super(fileInfo.name || '', key);

		this.__serverFileId = serverFileId;
		this.__info = fileInfo;
	}

	static getType(): string
	{
		return 'file';
	}

	static clone(node: FileNode): FileNode
	{
		return new FileNode(node.__serverFileId, node.__info, node.__key);
	}

	getId(): string | number
	{
		return this.__serverFileId;
	}

	getServerFileId(): string | number
	{
		return this.__serverFileId;
	}

	getInfo(): UploaderFileInfo
	{
		return this.__info;
	}

	getName(): string
	{
		return this.__info.name || 'unknown';
	}

	static importJSON(serializedNode: SerializedFileNode): FileNode
	{
		return $createFileNode(serializedNode.serverFileId, serializedNode.info);
	}

	static importDOM(): DOMConversionMap | null
	{
		return {
			span: (domNode: HTMLElement) => {
				if (!domNode.hasAttribute('data-file-id'))
				{
					return null;
				}

				return {
					conversion: (span: HTMLSpanElement): DOMConversionOutput | null => {
						const { fileId, fileInfo } = domNode.dataset;
						let info = null;
						try
						{
							info = JSON.parse(fileInfo);
						}
						catch
						{
							return null;
						}

						const node = $createFileNode(fileId, info);

						return { node };
					},
					priority: 1,
				};
			},
		};
	}

	exportDOM(): DOMExportOutput
	{
		const element = document.createElement('span');
		element.textContent = this.getName();
		element.setAttribute('data-file-id', this.__serverFileId);
		element.setAttribute('data-file-info', JSON.stringify(this.__info));

		return { element };
	}

	exportJSON(): SerializedFileNode
	{
		return {
			...super.exportJSON(),
			info: this.__info,
			serverFileId: this.__serverFileId,
			type: 'file',
			version: 1,
		};
	}

	createDOM(config: EditorConfig, editor: LexicalEditor): HTMLSpanElement
	{
		const span = document.createElement('span');
		if (Type.isStringFilled(config?.theme?.file))
		{
			Dom.addClass(span, config.theme.file);
		}

		span.textContent = this.getName();

		return span;
	}

	updateDOM(prevNode: FileNode, anchor: HTMLElement, config: EditorConfig): boolean
	{
		return false;
	}
}

export function $createFileNode(serverFileId: string | number, info: UploaderFileInfo = {}): FileNode
{
	return new FileNode(serverFileId, info).setMode('token');
}

export function $isFileNode(node: LexicalNode | null | undefined): boolean
{
	return node instanceof FileNode;
}