Your IP : 172.69.59.18


Current Path : /var/www/element/data/www/revenuestory.ru/bitrix/js/ui/buttons/src/split-button/
Upload File :
Current File : /var/www/element/data/www/revenuestory.ru/bitrix/js/ui/buttons/src/split-button/split-sub-button.js

import BaseButton from '../base-button';
import SplitButtonState from './split-button-state';
import SplitSubButtonType from './split-sub-button-type';
import type SplitButton from './split-button';
import { Type } from 'main.core';
import type { SplitSubButtonOptions } from './split-sub-button-options';

/**
 * @namespace {BX.UI}
 */
export default class SplitSubButton extends BaseButton
{
	constructor(options: SplitSubButtonOptions)
	{
		options = Type.isPlainObject(options) ? options : {};
		options.baseClass =
			options.buttonType === SplitSubButtonType.MAIN
				? SplitSubButtonType.MAIN
				: SplitSubButtonType.MENU
		;

		super(options);

		if (this.isInputType())
		{
			throw new Error('BX.UI.SplitSubButton: Split button cannot be an input tag.');
		}
	}

	static Type = SplitSubButtonType;

	init(): void
	{
		this.buttonType = this.options.buttonType;
		this.splitButton = this.options.splitButton;

		super.init();
	}

	/**
	 * @public
	 * @return {SplitButton}
	 */
	getSplitButton(): SplitButton
	{
		return this.splitButton;
	}

	/**
	 * @public
	 * @return {boolean}
	 */
	isMainButton(): boolean
	{
		return this.buttonType === SplitSubButtonType.MAIN;
	}

	/**
	 * @public
	 * @return {boolean}
	 */
	isMenuButton(): boolean
	{
		return this.buttonType === SplitSubButtonType.MENU;
	}

	setText(text: string): this
	{
		if (Type.isString(text) && this.isMenuButton())
		{
			throw new Error('BX.UI.SplitButton: a menu button doesn\'t support a text caption.');
		}

		return super.setText(text);
	}

	/**
	 * @public
	 * @param {boolean} [flag=true]
	 * @return {this}
	 */
	setActive(flag?: boolean): this
	{
		this.toggleState(
			flag,
			SplitButtonState.ACTIVE,
			SplitButtonState.MAIN_ACTIVE,
			SplitButtonState.MENU_ACTIVE
		);

		return this;
	}

	/**
	 * @public
	 * @return {boolean}
	 */
	isActive(): boolean
	{
		const state = this.getSplitButton().getState();
		if (state === SplitButtonState.ACTIVE)
		{
			return true;
		}

		if (this.isMainButton())
		{
			return state === SplitButtonState.MAIN_ACTIVE;
		}

		return state === SplitButtonState.MENU_ACTIVE;
	}

	/**
	 * @public
	 * @param {boolean} [flag=true]
	 * @return {this}
	 */
	setDisabled(flag?: boolean): this
	{
		this.toggleState(
			flag,
			SplitButtonState.DISABLED,
			SplitButtonState.MAIN_DISABLED,
			SplitButtonState.MENU_DISABLED
		);

		super.setDisabled(flag);

		return this;
	}

	/**
	 * @public
	 * @param {boolean} flag
	 * @return {this}
	 */
	setHovered(flag): this
	{
		this.toggleState(
			flag,
			SplitButtonState.HOVER,
			SplitButtonState.MAIN_HOVER,
			SplitButtonState.MENU_HOVER
		);

		return this;
	}

	/**
	 * @public
	 * @return {boolean}
	 */
	isHovered(): boolean
	{
		const state = this.getSplitButton().getState();
		if (state === SplitButtonState.HOVER)
		{
			return true;
		}

		if (this.isMainButton())
		{
			return state === SplitButtonState.MAIN_HOVER;
		}

		return state === SplitButtonState.MENU_HOVER;
	}

	/**
	 * @private
	 * @param flag
	 * @param globalState
	 * @param mainState
	 * @param menuState
	 */
	toggleState(flag, globalState, mainState, menuState)
	{
		const state = this.getSplitButton().getState();
		if (flag === false)
		{
			if (state === globalState)
			{
				this.getSplitButton().setState(this.isMainButton() ? menuState : mainState);
			}
			else
			{
				this.getSplitButton().setState(null);
			}
		}
		else
		{
			if (state === mainState && this.isMenuButton())
			{
				this.getSplitButton().setState(globalState);
			}
			else if (state === menuState && this.isMainButton())
			{
				this.getSplitButton().setState(globalState);
			}
			else if (state !== globalState)
			{
				this.getSplitButton().setState(this.isMainButton() ? mainState : menuState);
			}
		}
	}
}