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/activities/bitrix/sequenceactivity/src/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/activities/bitrix/sequenceactivity/src/index.js
import { Dom, Tag, Event, Text, Type, Reflection } from 'main.core';
import { BaseEvent } from 'main.core.events';
import { Menu, MenuItem } from 'main.popup';

import './css/style.css';

// eslint-disable-next-line @bitrix24/bitrix24-rules/no-pseudo-private,no-underscore-dangle
let _SequenceActivityCurClick = null;

// eslint-disable-next-line @bitrix24/bitrix24-rules/no-pseudo-private,no-underscore-dangle
function _SequenceActivityClick(activityIndex, i, presetId)
{
	const preset = presetId ? window.arAllActivities[activityIndex].PRESETS.find((item) => item.ID === presetId) : null;
	const defaultProps = preset ? preset.PROPERTIES : {};

	const activity = {
		Properties: {
			Title: (preset && preset.NAME) || Text.encode(window.arAllActivities[activityIndex].NAME),
			...defaultProps,
		},
		Type: window.arAllActivities[activityIndex].CLASS,
		Children: [],
	};

	_SequenceActivityCurClick.AddActivity(window.CreateActivity(activity), i);
}

// eslint-disable-next-line @bitrix24/bitrix24-rules/no-pseudo-private,no-underscore-dangle
function _SequenceActivityMyActivityClick(isn, i)
{
	if (
		window.arUserParams
		&& BX.type.isArray(window.arUserParams.SNIPPETS)
		&& window.arUserParams.SNIPPETS[isn]
	)
	{
		_SequenceActivityCurClick.AddActivity(window.CreateActivity(window.arUserParams.SNIPPETS[isn]), i);
	}
}

const BizProcActivity = window.BizProcActivity;

export class SequenceActivity extends BizProcActivity
{
	#numberHeadRows: number = 0;

	childsContainer;
	lastDrop;
	h1id;
	h2id;

	#menuItems: [];

	constructor()
	{
		super();
		this.Type = 'SequenceActivity';
		this.childsContainer = null;

		this.#initDragNDropHandlers();

		// compatibility
		this.LineMouseOver = this.#onLineMouseOver;
		this.LineMouseOut = this.#onLineMouseOut;
		this.OnClick = (event) => {
			this.#onClick(event.target);
		};
		this.ondragging = this.#onDragging.bind(this);
		this.ondrop = this.#onDrop.bind(this);

		this.ActivityRemoveChild = this.RemoveChild;
		this.RemoveChild = this.#removeChild.bind(this);
		this.RemoveResources = this.#removeResources.bind(this);
		this.AddActivity = this.#addActivity.bind(this);
		this.CreateLine = this.#createArrow.bind(this);
		this.ActivityDraw = this.Draw;
		this.Draw = this.#draw.bind(this);
	}

	get iHead(): number
	{
		return this.#numberHeadRows;
	}

	set iHead(value: number)
	{
		if (Type.isInteger(value) && value >= 0)
		{
			this.#numberHeadRows = value;
		}
	}

	#onLineMouseOver()
	{
		Dom.style(this.parentNode, 'backgroundImage', 'url(/bitrix/images/bizproc/arr_over.gif)');
	}

	#onLineMouseOut()
	{
		Dom.style(this.parentNode, 'backgroundImage', 'url(/bitrix/images/bizproc/arr.gif)');
	}

