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/info-helper/src/providers/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/info-helper/src/providers/slider-provider.js
import { Type, Uri, Event } from 'main.core';
import { Loader } from 'main.loader';
import { Actions } from '../actions';
import { ProviderRequestFactory } from '../provider-request-factory';
import { ProvidersType } from '../types/providers-type';
import { BaseProvider } from './base-provider';
import { FeaturePromotersRegistry } from 'ui.info-helper';

export class SliderProvider extends BaseProvider
{
	constructor(params = {})
	{
		super();
		this.frameUrlTemplate = params.frameUrlTemplate || '';
		this.frameUrl = Type.isStringFilled(params.frameUrl) ? params.frameUrl : '';
		this.width = Type.isNumber(params.width) ? params.width : 700;
		this.constructorParams = params;

		if (params.dataSource && params.dataSource instanceof Promise)
		{
			this.dataSource = params.dataSource;
		}
		else
		{
			const providerRequestFactoryConfiguration = {
				type: ProvidersType.SLIDER,
				code: null,
				featureId: params.featureId,
			};
			this.dataSource = (new ProviderRequestFactory(providerRequestFactoryConfiguration)).getRequest();
		}
	}

	__showExternal(code, option): void
	{
		let width = 700;
		const sliderId = `${this.getId()}:${code}`;
		const frame = this.#createFrameNode();
		if (!!option && !!option.width && option.width > 0)
		{
			width = option.width;
		}

		const contentCallback = (slider) => {
			return new Promise((resolve, reject) => {
				const providerRequestFactoryConfiguration = {
					type: ProvidersType.SLIDER,
				};
				(new ProviderRequestFactory(providerRequestFactoryConfiguration)).getRequest()
					.then((response) => {
						frame.src = this.#buildUrl(code);

						return this.#createContainerNode(this.getLoader(), frame);
					})
					.then((content) => resolve(content));
			});
		};

		const provider = FeaturePromotersRegistry.getPromoter({ code }).getProvider();

		this.#openSlider({
			id: sliderId,
			contentCallback: contentCallback.bind(this),
			width: width,
			events: {
				onLoad: () => {
					provider.frameNode = frame;
					provider.frameUrl = frame.src;
					this.showFrame(frame);
				},
			},
		});
	}

	show(code, params): void
	{
		if (this.isOpen())
		{
			return;
		}

		if (!Type.isPlainObject(params))
		{
			params = {};
		}

		if (!code && !params.featureId && !this.constructorParams.featureId && !this.constructorParams.dataSource)
		{
			return;
		}

		this.contentCallback = (slider) => {
			return new Promise((resolve, reject) => {
				if (this.hasOpen)
				{
					resolve(this.getContent());
				}
				else
				{
					this.dataSource
						.then((response) => {
							const { data } = response;
							if (data.code)
							{
								code = data.code;
							}

							this.frameUrlTemplate = data.frameUrlTemplate;
							this.frameUrl = this.#buildUrl(code, params, data);

							if (this.getFrame().src !== this.frameUrl)
							{
								this.getFrame().src = this.frameUrl;
							}
							this.bindEvent(data.availableDomainList);
							this.hasOpen = true;

							return resolve(this.getContent());
						})
				}
			});
		};

		this.#openSlider({
			id: this.getId(),
			contentCallback: this.contentCallback,
			width: this.width,
			events: {
				onLoad: () => this.showFrame(),
				onClose: () => {
					Event.unbindAll(window, 'message');
					if (this.frameNode)
					{
						this.frameNode.contentWindow?.postMessage({ action: 'onCloseWidget' }, '*');
					}
				},
			},
		});
	}

	bindEvent(availableDomainList): void
	{
		BX.bind(top.window, 'message', BX.proxy(function(event)
		{
			if (!event.origin || (!!event.origin && !availableDomainList.includes(event.origin)))
			{
				return;
			}

			if (!event.data || !Type.isObject(event.data))
			{
				return;
			}

			const action = Actions[event.data.action];

			if (Type.isFunction(action))
			{
				action(event.data);
			}
		}, this));
	}

	#openSlider(params): void
	{
		BX.SidePanel.Instance.open(
			params.id,
			{
				contentCallback: params.contentCallback,
				width: params.width,
				loader: 'default-loader',
				cacheable: false,
				customRightBoundary: 0,
				events: params.events,
			},
		);
	}

	#buildUrl(code, params = {}, data = null): string
	{
		let url = this.frameUrlTemplate.replace(/code/, code);

		if (params.featureId && Type.isArray(data.trialableFeatureList))
		{
			url = Uri.addParam(url, {
				featureId: params.featureId,
				trialableFeatureList: data.trialableFeatureList.join(','),
			});
		}

		return url;
	}

	close(): void
	{
		const slider = this.getSlider();
		if (slider && slider.isOpen())
		{
			slider.close();
		}
	}

	getContent(): HTMLElement
	{
		if (this.content)
		{
			return this.content;
		}
		this.content = this.#createContainerNode(this.getLoader(), this.getFrame());

		return this.content;
	}

	#createContainerNode(loader, frame): HTMLElement
	{
		return BX.create('div', {
			attrs: {
				className: 'info-helper-container',
				id: 'info-helper-container',
			},
			children: [
				loader,
				frame,
			],
		});
	}

	getId(): string
	{
		return 'ui:info_helper';
	}

	getFrame(): HTMLElement
	{
		if (this.frameNode)
		{
			return this.frameNode;
		}

		this.frameNode = this.#createFrameNode();

		return this.frameNode;
	}

	hasFrameNode(): boolean
	{
		return Type.isElementNode(this.frameNode);
	}

	#createFrameNode(): HTMLElement
	{
		return BX.create('iframe', {
			attrs: {
				className: 'info-helper-panel-iframe',
				src: 'about:blank',
			},
		});
	}

	showFrame(frame): void
	{
		if (!frame)
		{
			frame = this.getFrame();
		}

		setTimeout(() => {
			frame.classList.add('info-helper-panel-iframe-show');
		}, 600);
	}

	getSlider(): BX.SidePanel.Slider
	{
		return BX.SidePanel.Instance.getSlider(this.getId());
	}

	isOpen(): boolean
	{
		return this.getSlider() && this.getSlider().isOpen();
	}

	getLoader(): Loader
	{
		if (this.popupLoader)
		{
			return this.popupLoader;
		}

		const loader = new Loader({
			target: BX('info-helper-container'),
			size: 100,
		});

		loader.show();
		this.popupLoader = loader.data.container;

		return this.popupLoader;
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit