Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/js/catalog/config/settings/src/sections/components/
Upload File :
Current File : /var/www/homesaver/www/bitrix/js/catalog/config/settings/src/sections/components/mode-status.js

import { ExternalCatalogPlacement } from 'catalog.external-catalog-placement';
import { ModeList } from 'catalog.store-enable-wizard';
import { OneCPlanRestrictionSlider } from 'catalog.tool-availability-manager';
import { ajax as Ajax, Dom, Event, Loc, Tag } from 'main.core';
import { Label, LabelColor, LabelSize } from 'ui.label';

type ModeStatusParams = {
	isInventoryManagementEnabled: boolean,
	is1cRestricted: boolean,
	currentMode: string,
	onecStatusUrl: Object,
};

export default class ModeStatus
{
	#isInventoryManagementEnabled: boolean;
	#is1cRestricted: boolean;
	#currentMode: string;
	#onecStatusUrl: string;
	#rootElement: HTMLElement;

	constructor(params: ModeStatusParams)
	{
		this.#isInventoryManagementEnabled = params.isInventoryManagementEnabled;
		this.#is1cRestricted = params.is1cRestricted;
		this.#currentMode = params.currentMode;
		this.#onecStatusUrl = params.onecStatusUrl;
		this.#rootElement = Tag.render`
			<div id="inventoryManagementStatus">
			</div>
		`;
	}

	initialize(): HTMLElement
	{
		let statusText = '';
		let statusColor = '';
		let labelStatus = '';

		if (this.#currentMode === ModeList.MODE_1C)
		{
			if (this.#isInventoryManagementEnabled)
			{
				statusText = Loc.getMessage('CAT_CONFIG_SETTINGS_MODE_STATUS_CHECKING');
				statusColor = LabelColor.LIGHT;
				labelStatus = 'loading';

				ExternalCatalogPlacement.create().initialize()
					.then(() => {
						this.update({
							text: Loc.getMessage('CAT_CONFIG_SETTINGS_MODE_STATUS_CONNECTED'),
							color: LabelColor.LIGHT_GREEN,
						});
					})
					.catch(() => {
						this.update({
							text: Loc.getMessage('CAT_CONFIG_SETTINGS_MODE_STATUS_1C_NOT_CONNECTED'),
							color: LabelColor.LIGHT_RED,
						});
					});
			}
			else
			{
				statusText = Loc.getMessage('CAT_CONFIG_SETTINGS_MODE_STATUS_1C_NOT_CONNECTED');
				statusColor = LabelColor.LIGHT;
			}
		}

		const label = new Label({
			text: statusText,
			color: statusColor,
			size: LabelSize.LG,
			fill: true,
			status: labelStatus,
		});

		this.#render(label);

		return this.#rootElement;
	}

	#refreshAppLink(): void
	{
		Ajax.runComponentAction(
			'bitrix:catalog.config.settings',
			'refreshAppLink',
			{
				mode: 'class',
			},
		).then((response) => {
			if (!response.data)
			{
				return;
			}

			this.#onecStatusUrl = response.data;
		});
	}

	#refreshStatus(): void
	{
		ExternalCatalogPlacement.create().reset();
	}

	update({ text, color }: { text: string, color: string }): void
	{
		if (!this.#rootElement)
		{
			return;
		}

		const label = new Label({
			text,
			color,
			size: LabelSize.LG,
			fill: true,
		});

		this.#render(label);
	}

	#render(label: Label): void
	{
		const settingsLinkElement = this.#getSettingsLinkElement();
		const labelElement = label.render();

		let clickHandler = () => {};

		if (this.#is1cRestricted)
		{
			clickHandler = (event) => {
				event.preventDefault();

				OneCPlanRestrictionSlider.show();
			};
		}
		else if (this.#onecStatusUrl.type === 'app')
		{
			clickHandler = (event) => {
				event.preventDefault();

				top.BX.rest.AppLayout.openApplication(
					this.#onecStatusUrl.value,
					{
						source: 'inventory-management',
					},
					false,
					() => {
						this.#refreshStatus();
						this.initialize();
					},
				);
			};
		}
		else
		{
			clickHandler = (event) => {
				event.preventDefault();

				BX.SidePanel.Instance.open(this.#onecStatusUrl.value, {
					customLeftBoundary: 0,
					cacheable: false,
					loader: 'market:detail',
					width: 1162,
					events: {
						onClose: () => {
							this.#refreshAppLink();
							this.#refreshStatus();
							this.initialize();
						},
					},
				});
			};
		}

		Event.bind(settingsLinkElement, 'click', clickHandler);

		Dom.clean(this.#rootElement);
		Dom.append(labelElement, this.#rootElement);
		Dom.append(settingsLinkElement, this.#rootElement);
	}

	#getSettingsLinkElement(): HTMLElement
	{
		const before = this.#is1cRestricted ? '<span class="tariff-lock"></span>' : '';

		return Tag.render`
			<span class="catalog-settings-inventory-management-mode-settings-container">
				${before}
				<a href="${this.#onecStatusUrl.value}" class="catalog-settings-inventory-management-mode-settings" data-slider-ignore-autobinding="true">
					${Loc.getMessage('CAT_CONFIG_SETTINGS_MODE_STATUS_SETTINGS')}
				</a>
			</span>
		`;
	}
}