	#initDragNDropHandlers()
	{
		this.lastDrop = false;
		this.h1id = window.DragNDrop.AddHandler('ondragging', this.#onDragging.bind(this));
		this.h2id = window.DragNDrop.AddHandler('ondrop', this.#onDrop.bind(this));
	}

	#onDragging(event, x, y)
	{
		if (this.childsContainer)
		{
			for (let i = 0; i <= this.childActivities.length; i++)
			{
				const arrow = this.childsContainer.rows[i * 2 + this.iHead].cells[0].childNodes[0];
				const position = Dom.getPosition(arrow);

				if (position.left < x && x < position.right && position.top < y && y < position.bottom)
				{
					arrow.onmouseover();
					this.lastDrop = arrow;

					return;
				}
			}

			if (this.lastDrop)
			{
				this.lastDrop.onmouseout();
				this.lastDrop = false;
			}
		}
	}

	#onDrop(x, y, event)
	{
		if (this.childsContainer && this.lastDrop)
		{
			if (window.DragNDrop.obj.parentActivity && (event.ctrlKey === false && event.metaKey === false))
			{
				this.#moveActivityToPosition(window.DragNDrop.obj, this.lastDrop);
			}
			else
			{
				this.#copyActivityToPosition(window.DragNDrop.obj, this.lastDrop);
			}
			this.lastDrop.onmouseout();
			this.lastDrop = false;
		}
	}

	#moveActivityToPosition(originalActivity, positionNode)
	{
		const parentActivity = originalActivity.parentActivity;
		const childPosition = parentActivity.childActivities.findIndex((child) => child.Name === originalActivity.Name);
		const position = positionNode.ind;

		if (
			parentActivity.Name !== this.Name
			|| (childPosition !== position && (childPosition + 1 !== position))
		)
		{
			if (this.#checkMovingCycle(originalActivity))
			{
				parentActivity.childsContainer.deleteRow(childPosition * 2 + 1 + parentActivity.iHead);
				parentActivity.childsContainer.deleteRow(childPosition * 2 + 1 + parentActivity.iHead);

				parentActivity.childActivities.splice(childPosition, 1);
				this.#refreshArrows(parentActivity);

				// after refresh arrows position changed
				this.#addActivity(originalActivity, positionNode.ind);
			}
			else
			{
				// eslint-disable-next-line @bitrix24/bitrix24-rules/no-native-dialogs,no-alert
				alert(window.BPMESS.BPSA_ERROR_MOVE_1);
			}
		}
	}

	#checkMovingCycle(originalActivity): boolean
	{
		// eslint-disable-next-line unicorn/no-this-assignment
		let activity = this;
		while (activity)
		{
			if (originalActivity.Name === activity.Name)
			{
				return false;
			}

			activity = activity.parentActivity;
		}

		return true;
	}

	#copyActivityToPosition(originalActivity, positionNode)
	{
		const copiedActivity = window.CreateActivity(originalActivity);
		this.AddActivity(copiedActivity, positionNode.ind);
	}

	#removeChild(child)
	{
		const index = this.childActivities.indexOf(child);
		if (index >= 0)
		{
			this.ActivityRemoveChild(child);

			if (this.childsContainer)
			{
				this.childsContainer.deleteRow([index * 2 + 1 + this.iHead]);
				this.childsContainer.deleteRow([index * 2 + 1 + this.iHead]);

				this.#refreshArrows(this);
			}
		}
	}

	#refreshArrows(activity)
	{
		for (let i = 0; i <= activity.childActivities.length; i++)
		{
			// eslint-disable-next-line no-param-reassign
			activity.childsContainer.rows[i * 2 + activity.iHead].cells[0].childNodes[0].ind = i;
		}
	}

	#removeResources()
	{
		window.DragNDrop.RemoveHandler('ondragging', this.h1id);
		window.DragNDrop.RemoveHandler('ondrop', this.h2id);

		if (this.childsContainer && this.childsContainer.parentNode)
		{
			Dom.remove(this.childsContainer);
			this.childsContainer = null;
		}
	}

	#onClick(bindElement)
	{
		// eslint-disable-next-line unicorn/no-this-assignment
		_SequenceActivityCurClick = this;

		const menu = new Menu({
			bindElement,
			id: `all-worfklow-activity-${Text.getRandom()}`,
			minWidth: 190,
			autoHide: true,
			zIndexOptions: { alwaysOnTop: true },
			cacheable: false,
			items: this.#getAllActivitiesMenuItems(),
			subMenuOptions: {
				maxWidth: 850,
				maxHeight: 600,
			},
		});
		menu.show();
	}

	#getAllActivitiesMenuItems(): []
	{
		if (this.#menuItems)
		{
			this.#addMyActivitiesMenuItem();

			return this.#menuItems;
		}

		const items = this.#getGroupMenuItems();
		Object.entries(window.arAllActivities).forEach(([id, description]) => {
			if (
				(id !== 'setstateactivity' || window.rootActivity.Type !== this.Type)
				&& !description.EXCLUDED
				&& description.CATEGORY
			)
			{
				const groupId = description.CATEGORY.OWN_ID ?? description.CATEGORY.ID;
				if (items[groupId])
				{
					items[groupId].items.push(this.#getActivityMenuItem(id, description));

					if (Type.isArrayFilled(description.PRESETS))
					{
						description.PRESETS.forEach((preset) => {
							items[groupId].items.push(this.#getActivityMenuItem(id, description, preset));
						});
					}
				}
			}
		});

		if (items.rest && Reflection.getClass('BX.rest.Marketplace'))
		{
			items.rest.items.push({
				className: 'bizproc-designer-sequence-activity-menu-item-icon',
				html: this.#renderActivityMenuItemNode(
					window.BPMESS.BPSA_MARKETPLACE_ADD_TITLE_2,
					window.BPMESS.BPSA_MARKETPLACE_ADD_DESCR_3,
				),
				title: window.BPMESS.BPSA_MARKETPLACE_ADD_DESCR_3,
				dataset: {
					icon: '/bitrix/images/bizproc/act_icon_plus.png',
					name: window.BPMESS.BPSA_MARKETPLACE_ADD_TITLE_2,
				},
				onclick: (event, menuItem: MenuItem) => {
					BX.rest.Marketplace.open({}, 'auto_pb');
					menuItem.getMenuWindow().getParentMenuWindow().close();
				},
			});
		}

		this.#menuItems = Object.values(items).filter((item) => item.items.length > 0);

		this.#addMyActivitiesMenuItem();

		return this.#menuItems;
	}

	#getGroupMenuItems(): {}
	{
		const items = {};
		Object.entries(window.arAllActGroups).forEach(([id, title]) => {
			items[id] = {
				id,
				text: title,
				items: [],
				events: { 'SubMenu:onShow': this.#onGroupItemSubMenuShow },
			};
		});

		return items;
	}

	#addMyActivitiesMenuItem()
	{
		const index = this.#menuItems.findIndex((item) => item.id === 'MyActivity');
		if (index >= 0)
		{
			this.#menuItems.splice(index, 1);
		}

		if (window.arUserParams && Type.isArrayFilled(window.arUserParams.SNIPPETS))
		{
			const item = {
				id: 'MyActivity',
				text: window.BPMESS.BPSA_MY_ACTIVITIES_1,
				items: [],
				events: { 'SubMenu:onShow': this.#onGroupItemSubMenuShow },
			};

			window.arUserParams.SNIPPETS.forEach((snippet, index) => {
				item.items.push({
					className: 'bizproc-designer-sequence-activity-menu-item-icon',
					html: this.#renderActivityMenuItemNode(snippet.Properties.Title, ''),
					dataset: {
						icon: snippet.Icon ?? '/bitrix/images/bizproc/act_icon.gif',
						name: snippet.Properties.Title,
					},
					title: snippet.Properties.Title,
					onclick: (event, menuItem: MenuItem) => {
						_SequenceActivityMyActivityClick(
							index,
							menuItem.getMenuWindow().getParentMenuWindow().bindElement.ind,
						);
						menuItem.getMenuWindow().getParentMenuWindow().close()
					},
				});
			});

			this.#menuItems.push(item);
		}
	}

	#getActivityMenuItem(id: string, description: {}, preset: {}): {}
	{
		const descriptionText = preset && preset.DESCRIPTION ? preset.DESCRIPTION : description.DESCRIPTION;

		return {
			onclick: (event: PointerEvent, menuItem: MenuItem) => {
				_SequenceActivityClick(
					id,
					menuItem.getMenuWindow().getParentMenuWindow().bindElement.ind,
					preset ? preset.ID : null,
				);
				menuItem.getMenuWindow().getParentMenuWindow().close()
			},
			className: 'bizproc-designer-sequence-activity-menu-item-icon',
			html: this.#renderActivityMenuItemNode(preset ? preset.NAME : description.NAME, descriptionText),
			title: descriptionText,
			dataset: {
				icon: description.ICON ?? '/bitrix/images/bizproc/act_icon.gif',
				name: description.NAME,
			},
		};
	}

	#renderActivityMenuItemNode(title, description): HTMLDivElement
	{
		return Tag.render`
			<div style="line-height: normal; overflow: hidden; text-overflow: ellipsis;">
				<span><b>${Text.encode(title)}</b></span>
				<br/>
				<span>${Text.encode(description)}</span>
			</div>
		`;
	}

	#onGroupItemSubMenuShow(event: BaseEvent)
	{
		const groupItem: MenuItem = event.getTarget();
		if (groupItem.getSubMenu() && groupItem.getSubMenu().getMenuItems())
		{
			groupItem.getSubMenu().getMenuItems().forEach((item) => {
				const iconNode = item.layout.item.querySelector('.menu-popup-item-icon');
				Dom.append(
					Tag.render`<img src="${Text.encode(item.dataset.icon)}" alt="${Text.encode(item.dataset.name)}"/>`,
					iconNode,
				);
			});
		}
	}

	#addActivity(newActivity, position)
	{
		this.childActivities.splice(position, 0, newActivity);
		// eslint-disable-next-line no-param-reassign
		newActivity.parentActivity = this;
		newActivity.setCanBeActivated(this.getCanBeActivatedChild());

		const row = this.childsContainer.insertRow(position * 2 + 1 + this.iHead).insertCell(-1);
		Dom.attr(row, { align: 'center', vAlign: 'center' });

		newActivity.Draw(row);

		const row2 = this.childsContainer.insertRow(position * 2 + 2 + this.iHead).insertCell(-1);
		Dom.attr(row2, { align: 'center', vAlign: 'center' });

		this.#createArrow(position + 1);

		this.#refreshArrows(this);

		window.BPTemplateIsModified = true;
	}

	#createArrow(index)
	{
		Dom.style(
			this.childsContainer.rows[index * 2 + this.iHead].cells[0],
			{
				height: '40px',
				background: 'url(/bitrix/images/bizproc/arr.gif) no-repeat scroll 50% 50%',
			},
		);

		const image = BX.Dom.create('img', {
			attrs: {
				src: '/bitrix/images/1.gif',
				width: '28',
				height: '21',
			},
		});
		image.onmouseover = this.#onLineMouseOver;
		image.onmouseout = this.#onLineMouseOut;
		image.ind = index;
		Event.bind(image, 'click', this.#onClick.bind(this, image));
		Dom.append(image, this.childsContainer.rows[index * 2 + this.iHead].cells[0]);
	}

	#draw(wrapper)
	{
		const rows = Array.from(
			{ length: this.iHead + this.childActivities.length * 2 },
			() => Tag.render`
				<tr><td align="center" valign="center"></td></tr>
			`,
		);

		this.childsContainer = Tag.render`
			<table 
				class="seqactivitycontainer"
				id="${Text.encode(this.Name)}"
				width="100%"
				cellspacing="0"
				cellpadding="0"
				border="0"
			>
				<tbody>
					<tr><td align="center" valign="center"></td></tr>
					${rows}
				</tbody>
			</table>
		`;
		Dom.append(this.childsContainer, wrapper);
		this.#createArrow(0);
		this.childActivities.forEach((child, index) => {
			child.Draw(this.childsContainer.rows[index * 2 + 1 + this.iHead].cells[0]);
			this.#createArrow(Text.toInteger(index) + 1);
		});

		if (this.AfterSDraw)
		{
			this.AfterSDraw();
		}
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit