%PDF- %PDF- 403WebShell
403Webshell
Server IP : 37.220.80.31  /  Your IP : 3.145.55.39
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux 3051455-guretool.twc1.net 5.15.0-107-generic #117-Ubuntu SMP Fri Apr 26 12:26:49 UTC 2024 x86_64
User : www-root ( 1010)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/landing/ui/field/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/www-root/data/www/dev.artlot24.ru/bitrix/js/landing/ui/field/multiselect_field.js
;(function() {
	"use strict";

	BX.namespace("BX.Landing.UI.Field");

	var addClass = BX.Landing.Utils.addClass;
	var hasClass = BX.Landing.Utils.hasClass;
	var removeClass = BX.Landing.Utils.removeClass;
	var isArray = BX.Landing.Utils.isArray;
	var isFunction = BX.Landing.Utils.isFunction;
	var create = BX.Landing.Utils.create;
	var random = BX.Landing.Utils.random;
	var escapeHtml = BX.Landing.Utils.escapeHtml;
	var append = BX.Landing.Utils.append;
	var slice = BX.Landing.Utils.slice;
	var encodeDataValue = BX.Landing.Utils.encodeDataValue;
	var remove = BX.Landing.Utils.remove;
	var data = BX.Landing.Utils.data;
	var bind = BX.Landing.Utils.bind;
	var style = BX.Landing.Utils.style;
	var clone = BX.Landing.Utils.clone;
	var offsetLeft = BX.Landing.Utils.offsetLeft;
	var offsetTop = BX.Landing.Utils.offsetTop;
	var findParent = BX.Landing.Utils.findParent;
	var decodeDataValue = BX.Landing.Utils.decodeDataValue;
	var BaseCollection = BX.Landing.Collection.BaseCollection;

	function addPlaceholders(items, field, depth)
	{
		items.forEach(function(item) {
			var checkbox = new BX.Landing.UI.Field.Checkbox({
				id: item.value,
				items: [{name: item.name, value: item.value, checked: item.selected}],
				depth: depth,
				compact: true,
				onChange: field.onCheckboxChange
			});

			field.fields.add(checkbox);

			if (checkbox.layout)
			{
				append(checkbox.layout, field.getPopup().contentContainer);
			}

			if (item.selected)
			{
				field.addPlaceholder(item);
			}

			if (isArray(item.items))
			{
				depth += 1;
				addPlaceholders(item.items, field, depth);
				depth -= 1;
			}
		});
	}


	/**
	 * Implements interface for works with multi select field
	 * @extends {BX.Landing.UI.Field.BaseField}
	 * @param options
	 * @constructor
	 */
	BX.Landing.UI.Field.MultiSelect = function(options)
	{
		BX.Landing.UI.Field.BaseField.apply(this, arguments);
		addClass(this.layout, "landing-ui-field-multiselect");

		this.onChangeHandler = isFunction(options.onChange) ? options.onChange : (function() {});
		this.items = isArray(options.items) ? options.items : [];
		this.value = isArray(options.value) ? options.value : null;
		this.content = this.value;
		this.fields = new BaseCollection();

		this.button = new BX.Landing.UI.Button.BaseButton("dropdown_button", {
			text: BX.Landing.Loc.getMessage("LINK_URL_SUGGESTS_SELECT"),
			className: "landing-ui-button-select-link",
			onClick: this.onButtonClick.bind(this)
		});

		this.grid = create("div", {
			props: {className: "landing-ui-field-multiselect-grid"},
			children: [
				create("div", {
					props: {className: "landing-ui-field-multiselect-grid-left"},
					children: [
						this.input
					]
				}),
				create("div", {
					props: {className: "landing-ui-field-multiselect-grid-right"},
					children: [
						this.button.layout
					]
				})
			]
		});

		append(this.grid, this.layout);

		this.onInputClick = this.onInputClick.bind(this);
		this.onCheckboxChange = this.onCheckboxChange.bind(this);

		var rootWindow = BX.Landing.PageObject.getRootWindow();
		bind(this.input, "click", this.onInputClick);
		bind(rootWindow.document, "click", this.onDocumentClick.bind(this));

		requestAnimationFrame(function() {
			addPlaceholders(this.items, this, 0);

			if (isArray(this.value))
			{
				this.value = this.value.map(function(value) {
					return decodeDataValue(value);
				});

				this.setValue(this.value, true);
			}
			else
			{
				this.value = this.getValue();
				this.content = this.value;
			}
		}.bind(this));
	};


	BX.Landing.UI.Field.MultiSelect.prototype = {
		constructor: BX.Landing.UI.Field.MultiSelect,
		__proto__: BX.Landing.UI.Field.BaseField.prototype,


		/**
		 * Adds placeholder
		 * @param item
		 */
		addPlaceholder: function(item)
		{
			var placeholder = create("div", {
				props: {className: "landing-ui-field-multiselect-placeholder"},
				attrs: {'data-item': encodeDataValue(item), title: escapeHtml(item.name)},
				children: [
					create("span", {
						props: {className: "landing-ui-field-multiselect-placeholder-text"},
						html: escapeHtml(item.name)
					}),
					create("span", {
						props: {className: "landing-ui-field-multiselect-placeholder-remove"},
						events: {click: this.onPlaceholderRemoveClick.bind(this, item)}
					})
				]
			});

			append(placeholder, this.input);
		},


		/**
		 * Handles item remove event
		 * @param item
		 * @param event
		 * @param [preventEvent]
		 */
		onPlaceholderRemoveClick: function(item, event, preventEvent)
		{
			if (event)
			{
				event.preventDefault();
				event.stopPropagation();
			}

			var placeholder = this.getPlaceholderByItem(item);

			if (placeholder)
			{
				remove(placeholder);
				this.adjustPopupPosition();

				var field = this.fields.get(item.value);

				if (field)
				{
					field.layout.querySelector("input").checked = false;
				}
			}

			if (!preventEvent)
			{
				this.onValueChangeHandler(this);
			}
		},


		onCheckboxChange: function(checkbox)
		{
			if (checkbox instanceof BX.Landing.UI.Field.Checkbox)
			{
				var value = checkbox.getValue();

				if (value.length)
				{
					this.addPlaceholder(checkbox.items[0]);
					this.adjustPopupPosition();
				}
				else
				{
					this.onPlaceholderRemoveClick(checkbox.items[0], null, true);
				}

				this.onValueChangeHandler(this);
			}
		},


		/**
		 * Gets placeholder element by item
		 * @param item
		 * @return {?HTMLElement}
		 */
		getPlaceholderByItem: function(item)
		{
			return slice(this.input.children).find(function(element) {
				return data(element, "data-item").value === item.value;
			});
		},


		getPopup: function()
		{
			if (this.popup)
			{
				return this.popup;
			}

			this.popup = new BX.Main.Popup({
				id: (this.selector + "_" + random()),
				bindElement: this.input,
				autoHide: true,
				maxHeight: 142,
				events: {
					onPopupClose: function()
					{
						removeClass(this.input, "landing-ui-active");

						if (hasClass(this.layout.parentElement.parentElement, "landing-ui-form-style"))
						{
							void style(this.layout.parentElement.parentElement, {
								"z-index": null,
								"position": null
							});
						}
					}.bind(this)
				}
			});

			if (this.popup.popupContainer)
			{
				addClass(this.popup.popupContainer, "landing-ui-field-multiselect-popup");

				var parent = findParent(this.input, {className: "landing-ui-panel-content-body-content"}, document.body);

				if (parent)
				{
					append(this.popup.popupContainer, parent);
				}
			}

			return this.popup;
		},

		showPopup: function()
		{
			this.getPopup().show();
			this.adjustPopupPosition();
			this.setValue(this.getValue(), true);
		},

		adjustPopupPosition: function()
		{
			if (this.popup)
			{
				var offsetParent = findParent(this.input, {className: "landing-ui-panel-content-body-content"});

				if (BX.Type.isDomNode(offsetParent))
				{
					var inputTop = offsetTop(this.input, offsetParent);
					var inputLeft = offsetLeft(this.input, offsetParent);
					var inputRect = this.input.getBoundingClientRect();

					var offsetY = 2;

					requestAnimationFrame(function() {
						this.popup.popupContainer.style.top = inputTop + inputRect.height + offsetY + "px";
						this.popup.popupContainer.style.left = inputLeft + "px";
						this.popup.popupContainer.style.width = inputRect.width + "px";
					}.bind(this));
				}
			}
		},

		onInputClick: function(event)
		{
			if (event)
			{
				event.stopPropagation();
			}

			var popup = this.getPopup();

			if (popup.isShown())
			{
				removeClass(this.input, "landing-ui-active");
				return popup.close();
			}

			addClass(this.input, "landing-ui-active");
			return this.showPopup();
		},

		onButtonClick: function(event)
		{
			event.preventDefault();
			event.stopPropagation();

			this.onInputClick();
		},

		onDocumentClick: function()
		{
			this.getPopup().close();
		},

		getValue: function()
		{
			return slice(this.input.children).map(function(element) {
				return data(element, "data-item").value;
			});
		},

		isChanged: function()
		{
			var content = clone(this.content).sort();
			var value = this.getValue().sort();

			return JSON.stringify(content) !== JSON.stringify(value);
		},

		getItemByValue: function(items, value)
		{
			var result = null;

			function findItem(items, value)
			{
				return items.forEach(function(item) {
					// noinspection EqualityComparisonWithCoercionJS
					if (value == item.value)
					{
						result = item;
						return;
					}

					if (item.items)
					{
						findItem(item.items, value);
					}
				}, this)
			}

			findItem(items, value);

			return result;
		},

		setValue: function(value, preventEvent)
		{
			if (isArray(value))
			{
				this.input.innerHTML = "";
				value.forEach(function(itemValue) {
					var item = this.getItemByValue(this.items, itemValue);

					if (item)
					{
						this.addPlaceholder(item);

						var checkbox = this.fields.find(function(field) {
							return field.id === itemValue;
						}.bind(this));
						if (checkbox)
						{
							checkbox.setValue([itemValue]);
						}
					}
				}, this);
			}

			if (!preventEvent)
			{
				this.onValueChangeHandler(this);
			}
		}
	};
})();

Youez - 2016 - github.com/yon3zu
LinuXploit