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/entity-selector/dist/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/entity-selector/dist/entity-selector.bundle.js
/* eslint-disable */
this.BX = this.BX || {};
this.BX.UI = this.BX.UI || {};
(function (exports,main_popup,main_core_collections,main_core_events,main_core,main_loader) {
	'use strict';

	let ItemNodeComparator = /*#__PURE__*/function () {
	  function ItemNodeComparator() {
	    babelHelpers.classCallCheck(this, ItemNodeComparator);
	  }
	  babelHelpers.createClass(ItemNodeComparator, null, [{
	    key: "makeMultipleComparator",
	    value: function makeMultipleComparator(order) {
	      const props = Object.keys(order).map(property => `get${main_core.Text.capitalize(property)}`);

	      /*
	      asc *
	      asc nulls last *
	      asc nulls first
	      	desc *
	      desc nulls first *
	      desc nulls last
	      */
	      const directions = [];
	      Object.values(order).forEach(element => {
	        const direction = element.toLowerCase().trim();

	        // Default sorting: 'asc' || 'asc nulls last'
	        let ascOrdering = true;
	        let nullsOrdering = true;
	        if (direction === 'desc' || direction === 'desc nulls first') {
	          ascOrdering = false;
	        } else if (direction === 'asc nulls first') {
	          nullsOrdering = false;
	        } else if (direction === 'desc nulls last') {
	          ascOrdering = false;
	          nullsOrdering = false;
	        }
	        directions.push({
	          ascOrdering,
	          nullsOrdering
	        });
	      });
	      const numberOfProperties = props.length;
	      return (nodeA, nodeB) => {
	        let i = 0;
	        let result = 0;
	        while (result === 0 && i < numberOfProperties) {
	          const propertyGetter = props[i];
	          const direction = directions[i];
	          result = this.compareItemNodes(nodeA, nodeB, propertyGetter, direction.ascOrdering, direction.nullsOrdering);
	          i += 1;
	        }
	        return result;
	      };
	    }
	  }, {
	    key: "compareItemNodes",
	    value: function compareItemNodes(nodeA, nodeB, propertyGetter, ascOrdering, nullsOrdering) {
	      const itemA = nodeA.getItem();
	      const itemB = nodeB.getItem();
	      itemA.getCustomData().get();
	      const valueA = itemA[propertyGetter]();
	      const valueB = itemB[propertyGetter]();
	      let result = 0;
	      if (valueA !== null && valueB === null) {
	        result = nullsOrdering ? -1 : 1;
	      } else if (valueA === null && valueB !== null) {
	        result = nullsOrdering ? 1 : -1;
	      } else if (valueA === null && valueB === null) {
	        result = ascOrdering ? -1 : 1;
	      } else {
	        if (main_core.Type.isString(valueA)) {
	          result = valueA.localeCompare(valueB);
	        } else {
	          result = valueA - valueB;
	        }
	      }
	      const sortOrder = ascOrdering ? 1 : -1;
	      return result * sortOrder;
	    }
	  }]);
	  return ItemNodeComparator;
	}();

	let TextNodeType = /*#__PURE__*/function () {
	  function TextNodeType() {
	    babelHelpers.classCallCheck(this, TextNodeType);
	  }
	  babelHelpers.createClass(TextNodeType, null, [{
	    key: "isValid",
	    value: function isValid(type) {
	      return main_core.Type.isString(type) && (type === this.HTML || type === this.TEXT);
	    }
	  }]);
	  return TextNodeType;
	}();
	babelHelpers.defineProperty(TextNodeType, "TEXT", 'text');
	babelHelpers.defineProperty(TextNodeType, "HTML", 'html');

	let TextNode = /*#__PURE__*/function () {
	  function TextNode(options) {
	    babelHelpers.classCallCheck(this, TextNode);
	    babelHelpers.defineProperty(this, "text", null);
	    babelHelpers.defineProperty(this, "type", null);
	    if (main_core.Type.isPlainObject(options)) {
	      if (main_core.Type.isString(options.text)) {
	        this.text = options.text;
	      }
	      if (TextNodeType.isValid(options.type)) {
	        this.type = options.type;
	      }
	    } else if (main_core.Type.isString(options)) {
	      this.text = options;
	    }
	  }
	  babelHelpers.createClass(TextNode, [{
	    key: "getText",
	    value: function getText() {
	      return this.text;
	    }
	  }, {
	    key: "getType",
	    value: function getType() {
	      return this.type;
	    }
	  }, {
	    key: "isNullable",
	    value: function isNullable() {
	      return this.getText() === null;
	    }
	  }, {
	    key: "renderTo",
	    value: function renderTo(element) {
	      const text = this.getText();
	      if (text === null) {
	        return;
	      }
	      if (this.getType() === null || this.getType() === TextNodeType.TEXT) {
	        element.textContent = text;
	      } else if (this.getType() === TextNodeType.HTML) {
	        element.innerHTML = text;
	      }
	    }
	  }, {
	    key: "toString",
	    value: function toString() {
	      var _this$getText;
	      return (_this$getText = this.getText()) !== null && _this$getText !== void 0 ? _this$getText : '';
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      if (this.getType() === null) {
	        return this.getText();
	      } else {
	        return {
	          text: this.getText(),
	          type: this.getType()
	        };
	      }
	    }
	  }]);
	  return TextNode;
	}();

	let Highlighter = /*#__PURE__*/function () {
	  function Highlighter() {
	    babelHelpers.classCallCheck(this, Highlighter);
	  }
	  babelHelpers.createClass(Highlighter, null, [{
	    key: "mark",
	    value: function mark(text, matches) {
	      let encode = true;
	      if (text instanceof TextNode) {
	        if (text.getType() === 'html') {
	          encode = false;
	        }
	        text = text.getText();
	      }
	      if (!main_core.Type.isStringFilled(text) || !matches || matches.count() === 0) {
	        return text;
	      }
	      let result = '';
	      let offset = 0;
	      let chunk = '';
	      matches.forEach(match => {
	        if (offset > match.getStartIndex()) {
	          return;
	        }
	        chunk = text.substring(offset, match.getStartIndex());
	        result += encode ? main_core.Text.encode(chunk) : chunk;
	        result += '<span class="ui-selector-highlight-mark">';
	        chunk = text.substring(match.getStartIndex(), match.getEndIndex());
	        result += encode ? main_core.Text.encode(chunk) : chunk;
	        result += '</span>';
	        offset = match.getEndIndex();
	      });
	      chunk = text.substring(offset);
	      result += encode ? main_core.Text.encode(chunk) : chunk;
	      return result;
	    }
	  }]);
	  return Highlighter;
	}();

	let ItemBadge = /*#__PURE__*/function () {
	  function ItemBadge(badgeOptions) {
	    babelHelpers.classCallCheck(this, ItemBadge);
	    babelHelpers.defineProperty(this, "title", null);
	    babelHelpers.defineProperty(this, "textColor", null);
	    babelHelpers.defineProperty(this, "bgColor", null);
	    babelHelpers.defineProperty(this, "containers", new WeakMap());
	    const options = main_core.Type.isPlainObject(badgeOptions) ? badgeOptions : {};
	    this.setTitle(options.title);
	    this.setTextColor(options.textColor);
	    this.setBgColor(options.bgColor);
	  }
	  babelHelpers.createClass(ItemBadge, [{
	    key: "getTitle",
	    value: function getTitle() {
	      const titleNode = this.getTitleNode();
	      return titleNode !== null && !titleNode.isNullable() ? titleNode.getText() : '';
	    }
	  }, {
	    key: "getTitleNode",
	    value: function getTitleNode() {
	      return this.title;
	    }
	  }, {
	    key: "setTitle",
	    value: function setTitle(title) {
	      if (main_core.Type.isStringFilled(title) || main_core.Type.isPlainObject(title) || title === null) {
	        this.title = title === null ? null : new TextNode(title);
	      }
	    }
	  }, {
	    key: "getTextColor",
	    value: function getTextColor() {
	      return this.textColor;
	    }
	  }, {
	    key: "setTextColor",
	    value: function setTextColor(textColor) {
	      if (main_core.Type.isString(textColor) || textColor === null) {
	        this.textColor = textColor;
	      }
	    }
	  }, {
	    key: "getBgColor",
	    value: function getBgColor() {
	      return this.bgColor;
	    }
	  }, {
	    key: "setBgColor",
	    value: function setBgColor(bgColor) {
	      if (main_core.Type.isString(bgColor) || bgColor === null) {
	        this.bgColor = bgColor;
	      }
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer(target) {
	      let container = this.containers.get(target);
	      if (!container) {
	        container = document.createElement('span');
	        container.className = 'ui-selector-item-badge';
	        this.containers.set(target, container);
	      }
	      return container;
	    }
	  }, {
	    key: "renderTo",
	    value: function renderTo(target) {
	      const container = this.getContainer(target);
	      const titleNode = this.getTitleNode();
	      if (titleNode) {
	        this.getTitleNode().renderTo(container);
	      } else {
	        container.textContent = '';
	      }
	      main_core.Dom.style(container, 'color', this.getTextColor());
	      main_core.Dom.style(container, 'background-color', this.getBgColor());
	      main_core.Dom.append(container, target);
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      return {
	        title: this.getTitleNode(),
	        textColor: this.getTextColor(),
	        bgColor: this.getBgColor()
	      };
	    }
	  }]);
	  return ItemBadge;
	}();

	let SearchField = /*#__PURE__*/function () {
	  function SearchField(fieldOptions) {
	    babelHelpers.classCallCheck(this, SearchField);
	    babelHelpers.defineProperty(this, "name", null);
	    babelHelpers.defineProperty(this, "type", 'string');
	    babelHelpers.defineProperty(this, "searchable", true);
	    babelHelpers.defineProperty(this, "system", false);
	    babelHelpers.defineProperty(this, "sort", null);
	    const options = main_core.Type.isPlainObject(fieldOptions) ? fieldOptions : {};
	    if (!main_core.Type.isStringFilled(options.name)) {
	      throw new Error('EntitySelector.SearchField: "name" parameter is required.');
	    }
	    this.name = options.name;
	    this.setType(options.type);
	    this.setSystem(options.system);
	    this.setSort(options.sort);
	    this.setSearchable(options.searchable);
	  }
	  babelHelpers.createClass(SearchField, [{
	    key: "getName",
	    value: function getName() {
	      return this.name;
	    }
	  }, {
	    key: "getType",
	    value: function getType() {
	      return this.type;
	    }
	  }, {
	    key: "setType",
	    value: function setType(type) {
	      if (main_core.Type.isStringFilled(type)) {
	        this.type = type;
	      }
	    }
	  }, {
	    key: "getSort",
	    value: function getSort() {
	      return this.sort;
	    }
	  }, {
	    key: "setSort",
	    value: function setSort(sort) {
	      if (main_core.Type.isNumber(sort) || sort === null) {
	        this.sort = sort;
	      }
	    }
	  }, {
	    key: "setSearchable",
	    value: function setSearchable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.searchable = flag;
	      }
	    }
	  }, {
	    key: "isSearchable",
	    value: function isSearchable() {
	      return this.searchable;
	    }
	  }, {
	    key: "setSystem",
	    value: function setSystem(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.system = flag;
	      }
	    }
	  }, {
	    key: "isCustom",
	    value: function isCustom() {
	      return !this.isSystem();
	    }
	  }, {
	    key: "isSystem",
	    value: function isSystem() {
	      return this.system;
	    }
	  }]);
	  return SearchField;
	}();

	let MatchIndex = /*#__PURE__*/function () {
	  function MatchIndex(field, queryWord, startIndex) {
	    babelHelpers.classCallCheck(this, MatchIndex);
	    babelHelpers.defineProperty(this, "field", null);
	    babelHelpers.defineProperty(this, "queryWord", null);
	    babelHelpers.defineProperty(this, "startIndex", null);
	    babelHelpers.defineProperty(this, "endIndex", null);
	    this.field = field;
	    this.queryWord = queryWord;
	    this.startIndex = startIndex;
	    this.endIndex = startIndex + queryWord.length;
	  }
	  babelHelpers.createClass(MatchIndex, [{
	    key: "getField",
	    value: function getField() {
	      return this.field;
	    }
	  }, {
	    key: "getQueryWord",
	    value: function getQueryWord() {
	      return this.queryWord;
	    }
	  }, {
	    key: "getStartIndex",
	    value: function getStartIndex() {
	      return this.startIndex;
	    }
	  }, {
	    key: "getEndIndex",
	    value: function getEndIndex() {
	      return this.endIndex;
	    }
	  }]);
	  return MatchIndex;
	}();

	const comparator = (a, b) => {
	  if (a.getStartIndex() === b.getStartIndex()) {
	    return a.getEndIndex() > b.getEndIndex() ? -1 : 1;
	  } else {
	    return a.getStartIndex() > b.getStartIndex() ? 1 : -1;
	  }
	};
	let MatchField = /*#__PURE__*/function () {
	  function MatchField(field, indexes = []) {
	    babelHelpers.classCallCheck(this, MatchField);
	    babelHelpers.defineProperty(this, "field", null);
	    babelHelpers.defineProperty(this, "matchIndexes", new main_core_collections.OrderedArray(comparator));
	    this.field = field;
	    this.addIndexes(indexes);
	  }
	  babelHelpers.createClass(MatchField, [{
	    key: "getField",
	    value: function getField() {
	      return this.field;
	    }
	  }, {
	    key: "getMatches",
	    value: function getMatches() {
	      return this.matchIndexes;
	    }
	  }, {
	    key: "addIndex",
	    value: function addIndex(matchIndex) {
	      this.matchIndexes.add(matchIndex);
	    }
	  }, {
	    key: "addIndexes",
	    value: function addIndexes(matchIndexes) {
	      if (main_core.Type.isArray(matchIndexes)) {
	        matchIndexes.forEach(matchIndex => {
	          this.addIndex(matchIndex);
	        });
	      }
	    }
	  }]);
	  return MatchField;
	}();

	let Animation = /*#__PURE__*/function () {
	  function Animation() {
	    babelHelpers.classCallCheck(this, Animation);
	  }
	  babelHelpers.createClass(Animation, null, [{
	    key: "handleTransitionEnd",
	    value: function handleTransitionEnd(element, propertyName) {
	      const properties = main_core.Type.isArray(propertyName) ? new Set(propertyName) : new Set([propertyName]);
	      return new Promise(function (resolve) {
	        const handler = event => {
	          if (event.target !== element || !properties.has(event.propertyName)) {
	            return;
	          }
	          properties.delete(event.propertyName);
	          if (properties.size === 0) {
	            resolve(event);
	            main_core.Event.unbind(element, 'transitionend', handler);
	          }
	        };
	        main_core.Event.bind(element, 'transitionend', handler);
	      });
	    }
	  }, {
	    key: "handleAnimationEnd",
	    value: function handleAnimationEnd(element, animationName) {
	      return new Promise(resolve => {
	        const handler = event => {
	          if (!animationName || event.animationName === animationName) {
	            resolve(event);
	            main_core.Event.unbind(element, 'animationend', handler);
	          }
	        };
	        main_core.Event.bind(element, 'animationend', handler);
	      });
	    }
	  }]);
	  return Animation;
	}();

	const regexp = /^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\w\W]*?[^;])*),(.+)$/;
	const isDataUri = str => {
	  return typeof str === 'string' ? str.match(regexp) : false;
	};
	function encodeUrl(url) {
	  if (isDataUri(url)) {
	    return url;
	  }
	  return encodeURI(url);
	}

	function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
	function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
	function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess(receiver, classConstructor); return method; }
	function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } }
	function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
	let RenderMode = function RenderMode() {
	  babelHelpers.classCallCheck(this, RenderMode);
	};
	babelHelpers.defineProperty(RenderMode, "PARTIAL", 'partial');
	babelHelpers.defineProperty(RenderMode, "OVERRIDE", 'override');
	var _setHidden = /*#__PURE__*/new WeakSet();
	var _makeEllipsisTitle = /*#__PURE__*/new WeakSet();
	let ItemNode = /*#__PURE__*/function () {
	  // for the fast access

	  function ItemNode(item, nodeOptions) {
	    babelHelpers.classCallCheck(this, ItemNode);
	    _classPrivateMethodInitSpec(this, _makeEllipsisTitle);
	    _classPrivateMethodInitSpec(this, _setHidden);
	    babelHelpers.defineProperty(this, "item", null);
	    babelHelpers.defineProperty(this, "tab", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    babelHelpers.defineProperty(this, "parentNode", null);
	    babelHelpers.defineProperty(this, "children", null);
	    babelHelpers.defineProperty(this, "childItems", new WeakMap());
	    babelHelpers.defineProperty(this, "loaded", false);
	    babelHelpers.defineProperty(this, "dynamic", false);
	    babelHelpers.defineProperty(this, "dynamicPromise", null);
	    babelHelpers.defineProperty(this, "loader", null);
	    babelHelpers.defineProperty(this, "open", false);
	    babelHelpers.defineProperty(this, "autoOpen", false);
	    babelHelpers.defineProperty(this, "focused", false);
	    babelHelpers.defineProperty(this, "renderMode", RenderMode.PARTIAL);
	    babelHelpers.defineProperty(this, "title", null);
	    babelHelpers.defineProperty(this, "subtitle", null);
	    babelHelpers.defineProperty(this, "supertitle", null);
	    babelHelpers.defineProperty(this, "caption", null);
	    babelHelpers.defineProperty(this, "captionOptions", {});
	    babelHelpers.defineProperty(this, "avatar", null);
	    babelHelpers.defineProperty(this, "avatarOptions", null);
	    babelHelpers.defineProperty(this, "link", null);
	    babelHelpers.defineProperty(this, "linkTitle", null);
	    babelHelpers.defineProperty(this, "textColor", null);
	    babelHelpers.defineProperty(this, "badges", null);
	    babelHelpers.defineProperty(this, "badgesOptions", {});
	    babelHelpers.defineProperty(this, "hidden", false);
	    babelHelpers.defineProperty(this, "highlights", []);
	    babelHelpers.defineProperty(this, "renderWithDebounce", main_core.Runtime.debounce(this.render, 50, this));
	    const options = main_core.Type.isPlainObject(nodeOptions) ? nodeOptions : {};
	    if (main_core.Type.isObject(item)) {
	      this.item = item;
	    }
	    let comparator = null;
	    if (main_core.Type.isFunction(options.itemOrder)) {
	      comparator = options.itemOrder;
	    } else if (main_core.Type.isPlainObject(options.itemOrder)) {
	      comparator = ItemNodeComparator.makeMultipleComparator(options.itemOrder);
	    }
	    this.children = new main_core_collections.OrderedArray(comparator);
	    this.renderMode = options.renderMode === RenderMode.OVERRIDE ? RenderMode.OVERRIDE : RenderMode.PARTIAL;
	    if (this.renderMode === RenderMode.OVERRIDE) {
	      this.setTitle('');
	      this.setSubtitle('');
	      this.setSupertitle('');
	      this.setCaption('');
	      this.setLinkTitle('');
	      this.avatar = '';
	      this.avatarOptions = {
	        bgSize: null,
	        bgColor: null,
	        bgImage: null,
	        border: null,
	        borderRadius: null,
	        outline: null,
	        outlineOffset: null
	      };
	      this.textColor = '';
	      this.link = '';
	      this.badges = [];
	      this.captionOptions = {
	        fitContent: null,
	        maxWidth: null,
	        justifyContent: null
	      };
	      this.badgesOptions = {
	        fitContent: null,
	        maxWidth: null,
	        justifyContent: null
	      };
	    }
	    this.setTitle(options.title);
	    this.setSubtitle(options.subtitle);
	    this.setSupertitle(options.supertitle);
	    this.setCaption(options.caption);
	    this.setCaptionOptions(options.captionOptions);
	    this.setAvatar(options.avatar);
	    this.setAvatarOptions(options.avatarOptions);
	    this.setTextColor(options.textColor);
	    this.setLink(options.link);
	    this.setLinkTitle(options.linkTitle);
	    this.setBadges(options.badges);
	    this.setBadgesOptions(options.badgesOptions);
	    this.setDynamic(options.dynamic);
	    this.setOpen(options.open);
	  }
	  babelHelpers.createClass(ItemNode, [{
	    key: "getItem",
	    value: function getItem() {
	      return this.item;
	    }
	  }, {
	    key: "isRoot",
	    value: function isRoot() {
	      return this.getParentNode() === null;
	    }
	  }, {
	    key: "getDialog",
	    value: function getDialog() {
	      return this.getTab().getDialog();
	    }
	  }, {
	    key: "setTab",
	    value: function setTab(tab) {
	      this.tab = tab;
	    }
	  }, {
	    key: "getTab",
	    value: function getTab() {
	      return this.tab;
	    }
	  }, {
	    key: "getParentNode",
	    value: function getParentNode() {
	      return this.parentNode;
	    }
	  }, {
	    key: "setParentNode",
	    value: function setParentNode(parentNode) {
	      this.parentNode = parentNode;
	    }
	  }, {
	    key: "getNextSibling",
	    value: function getNextSibling() {
	      if (!this.getParentNode()) {
	        return null;
	      }
	      const siblings = this.getParentNode().getChildren();
	      const index = siblings.getIndex(this);
	      return siblings.getByIndex(index + 1);
	    }
	  }, {
	    key: "getPreviousSibling",
	    value: function getPreviousSibling() {
	      if (!this.getParentNode()) {
	        return null;
	      }
	      const siblings = this.getParentNode().getChildren();
	      const index = siblings.getIndex(this);
	      return siblings.getByIndex(index - 1);
	    }
	  }, {
	    key: "addChildren",
	    value: function addChildren(children) {
	      if (!main_core.Type.isArray(children)) {
	        return;
	      }
	      children.forEach(childOptions => {
	        delete childOptions.tabs;
	        const childItem = this.getDialog().addItem(childOptions);
	        const childNode = this.addItem(childItem, childOptions.nodeOptions);
	        childNode.addChildren(childOptions.children);
	      });
	    }
	  }, {
	    key: "addChild",
	    value: function addChild(child) {
	      if (!(child instanceof ItemNode)) {
	        throw new Error('EntitySelector.ItemNode: an item must be an instance of EntitySelector.ItemNode.');
	      }
	      if (this.isChildOf(child) || child === this) {
	        throw new Error('EntitySelector.ItemNode: a child item cannot be a parent of current item.');
	      }
	      if (this.getChildren().has(child) || this.childItems.has(child.getItem())) {
	        return null;
	      }
	      this.getChildren().add(child);
	      this.childItems.set(child.getItem(), child);
	      child.setTab(this.getTab());
	      child.setParentNode(this);
	      if (this.isRendered()) {
	        this.renderWithDebounce();
	      }
	      return child;
	    }
	  }, {
	    key: "getDepthLevel",
	    value: function getDepthLevel() {
	      return this.isRoot() ? 0 : this.getParentNode().getDepthLevel() + 1;
	    }
	  }, {
	    key: "addItem",
	    value: function addItem(item, nodeOptions) {
	      let itemNode = this.childItems.get(item);
	      if (!itemNode) {
	        itemNode = item.createNode(nodeOptions);
	        this.addChild(itemNode);
	      }
	      return itemNode;
	    }
	  }, {
	    key: "addItems",
	    value: function addItems(items) {
	      if (main_core.Type.isArray(items)) {
	        this.disableRender();
	        items.forEach(item => {
	          if (main_core.Type.isArray(item) && item.length === 2) {
	            this.addItem(item[0], item[1]);
	          } else if (item instanceof Item) {
	            this.addItem(item);
	          }
	        });
	        this.enableRender();
	        if (this.isRendered()) {
	          this.renderWithDebounce();
	        }
	      }
	    }
	  }, {
	    key: "hasItem",
	    value: function hasItem(item) {
	      return this.childItems.has(item);
	    }
	  }, {
	    key: "removeChild",
	    value: function removeChild(child) {
	      if (!this.getChildren().has(child)) {
	        return false;
	      }
	      child.removeChildren();
	      if (child.isFocused()) {
	        child.unfocus();
	      }
	      child.setParentNode(null);
	      child.getItem().removeNode(child);
	      this.getChildren().delete(child);
	      this.childItems.delete(child.getItem());
	      if (this.isRendered()) {
	        main_core.Dom.remove(child.getOuterContainer());
	      }
	      return true;
	    }
	  }, {
	    key: "removeChildren",
	    value: function removeChildren() {
	      if (!this.hasChildren()) {
	        return;
	      }
	      this.getChildren().forEach(node => {
	        node.removeChildren();
	        if (node.isFocused()) {
	          node.unfocus();
	        }
	        node.setParentNode(null);
	        node.getItem().removeNode(node);
	      });
	      this.getChildren().clear();
	      this.childItems = new WeakMap();
	      if (this.isRendered()) {
	        if (main_core.Browser.isIE()) {
	          main_core.Dom.clean(this.getChildrenContainer());
	        } else {
	          this.getChildrenContainer().textContent = '';
	        }
	      }
	    }
	  }, {
	    key: "hasChild",
	    value: function hasChild(child) {
	      return this.getChildren().has(child);
	    }
	  }, {
	    key: "isChildOf",
	    value: function isChildOf(parent) {
	      let parentNode = this.getParentNode();
	      while (parentNode !== null) {
	        if (parentNode === parent) {
	          return true;
	        }
	        parentNode = parentNode.getParentNode();
	      }
	      return false;
	    }
	  }, {
	    key: "getFirstChild",
	    value: function getFirstChild() {
	      return this.children.getFirst();
	    }
	  }, {
	    key: "getLastChild",
	    value: function getLastChild() {
	      return this.children.getLast();
	    }
	  }, {
	    key: "getChildren",
	    value: function getChildren() {
	      return this.children;
	    }
	  }, {
	    key: "hasChildren",
	    value: function hasChildren() {
	      return this.children.count() > 0;
	    }
	  }, {
	    key: "loadChildren",
	    value: function loadChildren() {
	      if (!this.isDynamic()) {
	        throw new Error('EntitySelector.ItemNode.loadChildren: an item node is not dynamic.');
	      }
	      if (this.dynamicPromise) {
	        return this.dynamicPromise;
	      }
	      this.dynamicPromise = main_core.ajax.runAction('ui.entityselector.getChildren', {
	        json: {
	          parentItem: this.getItem().getAjaxJson(),
	          dialog: this.getDialog().getAjaxJson()
	        },
	        getParameters: {
	          context: this.getDialog().getContext()
	        }
	      });
	      this.dynamicPromise.then(response => {
	        if (response && response.data && main_core.Type.isPlainObject(response.data.dialog)) {
	          this.addChildren(response.data.dialog.items);
	          this.render();
	        }
	        this.loaded = true;
	      });
	      this.dynamicPromise.catch(error => {
	        this.loaded = false;
	        this.dynamicPromise = null;
	        console.error(error);
	      });
	      return this.dynamicPromise;
	    }
	  }, {
	    key: "setOpen",
	    value: function setOpen(open) {
	      if (main_core.Type.isBoolean(open)) {
	        if (open && this.isDynamic() && !this.isLoaded()) {
	          this.setAutoOpen(true);
	        } else {
	          this.open = open;
	        }
	      }
	    }
	  }, {
	    key: "isOpen",
	    value: function isOpen() {
	      return this.open;
	    }
	  }, {
	    key: "isAutoOpen",
	    value: function isAutoOpen() {
	      return this.autoOpen && this.isDynamic() && !this.isLoaded();
	    }
	  }, {
	    key: "setAutoOpen",
	    value: function setAutoOpen(autoOpen) {
	      if (main_core.Type.isBoolean(autoOpen)) {
	        this.autoOpen = autoOpen;
	      }
	    }
	  }, {
	    key: "setDynamic",
	    value: function setDynamic(dynamic) {
	      if (main_core.Type.isBoolean(dynamic)) {
	        this.dynamic = dynamic;
	      }
	    }
	  }, {
	    key: "isDynamic",
	    value: function isDynamic() {
	      return this.dynamic;
	    }
	  }, {
	    key: "isLoaded",
	    value: function isLoaded() {
	      return this.loaded;
	    }
	  }, {
	    key: "getLoader",
	    value: function getLoader() {
	      if (this.loader === null) {
	        this.loader = new main_loader.Loader({
	          target: this.getIndicatorContainer(),
	          size: 30
	        });
	      }
	      return this.loader;
	    }
	  }, {
	    key: "showLoader",
	    value: function showLoader() {
	      void this.getLoader().show();
	      main_core.Dom.addClass(this.getIndicatorContainer(), 'ui-selector-item-indicator-hidden');
	    }
	  }, {
	    key: "hideLoader",
	    value: function hideLoader() {
	      void this.getLoader().hide();
	      main_core.Dom.removeClass(this.getIndicatorContainer(), 'ui-selector-item-indicator-hidden');
	    }
	  }, {
	    key: "destroyLoader",
	    value: function destroyLoader() {
	      this.getLoader().destroy();
	      this.loader = null;
	      main_core.Dom.removeClass(this.getIndicatorContainer(), 'ui-selector-item-indicator-hidden');
	    }
	  }, {
	    key: "expand",
	    value: function expand() {
	      if (this.isOpen() || !this.hasChildren() && !this.isDynamic()) {
	        return;
	      }
	      if (this.isDynamic() && !this.isLoaded()) {
	        this.loadChildren().then(() => {
	          this.destroyLoader();
	          this.expand();
	        });
	        this.showLoader();
	        return;
	      }
	      main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-open');
	      main_core.Dom.style(this.getChildrenContainer(), 'height', '0px');
	      main_core.Dom.style(this.getChildrenContainer(), 'opacity', 0);
	      requestAnimationFrame(() => {
	        requestAnimationFrame(() => {
	          main_core.Dom.style(this.getChildrenContainer(), 'height', `${this.getChildrenContainer().scrollHeight}px`);
	          main_core.Dom.style(this.getChildrenContainer(), 'opacity', 1);
	          Animation.handleTransitionEnd(this.getChildrenContainer(), 'height').then(() => {
	            main_core.Dom.style(this.getChildrenContainer(), 'height', null);
	            main_core.Dom.style(this.getChildrenContainer(), 'opacity', null);
	            main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-open');
	            this.setOpen(true);
	          });
	        });
	      });
	    }
	  }, {
	    key: "collapse",
	    value: function collapse() {
	      if (!this.isOpen()) {
	        return;
	      }
	      main_core.Dom.style(this.getChildrenContainer(), 'height', `${this.getChildrenContainer().offsetHeight}px`);
	      requestAnimationFrame(() => {
	        requestAnimationFrame(() => {
	          main_core.Dom.style(this.getChildrenContainer(), 'height', '0px');
	          main_core.Dom.style(this.getChildrenContainer(), 'opacity', 0);
	          Animation.handleTransitionEnd(this.getChildrenContainer(), 'height').then(() => {
	            main_core.Dom.style(this.getChildrenContainer(), 'height', null);
	            main_core.Dom.style(this.getChildrenContainer(), 'opacity', null);
	            main_core.Dom.removeClass(this.getOuterContainer(), 'ui-selector-item-box-open');
	            this.setOpen(false);
	          });
	        });
	      });
	    }
	  }, {
	    key: "render",
	    value: function render(appendChildren = false) {
	      if (this.isRoot()) {
	        this.renderRoot(appendChildren);
	        return;
	      }
	      const titleNode = this.getTitleNode();
	      if (titleNode) {
	        titleNode.renderTo(this.getTitleContainer());
	      } else {
	        this.getTitleContainer().textContent = '';
	      }
	      const supertitleNode = this.getSupertitleNode();
	      if (supertitleNode) {
	        supertitleNode.renderTo(this.getSupertitleContainer());
	      } else {
	        this.getSupertitleContainer().textContent = '';
	      }
	      const subtitleNode = this.getSubtitleNode();
	      if (subtitleNode) {
	        subtitleNode.renderTo(this.getSubtitleContainer());
	      } else {
	        this.getSubtitleContainer().textContent = '';
	      }
	      const captionNode = this.getCaptionNode();
	      if (captionNode) {
	        captionNode.renderTo(this.getCaptionContainer());
	      } else {
	        this.getCaptionContainer().textContent = '';
	      }
	      const captionFitContent = this.getCaptionOption('fitContent');
	      if (main_core.Type.isBoolean(captionFitContent)) {
	        main_core.Dom.style(this.getCaptionContainer(), 'flex-shrink', captionFitContent ? 0 : null);
	      }
	      const captionJustifyContent = this.getCaptionOption('justifyContent');
	      if (main_core.Type.isStringFilled(captionJustifyContent) || captionJustifyContent === null) {
	        main_core.Dom.style(this.getCaptionContainer(), {
	          flexGrow: captionJustifyContent ? '1' : null,
	          textAlign: captionJustifyContent || null
	        });
	      }
	      const captionMaxWidth = this.getCaptionOption('maxWidth');
	      if (main_core.Type.isString(captionMaxWidth) || main_core.Type.isNumber(captionMaxWidth)) {
	        main_core.Dom.style(this.getCaptionContainer(), 'max-width', main_core.Type.isNumber(captionMaxWidth) ? `${captionMaxWidth}px` : captionMaxWidth);
	      }
	      if (main_core.Type.isStringFilled(this.getTextColor())) {
	        this.getTitleContainer().style.color = this.getTextColor();
	      } else {
	        this.getTitleContainer().style.removeProperty('color');
	      }
	      const avatar = this.getAvatar();
	      if (main_core.Type.isStringFilled(avatar)) {
	        this.getAvatarContainer().style.backgroundImage = `url('${encodeUrl(avatar)}')`;
	      } else {
	        const bgImage = this.getAvatarOption('bgImage');
	        if (main_core.Type.isStringFilled(bgImage)) {
	          this.getAvatarContainer().style.backgroundImage = bgImage;
	        } else {
	          this.getAvatarContainer().style.removeProperty('background-image');
	        }
	      }
	      const bgColor = this.getAvatarOption('bgColor');
	      if (main_core.Type.isStringFilled(bgColor)) {
	        this.getAvatarContainer().style.backgroundColor = bgColor;
	      } else {
	        this.getAvatarContainer().style.removeProperty('background-color');
	      }
	      const bgSize = this.getAvatarOption('bgSize');
	      if (main_core.Type.isStringFilled(bgSize)) {
	        this.getAvatarContainer().style.backgroundSize = bgSize;
	      } else {
	        this.getAvatarContainer().style.removeProperty('background-size');
	      }
	      const border = this.getAvatarOption('border');
	      if (main_core.Type.isStringFilled(border)) {
	        this.getAvatarContainer().style.border = border;
	      } else {
	        this.getAvatarContainer().style.removeProperty('border');
	      }
	      const borderRadius = this.getAvatarOption('borderRadius');
	      if (main_core.Type.isStringFilled(borderRadius)) {
	        this.getAvatarContainer().style.borderRadius = borderRadius;
	      } else {
	        this.getAvatarContainer().style.removeProperty('border-radius');
	      }
	      const outline = this.getAvatarOption('outline');
	      main_core.Dom.style(this.getAvatarContainer(), 'outline', outline);
	      const outlineOffset = this.getAvatarOption('outlineOffset');
	      main_core.Dom.style(this.getAvatarContainer(), 'outline-offset', outlineOffset);
	      main_core.Dom.clean(this.getBadgeContainer());
	      this.getBadges().forEach(badge => {
	        badge.renderTo(this.getBadgeContainer());
	      });
	      const badgesFitContent = this.getBadgesOption('fitContent');
	      if (main_core.Type.isBoolean(badgesFitContent)) {
	        main_core.Dom.style(this.getBadgeContainer(), 'flex-shrink', badgesFitContent ? 0 : null);
	      }
	      const badgesJustifyContent = this.getBadgesOption('justifyContent');
	      if (main_core.Type.isStringFilled(badgesJustifyContent) || badgesJustifyContent === null) {
	        main_core.Dom.style(this.getBadgeContainer(), {
	          flexGrow: badgesJustifyContent ? '1' : null,
	          justifyContent: badgesJustifyContent || null
	        });
	      }
	      const badgesMaxWidth = this.getBadgesOption('maxWidth');
	      if (main_core.Type.isString(badgesMaxWidth) || main_core.Type.isNumber(badgesMaxWidth)) {
	        main_core.Dom.style(this.getBadgeContainer(), 'max-width', main_core.Type.isNumber(badgesMaxWidth) ? `${badgesMaxWidth}px` : badgesMaxWidth);
	      }
	      const linkTitleNode = this.getLinkTitleNode();
	      if (linkTitleNode) {
	        linkTitleNode.renderTo(this.getLinkTextContainer());
	      } else {
	        this.getLinkTextContainer().textContent = '';
	      }
	      if (this.hasChildren() || this.isDynamic()) {
	        main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-has-children');
	        if (this.getDepthLevel() >= this.getTab().getItemMaxDepth()) {
	          main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-max-depth');
	        }
	      } else if (this.getOuterContainer().classList.contains('ui-selector-item-box-has-children')) {
	        main_core.Dom.removeClass(this.getOuterContainer(), ['ui-selector-item-box-has-children', 'ui-selector-item-box-max-depth']);
	      }
	      if (this.hasChildren()) {
	        const hasVisibleChild = this.getChildren().getAll().some(child => {
	          return child.isHidden() !== true;
	        });
	        if (!hasVisibleChild) {
	          _classPrivateMethodGet(this, _setHidden, _setHidden2).call(this, true);
	        }
	      }
	      this.toggleVisibility();
	      this.highlight();
	      this.renderChildren(appendChildren);
	      if (this.isAutoOpen()) {
	        this.setAutoOpen(false);
	        requestAnimationFrame(() => {
	          requestAnimationFrame(() => {
	            this.expand();
	          });
	        });
	      }
	      this.rendered = true;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "renderRoot",
	    value: function renderRoot(appendChildren = false) {
	      this.renderChildren(appendChildren);
	      this.rendered = true;
	      const stub = this.getTab().getStub();
	      if (stub && stub.isAutoShow() && (this.getDialog().isLoaded() || !this.getDialog().hasDynamicLoad())) {
	        if (this.hasChildren()) {
	          stub.hide();
	        } else {
	          stub.show();
	        }
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "renderChildren",
	    value: function renderChildren(appendChildren = false) {
	      if (!appendChildren) {
	        if (main_core.Browser.isIE()) {
	          main_core.Dom.clean(this.getChildrenContainer());
	        } else {
	          this.getChildrenContainer().textContent = '';
	        }
	      }
	      if (this.hasChildren()) {
	        let previousSibling = null;
	        this.getChildren().forEach(child => {
	          child.render(appendChildren);
	          const container = child.getOuterContainer();
	          if (!appendChildren) {
	            main_core.Dom.append(container, this.getChildrenContainer());
	          }
	          if (!container.parentNode) {
	            if (previousSibling !== null) {
	              main_core.Dom.insertAfter(container, previousSibling.getOuterContainer());
	            } else {
	              main_core.Dom.append(container, this.getChildrenContainer());
	            }
	          }
	          previousSibling = child;
	        });
	      }
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.rendered && this.getDialog() && this.getDialog().isRendered();
	    }
	  }, {
	    key: "enableRender",
	    value: function enableRender() {
	      this.rendered = true;
	    }
	  }, {
	    key: "disableRender",
	    value: function disableRender() {
	      this.rendered = false;
	    }
	  }, {
	    key: "getRenderMode",
	    value: function getRenderMode() {
	      return this.renderMode;
	    }
	  }, {
	    key: "isHidden",
	    value: function isHidden() {
	      return this.hidden === true || this.getItem().isHidden() === true;
	    }
	  }, {
	    key: "setHidden",
	    value: function setHidden(flag) {
	      if (!main_core.Type.isBoolean(flag) || this.isRoot()) {
	        return;
	      }
	      _classPrivateMethodGet(this, _setHidden, _setHidden2).call(this, flag);
	      if (this.isRendered()) {
	        this.toggleVisibility();
	        let parentNode = this.getParentNode();
	        const isHidden = this.isHidden();
	        while (parentNode.isRoot() === false) {
	          if (isHidden) {
	            const hasVisibleChild = parentNode.getChildren().getAll().some(child => {
	              return child.isHidden() !== true;
	            });
	            if (!hasVisibleChild) {
	              var _parentNode;
	              _classPrivateMethodGet(_parentNode = parentNode, _setHidden, _setHidden2).call(_parentNode, true);
	            }
	            parentNode.toggleVisibility();
	          } else {
	            var _parentNode2;
	            _classPrivateMethodGet(_parentNode2 = parentNode, _setHidden, _setHidden2).call(_parentNode2, false);
	            parentNode.toggleVisibility();
	            if (parentNode.isHidden()) {
	              break;
	            }
	          }
	          parentNode = parentNode.getParentNode();
	        }
	      }
	    }
	  }, {
	    key: "toggleVisibility",
	    value: function toggleVisibility() {
	      if (this.isHidden()) {
	        main_core.Dom.addClass(this.getOuterContainer(), '--hidden');
	      } else if (this.getOuterContainer().classList.contains('--hidden')) {
	        main_core.Dom.removeClass(this.getOuterContainer(), '--hidden');
	      }
	    }
	  }, {
	    key: "getTitle",
	    value: function getTitle() {
	      const titleNode = this.getTitleNode();
	      return titleNode !== null ? titleNode.getText() : null;
	    }
	  }, {
	    key: "getTitleNode",
	    value: function getTitleNode() {
	      return this.title !== null ? this.title : this.getItem().getTitleNode();
	    }
	  }, {
	    key: "setTitle",
	    value: function setTitle(title) {
	      if (main_core.Type.isString(title) || main_core.Type.isPlainObject(title)) {
	        this.title = new TextNode(title);
	      } else if (title === null) {
	        this.title = null;
	      }
	    }
	  }, {
	    key: "getSubtitle",
	    value: function getSubtitle() {
	      const subtitleNode = this.getSubtitleNode();
	      return subtitleNode !== null ? subtitleNode.getText() : null;
	    }
	  }, {
	    key: "getSubtitleNode",
	    value: function getSubtitleNode() {
	      return this.subtitle !== null ? this.subtitle : this.getItem().getSubtitleNode();
	    }
	  }, {
	    key: "setSubtitle",
	    value: function setSubtitle(subtitle) {
	      if (main_core.Type.isString(subtitle) || main_core.Type.isPlainObject(subtitle)) {
	        this.subtitle = new TextNode(subtitle);
	      } else if (subtitle === null) {
	        this.subtitle = null;
	      }
	    }
	  }, {
	    key: "getSupertitle",
	    value: function getSupertitle() {
	      const supertitleNode = this.getSupertitleNode();
	      return supertitleNode !== null ? supertitleNode.getText() : null;
	    }
	  }, {
	    key: "getSupertitleNode",
	    value: function getSupertitleNode() {
	      return this.supertitle !== null ? this.supertitle : this.getItem().getSupertitleNode();
	    }
	  }, {
	    key: "setSupertitle",
	    value: function setSupertitle(supertitle) {
	      if (main_core.Type.isString(supertitle) || main_core.Type.isPlainObject(supertitle)) {
	        this.supertitle = new TextNode(supertitle);
	      } else if (supertitle === null) {
	        this.supertitle = null;
	      }
	    }
	  }, {
	    key: "getCaption",
	    value: function getCaption() {
	      const caption = this.getCaptionNode();
	      return caption !== null ? caption.getText() : null;
	    }
	  }, {
	    key: "getCaptionNode",
	    value: function getCaptionNode() {
	      return this.caption !== null ? this.caption : this.getItem().getCaptionNode();
	    }
	  }, {
	    key: "setCaption",
	    value: function setCaption(caption) {
	      if (main_core.Type.isString(caption) || main_core.Type.isPlainObject(caption)) {
	        this.caption = new TextNode(caption);
	      } else if (caption === null) {
	        this.caption = null;
	      }
	    }
	  }, {
	    key: "getCaptionOption",
	    value: function getCaptionOption(option) {
	      if (!main_core.Type.isUndefined(this.captionOptions[option])) {
	        return this.captionOptions[option];
	      }
	      return this.getItem().getCaptionOption(option);
	    }
	  }, {
	    key: "setCaptionOption",
	    value: function setCaptionOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        this.captionOptions[option] = value;
	      }
	    }
	  }, {
	    key: "setCaptionOptions",
	    value: function setCaptionOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setCaptionOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getAvatar",
	    value: function getAvatar() {
	      return this.avatar !== null ? this.avatar : this.getItem().getAvatar();
	    }
	  }, {
	    key: "setAvatar",
	    value: function setAvatar(avatar) {
	      if (main_core.Type.isString(avatar) || avatar === null) {
	        this.avatar = avatar;
	      }
	    }
	  }, {
	    key: "getAvatarOption",
	    value: function getAvatarOption(option) {
	      return this.avatarOptions === null || main_core.Type.isUndefined(this.avatarOptions[option]) ? this.getItem().getAvatarOption(option) : this.avatarOptions[option];
	    }
	  }, {
	    key: "setAvatarOption",
	    value: function setAvatarOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        if (this.avatarOptions === null) {
	          this.avatarOptions = {};
	        }
	        this.avatarOptions[option] = value;
	      }
	    }
	  }, {
	    key: "setAvatarOptions",
	    value: function setAvatarOptions(avatarOptions) {
	      if (main_core.Type.isPlainObject(avatarOptions)) {
	        Object.keys(avatarOptions).forEach(option => {
	          this.setAvatarOption(option, avatarOptions[option]);
	        });
	      }
	    }
	  }, {
	    key: "getTextColor",
	    value: function getTextColor() {
	      return this.textColor !== null ? this.textColor : this.getItem().getTextColor();
	    }
	  }, {
	    key: "setTextColor",
	    value: function setTextColor(textColor) {
	      if (main_core.Type.isString(textColor) || textColor === null) {
	        this.textColor = textColor;
	      }
	    }
	  }, {
	    key: "getLink",
	    value: function getLink() {
	      return this.link !== null ? this.getItem().replaceMacros(this.link) : this.getItem().getLink();
	    }
	  }, {
	    key: "setLink",
	    value: function setLink(link) {
	      if (main_core.Type.isString(link) || link === null) {
	        this.link = link;
	      }
	    }
	  }, {
	    key: "getLinkTitle",
	    value: function getLinkTitle() {
	      const linkTitle = this.getLinkTitleNode();
	      return linkTitle !== null ? linkTitle.getText() : null;
	    }
	  }, {
	    key: "getLinkTitleNode",
	    value: function getLinkTitleNode() {
	      return this.linkTitle !== null ? this.linkTitle : this.getItem().getLinkTitleNode();
	    }
	  }, {
	    key: "setLinkTitle",
	    value: function setLinkTitle(title) {
	      if (main_core.Type.isString(title) || main_core.Type.isPlainObject(title)) {
	        this.linkTitle = new TextNode(title);
	      } else if (title === null) {
	        this.linkTitle = null;
	      }
	    }
	  }, {
	    key: "getBadges",
	    value: function getBadges() {
	      return this.badges !== null ? this.badges : this.getItem().getBadges();
	    }
	  }, {
	    key: "setBadges",
	    value: function setBadges(badges) {
	      if (main_core.Type.isArray(badges)) {
	        this.badges = [];
	        badges.forEach(badge => {
	          this.badges.push(new ItemBadge(badge));
	        });
	      } else if (badges === null) {
	        this.badges = null;
	      }
	    }
	  }, {
	    key: "getBadgesOption",
	    value: function getBadgesOption(option) {
	      if (!main_core.Type.isUndefined(this.badgesOptions[option])) {
	        return this.badgesOptions[option];
	      }
	      return this.getItem().getBadgesOption(option);
	    }
	  }, {
	    key: "setBadgesOption",
	    value: function setBadgesOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        this.badgesOptions[option] = value;
	      }
	    }
	  }, {
	    key: "setBadgesOptions",
	    value: function setBadgesOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setBadgesOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getOuterContainer",
	    value: function getOuterContainer() {
	      return this.cache.remember('outer-container', () => {
	        let className = '';
	        if (this.hasChildren() || this.isDynamic()) {
	          className += ' ui-selector-item-box-has-children';
	          if (this.getDepthLevel() >= this.getTab().getItemMaxDepth()) {
	            className += ' ui-selector-item-box-max-depth';
	          }
	        } else if (this.getItem().isSelected()) {
	          className += ' ui-selector-item-box-selected';
	        }
	        if (this.isOpen()) {
	          className += ' ui-selector-item-box-open';
	        }
	        const div = document.createElement('div');
	        div.className = `ui-selector-item-box${className}`;
	        div.appendChild(this.getContainer());
	        div.appendChild(this.getChildrenContainer());
	        return div;
	      });
	    }
	  }, {
	    key: "getChildrenContainer",
	    value: function getChildrenContainer() {
	      if (this.isRoot() && this.getTab()) {
	        return this.getTab().getItemsContainer();
	      }
	      return this.cache.remember('children-container', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-children';
	        return div;
	      });
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item';
	        main_core.Event.bind(div, 'click', this.handleClick.bind(this));
	        main_core.Event.bind(div, 'mouseenter', this.handleMouseEnter.bind(this));
	        main_core.Event.bind(div, 'mouseleave', this.handleMouseLeave.bind(this));
	        div.appendChild(this.getAvatarContainer());
	        div.appendChild(this.getTitlesContainer());
	        div.appendChild(this.getIndicatorContainer());
	        if (main_core.Type.isStringFilled(this.getLink())) {
	          div.appendChild(this.getLinkContainer());
	        }
	        return div;
	      });
	    }
	  }, {
	    key: "getAvatarContainer",
	    value: function getAvatarContainer() {
	      return this.cache.remember('avatar', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-avatar';
	        return div;
	      });
	    }
	  }, {
	    key: "getTitlesContainer",
	    value: function getTitlesContainer() {
	      return this.cache.remember('titles', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-titles';
	        div.appendChild(this.getSupertitleContainer());
	        div.appendChild(this.getTitleBoxContainer());
	        div.appendChild(this.getSubtitleContainer());
	        return div;
	      });
	    }
	  }, {
	    key: "getTitleBoxContainer",
	    value: function getTitleBoxContainer() {
	      return this.cache.remember('title-box', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-title-box';
	        div.appendChild(this.getTitleContainer());
	        div.appendChild(this.getBadgeContainer());
	        div.appendChild(this.getCaptionContainer());
	        return div;
	      });
	    }
	  }, {
	    key: "getTitleContainer",
	    value: function getTitleContainer() {
	      return this.cache.remember('title', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-title';
	        return div;
	      });
	    }
	  }, {
	    key: "getSubtitleContainer",
	    value: function getSubtitleContainer() {
	      return this.cache.remember('subtitle', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-subtitle';
	        return div;
	      });
	    }
	  }, {
	    key: "getSupertitleContainer",
	    value: function getSupertitleContainer() {
	      return this.cache.remember('supertitle', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-supertitle';
	        return div;
	      });
	    }
	  }, {
	    key: "getCaptionContainer",
	    value: function getCaptionContainer() {
	      return this.cache.remember('caption', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-caption';
	        return div;
	      });
	    }
	  }, {
	    key: "getIndicatorContainer",
	    value: function getIndicatorContainer() {
	      return this.cache.remember('indicator', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-indicator';
	        return div;
	      });
	    }
	  }, {
	    key: "getBadgeContainer",
	    value: function getBadgeContainer() {
	      return this.cache.remember('badge', () => {
	        const div = document.createElement('div');
	        div.className = 'ui-selector-item-badges';
	        return div;
	      });
	    }
	  }, {
	    key: "getLinkContainer",
	    value: function getLinkContainer() {
	      return this.cache.remember('link', () => {
	        const anchor = document.createElement('a');
	        anchor.className = 'ui-selector-item-link';
	        anchor.href = this.getLink();
	        anchor.target = '_blank';
	        anchor.title = '';
	        main_core.Event.bind(anchor, 'click', this.handleLinkClick.bind(this));
	        anchor.appendChild(this.getLinkTextContainer());
	        return anchor;
	      });
	    }
	  }, {
	    key: "getLinkTextContainer",
	    value: function getLinkTextContainer() {
	      return this.cache.remember('link-text', () => {
	        const span = document.createElement('span');
	        span.className = 'ui-selector-item-link-text';
	        return span;
	      });
	    }
	  }, {
	    key: "showLink",
	    value: function showLink() {
	      if (main_core.Type.isStringFilled(this.getLink())) {
	        main_core.Dom.addClass(this.getLinkContainer(), 'ui-selector-item-link--show');
	        requestAnimationFrame(() => {
	          requestAnimationFrame(() => {
	            main_core.Dom.addClass(this.getLinkContainer(), 'ui-selector-item-link--animate');
	          });
	        });
	      }
	    }
	  }, {
	    key: "hideLink",
	    value: function hideLink() {
	      if (main_core.Type.isStringFilled(this.getLink())) {
	        main_core.Dom.removeClass(this.getLinkContainer(), ['ui-selector-item-link--show', 'ui-selector-item-link--animate']);
	      }
	    }
	  }, {
	    key: "setHighlights",
	    value: function setHighlights(highlights) {
	      this.highlights = highlights;
	    }
	  }, {
	    key: "getHighlights",
	    value: function getHighlights() {
	      return this.highlights;
	    }
	  }, {
	    key: "highlight",
	    value: function highlight() {
	      this.getHighlights().forEach(matchField => {
	        const field = matchField.getField();
	        const fieldName = field.getName();
	        if (field.isCustom()) {
	          const text = this.getItem().getCustomData().get(fieldName);
	          this.getSubtitleContainer().innerHTML = Highlighter.mark(text, matchField.getMatches());
	        } else if (field.getName() === 'title') {
	          this.getTitleContainer().innerHTML = Highlighter.mark(this.getItem().getTitleNode(), matchField.getMatches());
	        } else if (field.getName() === 'subtitle') {
	          this.getSubtitleContainer().innerHTML = Highlighter.mark(this.getItem().getSubtitleNode(), matchField.getMatches());
	        } else if (field.getName() === 'supertitle') {
	          this.getSupertitleContainer().innerHTML = Highlighter.mark(this.getItem().getSupertitleNode(), matchField.getMatches());
	        } else if (field.getName() === 'caption') {
	          this.getCaptionContainer().innerHTML = Highlighter.mark(this.getItem().getCaptionNode(), matchField.getMatches());
	        }
	      });
	    }
	  }, {
	    key: "select",
	    value: function select() {
	      if (this.hasChildren() || this.isDynamic()) {
	        return;
	      }
	      main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-selected');
	    }
	  }, {
	    key: "deselect",
	    value: function deselect() {
	      if (this.hasChildren() || this.isDynamic()) {
	        return;
	      }
	      main_core.Dom.removeClass(this.getOuterContainer(), 'ui-selector-item-box-selected');
	    }
	  }, {
	    key: "focus",
	    value: function focus() {
	      if (this.isFocused()) {
	        return;
	      }
	      this.focused = true;
	      main_core.Dom.addClass(this.getOuterContainer(), 'ui-selector-item-box-focused');
	      this.getDialog().emit('ItemNode:onFocus', {
	        node: this
	      });
	    }
	  }, {
	    key: "unfocus",
	    value: function unfocus() {
	      if (!this.isFocused()) {
	        return;
	      }
	      this.focused = false;
	      main_core.Dom.removeClass(this.getOuterContainer(), 'ui-selector-item-box-focused');
	      this.getDialog().emit('ItemNode:onUnfocus', {
	        node: this
	      });
	    }
	  }, {
	    key: "isFocused",
	    value: function isFocused() {
	      return this.focused;
	    }
	  }, {
	    key: "click",
	    value: function click() {
	      if (this.hasChildren() || this.isDynamic()) {
	        if (this.isOpen()) {
	          this.collapse();
	        } else {
	          this.expand();
	        }
	      } else {
	        if (this.getItem().isSelected()) {
	          if (this.getItem().isDeselectable()) {
	            this.getItem().deselect();
	          }
	          if (this.getDialog().shouldHideOnDeselect()) {
	            this.getDialog().hide();
	          }
	        } else {
	          this.getItem().select();
	          if (this.getDialog().shouldClearSearchOnSelect()) {
	            this.getDialog().clearSearch();
	          }
	          if (this.getDialog().shouldHideOnSelect()) {
	            this.getDialog().hide();
	          }
	        }
	      }
	      this.getDialog().focusSearch();
	    }
	  }, {
	    key: "scrollIntoView",
	    value: function scrollIntoView() {
	      const tabContainer = this.getTab().getContainer();
	      const nodeContainer = this.getContainer();
	      const tabRect = main_core.Dom.getPosition(tabContainer);
	      const nodeRect = main_core.Dom.getPosition(nodeContainer);
	      const margin = 9; // 'ui-selector-items' padding - 'ui-selector-item' margin = 10 - 1

	      if (nodeRect.top < tabRect.top)
	        // scroll up
	        {
	          tabContainer.scrollTop -= tabRect.top - nodeRect.top + margin;
	        } else if (nodeRect.bottom > tabRect.bottom)
	        // scroll down
	        {
	          tabContainer.scrollTop += nodeRect.bottom - tabRect.bottom + margin;
	        }
	    }
	  }, {
	    key: "handleClick",
	    value: function handleClick() {
	      this.click();
	    }
	  }, {
	    key: "handleLinkClick",
	    value: function handleLinkClick(event) {
	      this.getDialog().emit('ItemNode:onLinkClick', {
	        node: this,
	        event
	      });
	      event.stopPropagation();
	    }
	  }, {
	    key: "handleMouseEnter",
	    value: function handleMouseEnter() {
	      this.focus();
	      this.showLink();
	      _classPrivateMethodGet(this, _makeEllipsisTitle, _makeEllipsisTitle2).call(this);
	    }
	  }, {
	    key: "handleMouseLeave",
	    value: function handleMouseLeave() {
	      this.unfocus();
	      this.hideLink();
	    }
	  }]);
	  return ItemNode;
	}();
	function _setHidden2(flag) {
	  if (main_core.Type.isBoolean(flag) && !this.isRoot()) {
	    this.hidden = flag;
	  }
	}
	function _makeEllipsisTitle2() {
	  var _this$constructor;
	  if (_classStaticPrivateMethodGet(_this$constructor = this.constructor, ItemNode, _isEllipsisActive).call(_this$constructor, this.getTitleContainer())) {
	    var _this$constructor2;
	    this.getContainer().setAttribute('title', _classStaticPrivateMethodGet(_this$constructor2 = this.constructor, ItemNode, _sanitizeTitle).call(_this$constructor2, this.getTitleContainer().textContent));
	  } else {
	    main_core.Dom.attr(this.getContainer(), 'title', null);
	  }
	  const containers = [this.getSupertitleContainer(), this.getSubtitleContainer(), this.getCaptionContainer(), ...this.getBadges().map(badge => badge.getContainer(this.getBadgeContainer()))];
	  containers.forEach(container => {
	    var _this$constructor3;
	    if (_classStaticPrivateMethodGet(_this$constructor3 = this.constructor, ItemNode, _isEllipsisActive).call(_this$constructor3, container)) {
	      var _this$constructor4;
	      container.setAttribute('title', _classStaticPrivateMethodGet(_this$constructor4 = this.constructor, ItemNode, _sanitizeTitle).call(_this$constructor4, container.textContent));
	    } else {
	      main_core.Dom.attr(container, 'title', null);
	    }
	  });
	}
	function _isEllipsisActive(element) {
	  return element.offsetWidth < element.scrollWidth;
	}
	function _sanitizeTitle(text) {
	  return text.replace(/[\t ]+/gm, ' ').replace(/\n+/gm, '\n').trim();
	}

	let SearchFieldIndex = /*#__PURE__*/function () {
	  function SearchFieldIndex(field, indexes = []) {
	    babelHelpers.classCallCheck(this, SearchFieldIndex);
	    babelHelpers.defineProperty(this, "field", null);
	    babelHelpers.defineProperty(this, "indexes", []);
	    this.field = field;
	    this.addIndexes(indexes);
	  }
	  babelHelpers.createClass(SearchFieldIndex, [{
	    key: "getField",
	    value: function getField() {
	      return this.field;
	    }
	  }, {
	    key: "getIndexes",
	    value: function getIndexes() {
	      return this.indexes;
	    }
	  }, {
	    key: "addIndex",
	    value: function addIndex(index) {
	      this.getIndexes().push(index);
	    }
	  }, {
	    key: "addIndexes",
	    value: function addIndexes(indexes) {
	      indexes.forEach(index => {
	        this.addIndex(index);
	      });
	    }
	  }]);
	  return SearchFieldIndex;
	}();

	let WordIndex = /*#__PURE__*/function () {
	  function WordIndex(word, startIndex) {
	    babelHelpers.classCallCheck(this, WordIndex);
	    babelHelpers.defineProperty(this, "word", '');
	    babelHelpers.defineProperty(this, "startIndex", 0);
	    this.setWord(word);
	    this.setStartIndex(startIndex);
	  }
	  babelHelpers.createClass(WordIndex, [{
	    key: "getWord",
	    value: function getWord() {
	      return this.word;
	    }
	  }, {
	    key: "setWord",
	    value: function setWord(word) {
	      if (main_core.Type.isStringFilled(word)) {
	        this.word = word;
	      }
	      return this;
	    }
	  }, {
	    key: "getStartIndex",
	    value: function getStartIndex() {
	      return this.startIndex;
	    }
	  }, {
	    key: "setStartIndex",
	    value: function setStartIndex(index) {
	      if (main_core.Type.isNumber(index) && index >= 0) {
	        this.startIndex = index;
	      }
	      return this;
	    }
	  }]);
	  return WordIndex;
	}();

	/**
	 * @license
	 * Lodash <https://lodash.com/>
	 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
	 * Released under MIT license <https://lodash.com/license>
	 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
	 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
	 */

	/** Used to compose unicode character classes. */
	const rsAstralRange = '\\ud800-\\udfff';
	const rsComboMarksRange = '\\u0300-\\u036f';
	const reComboHalfMarksRange = '\\ufe20-\\ufe2f';
	const rsComboSymbolsRange = '\\u20d0-\\u20ff';
	const rsComboMarksExtendedRange = '\\u1ab0-\\u1aff';
	const rsComboMarksSupplementRange = '\\u1dc0-\\u1dff';
	const rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange + rsComboMarksExtendedRange + rsComboMarksSupplementRange;
	const rsDingbatRange = '\\u2700-\\u27bf';
	const rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff';
	const rsMathOpRange = '\\xac\\xb1\\xd7\\xf7';
	const rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf';
	const rsPunctuationRange = '\\u2000-\\u206f';
	const rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000';
	const rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde';
	const rsVarRange = '\\ufe0e\\ufe0f';
	const rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;

	/** Used to compose unicode capture groups. */
	const rsApos = '[\'\u2019]';
	const rsBreak = `[${rsBreakRange}]`;
	const rsCombo = `[${rsComboRange}]`;
	const rsDigit = '\\d';
	const rsDingbat = `[${rsDingbatRange}]`;
	const rsLower = `[${rsLowerRange}]`;
	const rsMisc = `[^${rsAstralRange}${rsBreakRange + rsDigit + rsDingbatRange + rsLowerRange + rsUpperRange}]`;
	const rsFitz = '\\ud83c[\\udffb-\\udfff]';
	const rsModifier = `(?:${rsCombo}|${rsFitz})`;
	const rsNonAstral = `[^${rsAstralRange}]`;
	const rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}';
	const rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]';
	const rsUpper = `[${rsUpperRange}]`;
	const rsZWJ = '\\u200d';

	/** Used to compose unicode regexes. */
	const rsMiscLower = `(?:${rsLower}|${rsMisc})`;
	const rsMiscUpper = `(?:${rsUpper}|${rsMisc})`;
	const rsOptContrLower = `(?:${rsApos}(?:d|ll|m|re|s|t|ve))?`;
	const rsOptContrUpper = `(?:${rsApos}(?:D|LL|M|RE|S|T|VE))?`;
	const reOptMod = `${rsModifier}?`;
	const rsOptVar = `[${rsVarRange}]?`;
	const rsOptJoin = `(?:${rsZWJ}(?:${[rsNonAstral, rsRegional, rsSurrPair].join('|')})${rsOptVar + reOptMod})*`;
	const rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])';
	const rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])';
	const rsSeq = rsOptVar + reOptMod + rsOptJoin;
	const rsEmoji = `(?:${[rsDingbat, rsRegional, rsSurrPair].join('|')})${rsSeq}`;
	const unicodeWordsRegExp = new RegExp([`${rsUpper}?${rsLower}+${rsOptContrLower}(?=${[rsBreak, rsUpper, '$'].join('|')})`, `${rsMiscUpper}+${rsOptContrUpper}(?=${[rsBreak, rsUpper + rsMiscLower, '$'].join('|')})`, `${rsUpper}?${rsMiscLower}+${rsOptContrLower}`, `${rsUpper}+${rsOptContrUpper}`, rsOrdUpper, rsOrdLower, `${rsDigit}+`, rsEmoji].join('|'), 'g');

	const asciiWordRegExp = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
	const hasUnicodeWordRegExp = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
	const nonWhitespaceRegExp = /[^\s]+/g;
	const specialChars = `!"#$%&'()*+,-.\/:;<=>?@[\\]^_\`{|}`;
	const specialCharsRegExp = new RegExp(`[${specialChars}]`);
	let SearchIndex = /*#__PURE__*/function () {
	  function SearchIndex() {
	    babelHelpers.classCallCheck(this, SearchIndex);
	    babelHelpers.defineProperty(this, "indexes", []);
	  }
	  babelHelpers.createClass(SearchIndex, [{
	    key: "addIndex",
	    value: function addIndex(fieldIndex) {
	      if (main_core.Type.isObject(fieldIndex)) {
	        this.getIndexes().push(fieldIndex);
	      }
	    }
	  }, {
	    key: "getIndexes",
	    value: function getIndexes() {
	      return this.indexes;
	    }
	  }], [{
	    key: "create",
	    value: function create(item) {
	      const index = new SearchIndex();
	      const entity = item.getEntity();
	      if (!item.isSearchable() || !entity.isSearchable() || item.isHidden()) {
	        return index;
	      }
	      const searchFields = entity.getSearchFields();
	      searchFields.forEach(field => {
	        if (!field.isSearchable()) {
	          return;
	        }
	        if (field.isSystem()) {
	          if (field.getName() === 'title') {
	            const textNode = item.getTitleNode();
	            const stripTags = textNode !== null && textNode.getType() === 'html';
	            index.addIndex(this.createIndex(field, item.getTitle(), stripTags));
	          } else if (field.getName() === 'subtitle') {
	            const textNode = item.getSubtitleNode();
	            const stripTags = textNode !== null && textNode.getType() === 'html';
	            index.addIndex(this.createIndex(field, item.getSubtitle(), stripTags));
	          } else if (field.getName() === 'supertitle') {
	            const textNode = item.getSupertitleNode();
	            const stripTags = textNode !== null && textNode.getType() === 'html';
	            index.addIndex(this.createIndex(field, item.getSupertitle(), stripTags));
	          } else if (field.getName() === 'caption') {
	            const textNode = item.getCaptionNode();
	            const stripTags = textNode !== null && textNode.getType() === 'html';
	            index.addIndex(this.createIndex(field, item.getCaption(), stripTags));
	          }
	        } else {
	          const customData = item.getCustomData().get(field.getName());
	          if (!main_core.Type.isUndefined(customData)) {
	            index.addIndex(this.createIndex(field, customData));
	          }
	        }
	      });
	      return index;
	    }
	  }, {
	    key: "createIndex",
	    value: function createIndex(field, text, stripTags = false) {
	      if (!main_core.Type.isStringFilled(text)) {
	        return null;
	      }
	      if (stripTags) {
	        text = text.replace(/<\/?[^>]+>/g, match => ' '.repeat(match.length));
	        text = text.replace(/&(?:#\d+|#x[\da-fA-F]+|[0-9a-zA-Z]+);/g, match => ' '.repeat(match.length));
	      }
	      let index = null;
	      if (field.getType() === 'string') {
	        const wordIndexes = this.splitText(text);
	        if (main_core.Type.isArrayFilled(wordIndexes)) {
	          // "GoPro111 Leto15"
	          // [go, pro, 111, leto, 15] + [gopro111, leto15]
	          this.fillComplexWords(wordIndexes);
	          this.fillNonCharWords(wordIndexes, text);
	          index = new SearchFieldIndex(field, wordIndexes);
	        }
	      } else if (field.getType() === 'email') {
	        const position = text.indexOf('@');
	        if (position !== -1) {
	          index = new SearchFieldIndex(field, [new WordIndex(text.toLowerCase(), 0), new WordIndex(text.substr(position + 1).toLowerCase(), position + 1)]);
	        }
	      }
	      return index;
	    }
	  }, {
	    key: "splitText",
	    value: function splitText(text) {
	      if (!main_core.Type.isStringFilled(text)) {
	        return [];
	      }
	      return this.hasUnicodeWord(text) ? this.splitUnicodeText(text) : this.splitAsciiText(text);
	    }
	  }, {
	    key: "splitUnicodeText",
	    value: function splitUnicodeText(text) {
	      return this.splitTextInternal(text, unicodeWordsRegExp);
	    }
	  }, {
	    key: "splitAsciiText",
	    value: function splitAsciiText(text) {
	      return this.splitTextInternal(text, asciiWordRegExp);
	    }
	  }, {
	    key: "hasUnicodeWord",
	    value: function hasUnicodeWord(text) {
	      return hasUnicodeWordRegExp.test(text);
	    }
	  }, {
	    key: "splitTextInternal",
	    value: function splitTextInternal(text, regExp) {
	      let match;
	      const result = [];
	      regExp.lastIndex = 0;
	      while ((match = regExp.exec(text)) !== null) {
	        if (match.index === regExp.lastIndex) {
	          regExp.lastIndex++;
	        }
	        result.push(new WordIndex(match[0].toLowerCase(), match.index));
	      }
	      return result;
	    }
	    /**
	     *  @private
	     */
	  }, {
	    key: "fillComplexWords",
	    value: function fillComplexWords(indexes) {
	      if (indexes.length < 2) {
	        return;
	      }
	      let complexWord = null;
	      let startIndex = null;
	      indexes.forEach((currentIndex, currentArrayIndex) => {
	        const nextIndex = indexes[currentArrayIndex + 1];
	        if (nextIndex) {
	          const sameWord = currentIndex.getStartIndex() + currentIndex.getWord().length === nextIndex.getStartIndex();
	          if (sameWord) {
	            if (complexWord === null) {
	              complexWord = currentIndex.getWord();
	              startIndex = currentIndex.getStartIndex();
	            }
	            complexWord += nextIndex.getWord();
	          } else if (complexWord !== null) {
	            indexes.push(new WordIndex(complexWord, startIndex));
	            complexWord = null;
	            startIndex = null;
	          }
	        } else if (complexWord !== null) {
	          indexes.push(new WordIndex(complexWord, startIndex));
	          complexWord = null;
	          startIndex = null;
	        }
	      });
	    }
	    /**
	     *  @private
	     */
	  }, {
	    key: "fillNonCharWords",
	    value: function fillNonCharWords(indexes, text) {
	      if (!specialCharsRegExp.test(text)) {
	        return;
	      }
	      let match;
	      while ((match = nonWhitespaceRegExp.exec(text)) !== null) {
	        if (match.index === nonWhitespaceRegExp.lastIndex) {
	          nonWhitespaceRegExp.lastIndex++;
	        }
	        const word = match[0];
	        if (specialCharsRegExp.test(word)) {
	          indexes.push(new WordIndex(word.toLowerCase(), match.index));
	          for (let i = 0; i < word.length; i++) {
	            const char = word[i];
	            if (!specialChars.includes(char)) {
	              break;
	            }
	            const wordToIndex = word.substr(i + 1);
	            if (wordToIndex.length) {
	              indexes.push(new WordIndex(wordToIndex.toLowerCase(), match.index + i + 1));
	            }
	          }
	        }
	      }
	      nonWhitespaceRegExp.lastIndex = 0;
	    }
	  }]);
	  return SearchIndex;
	}();

	let EntityFilter = /*#__PURE__*/function () {
	  function EntityFilter(filterOptions) {
	    babelHelpers.classCallCheck(this, EntityFilter);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "options", {});
	    const options = main_core.Type.isPlainObject(filterOptions) ? filterOptions : {};
	    this.id = options.id;
	    this.options = options.options;
	  }
	  babelHelpers.createClass(EntityFilter, [{
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	  }, {
	    key: "getOptions",
	    value: function getOptions() {
	      return this.options;
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      return {
	        id: this.getId(),
	        options: this.getOptions()
	      };
	    }
	  }]);
	  return EntityFilter;
	}();

	/**
	 * @memberof BX.UI.EntitySelector
	 */
	let Entity = /*#__PURE__*/function () {
	  function Entity(entityOptions) {
	    babelHelpers.classCallCheck(this, Entity);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "options", {});
	    babelHelpers.defineProperty(this, "searchable", true);
	    babelHelpers.defineProperty(this, "searchFields", null);
	    babelHelpers.defineProperty(this, "dynamicLoad", false);
	    babelHelpers.defineProperty(this, "dynamicSearch", false);
	    babelHelpers.defineProperty(this, "substituteEntityId", null);
	    babelHelpers.defineProperty(this, "searchCacheLimits", []);
	    babelHelpers.defineProperty(this, "filters", new Map());
	    babelHelpers.defineProperty(this, "itemOptions", {});
	    babelHelpers.defineProperty(this, "tagOptions", {});
	    babelHelpers.defineProperty(this, "badgeOptions", []);
	    babelHelpers.defineProperty(this, "textNodes", new Map());
	    let options = main_core.Type.isPlainObject(entityOptions) ? entityOptions : {};
	    if (!main_core.Type.isStringFilled(options.id)) {
	      throw new Error('EntitySelector.Entity: "id" parameter is required.');
	    }
	    const defaultOptions = this.constructor.getEntityDefaultOptions(options.id) || {};
	    options = main_core.Runtime.merge(JSON.parse(JSON.stringify(defaultOptions)), options);
	    this.id = options.id.toLowerCase();
	    this.options = main_core.Type.isPlainObject(options.options) ? options.options : {};
	    this.itemOptions = main_core.Type.isPlainObject(options.itemOptions) ? options.itemOptions : {};
	    this.tagOptions = main_core.Type.isPlainObject(options.tagOptions) ? options.tagOptions : {};
	    this.badgeOptions = main_core.Type.isArray(options.badgeOptions) ? options.badgeOptions : [];
	    this.substituteEntityId = main_core.Type.isStringFilled(options.substituteEntityId) ? options.substituteEntityId : null;
	    if (main_core.Type.isArray(options.filters)) {
	      options.filters.forEach(filterOptions => {
	        this.addFilter(filterOptions);
	      });
	    }
	    this.searchFields = new main_core_collections.OrderedArray((fieldA, fieldB) => {
	      if (fieldA.getSort() !== null && fieldB.getSort() === null) {
	        return -1;
	      } else if (fieldA.getSort() === null && fieldB.getSort() !== null) {
	        return 1;
	      } else if (fieldA.getSort() === null && fieldB.getSort() === null) {
	        return -1;
	      } else {
	        return fieldA.getSort() - fieldB.getSort();
	      }
	    });
	    this.setSearchable(options.searchable);
	    this.setDynamicLoad(options.dynamicLoad);
	    this.setDynamicSearch(options.dynamicSearch);
	    this.setSearchFields(options.searchFields);
	    this.setSearchCacheLimits(options.searchCacheLimits);
	  }
	  babelHelpers.createClass(Entity, [{
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	  }, {
	    key: "getOptions",
	    value: function getOptions() {
	      return this.options;
	    }
	  }, {
	    key: "getItemOptions",
	    value: function getItemOptions() {
	      return this.itemOptions;
	    }
	  }, {
	    key: "getItemOption",
	    value: function getItemOption(option, entityType) {
	      return this.constructor.getOptionInternal(this.itemOptions, option, entityType);
	    }
	  }, {
	    key: "getTagOptions",
	    value: function getTagOptions() {
	      return this.tagOptions;
	    }
	  }, {
	    key: "getTagOption",
	    value: function getTagOption(option, entityType) {
	      return this.constructor.getOptionInternal(this.tagOptions, option, entityType);
	    }
	  }, {
	    key: "getBadges",
	    value: function getBadges(item) {
	      const entityTypeBadges = this.getItemOption('badges', item.getEntityType()) || [];
	      const badges = [...entityTypeBadges];
	      this.badgeOptions.forEach(badge => {
	        if (main_core.Type.isPlainObject(badge.conditions)) {
	          for (const condition in badge.conditions) {
	            if (item.getCustomData().get(condition) !== badge.conditions[condition]) {
	              return;
	            }
	          }
	          badges.push(badge);
	        }
	      });
	      return badges;
	    }
	  }, {
	    key: "getOptionTextNode",
	    value: function getOptionTextNode(option, entityType) {
	      if (!main_core.Type.isString(option)) {
	        return null;
	      }
	      if (!main_core.Type.isString(entityType)) {
	        entityType = 'default';
	      }
	      let optionNodes = this.textNodes.get(option);
	      let node = optionNodes ? optionNodes.get(entityType) : undefined;
	      if (main_core.Type.isUndefined(node)) {
	        if (!optionNodes) {
	          optionNodes = new Map();
	          this.textNodes.set(option, optionNodes);
	        }
	        const itemOption = this.getItemOption(option, entityType);
	        node = main_core.Type.isString(itemOption) || main_core.Type.isPlainObject(itemOption) ? new TextNode(itemOption) : null;
	        optionNodes.set(entityType, node);
	      }
	      return node;
	    }
	  }, {
	    key: "isSearchable",
	    value: function isSearchable() {
	      return this.searchable;
	    }
	  }, {
	    key: "setSearchable",
	    value: function setSearchable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.searchable = flag;
	      }
	    }
	  }, {
	    key: "getSearchFields",
	    value: function getSearchFields() {
	      return this.searchFields;
	    }
	  }, {
	    key: "setSearchFields",
	    value: function setSearchFields(searchFields) {
	      this.searchFields.clear();

	      // Default Search Fields
	      const titleField = new SearchField({
	        name: 'title',
	        searchable: true,
	        system: true,
	        type: 'string'
	      });
	      const subtitleField = new SearchField({
	        name: 'subtitle',
	        searchable: true,
	        system: true,
	        type: 'string'
	      });
	      this.searchFields.add(titleField);
	      this.searchFields.add(subtitleField);

	      // Custom Search Fields
	      const customFields = main_core.Type.isArray(searchFields) ? searchFields : [];
	      customFields.forEach(fieldOptions => {
	        const field = new SearchField(fieldOptions);
	        if (field.isSystem())
	          // Entity can override default fields.
	          {
	            // delete a default title field
	            if (field.getName() === 'title') {
	              this.searchFields.delete(titleField);
	            } else if (field.getName() === 'subtitle') {
	              this.searchFields.delete(subtitleField);
	            }
	          }
	        this.searchFields.add(field);
	      });
	      this.searchFields.forEach((field, index) => {
	        field.setSort(index);
	      });
	    }
	  }, {
	    key: "setSearchCacheLimits",
	    value: function setSearchCacheLimits(limits) {
	      if (main_core.Type.isArrayFilled(limits)) {
	        limits.forEach(limit => {
	          if (main_core.Type.isStringFilled(limit)) {
	            this.searchCacheLimits.push(new RegExp(limit, 'i'));
	          }
	        });
	      }
	    }
	  }, {
	    key: "getSearchCacheLimits",
	    value: function getSearchCacheLimits() {
	      return this.searchCacheLimits;
	    }
	  }, {
	    key: "hasDynamicLoad",
	    value: function hasDynamicLoad() {
	      return this.dynamicLoad;
	    }
	  }, {
	    key: "setDynamicLoad",
	    value: function setDynamicLoad(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.dynamicLoad = flag;
	      }
	    }
	  }, {
	    key: "hasDynamicSearch",
	    value: function hasDynamicSearch() {
	      return this.dynamicSearch;
	    }
	  }, {
	    key: "setDynamicSearch",
	    value: function setDynamicSearch(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.dynamicSearch = flag;
	      }
	    }
	  }, {
	    key: "getFilters",
	    value: function getFilters() {
	      return Array.from(this.filters.values());
	    }
	  }, {
	    key: "addFilters",
	    value: function addFilters(filters) {
	      if (main_core.Type.isArray(filters)) {
	        filters.forEach(filterOptions => {
	          this.addFilter(filterOptions);
	        });
	      }
	    }
	  }, {
	    key: "addFilter",
	    value: function addFilter(filterOptions) {
	      if (main_core.Type.isPlainObject(filterOptions)) {
	        const filter = new EntityFilter(filterOptions);
	        this.filters.set(filter.getId(), filter);
	      }
	    }
	  }, {
	    key: "getFilter",
	    value: function getFilter(id) {
	      return this.filters.get(id) || null;
	    }
	  }, {
	    key: "getSubstituteEntityId",
	    value: function getSubstituteEntityId() {
	      return this.substituteEntityId;
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      return {
	        id: this.getId(),
	        options: this.getOptions(),
	        searchable: this.isSearchable(),
	        dynamicLoad: this.hasDynamicLoad(),
	        dynamicSearch: this.hasDynamicSearch(),
	        filters: this.getFilters(),
	        substituteEntityId: this.getSubstituteEntityId()
	      };
	    }
	  }], [{
	    key: "getDefaultOptions",
	    value: function getDefaultOptions() {
	      if (this.defaultOptions === null) {
	        this.defaultOptions = {};
	        this.getExtensions().forEach(extension => {
	          const settings = main_core.Extension.getSettings(extension);
	          const entities = settings.get('entities', []);
	          entities.forEach(entity => {
	            if (main_core.Type.isStringFilled(entity.id) && main_core.Type.isPlainObject(entity.options)) {
	              this.defaultOptions[entity.id] = JSON.parse(JSON.stringify(entity.options)); // clone
	            }
	          });
	        });
	      }

	      return this.defaultOptions;
	    }
	  }, {
	    key: "getExtensions",
	    value: function getExtensions() {
	      if (this.extensions === null) {
	        const settings = main_core.Extension.getSettings('ui.entity-selector');
	        this.extensions = settings.get('extensions', []);
	      }
	      return this.extensions;
	    }
	  }, {
	    key: "getEntityDefaultOptions",
	    value: function getEntityDefaultOptions(entityId) {
	      return this.getDefaultOptions()[entityId] || null;
	    }
	  }, {
	    key: "getItemOptions",
	    value: function getItemOptions(entityId, entityType) {
	      if (!main_core.Type.isStringFilled(entityId)) {
	        return null;
	      }
	      const options = this.getEntityDefaultOptions(entityId);
	      const itemOptions = options && options['itemOptions'] ? options['itemOptions'] : null;
	      if (main_core.Type.isUndefined(entityType)) {
	        return itemOptions;
	      } else {
	        return itemOptions && !main_core.Type.isUndefined(itemOptions[entityType]) ? itemOptions[entityType] : null;
	      }
	    }
	  }, {
	    key: "getTagOptions",
	    value: function getTagOptions(entityId, entityType) {
	      if (!main_core.Type.isStringFilled(entityId)) {
	        return null;
	      }
	      const options = this.getEntityDefaultOptions(entityId);
	      const tagOptions = options && options['tagOptions'] ? options['tagOptions'] : null;
	      if (main_core.Type.isUndefined(entityType)) {
	        return tagOptions;
	      } else {
	        return tagOptions && !main_core.Type.isUndefined(tagOptions[entityType]) ? tagOptions[entityType] : null;
	      }
	    }
	  }, {
	    key: "getItemOption",
	    value: function getItemOption(entityId, option, entityType) {
	      return this.getOptionInternal(this.getItemOptions(entityId), option, entityType);
	    }
	  }, {
	    key: "getTagOption",
	    value: function getTagOption(entityId, option, entityType) {
	      return this.getOptionInternal(this.getTagOptions(entityId), option, entityType);
	    }
	  }, {
	    key: "getOptionInternal",
	    value: function getOptionInternal(options, option, type) {
	      if (!main_core.Type.isPlainObject(options)) {
	        return null;
	      }
	      if (options[type] && !main_core.Type.isUndefined(options[type][option])) {
	        return options[type][option];
	      } else if (options['default'] && !main_core.Type.isUndefined(options['default'][option])) {
	        return options['default'][option];
	      }
	      return null;
	    }
	  }]);
	  return Entity;
	}();
	babelHelpers.defineProperty(Entity, "extensions", null);
	babelHelpers.defineProperty(Entity, "defaultOptions", null);

	let TypeUtils = /*#__PURE__*/function () {
	  function TypeUtils() {
	    babelHelpers.classCallCheck(this, TypeUtils);
	  }
	  babelHelpers.createClass(TypeUtils, null, [{
	    key: "createMapFromOptions",
	    value: function createMapFromOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        return new Map(Object.entries(options));
	      }
	      const map = new Map();
	      if (main_core.Type.isArrayFilled(options)) {
	        options.forEach(element => {
	          if (main_core.Type.isArray(element) && element.length === 2 && main_core.Type.isString(element[0])) {
	            map.set(element[0], element[1]);
	          }
	        });
	      }
	      return map;
	    }
	  }, {
	    key: "convertMapToObject",
	    value: function convertMapToObject(map) {
	      const obj = {};
	      if (main_core.Type.isMap(map)) {
	        map.forEach((value, key) => {
	          if (main_core.Type.isString(key)) {
	            obj[key] = value;
	          }
	        });
	      }
	      return obj;
	    }
	  }]);
	  return TypeUtils;
	}();

	function _classPrivateMethodInitSpec$1(obj, privateSet) { _checkPrivateRedeclaration$1(obj, privateSet); privateSet.add(obj); }
	function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
	function _classPrivateMethodGet$1(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; }
	var _renderNodes = /*#__PURE__*/new WeakSet();
	/**
	 * @memberof BX.UI.EntitySelector
	 * @package ui.entity-selector
	 */
	let Item = /*#__PURE__*/function () {
	  function Item(itemOptions) {
	    babelHelpers.classCallCheck(this, Item);
	    _classPrivateMethodInitSpec$1(this, _renderNodes);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "entityId", null);
	    babelHelpers.defineProperty(this, "entityType", null);
	    babelHelpers.defineProperty(this, "title", null);
	    babelHelpers.defineProperty(this, "subtitle", null);
	    babelHelpers.defineProperty(this, "supertitle", null);
	    babelHelpers.defineProperty(this, "caption", null);
	    babelHelpers.defineProperty(this, "captionOptions", {});
	    babelHelpers.defineProperty(this, "avatar", null);
	    babelHelpers.defineProperty(this, "avatarOptions", null);
	    babelHelpers.defineProperty(this, "textColor", null);
	    babelHelpers.defineProperty(this, "link", null);
	    babelHelpers.defineProperty(this, "linkTitle", null);
	    babelHelpers.defineProperty(this, "tagOptions", null);
	    babelHelpers.defineProperty(this, "badges", null);
	    babelHelpers.defineProperty(this, "badgesOptions", {});
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "nodes", new Set());
	    babelHelpers.defineProperty(this, "selected", false);
	    babelHelpers.defineProperty(this, "searchable", true);
	    babelHelpers.defineProperty(this, "saveable", true);
	    babelHelpers.defineProperty(this, "deselectable", true);
	    babelHelpers.defineProperty(this, "hidden", false);
	    babelHelpers.defineProperty(this, "searchIndex", null);
	    babelHelpers.defineProperty(this, "customData", null);
	    babelHelpers.defineProperty(this, "sort", null);
	    babelHelpers.defineProperty(this, "contextSort", null);
	    babelHelpers.defineProperty(this, "globalSort", null);
	    const options = main_core.Type.isPlainObject(itemOptions) ? itemOptions : {};
	    if (!main_core.Type.isStringFilled(options.id) && !main_core.Type.isNumber(options.id)) {
	      throw new Error('EntitySelector.Item: "id" parameter is required.');
	    }
	    if (!main_core.Type.isStringFilled(options.entityId)) {
	      throw new Error('EntitySelector.Item: "entityId" parameter is required.');
	    }
	    this.id = options.id;
	    this.entityId = options.entityId.toLowerCase();
	    this.entityType = main_core.Type.isStringFilled(options.entityType) ? options.entityType : 'default';
	    this.selected = main_core.Type.isBoolean(options.selected) ? options.selected : false;
	    this.customData = TypeUtils.createMapFromOptions(options.customData);
	    this.tagOptions = TypeUtils.createMapFromOptions(options.tagOptions);
	    this.setTitle(options.title);
	    this.setSubtitle(options.subtitle);
	    this.setSupertitle(options.supertitle);
	    this.setCaption(options.caption);
	    this.setCaptionOptions(options.captionOptions);
	    this.setAvatar(options.avatar);
	    this.setAvatarOptions(options.avatarOptions);
	    this.setTextColor(options.textColor);
	    this.setLink(options.link);
	    this.setLinkTitle(options.linkTitle);
	    this.setBadges(options.badges);
	    this.setBadgesOptions(options.badgesOptions);
	    this.setSearchable(options.searchable);
	    this.setSaveable(options.saveable);
	    this.setDeselectable(options.deselectable);
	    this.setHidden(options.hidden);
	    this.setContextSort(options.contextSort);
	    this.setGlobalSort(options.globalSort);
	    this.setSort(options.sort);
	  }
	  babelHelpers.createClass(Item, [{
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	  }, {
	    key: "getEntityId",
	    value: function getEntityId() {
	      return this.entityId;
	    }
	  }, {
	    key: "getEntity",
	    value: function getEntity() {
	      let entity = this.getDialog().getEntity(this.getEntityId());
	      if (entity === null) {
	        entity = new Entity({
	          id: this.getEntityId()
	        });
	        this.getDialog().addEntity(entity);
	      }
	      return entity;
	    }
	  }, {
	    key: "getEntityType",
	    value: function getEntityType() {
	      return this.entityType;
	    }
	  }, {
	    key: "getTitle",
	    value: function getTitle() {
	      const titleNode = this.getTitleNode();
	      return titleNode !== null && !titleNode.isNullable() ? titleNode.getText() : '';
	    }
	  }, {
	    key: "getTitleNode",
	    value: function getTitleNode() {
	      return this.title;
	    }
	  }, {
	    key: "setTitle",
	    value: function setTitle(title) {
	      if (main_core.Type.isStringFilled(title) || main_core.Type.isPlainObject(title) || title === null) {
	        this.title = title === null ? null : new TextNode(title);
	        this.resetSearchIndex();
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getSubtitle",
	    value: function getSubtitle() {
	      const subtitleNode = this.getSubtitleNode();
	      return subtitleNode !== null ? subtitleNode.getText() : null;
	    }
	  }, {
	    key: "getSubtitleNode",
	    value: function getSubtitleNode() {
	      return this.subtitle !== null ? this.subtitle : this.getEntityTextNode('subtitle');
	    }
	  }, {
	    key: "setSubtitle",
	    value: function setSubtitle(subtitle) {
	      if (main_core.Type.isString(subtitle) || main_core.Type.isPlainObject(subtitle) || subtitle === null) {
	        this.subtitle = subtitle === null ? null : new TextNode(subtitle);
	        this.resetSearchIndex();
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getSupertitle",
	    value: function getSupertitle() {
	      const supertitleNode = this.getSupertitleNode();
	      return supertitleNode !== null ? supertitleNode.getText() : null;
	    }
	  }, {
	    key: "getSupertitleNode",
	    value: function getSupertitleNode() {
	      return this.supertitle !== null ? this.supertitle : this.getEntityTextNode('supertitle');
	    }
	  }, {
	    key: "setSupertitle",
	    value: function setSupertitle(supertitle) {
	      if (main_core.Type.isString(supertitle) || main_core.Type.isPlainObject(supertitle) || supertitle === null) {
	        this.supertitle = supertitle === null ? null : new TextNode(supertitle);
	        this.resetSearchIndex();
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getCaption",
	    value: function getCaption() {
	      const captionNode = this.getCaptionNode();
	      return captionNode !== null ? captionNode.getText() : null;
	    }
	  }, {
	    key: "getCaptionNode",
	    value: function getCaptionNode() {
	      return this.caption !== null ? this.caption : this.getEntityTextNode('caption');
	    }
	  }, {
	    key: "setCaption",
	    value: function setCaption(caption) {
	      if (main_core.Type.isString(caption) || main_core.Type.isPlainObject(caption) || caption === null) {
	        this.caption = caption === null ? null : new TextNode(caption);
	        this.resetSearchIndex();
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getCaptionOption",
	    value: function getCaptionOption(option) {
	      if (!main_core.Type.isUndefined(this.captionOptions[option])) {
	        return this.captionOptions[option];
	      }
	      const captionOptions = this.getEntityItemOption('captionOptions');
	      if (main_core.Type.isPlainObject(captionOptions) && !main_core.Type.isUndefined(captionOptions[option])) {
	        return captionOptions[option];
	      }
	      return null;
	    }
	  }, {
	    key: "setCaptionOption",
	    value: function setCaptionOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        this.captionOptions[option] = value;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "setCaptionOptions",
	    value: function setCaptionOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setCaptionOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getAvatar",
	    value: function getAvatar() {
	      return this.avatar !== null ? this.avatar : this.getEntityItemOption('avatar');
	    }
	  }, {
	    key: "setAvatar",
	    value: function setAvatar(avatar) {
	      if (main_core.Type.isString(avatar) || avatar === null) {
	        this.avatar = avatar;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getAvatarOption",
	    value: function getAvatarOption(option) {
	      if (this.avatarOptions !== null && !main_core.Type.isUndefined(this.avatarOptions[option])) {
	        return this.avatarOptions[option];
	      }
	      const avatarOptions = this.getEntityItemOption('avatarOptions');
	      if (main_core.Type.isPlainObject(avatarOptions) && !main_core.Type.isUndefined(avatarOptions[option])) {
	        return avatarOptions[option];
	      }
	      return null;
	    }
	  }, {
	    key: "setAvatarOption",
	    value: function setAvatarOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        if (this.avatarOptions === null) {
	          this.avatarOptions = {};
	        }
	        this.avatarOptions[option] = value;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "setAvatarOptions",
	    value: function setAvatarOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setAvatarOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getTextColor",
	    value: function getTextColor() {
	      return this.textColor !== null ? this.textColor : this.getEntityItemOption('textColor');
	    }
	  }, {
	    key: "setTextColor",
	    value: function setTextColor(textColor) {
	      if (main_core.Type.isString(textColor) || textColor === null) {
	        this.textColor = textColor;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getLink",
	    value: function getLink() {
	      const link = this.link !== null ? this.link : this.getEntityItemOption('link');
	      return this.replaceMacros(link);
	    }
	  }, {
	    key: "setLink",
	    value: function setLink(link) {
	      if (main_core.Type.isString(link) || link === null) {
	        this.link = link;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getLinkTitle",
	    value: function getLinkTitle() {
	      const linkTitleNode = this.getLinkTitleNode();
	      return linkTitleNode !== null ? linkTitleNode.getText() : main_core.Loc.getMessage('UI_SELECTOR_ITEM_LINK_TITLE');
	    }
	  }, {
	    key: "getLinkTitleNode",
	    value: function getLinkTitleNode() {
	      return this.linkTitle !== null ? this.linkTitle : this.getEntityTextNode('linkTitle');
	    }
	  }, {
	    key: "setLinkTitle",
	    value: function setLinkTitle(linkTitle) {
	      if (main_core.Type.isString(linkTitle) || main_core.Type.isPlainObject(linkTitle) || linkTitle === null) {
	        this.linkTitle = linkTitle === null ? null : new TextNode(linkTitle);
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getBadges",
	    value: function getBadges() {
	      if (this.badges !== null) {
	        return this.badges;
	      }
	      const badges = this.getEntity().getBadges(this);
	      if (main_core.Type.isArray(badges)) {
	        this.setBadges(badges);
	      } else {
	        this.badges = [];
	      }
	      return this.badges;
	    }
	  }, {
	    key: "setBadges",
	    value: function setBadges(badges) {
	      if (main_core.Type.isArray(badges)) {
	        this.badges = [];
	        badges.forEach(badge => {
	          this.badges.push(new ItemBadge(badge));
	        });
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      } else if (badges === null) {
	        this.badges = null;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "getBadgesOption",
	    value: function getBadgesOption(option) {
	      if (!main_core.Type.isUndefined(this.badgesOptions[option])) {
	        return this.badgesOptions[option];
	      }
	      const badgesOptions = this.getEntityItemOption('badgesOptions');
	      if (main_core.Type.isPlainObject(badgesOptions) && !main_core.Type.isUndefined(badgesOptions[option])) {
	        return badgesOptions[option];
	      }
	      return null;
	    }
	  }, {
	    key: "setBadgesOption",
	    value: function setBadgesOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        this.badgesOptions[option] = value;
	        _classPrivateMethodGet$1(this, _renderNodes, _renderNodes2).call(this);
	      }
	    }
	  }, {
	    key: "setBadgesOptions",
	    value: function setBadgesOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setBadgesOption(option, options[option]);
	        });
	      }
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "setDialog",
	    value: function setDialog(dialog) {
	      this.dialog = dialog;
	    }
	  }, {
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "createNode",
	    value: function createNode(nodeOptions) {
	      const itemNode = new ItemNode(this, nodeOptions);
	      this.nodes.add(itemNode);
	      return itemNode;
	    }
	  }, {
	    key: "removeNode",
	    value: function removeNode(node) {
	      this.nodes.delete(node);
	    }
	  }, {
	    key: "getNodes",
	    value: function getNodes() {
	      return this.nodes;
	    }
	  }, {
	    key: "select",
	    value: function select(preselectedMode = false) {
	      if (this.selected) {
	        return;
	      }
	      const dialog = this.getDialog();
	      const emitEvents = dialog && !preselectedMode;
	      if (emitEvents) {
	        const event = new main_core_events.BaseEvent({
	          data: {
	            item: this
	          }
	        });
	        dialog.emit('Item:onBeforeSelect', event);
	        if (event.isDefaultPrevented()) {
	          return;
	        }
	      }
	      this.selected = true;
	      if (dialog) {
	        dialog.handleItemSelect(this, !preselectedMode);
	      }
	      if (this.isRendered()) {
	        this.getNodes().forEach(node => {
	          node.select();
	        });
	      }
	      if (emitEvents) {
	        dialog.emit('Item:onSelect', {
	          item: this
	        });
	        dialog.saveRecentItem(this);
	      }
	    }
	  }, {
	    key: "deselect",
	    value: function deselect(preselectedMode = false) {
	      if (!this.selected) {
	        return;
	      }
	      const dialog = this.getDialog();
	      if (dialog) {
	        const event = new main_core_events.BaseEvent({
	          data: {
	            item: this
	          }
	        });
	        dialog.emit('Item:onBeforeDeselect', event);
	        if (event.isDefaultPrevented()) {
	          return;
	        }
	      }
	      this.selected = false;
	      if (this.isRendered()) {
	        this.getNodes().forEach(node => {
	          node.deselect();
	        });
	      }
	      if (dialog) {
	        dialog.handleItemDeselect(this, !preselectedMode);
	        dialog.emit('Item:onDeselect', {
	          item: this
	        });
	      }
	    }
	  }, {
	    key: "isSelected",
	    value: function isSelected() {
	      return this.selected;
	    }
	  }, {
	    key: "setSearchable",
	    value: function setSearchable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.searchable = flag;
	      }
	    }
	  }, {
	    key: "isSearchable",
	    value: function isSearchable() {
	      return this.searchable;
	    }
	  }, {
	    key: "setSaveable",
	    value: function setSaveable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.saveable = flag;
	      }
	    }
	  }, {
	    key: "isSaveable",
	    value: function isSaveable() {
	      return this.saveable;
	    }
	  }, {
	    key: "setDeselectable",
	    value: function setDeselectable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.deselectable = flag;
	        if (this.getDialog() && this.getDialog().getTagSelector()) {
	          const tag = this.getDialog().getTagSelector().getTag({
	            id: this.getId(),
	            entityId: this.getEntityId()
	          });
	          if (tag) {
	            tag.setDeselectable(flag);
	          }
	        }
	      }
	    }
	  }, {
	    key: "isDeselectable",
	    value: function isDeselectable() {
	      return this.deselectable;
	    }
	  }, {
	    key: "setHidden",
	    value: function setHidden(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.hidden = flag;
	        if (this.isRendered()) {
	          this.getNodes().forEach(node => {
	            node.setHidden(flag);
	          });
	        }
	      }
	    }
	  }, {
	    key: "isHidden",
	    value: function isHidden() {
	      return this.hidden;
	    }
	  }, {
	    key: "setContextSort",
	    value: function setContextSort(sort) {
	      if (main_core.Type.isNumber(sort) || sort === null) {
	        this.contextSort = sort;
	      }
	    }
	  }, {
	    key: "getContextSort",
	    value: function getContextSort() {
	      return this.contextSort;
	    }
	  }, {
	    key: "setGlobalSort",
	    value: function setGlobalSort(sort) {
	      if (main_core.Type.isNumber(sort) || sort === null) {
	        this.globalSort = sort;
	      }
	    }
	  }, {
	    key: "getGlobalSort",
	    value: function getGlobalSort() {
	      return this.globalSort;
	    }
	  }, {
	    key: "setSort",
	    value: function setSort(sort) {
	      if (main_core.Type.isNumber(sort) || sort === null) {
	        this.sort = sort;
	      }
	    }
	  }, {
	    key: "getSort",
	    value: function getSort() {
	      return this.sort;
	    }
	  }, {
	    key: "getSearchIndex",
	    value: function getSearchIndex() {
	      if (this.searchIndex === null) {
	        this.searchIndex = SearchIndex.create(this);
	      }
	      return this.searchIndex;
	    }
	  }, {
	    key: "resetSearchIndex",
	    value: function resetSearchIndex() {
	      this.searchIndex = null;
	    }
	  }, {
	    key: "getCustomData",
	    value: function getCustomData() {
	      return this.customData;
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.getDialog() && this.getDialog().isRendered();
	    }
	  }, {
	    key: "getEntityItemOption",
	    value: function getEntityItemOption(option) {
	      return this.getEntity().getItemOption(option, this.getEntityType());
	    }
	  }, {
	    key: "getEntityTagOption",
	    value: function getEntityTagOption(option) {
	      return this.getEntity().getTagOption(option, this.getEntityType());
	    }
	  }, {
	    key: "getEntityTextNode",
	    value: function getEntityTextNode(option) {
	      return this.getEntity().getOptionTextNode(option, this.getEntityType());
	    }
	  }, {
	    key: "getTagOptions",
	    value: function getTagOptions() {
	      return this.tagOptions;
	    }
	  }, {
	    key: "getTagOption",
	    value: function getTagOption(option) {
	      const value = this.getTagOptions().get(option);
	      if (!main_core.Type.isUndefined(value)) {
	        return value;
	      }
	      return null;
	    }
	  }, {
	    key: "getTagGlobalOption",
	    value: function getTagGlobalOption(option, useItemOptions = false) {
	      if (!main_core.Type.isStringFilled(option)) {
	        return null;
	      }
	      let value = this.getTagOption(option);
	      if (value === null && useItemOptions === true && this[option] !== null) {
	        value = this[option];
	      }
	      if (value === null && this.getDialog().getTagSelector()) {
	        const fn = `getTag${main_core.Text.toPascalCase(option)}`;
	        if (main_core.Type.isFunction(this.getDialog().getTagSelector()[fn])) {
	          value = this.getDialog().getTagSelector()[fn]();
	        }
	      }
	      if (value === null) {
	        value = this.getEntityTagOption(option);
	      }
	      if (value === null && useItemOptions === true) {
	        value = this.getEntityItemOption(option);
	      }
	      return value;
	    }
	  }, {
	    key: "getTagBgColor",
	    value: function getTagBgColor() {
	      return this.getTagGlobalOption('bgColor');
	    }
	  }, {
	    key: "getTagTextColor",
	    value: function getTagTextColor() {
	      return this.getTagGlobalOption('textColor');
	    }
	  }, {
	    key: "getTagMaxWidth",
	    value: function getTagMaxWidth() {
	      return this.getTagGlobalOption('maxWidth');
	    }
	  }, {
	    key: "getTagFontWeight",
	    value: function getTagFontWeight() {
	      return this.getTagGlobalOption('fontWeight');
	    }
	  }, {
	    key: "getTagAvatar",
	    value: function getTagAvatar() {
	      return this.getTagGlobalOption('avatar', true);
	    }
	  }, {
	    key: "getTagAvatarOptions",
	    value: function getTagAvatarOptions() {
	      return this.getTagGlobalOption('avatarOptions', true);
	    }
	  }, {
	    key: "getTagLink",
	    value: function getTagLink() {
	      return this.replaceMacros(this.getTagGlobalOption('link', true));
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "replaceMacros",
	    value: function replaceMacros(str) {
	      if (!main_core.Type.isStringFilled(str)) {
	        return str;
	      }
	      return str.replace(/#id#/i, this.getId()).replace(/#element_id#/i, this.getId());
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "createTag",
	    value: function createTag() {
	      return {
	        id: this.getId(),
	        entityId: this.getEntityId(),
	        entityType: this.getEntityType(),
	        title: this.getTagOption('title') || this.getTitleNode() && this.getTitleNode().toJSON() || '',
	        deselectable: this.isDeselectable(),
	        avatar: this.getTagAvatar(),
	        avatarOptions: this.getTagAvatarOptions(),
	        link: this.getTagLink(),
	        maxWidth: this.getTagMaxWidth(),
	        textColor: this.getTagTextColor(),
	        bgColor: this.getTagBgColor(),
	        fontWeight: this.getTagFontWeight(),
	        onclick: this.getTagOption('onclick')
	      };
	    }
	  }, {
	    key: "getAjaxJson",
	    value: function getAjaxJson() {
	      return this.toJSON();
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      return {
	        id: this.getId(),
	        entityId: this.getEntityId(),
	        entityType: this.getEntityType(),
	        selected: this.isSelected(),
	        deselectable: this.isDeselectable(),
	        searchable: this.isSearchable(),
	        saveable: this.isSaveable(),
	        hidden: this.isHidden(),
	        title: this.getTitleNode(),
	        link: this.getLink(),
	        linkTitle: this.getLinkTitleNode(),
	        subtitle: this.getSubtitleNode(),
	        supertitle: this.getSupertitleNode(),
	        caption: this.getCaptionNode(),
	        avatar: this.getAvatar(),
	        textColor: this.getTextColor(),
	        sort: this.getSort(),
	        contextSort: this.getContextSort(),
	        globalSort: this.getGlobalSort(),
	        customData: TypeUtils.convertMapToObject(this.getCustomData()),
	        tagOptions: TypeUtils.convertMapToObject(this.getTagOptions()),
	        badges: this.getBadges()
	      };
	    }
	  }]);
	  return Item;
	}();
	function _renderNodes2() {
	  if (this.isRendered()) {
	    this.getNodes().forEach(node => {
	      node.render();
	    });
	  }
	}

	let _ = t => t,
	  _t;
	let BaseStub = /*#__PURE__*/function () {
	  function BaseStub(tab, options) {
	    babelHelpers.classCallCheck(this, BaseStub);
	    babelHelpers.defineProperty(this, "tab", null);
	    babelHelpers.defineProperty(this, "autoShow", true);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    babelHelpers.defineProperty(this, "content", null);
	    this.options = main_core.Type.isPlainObject(options) ? options : {};
	    this.tab = tab;
	    this.autoShow = this.getOption('autoShow', true);
	  }

	  /**
	   * @abstract
	   */
	  babelHelpers.createClass(BaseStub, [{
	    key: "render",
	    value: function render() {
	      throw new Error('You must implement render() method.');
	    }
	  }, {
	    key: "getTab",
	    value: function getTab() {
	      return this.tab;
	    }
	  }, {
	    key: "getOuterContainer",
	    value: function getOuterContainer() {
	      return this.cache.remember('outer-container', () => {
	        return main_core.Tag.render(_t || (_t = _`
				<div class="ui-selector-tab-stub">${0}</div>
			`), this.render());
	      });
	    }
	  }, {
	    key: "isAutoShow",
	    value: function isAutoShow() {
	      return this.autoShow;
	    }
	  }, {
	    key: "show",
	    value: function show() {
	      main_core.Dom.append(this.getOuterContainer(), this.getTab().getContainer());
	      /*requestAnimationFrame(() => {
	      	Dom.addClass(this.getOuterContainer(), 'ui-selector-tab-stub--show');
	      });*/
	    }
	  }, {
	    key: "hide",
	    value: function hide() {
	      // Dom.removeClass(this.getOuterContainer(), 'ui-selector-tab-stub--show');
	      main_core.Dom.remove(this.getOuterContainer());
	    }
	  }, {
	    key: "getOptions",
	    value: function getOptions() {
	      return this.options;
	    }
	  }, {
	    key: "getOption",
	    value: function getOption(option, defaultValue) {
	      if (!main_core.Type.isUndefined(this.options[option])) {
	        return this.options[option];
	      } else if (!main_core.Type.isUndefined(defaultValue)) {
	        return defaultValue;
	      }
	      return null;
	    }
	  }]);
	  return BaseStub;
	}();

	let _$1 = t => t,
	  _t$1,
	  _t2,
	  _t3,
	  _t4;
	let DefaultStub = /*#__PURE__*/function (_BaseStub) {
	  babelHelpers.inherits(DefaultStub, _BaseStub);
	  function DefaultStub(tab, options) {
	    var _this;
	    babelHelpers.classCallCheck(this, DefaultStub);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(DefaultStub).call(this, tab, options));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "content", null);
	    return _this;
	  }
	  babelHelpers.createClass(DefaultStub, [{
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        const subtitle = this.getOption('subtitle');
	        const title = main_core.Type.isStringFilled(this.getOption('title')) ? this.getOption('title') : this.getDefaultTitle();
	        const icon = this.getOption('icon') || this.getTab().getIcon('default');
	        let iconOpacity = 35;
	        if (main_core.Type.isNumber(this.getOption('iconOpacity'))) {
	          iconOpacity = Math.min(100, Math.max(0, this.getOption('iconOpacity')));
	        }
	        const iconStyle = main_core.Type.isStringFilled(icon) ? `style="background-image: url('${encodeUrl(icon)}'); opacity: ${iconOpacity / 100};"` : '';
	        const arrow = this.getOption('arrow', false) && this.getTab().getDialog().getActiveFooter() !== null;
	        return main_core.Tag.render(_t$1 || (_t$1 = _$1`
				<div class="ui-selector-tab-default-stub">
					<div class="ui-selector-tab-default-stub-icon" ${0}></div>
					<div class="ui-selector-tab-default-stub-titles">
						<div class="ui-selector-tab-default-stub-title">${0}</div>
						${0}
					</div>
					
					${0}
				</div>
			`), iconStyle, title, subtitle ? main_core.Tag.render(_t2 || (_t2 = _$1`<div class="ui-selector-tab-default-stub-subtitle">${0}</div>`), subtitle) : '', arrow ? main_core.Tag.render(_t3 || (_t3 = _$1`<div class="ui-selector-tab-default-stub-arrow"></div>`)) : '');
	      });
	    }
	  }, {
	    key: "getDefaultTitle",
	    value: function getDefaultTitle() {
	      const titleNode = this.getTab().getTitleNode();
	      if (titleNode === null) {
	        return main_core.Loc.getMessage('UI_SELECTOR_TAB_STUB_TITLE').replace(/#TAB_TITLE#/, '');
	      }
	      const titleContainer = main_core.Tag.render(_t4 || (_t4 = _$1`<span class="ui-selector-tab-default-stub-title"></span>`));
	      titleNode.renderTo(titleContainer);
	      return main_core.Loc.getMessage('UI_SELECTOR_TAB_STUB_TITLE').replace(/#TAB_TITLE#/, titleContainer.innerHTML);
	    }
	  }, {
	    key: "render",
	    value: function render() {
	      return this.getContainer();
	    }
	  }]);
	  return DefaultStub;
	}(BaseStub);

	let _$2 = t => t,
	  _t$2;
	let BaseHeader = /*#__PURE__*/function () {
	  function BaseHeader(context, options) {
	    babelHelpers.classCallCheck(this, BaseHeader);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "tab", null);
	    babelHelpers.defineProperty(this, "container", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    this.options = main_core.Type.isPlainObject(options) ? options : {};
	    if (context instanceof Dialog) {
	      this.dialog = context;
	    } else {
	      this.tab = context;
	      this.dialog = this.tab.getDialog();
	    }
	  }
	  babelHelpers.createClass(BaseHeader, [{
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "getTab",
	    value: function getTab() {
	      return this.tab;
	    }
	  }, {
	    key: "show",
	    value: function show() {
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-header--show');
	    }
	  }, {
	    key: "hide",
	    value: function hide() {
	      main_core.Dom.removeClass(this.getContainer(), 'ui-selector-header--show');
	    }
	  }, {
	    key: "getOptions",
	    value: function getOptions() {
	      return this.options;
	    }
	  }, {
	    key: "getOption",
	    value: function getOption(option, defaultValue) {
	      if (!main_core.Type.isUndefined(this.options[option])) {
	        return this.options[option];
	      } else if (!main_core.Type.isUndefined(defaultValue)) {
	        return defaultValue;
	      }
	      return null;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      if (this.container === null) {
	        this.container = main_core.Tag.render(_t$2 || (_t$2 = _$2`
				<div class="ui-selector-header">${0}</div>
			`), this.render());
	      }
	      return this.container;
	    }
	    /**
	     * @abstract
	     */
	  }, {
	    key: "render",
	    value: function render() {
	      throw new Error('You must implement render() method.');
	    }
	  }]);
	  return BaseHeader;
	}();

	let _$3 = t => t,
	  _t$3;
	let BaseFooter = /*#__PURE__*/function () {
	  function BaseFooter(context, options) {
	    babelHelpers.classCallCheck(this, BaseFooter);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "tab", null);
	    babelHelpers.defineProperty(this, "container", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    this.options = main_core.Type.isPlainObject(options) ? options : {};
	    if (context instanceof Dialog) {
	      this.dialog = context;
	    } else {
	      this.tab = context;
	      this.dialog = this.tab.getDialog();
	    }
	  }
	  babelHelpers.createClass(BaseFooter, [{
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "getTab",
	    value: function getTab() {
	      return this.tab;
	    }
	  }, {
	    key: "show",
	    value: function show() {
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-footer--show');
	    }
	  }, {
	    key: "hide",
	    value: function hide() {
	      main_core.Dom.removeClass(this.getContainer(), 'ui-selector-footer--show');
	    }
	  }, {
	    key: "getOptions",
	    value: function getOptions() {
	      return this.options;
	    }
	  }, {
	    key: "getOption",
	    value: function getOption(option, defaultValue) {
	      if (!main_core.Type.isUndefined(this.options[option])) {
	        return this.options[option];
	      } else if (!main_core.Type.isUndefined(defaultValue)) {
	        return defaultValue;
	      }
	      return null;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      if (this.container === null) {
	        this.container = main_core.Tag.render(_t$3 || (_t$3 = _$3`
				<div class="ui-selector-footer">${0}</div>
			`), this.render());
	      }
	      return this.container;
	    }
	    /**
	     * @abstract
	     */
	  }, {
	    key: "render",
	    value: function render() {
	      throw new Error('You must implement render() method.');
	    }
	  }]);
	  return BaseFooter;
	}();

	let _$4 = t => t,
	  _t$4,
	  _t2$1,
	  _t3$1,
	  _t4$1,
	  _t5;
	/**
	 * @memberof BX.UI.EntitySelector
	 */
	let Tab = /*#__PURE__*/function () {
	  function Tab(dialog, tabOptions) {
	    babelHelpers.classCallCheck(this, Tab);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "title", null);
	    babelHelpers.defineProperty(this, "rootNode", null);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "stub", null);
	    babelHelpers.defineProperty(this, "visible", true);
	    babelHelpers.defineProperty(this, "rendered", false);
	    babelHelpers.defineProperty(this, "locked", false);
	    babelHelpers.defineProperty(this, "selected", false);
	    babelHelpers.defineProperty(this, "hovered", false);
	    babelHelpers.defineProperty(this, "icon", {});
	    babelHelpers.defineProperty(this, "textColor", {});
	    babelHelpers.defineProperty(this, "bgColor", {});
	    babelHelpers.defineProperty(this, "itemMaxDepth", 5);
	    babelHelpers.defineProperty(this, "header", null);
	    babelHelpers.defineProperty(this, "showDefaultHeader", true);
	    babelHelpers.defineProperty(this, "footer", null);
	    babelHelpers.defineProperty(this, "showDefaultFooter", true);
	    babelHelpers.defineProperty(this, "showAvatars", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    const options = main_core.Type.isPlainObject(tabOptions) ? tabOptions : {};
	    if (!main_core.Type.isStringFilled(options.id)) {
	      throw new Error('EntitySelector.Tab: "id" parameter is required.');
	    }
	    this.setDialog(dialog);
	    this.id = options.id;
	    this.showDefaultHeader = options.showDefaultHeader !== false;
	    this.showDefaultFooter = options.showDefaultFooter !== false;
	    this.rootNode = new ItemNode(null, {
	      itemOrder: options.itemOrder
	    });
	    this.rootNode.setTab(this);
	    this.setVisible(options.visible);
	    this.setTitle(options.title);
	    this.setItemMaxDepth(options.itemMaxDepth);
	    this.setIcon(options.icon);
	    this.setTextColor(options.textColor);
	    this.setBgColor(options.bgColor);
	    this.setStub(options.stub, options.stubOptions);
	    this.setHeader(options.header, options.headerOptions);
	    this.setFooter(options.footer, options.footerOptions);
	    this.setShowAvatars(options.showAvatars);
	  }
	  babelHelpers.createClass(Tab, [{
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "setDialog",
	    value: function setDialog(dialog) {
	      this.dialog = dialog;
	    }
	  }, {
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "getStub",
	    value: function getStub() {
	      return this.stub;
	    }
	  }, {
	    key: "setStub",
	    value: function setStub(stub, stubOptions) {
	      let instance = null;
	      const options = main_core.Type.isPlainObject(stubOptions) ? stubOptions : {};
	      if (main_core.Type.isString(stub) || main_core.Type.isFunction(stub)) {
	        const className = main_core.Type.isString(stub) ? main_core.Reflection.getClass(stub) : stub;
	        if (main_core.Type.isFunction(className)) {
	          instance = new className(this, options);
	          if (!(instance instanceof BaseStub)) {
	            console.error('EntitySelector: stub is not an instance of BaseStub.');
	            instance = null;
	          }
	        }
	      }
	      if (!instance && stub !== false) {
	        instance = new DefaultStub(this, options);
	      }
	      this.stub = instance;
	    }
	  }, {
	    key: "getHeader",
	    value: function getHeader() {
	      return this.header;
	    }
	  }, {
	    key: "setHeader",
	    value: function setHeader(headerContent, headerOptions) {
	      /** @var {BaseHeader} */
	      let header = null;
	      if (headerContent !== null) {
	        header = Dialog.createHeader(this, headerContent, headerOptions);
	        if (header === null) {
	          return;
	        }
	      }
	      if (this.isRendered() && this.getHeader() !== null) {
	        main_core.Dom.remove(this.getHeader().getContainer());
	        this.getDialog().adjustHeader();
	      }
	      this.header = header;
	      if (this.isRendered()) {
	        this.getDialog().appendHeader(header);
	        this.getDialog().adjustHeader();
	      }
	    }
	  }, {
	    key: "canShowDefaultHeader",
	    value: function canShowDefaultHeader() {
	      return this.showDefaultHeader;
	    }
	  }, {
	    key: "enableDefaultHeader",
	    value: function enableDefaultHeader() {
	      this.showDefaultHeader = true;
	      this.getDialog().adjustHeader();
	    }
	  }, {
	    key: "disableDefaultHeader",
	    value: function disableDefaultHeader() {
	      this.showDefaultHeader = false;
	      this.getDialog().adjustHeader();
	    }
	  }, {
	    key: "getFooter",
	    value: function getFooter() {
	      return this.footer;
	    }
	  }, {
	    key: "setFooter",
	    value: function setFooter(footerContent, footerOptions) {
	      /** @var {BaseFooter} */
	      let footer = null;
	      if (footerContent !== null) {
	        footer = Dialog.createFooter(this, footerContent, footerOptions);
	        if (footer === null) {
	          return;
	        }
	      }
	      if (this.isRendered() && this.getFooter() !== null) {
	        main_core.Dom.remove(this.getFooter().getContainer());
	        this.getDialog().adjustFooter();
	      }
	      this.footer = footer;
	      if (this.isRendered()) {
	        this.getDialog().appendFooter(footer);
	        this.getDialog().adjustFooter();
	      }
	    }
	  }, {
	    key: "canShowDefaultFooter",
	    value: function canShowDefaultFooter() {
	      return this.showDefaultFooter;
	    }
	  }, {
	    key: "enableDefaultFooter",
	    value: function enableDefaultFooter() {
	      this.showDefaultFooter = true;
	      this.getDialog().adjustFooter();
	    }
	  }, {
	    key: "disableDefaultFooter",
	    value: function disableDefaultFooter() {
	      this.showDefaultFooter = false;
	      this.getDialog().adjustFooter();
	    }
	  }, {
	    key: "setShowAvatars",
	    value: function setShowAvatars(flag) {
	      if (main_core.Type.isBoolean(flag) || flag === null) {
	        this.showAvatars = flag;
	        if (this.isRendered()) {
	          this.renderContainer();
	        }
	      }
	    }
	  }, {
	    key: "shouldShowAvatars",
	    value: function shouldShowAvatars() {
	      var _this$showAvatars;
	      return (_this$showAvatars = this.showAvatars) !== null && _this$showAvatars !== void 0 ? _this$showAvatars : this.getDialog().shouldShowAvatars();
	    }
	  }, {
	    key: "getRootNode",
	    value: function getRootNode() {
	      return this.rootNode;
	    }
	  }, {
	    key: "setTitle",
	    value: function setTitle(title) {
	      if (main_core.Type.isStringFilled(title) || main_core.Type.isPlainObject(title) || title === null) {
	        this.title = title === null ? null : new TextNode(title);
	        if (this.isRendered()) {
	          this.renderLabel();
	        }
	      }
	    }
	  }, {
	    key: "getTitle",
	    value: function getTitle() {
	      const titleNode = this.getTitleNode();
	      return titleNode !== null && !titleNode.isNullable() ? titleNode.getText() : '';
	    }
	  }, {
	    key: "getTitleNode",
	    value: function getTitleNode() {
	      return this.title;
	    }
	  }, {
	    key: "setIcon",
	    value: function setIcon(icon) {
	      return this.setProperty('icon', icon);
	    }
	  }, {
	    key: "getIcon",
	    value: function getIcon(state) {
	      return this.getPropertyByState('icon', state);
	    }
	  }, {
	    key: "setBgColor",
	    value: function setBgColor(bgColor) {
	      return this.setProperty('bgColor', bgColor);
	    }
	  }, {
	    key: "getBgColor",
	    value: function getBgColor(state) {
	      return this.getPropertyByState('bgColor', state);
	    }
	  }, {
	    key: "setTextColor",
	    value: function setTextColor(textColor) {
	      return this.setProperty('textColor', textColor);
	    }
	  }, {
	    key: "getTextColor",
	    value: function getTextColor(state) {
	      return this.getPropertyByState('textColor', state);
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "setProperty",
	    value: function setProperty(name, states) {
	      const property = this[name];
	      if (!property) {
	        return;
	      }
	      if (main_core.Type.isPlainObject(states)) {
	        Object.keys(states).forEach(state => {
	          if (main_core.Type.isStringFilled(states[state])) {
	            property[state] = states[state];
	          }
	        });
	      } else if (main_core.Type.isStringFilled(states)) {
	        property['default'] = states;
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "getPropertyByState",
	    value: function getPropertyByState(name, state) {
	      const property = this[name];
	      const labelState = main_core.Type.isStringFilled(state) ? state : 'default';
	      if (!main_core.Type.isUndefined(property) && !main_core.Type.isUndefined(property[labelState])) {
	        return property[labelState];
	      }
	      return null;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "getPropertyByCurrentState",
	    value: function getPropertyByCurrentState(name) {
	      const property = this[name];
	      if (this.isSelected() && this.isHovered() && property.selectedHovered) {
	        return property.selectedHovered;
	      } else if (this.isSelected() && property.selected) {
	        return property.selected;
	      } else if (this.isHovered() && property.hovered) {
	        return property.hovered;
	      } else if (property.default) {
	        return property.default;
	      }
	      return null;
	    }
	  }, {
	    key: "setItemMaxDepth",
	    value: function setItemMaxDepth(depth) {
	      if (main_core.Type.isNumber(depth) && depth > 0) {
	        this.itemMaxDepth = depth;
	      }
	    }
	  }, {
	    key: "getItemMaxDepth",
	    value: function getItemMaxDepth() {
	      return this.itemMaxDepth;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        return main_core.Tag.render(_t$4 || (_t$4 = _$4`
				<div class="ui-selector-tab-content">${0}</div>
			`), this.getItemsContainer());
	      });
	    }
	  }, {
	    key: "getLabelContainer",
	    value: function getLabelContainer() {
	      return this.cache.remember('label', () => {
	        const className = this.isVisible() ? '' : ' ui-selector-tab-label-hidden';
	        return main_core.Tag.render(_t2$1 || (_t2$1 = _$4`
				<div
					class="ui-selector-tab-label${0}"
					onclick="${0}"
					onmouseenter="${0}"
					onmouseleave="${0}"
				>
					${0}
					${0}
				</div>
			`), className, this.handleLabelClick.bind(this), this.handleLabelMouseEnter.bind(this), this.handleLabelMouseLeave.bind(this), this.getIconContainer(), this.getTitleContainer());
	      });
	    }
	  }, {
	    key: "getIconContainer",
	    value: function getIconContainer() {
	      return this.cache.remember('icon', () => {
	        return main_core.Tag.render(_t3$1 || (_t3$1 = _$4`
				<div class="ui-selector-tab-icon"></div>
			`));
	      });
	    }
	  }, {
	    key: "getTitleContainer",
	    value: function getTitleContainer() {
	      return this.cache.remember('title', () => {
	        return main_core.Tag.render(_t4$1 || (_t4$1 = _$4`
				<div class="ui-selector-tab-title"></div>
			`));
	      });
	    }
	  }, {
	    key: "getItemsContainer",
	    value: function getItemsContainer() {
	      return this.cache.remember('items', () => {
	        return main_core.Tag.render(_t5 || (_t5 = _$4`
				<div class="ui-selector-items"></div>
			`));
	      });
	    }
	  }, {
	    key: "render",
	    value: function render() {
	      this.getRootNode().render();
	      this.rendered = true;
	    } /** @internal **/
	  }, {
	    key: "renderLabel",
	    value: function renderLabel() {
	      main_core.Dom.style(this.getTitleContainer(), 'color', this.getPropertyByCurrentState('textColor'));
	      main_core.Dom.style(this.getLabelContainer(), 'background-color', this.getPropertyByCurrentState('bgColor'));
	      const icon = this.getPropertyByCurrentState('icon');
	      main_core.Dom.style(this.getIconContainer(), 'background-image', icon ? `url('${encodeUrl(icon)}')` : null);
	      const titleNode = this.getTitleNode();
	      if (titleNode) {
	        this.getTitleNode().renderTo(this.getTitleContainer());
	      } else {
	        this.getTitleContainer().textContent = '';
	      }
	    } /** @internal **/
	  }, {
	    key: "renderContainer",
	    value: function renderContainer() {
	      const className = 'ui-selector-tab-content--hide-avatars';
	      if (this.shouldShowAvatars()) {
	        main_core.Dom.removeClass(this.getContainer(), className);
	      } else {
	        main_core.Dom.addClass(this.getContainer(), className);
	      }
	    }
	  }, {
	    key: "isVisible",
	    value: function isVisible() {
	      return this.visible;
	    }
	  }, {
	    key: "setVisible",
	    value: function setVisible(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.visible = flag;
	        if (this.isRendered()) {
	          if (this.visible) {
	            main_core.Dom.remove(this.getLabelContainer(), 'ui-selector-tab-label-hidden');
	          } else {
	            main_core.Dom.addClass(this.getLabelContainer(), 'ui-selector-tab-label-hidden');
	          }
	        }
	      }
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.rendered && this.getDialog() && this.getDialog().isRendered();
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "select",
	    value: function select() {
	      if (this.isSelected()) {
	        return;
	      }
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-tab-content-active');
	      if (this.isVisible()) {
	        main_core.Dom.addClass(this.getLabelContainer(), 'ui-selector-tab-label-active');
	        this.renderLabel();
	      }
	      this.selected = true;
	      if (this.isVisible()) {
	        this.renderLabel();
	      }
	      if (this.getHeader()) {
	        this.getHeader().show();
	      }
	      if (this.getFooter()) {
	        this.getFooter().show();
	      }
	      this.getDialog().emit('Tab:onSelect', {
	        tab: this
	      });
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "deselect",
	    value: function deselect() {
	      if (!this.isSelected()) {
	        return;
	      }
	      main_core.Dom.removeClass(this.getContainer(), 'ui-selector-tab-content-active');
	      if (this.isVisible()) {
	        main_core.Dom.removeClass(this.getLabelContainer(), 'ui-selector-tab-label-active');
	      }
	      this.selected = false;
	      if (this.isVisible()) {
	        this.renderLabel();
	      }
	      if (this.getHeader()) {
	        this.getHeader().hide();
	      }
	      if (this.getFooter()) {
	        this.getFooter().hide();
	      }
	      this.getDialog().emit('Tab:onDeselect', {
	        tab: this
	      });
	    }
	  }, {
	    key: "hover",
	    value: function hover() {
	      if (this.isHovered()) {
	        return;
	      }
	      main_core.Dom.addClass(this.getLabelContainer(), 'ui-selector-tab-label-hover');
	      this.hovered = true;
	      this.renderLabel();
	    }
	  }, {
	    key: "unhover",
	    value: function unhover() {
	      if (!this.isHovered()) {
	        return;
	      }
	      main_core.Dom.removeClass(this.getLabelContainer(), 'ui-selector-tab-label-hover');
	      this.hovered = false;
	      this.renderLabel();
	    }
	  }, {
	    key: "isSelected",
	    value: function isSelected() {
	      return this.selected;
	    }
	  }, {
	    key: "isHovered",
	    value: function isHovered() {
	      return this.hovered;
	    }
	  }, {
	    key: "lock",
	    value: function lock() {
	      this.locked = true;
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-tab-content-locked');
	    }
	  }, {
	    key: "unlock",
	    value: function unlock() {
	      this.locked = false;
	      main_core.Dom.removeClass(this.getContainer(), 'ui-selector-tab-content-locked');
	    }
	  }, {
	    key: "isLocked",
	    value: function isLocked() {
	      return this.locked;
	    }
	  }, {
	    key: "handleLabelClick",
	    value: function handleLabelClick() {
	      this.getDialog().selectTab(this.getId());
	    }
	  }, {
	    key: "handleLabelMouseEnter",
	    value: function handleLabelMouseEnter() {
	      this.hover();
	    }
	  }, {
	    key: "handleLabelMouseLeave",
	    value: function handleLabelMouseLeave() {
	      this.unhover();
	    }
	  }]);
	  return Tab;
	}();

	function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration$2(obj, privateMap); privateMap.set(obj, value); }
	function _checkPrivateRedeclaration$2(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }

	/**
	 * @namespace BX.UI.Uploader
	 */
	var _entityId = /*#__PURE__*/new WeakMap();
	let EntityError = /*#__PURE__*/function (_BaseError) {
	  babelHelpers.inherits(EntityError, _BaseError);
	  function EntityError(...args) {
	    var _this;
	    babelHelpers.classCallCheck(this, EntityError);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(EntityError).call(this, ...args));
	    _classPrivateFieldInitSpec(babelHelpers.assertThisInitialized(_this), _entityId, {
	      writable: true,
	      value: void 0
	    });
	    return _this;
	  }
	  babelHelpers.createClass(EntityError, [{
	    key: "setEntityId",
	    value: function setEntityId(entityId) {
	      if (main_core.Type.isStringFilled(entityId)) {
	        babelHelpers.classPrivateFieldSet(this, _entityId, entityId);
	      }
	    }
	  }, {
	    key: "getEntityId",
	    value: function getEntityId() {
	      return babelHelpers.classPrivateFieldGet(this, _entityId);
	    }
	  }]);
	  return EntityError;
	}(main_core.BaseError);

	let _Symbol$iterator;
	function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$3(obj, privateMap); privateMap.set(obj, value); }
	function _checkPrivateRedeclaration$3(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
	var _errors = /*#__PURE__*/new WeakMap();
	_Symbol$iterator = Symbol.iterator;
	/**
	 * @namespace BX.UI.Uploader
	 */
	let EntityErrorCollection = /*#__PURE__*/function () {
	  function EntityErrorCollection() {
	    babelHelpers.classCallCheck(this, EntityErrorCollection);
	    _classPrivateFieldInitSpec$1(this, _errors, {
	      writable: true,
	      value: []
	    });
	  }
	  babelHelpers.createClass(EntityErrorCollection, [{
	    key: "getByEntityId",
	    value: function getByEntityId(entityId) {
	      return babelHelpers.classPrivateFieldGet(this, _errors).filter(error => error.getEntityId() === entityId);
	    }
	  }, {
	    key: "add",
	    value: function add(item) {
	      babelHelpers.classPrivateFieldGet(this, _errors).push(item);
	    }
	  }, {
	    key: "has",
	    value: function has(item) {
	      return babelHelpers.classPrivateFieldGet(this, _errors).includes(item);
	    }
	  }, {
	    key: "clear",
	    value: function clear() {
	      babelHelpers.classPrivateFieldSet(this, _errors, []);
	    }
	  }, {
	    key: "getIndex",
	    value: function getIndex(item) {
	      return babelHelpers.classPrivateFieldGet(this, _errors).indexOf(item);
	    }
	  }, {
	    key: "getByIndex",
	    value: function getByIndex(index) {
	      if (main_core.Type.isNumber(index) && index >= 0) {
	        const error = babelHelpers.classPrivateFieldGet(this, _errors)[index];
	        return main_core.Type.isUndefined(error) ? null : error;
	      }
	      return null;
	    }
	  }, {
	    key: _Symbol$iterator,
	    value: function () {
	      return babelHelpers.classPrivateFieldGet(this, _errors)[Symbol.iterator]();
	    }
	  }], [{
	    key: "create",
	    value: function create(errorOptions) {
	      const errorCollection = new this();
	      errorOptions.forEach(errorOption => {
	        if (!main_core.Type.isStringFilled(errorOption.entityId)) {
	          return;
	        }
	        const error = new EntityError();
	        error.setEntityId(errorOption.entityId);
	        if (main_core.Type.isStringFilled(errorOption.message)) {
	          error.setMessage(errorOption.message);
	        }
	        if (!main_core.Type.isNil(errorOption.code)) {
	          error.setCode(errorOption.code);
	        }
	        if (main_core.Type.isArrayFilled(errorOption.customData)) {
	          error.setCustomData(errorOption.customData);
	        }
	        errorCollection.add(error);
	      });
	      return errorCollection;
	    }
	  }]);
	  return EntityErrorCollection;
	}();

	let _$5 = t => t,
	  _t$5,
	  _t2$2,
	  _t3$2,
	  _t4$2,
	  _t5$1,
	  _t6;
	function _classStaticPrivateMethodGet$1(receiver, classConstructor, method) { _classCheckPrivateStaticAccess$1(receiver, classConstructor); return method; }
	function _classCheckPrivateStaticAccess$1(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } }
	let TagItem = /*#__PURE__*/function () {
	  function TagItem(itemOptions) {
	    babelHelpers.classCallCheck(this, TagItem);
	    babelHelpers.defineProperty(this, "id", null);
	    babelHelpers.defineProperty(this, "entityId", null);
	    babelHelpers.defineProperty(this, "entityType", null);
	    babelHelpers.defineProperty(this, "title", null);
	    babelHelpers.defineProperty(this, "avatar", null);
	    babelHelpers.defineProperty(this, "avatarOptions", null);
	    babelHelpers.defineProperty(this, "maxWidth", null);
	    babelHelpers.defineProperty(this, "textColor", null);
	    babelHelpers.defineProperty(this, "bgColor", null);
	    babelHelpers.defineProperty(this, "fontWeight", null);
	    babelHelpers.defineProperty(this, "link", null);
	    babelHelpers.defineProperty(this, "onclick", null);
	    babelHelpers.defineProperty(this, "clickable", null);
	    babelHelpers.defineProperty(this, "deselectable", null);
	    babelHelpers.defineProperty(this, "customData", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    babelHelpers.defineProperty(this, "selector", null);
	    babelHelpers.defineProperty(this, "rendered", false);
	    const options = main_core.Type.isPlainObject(itemOptions) ? itemOptions : {};
	    if (!main_core.Type.isStringFilled(options.id) && !main_core.Type.isNumber(options.id)) {
	      throw new Error('TagSelector.TagItem: "id" parameter is required.');
	    }
	    if (!main_core.Type.isStringFilled(options.entityId)) {
	      throw new Error('TagSelector.TagItem: "entityId" parameter is required.');
	    }
	    this.id = options.id;
	    this.entityId = options.entityId.toLowerCase();
	    this.entityType = main_core.Type.isStringFilled(options.entityType) ? options.entityType : 'default';
	    this.customData = TypeUtils.createMapFromOptions(options.customData);
	    this.onclick = main_core.Type.isFunction(options.onclick) ? options.onclick : null;
	    this.link = main_core.Type.isStringFilled(options.link) ? options.link : null;
	    this.setTitle(options.title);
	    this.setDeselectable(options.deselectable);
	    this.setAvatar(options.avatar);
	    this.setAvatarOptions(options.avatarOptions);
	    this.setMaxWidth(options.maxWidth);
	    this.setTextColor(options.textColor);
	    this.setBgColor(options.bgColor);
	    this.setFontWeight(options.fontWeight);
	    this.setClickable(options.clickable);
	  }
	  babelHelpers.createClass(TagItem, [{
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	  }, {
	    key: "getEntityId",
	    value: function getEntityId() {
	      return this.entityId;
	    }
	  }, {
	    key: "getEntityType",
	    value: function getEntityType() {
	      return this.entityType;
	    }
	  }, {
	    key: "getSelector",
	    value: function getSelector() {
	      return this.selector;
	    }
	  }, {
	    key: "setSelector",
	    value: function setSelector(selector) {
	      this.selector = selector;
	    }
	  }, {
	    key: "getTitle",
	    value: function getTitle() {
	      return this.getTitleNode() && !this.getTitleNode().isNullable() ? this.getTitleNode().getText() : '';
	    }
	  }, {
	    key: "getTitleNode",
	    value: function getTitleNode() {
	      return this.title;
	    }
	  }, {
	    key: "setTitle",
	    value: function setTitle(title) {
	      if (main_core.Type.isStringFilled(title) || main_core.Type.isPlainObject(title) || title === null) {
	        this.title = title === null ? null : new TextNode(title);
	      }
	    }
	  }, {
	    key: "getAvatar",
	    value: function getAvatar() {
	      if (this.avatar !== null) {
	        return this.avatar;
	      }
	      if (this.getSelector().getTagAvatar() !== null) {
	        return this.getSelector().getTagAvatar();
	      }
	      if (this.getEntityTagOption('avatar') !== null) {
	        return this.getEntityTagOption('avatar');
	      }
	      return this.getEntityItemOption('avatar');
	    }
	  }, {
	    key: "setAvatar",
	    value: function setAvatar(avatar) {
	      if (main_core.Type.isString(avatar) || avatar === null) {
	        this.avatar = avatar;
	      }
	    }
	  }, {
	    key: "getAvatarOption",
	    value: function getAvatarOption(option) {
	      if (this.avatarOptions !== null && !main_core.Type.isUndefined(this.avatarOptions[option])) {
	        return this.avatarOptions[option];
	      }
	      const selectorAvatarOption = this.getSelector().getTagAvatarOption(option);
	      if (selectorAvatarOption !== null) {
	        return selectorAvatarOption[option];
	      }
	      const entityTagAvatarOptions = this.getEntityTagOption('avatarOptions');
	      if (main_core.Type.isPlainObject(entityTagAvatarOptions) && !main_core.Type.isUndefined(entityTagAvatarOptions[option])) {
	        return entityTagAvatarOptions[option];
	      }
	      const entityItemAvatarOptions = this.getEntityItemOption('avatarOptions');
	      if (main_core.Type.isPlainObject(entityItemAvatarOptions) && !main_core.Type.isUndefined(entityItemAvatarOptions[option])) {
	        return entityItemAvatarOptions[option];
	      }
	      return null;
	    }
	  }, {
	    key: "setAvatarOption",
	    value: function setAvatarOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        if (this.avatarOptions === null) {
	          this.avatarOptions = {};
	        }
	        this.avatarOptions[option] = value;
	      }
	    }
	  }, {
	    key: "setAvatarOptions",
	    value: function setAvatarOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setAvatarOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getTextColor",
	    value: function getTextColor() {
	      if (this.textColor !== null) {
	        return this.textColor;
	      }
	      if (this.getSelector().getTagTextColor() !== null) {
	        return this.getSelector().getTagTextColor();
	      }
	      return this.getEntityTagOption('textColor');
	    }
	  }, {
	    key: "setTextColor",
	    value: function setTextColor(textColor) {
	      if (main_core.Type.isString(textColor) || textColor === null) {
	        this.textColor = textColor;
	      }
	    }
	  }, {
	    key: "getBgColor",
	    value: function getBgColor() {
	      if (this.bgColor !== null) {
	        return this.bgColor;
	      }
	      if (this.getSelector().getTagBgColor() !== null) {
	        return this.getSelector().getTagBgColor();
	      }
	      return this.getEntityTagOption('bgColor');
	    }
	  }, {
	    key: "setBgColor",
	    value: function setBgColor(bgColor) {
	      if (main_core.Type.isString(bgColor) || bgColor === null) {
	        this.bgColor = bgColor;
	      }
	    }
	  }, {
	    key: "getFontWeight",
	    value: function getFontWeight() {
	      if (this.fontWeight !== null) {
	        return this.fontWeight;
	      }
	      if (this.getSelector().getTagFontWeight() !== null) {
	        return this.getSelector().getTagFontWeight();
	      }
	      return this.getEntityTagOption('fontWeight');
	    }
	  }, {
	    key: "setFontWeight",
	    value: function setFontWeight(fontWeight) {
	      if (main_core.Type.isString(fontWeight) || fontWeight === null) {
	        this.fontWeight = fontWeight;
	      }
	    }
	  }, {
	    key: "getMaxWidth",
	    value: function getMaxWidth() {
	      if (this.maxWidth !== null) {
	        return this.maxWidth;
	      }
	      if (this.getSelector().getTagMaxWidth() !== null) {
	        return this.getSelector().getTagMaxWidth();
	      }
	      return this.getEntityTagOption('maxWidth');
	    }
	  }, {
	    key: "setMaxWidth",
	    value: function setMaxWidth(width) {
	      if (main_core.Type.isNumber(width) && width >= 0 || width === null) {
	        this.maxWidth = width;
	      }
	    }
	  }, {
	    key: "setDeselectable",
	    value: function setDeselectable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.deselectable = flag;
	      }
	    }
	  }, {
	    key: "isDeselectable",
	    value: function isDeselectable() {
	      return this.deselectable === null ? this.getSelector().isDeselectable() : this.deselectable;
	    }
	  }, {
	    key: "getCustomData",
	    value: function getCustomData() {
	      return this.customData;
	    }
	  }, {
	    key: "getLink",
	    value: function getLink() {
	      return this.link;
	    }
	  }, {
	    key: "getOnclick",
	    value: function getOnclick() {
	      return this.onclick;
	    }
	  }, {
	    key: "setClickable",
	    value: function setClickable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.clickable = flag;
	      }
	    }
	  }, {
	    key: "isClickable",
	    value: function isClickable() {
	      if (this.clickable !== null) {
	        return this.clickable;
	      }
	      if (this.getSelector().getTagClickable() !== null) {
	        return this.getSelector().getTagClickable();
	      }
	      if (this.getEntityTagOption('clickable') !== null) {
	        return this.getEntityTagOption('clickable');
	      }
	      if (this.getEntityItemOption('clickable') !== null) {
	        return this.getEntityItemOption('clickable');
	      }
	      return false;
	    }
	  }, {
	    key: "render",
	    value: function render() {
	      const titleNode = this.getTitleNode();
	      if (titleNode) {
	        var _this$constructor;
	        titleNode.renderTo(this.getTitleContainer());
	        const title = this.getTitleContainer().textContent;
	        this.getContentContainer().setAttribute('title', _classStaticPrivateMethodGet$1(_this$constructor = this.constructor, TagItem, _sanitizeTitle$1).call(_this$constructor, title));
	      } else {
	        this.getTitleContainer().textContent = '';
	        main_core.Dom.attr(this.getContentContainer(), 'title', null);
	      }
	      const avatar = this.getAvatar();
	      const bgImage = this.getAvatarOption('bgImage');
	      if (main_core.Type.isStringFilled(avatar)) {
	        main_core.Dom.style(this.getAvatarContainer(), 'background-image', `url('${encodeUrl(avatar)}')`);
	      } else {
	        main_core.Dom.style(this.getAvatarContainer(), 'background-image', bgImage);
	      }
	      const bgColor = this.getAvatarOption('bgColor');
	      const bgSize = this.getAvatarOption('bgSize');
	      const border = this.getAvatarOption('border');
	      const borderRadius = this.getAvatarOption('borderRadius');
	      const outline = this.getAvatarOption('outline');
	      const outlineOffset = this.getAvatarOption('outlineOffset');
	      main_core.Dom.style(this.getAvatarContainer(), 'background-color', bgColor);
	      main_core.Dom.style(this.getAvatarContainer(), 'background-size', bgSize);
	      main_core.Dom.style(this.getAvatarContainer(), 'border', border);
	      main_core.Dom.style(this.getAvatarContainer(), 'border-radius', borderRadius);
	      main_core.Dom.style(this.getAvatarContainer(), 'outline', outline);
	      main_core.Dom.style(this.getAvatarContainer(), 'outline-offset', outlineOffset);
	      const hasAvatar = avatar || bgColor && bgColor !== 'none' || bgImage && bgImage !== 'none';
	      if (hasAvatar) {
	        main_core.Dom.addClass(this.getContainer(), 'ui-tag-selector-tag--has-avatar');
	      } else {
	        main_core.Dom.removeClass(this.getContainer(), 'ui-tag-selector-tag--has-avatar');
	      }
	      const maxWidth = this.getMaxWidth();
	      if (maxWidth > 0) {
	        main_core.Dom.style(this.getContainer(), 'max-width', `${maxWidth}px`);
	      } else {
	        main_core.Dom.style(this.getContainer(), 'max-width', null);
	      }
	      if (this.isDeselectable()) {
	        main_core.Dom.removeClass(this.getContainer(), 'ui-tag-selector-tag-readonly');
	      } else {
	        main_core.Dom.addClass(this.getContainer(), 'ui-tag-selector-tag-readonly');
	      }
	      main_core.Dom.style(this.getTitleContainer(), 'color', this.getTextColor());
	      main_core.Dom.style(this.getTitleContainer(), 'font-weight', this.getFontWeight());
	      main_core.Dom.style(this.getContainer(), 'background-color', this.getBgColor());
	      this.rendered = true;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        return main_core.Tag.render(_t$5 || (_t$5 = _$5`
				<div class="ui-tag-selector-item ui-tag-selector-tag">
					${0}
					${0}
				</div>
			`), this.getContentContainer(), this.getRemoveIcon());
	      });
	    }
	  }, {
	    key: "getContentContainer",
	    value: function getContentContainer() {
	      return this.cache.remember('content-container', () => {
	        if (main_core.Type.isStringFilled(this.getLink())) {
	          return main_core.Tag.render(_t2$2 || (_t2$2 = _$5`
					<a
						class="ui-tag-selector-tag-content"
						onclick="${0}"
						href="${0}"
						target="_blank"
					>
						${0}
						${0}
					</a>
				`), this.handleContainerClick.bind(this), this.getLink(), this.getAvatarContainer(), this.getTitleContainer());
	        }
	        const className = this.isClickable() || this.getOnclick() !== null ? ' ui-tag-selector-tag-content--clickable' : '';
	        return main_core.Tag.render(_t3$2 || (_t3$2 = _$5`
				<div
					class="ui-tag-selector-tag-content${0}"
					onclick="${0}"
				>
					${0}
					${0}
				</div>
			`), className, this.handleContainerClick.bind(this), this.getAvatarContainer(), this.getTitleContainer());
	      });
	    }
	  }, {
	    key: "getAvatarContainer",
	    value: function getAvatarContainer() {
	      return this.cache.remember('avatar', () => {
	        return main_core.Tag.render(_t4$2 || (_t4$2 = _$5`
				<div class="ui-tag-selector-tag-avatar"></div>
			`));
	      });
	    }
	  }, {
	    key: "getTitleContainer",
	    value: function getTitleContainer() {
	      return this.cache.remember('title', () => {
	        return main_core.Tag.render(_t5$1 || (_t5$1 = _$5`
				<div class="ui-tag-selector-tag-title"></div>
			`));
	      });
	    }
	  }, {
	    key: "getRemoveIcon",
	    value: function getRemoveIcon() {
	      return this.cache.remember('remove-icon', () => {
	        return main_core.Tag.render(_t6 || (_t6 = _$5`
				<div class="ui-tag-selector-tag-remove" onclick="${0}"></div>
			`), this.handleRemoveIconClick.bind(this));
	      });
	    }
	  }, {
	    key: "getEntityTagOption",
	    value: function getEntityTagOption(option) {
	      return Entity.getTagOption(this.getEntityId(), option, this.getEntityType());
	    }
	  }, {
	    key: "getEntityItemOption",
	    value: function getEntityItemOption(option) {
	      return Entity.getItemOption(this.getEntityId(), option, this.getEntityType());
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.rendered && this.getSelector() && this.getSelector().isRendered();
	    }
	  }, {
	    key: "remove",
	    value: function remove(animate = true) {
	      if (animate === false) {
	        main_core.Dom.remove(this.getContainer());
	        return Promise.resolve();
	      }
	      return new Promise(resolve => {
	        main_core.Dom.style(this.getContainer(), 'width', `${this.getContainer().offsetWidth}px`);
	        main_core.Dom.addClass(this.getContainer(), 'ui-tag-selector-tag--remove');
	        Animation.handleAnimationEnd(this.getContainer(), 'ui-tag-selector-tag-remove').then(() => {
	          main_core.Dom.remove(this.getContainer());
	          resolve();
	        }).catch(() => {
	          // Fail silently
	        });
	      });
	    }
	  }, {
	    key: "show",
	    value: function show() {
	      return new Promise(resolve => {
	        main_core.Dom.addClass(this.getContainer(), 'ui-tag-selector-tag--show');
	        Animation.handleAnimationEnd(this.getContainer(), 'ui-tag-selector-tag-show').then(() => {
	          main_core.Dom.removeClass(this.getContainer(), 'ui-tag-selector-tag--show');
	          resolve();
	        }).catch(() => {
	          // Fail silently
	        });
	      });
	    }
	  }, {
	    key: "handleContainerClick",
	    value: function handleContainerClick() {
	      const fn = this.getOnclick();
	      if (main_core.Type.isFunction(fn)) {
	        fn(this);
	      }
	      const selector = this.getSelector();
	      selector.emit('TagItem:onClick', {
	        item: this
	      });
	    }
	  }, {
	    key: "handleRemoveIconClick",
	    value: function handleRemoveIconClick(event) {
	      event.stopPropagation();
	      if (this.isDeselectable()) {
	        this.getSelector().removeTag(this);
	      }
	    }
	  }]);
	  return TagItem;
	}();
	function _sanitizeTitle$1(text) {
	  return text.replaceAll(/[\t ]+/gm, ' ').replaceAll(/\n+/gm, '\n').trim();
	}

	let _$6 = t => t,
	  _t$6,
	  _t2$3,
	  _t3$3,
	  _t4$3,
	  _t5$2,
	  _t6$1,
	  _t7;
	/**
	 * @memberof BX.UI.EntitySelector
	 */
	let TagSelector = /*#__PURE__*/function (_EventEmitter) {
	  babelHelpers.inherits(TagSelector, _EventEmitter);
	  function TagSelector(selectorOptions) {
	    var _this;
	    babelHelpers.classCallCheck(this, TagSelector);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(TagSelector).call(this));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tags", []);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "cache", new main_core.Cache.MemoryCache());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "multiple", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "readonly", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "locked", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "deselectable", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "addButtonCaption", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "addButtonCaptionMore", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "createButtonCaption", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "addButtonVisible", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "createButtonVisible", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "textBoxVisible", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "textBoxWidth", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "maxHeight", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "placeholder", '');
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "textBoxAutoHide", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "textBoxOldValue", '');
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagAvatar", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagAvatarOptions", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagTextColor", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagBgColor", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagFontWeight", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagMaxWidth", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagClickable", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "dialog", null);
	    _this.setEventNamespace('BX.UI.EntitySelector.TagSelector');
	    const options = main_core.Type.isPlainObject(selectorOptions) ? selectorOptions : {};
	    _this.id = main_core.Type.isStringFilled(options.id) ? options.id : `ui-tag-selector-${main_core.Text.getRandom().toLowerCase()}`;
	    _this.multiple = main_core.Type.isBoolean(options.multiple) ? options.multiple : true;
	    _this.addButtonVisible = options.showAddButton !== false;
	    _this.createButtonVisible = options.showCreateButton === true;
	    _this.textBoxVisible = options.showTextBox === true;
	    _this.setReadonly(options.readonly);
	    _this.setLocked(options.locked);
	    _this.setAddButtonCaption(options.addButtonCaption);
	    _this.setAddButtonCaptionMore(options.addButtonCaptionMore);
	    _this.setCreateButtonCaption(options.createButtonCaption);
	    _this.setPlaceholder(options.placeholder);
	    _this.setTextBoxAutoHide(options.textBoxAutoHide);
	    _this.setTextBoxWidth(options.textBoxWidth);
	    _this.setDeselectable(options.deselectable);
	    _this.setMaxHeight(options.maxHeight);
	    _this.setTagAvatar(options.tagAvatar);
	    _this.setTagAvatarOptions(options.tagAvatarOptions);
	    _this.setTagMaxWidth(options.tagMaxWidth);
	    _this.setTagTextColor(options.tagTextColor);
	    _this.setTagBgColor(options.tagBgColor);
	    _this.setTagFontWeight(options.tagFontWeight);
	    _this.setTagClickable(options.tagClickable);
	    if (main_core.Type.isPlainObject(options.dialogOptions)) {
	      let selectedItems = main_core.Type.isArray(options.items) ? options.items : [];
	      if (main_core.Type.isArray(options.dialogOptions.selectedItems)) {
	        selectedItems = selectedItems.concat(options.dialogOptions.selectedItems);
	      }
	      const dialogOptions = Object.assign({}, options.dialogOptions, {
	        tagSelectorOptions: null,
	        selectedItems,
	        multiple: _this.isMultiple(),
	        tagSelector: babelHelpers.assertThisInitialized(_this)
	      });
	      new Dialog(dialogOptions);
	    } else if (main_core.Type.isArray(options.items)) {
	      options.items.forEach(item => {
	        _this.addTag(item);
	      });
	    }
	    _this.subscribeFromOptions(options.events);
	    return _this;
	  }
	  babelHelpers.createClass(TagSelector, [{
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	    /**
	     * @internal
	     * @param dialog
	     */
	  }, {
	    key: "setDialog",
	    value: function setDialog(dialog) {
	      this.dialog = dialog;
	    }
	  }, {
	    key: "setReadonly",
	    value: function setReadonly(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.readonly = flag;
	        if (this.isRendered()) {
	          if (flag) {
	            main_core.Dom.addClass(this.getOuterContainer(), 'ui-tag-selector-container-readonly');
	          } else {
	            main_core.Dom.removeClass(this.getOuterContainer(), 'ui-tag-selector-container-readonly');
	          }
	        }
	      }
	    }
	  }, {
	    key: "isReadonly",
	    value: function isReadonly() {
	      return this.readonly;
	    }
	  }, {
	    key: "setLocked",
	    value: function setLocked(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.locked = flag;
	        if (flag) {
	          main_core.Dom.addClass(this.getOuterContainer(), 'ui-tag-selector-container-locked');
	          this.getTextBox().disabled = true;
	        } else {
	          main_core.Dom.removeClass(this.getOuterContainer(), 'ui-tag-selector-container-locked');
	          this.getTextBox().disabled = false;
	        }
	      }
	    }
	  }, {
	    key: "lock",
	    value: function lock() {
	      if (!this.isLocked()) {
	        this.setLocked(true);
	      }
	    }
	  }, {
	    key: "unlock",
	    value: function unlock() {
	      if (this.isLocked()) {
	        this.setLocked(false);
	      }
	    }
	  }, {
	    key: "isLocked",
	    value: function isLocked() {
	      return this.locked;
	    }
	  }, {
	    key: "isMultiple",
	    value: function isMultiple() {
	      return this.multiple;
	    }
	  }, {
	    key: "setDeselectable",
	    value: function setDeselectable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        const changed = this.deselectable !== flag;
	        this.deselectable = flag;
	        if (changed) {
	          this.updateTags();
	        }
	      }
	    }
	  }, {
	    key: "isDeselectable",
	    value: function isDeselectable() {
	      return this.deselectable;
	    }
	  }, {
	    key: "getTag",
	    value: function getTag(tagItem) {
	      if (tagItem instanceof TagItem) {
	        return this.getTags().find(tag => tag === tagItem);
	      } else if (main_core.Type.isPlainObject(tagItem)) {
	        const {
	          id,
	          entityId
	        } = tagItem;
	        return this.getTags().find(tag => tag.getId() === id && tag.getEntityId() === entityId);
	      }
	      return null;
	    }
	  }, {
	    key: "addTag",
	    value: function addTag(tagOptions) {
	      if (!main_core.Type.isObjectLike(tagOptions)) {
	        throw new Error('TagSelector.addTag: wrong item options.');
	      }
	      if (this.getTag(tagOptions)) {
	        return null;
	      }
	      const tag = new TagItem(tagOptions);
	      tag.setSelector(this);
	      const event = new main_core_events.BaseEvent({
	        data: {
	          tag
	        }
	      });
	      this.emit('onBeforeTagAdd', event);
	      if (event.isDefaultPrevented()) {
	        return null;
	      }
	      if (!this.isMultiple()) {
	        this.removeTags();
	      }
	      this.tags.push(tag);
	      this.emit('onTagAdd', {
	        tag
	      });
	      if (this.isRendered()) {
	        tag.render();
	        this.getItemsContainer().insertBefore(tag.getContainer(), this.getTextBox());
	        if (tagOptions.animate !== false) {
	          tag.show().then(() => {
	            this.getContainer().scrollTop = this.getContainer().scrollHeight - this.getContainer().offsetHeight;
	            this.emit('onAfterTagAdd', {
	              tag
	            });
	          });
	        } else {
	          this.emit('onAfterTagAdd', {
	            tag
	          });
	        }
	        this.toggleAddButtonCaption();
	      } else {
	        this.emit('onAfterTagAdd', {
	          tag
	        });
	      }
	      return tag;
	    }
	  }, {
	    key: "removeTag",
	    value: function removeTag(item, animate = true) {
	      const tagItem = this.getTag(item);
	      if (!tagItem) {
	        return;
	      }
	      const event = new main_core_events.BaseEvent({
	        data: {
	          tag: tagItem
	        }
	      });
	      this.emit('onBeforeTagRemove', event);
	      if (event.isDefaultPrevented()) {
	        return;
	      }
	      this.tags = this.tags.filter(el => el !== tagItem);
	      this.emit('onTagRemove', {
	        tag: tagItem
	      });
	      if (this.isRendered()) {
	        tagItem.remove(animate).then(() => {
	          this.toggleAddButtonCaption();
	          this.emit('onAfterTagRemove', {
	            tag: tagItem
	          });
	        });
	      } else {
	        this.emit('onAfterTagRemove', {
	          tag: tagItem
	        });
	      }
	    }
	  }, {
	    key: "removeTags",
	    value: function removeTags() {
	      this.getTags().forEach(tag => {
	        this.removeTag(tag, false);
	      });
	    }
	  }, {
	    key: "getTags",
	    value: function getTags() {
	      return this.tags;
	    }
	  }, {
	    key: "renderTo",
	    value: function renderTo(node) {
	      this.rendered = true;
	      this.getTags().forEach(tag => {
	        tag.render();
	        this.getItemsContainer().insertBefore(tag.getContainer(), this.getTextBox());
	      });
	      if (main_core.Type.isDomNode(node)) {
	        main_core.Dom.append(this.getOuterContainer(), node);
	      }
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.rendered;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "updateTags",
	    value: function updateTags() {
	      if (this.isRendered()) {
	        this.getTags().forEach(tag => {
	          tag.render();
	        });
	      }
	    }
	  }, {
	    key: "getOuterContainer",
	    value: function getOuterContainer() {
	      return this.cache.remember('outer-container', () => {
	        let className = this.isReadonly() ? ' ui-tag-selector-container-readonly' : '';
	        className += this.isLocked() ? ' ui-tag-selector-container-locked' : '';
	        return main_core.Tag.render(_t$6 || (_t$6 = _$6`
				<div class="ui-tag-selector-outer-container${0}">${0}</div>
			`), className, this.getContainer());
	      });
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        const style = this.getMaxHeight() ? ` style="max-height: ${this.getMaxHeight()}px; -ms-overflow-style: -ms-autohiding-scrollbar;"` : '';
	        return main_core.Tag.render(_t2$3 || (_t2$3 = _$6`
				<div 
					class="ui-tag-selector-container" 
					onclick="${0}"
					${0}
				>
					${0}
					${0}
				</div>
			`), this.handleContainerClick.bind(this), style, this.getItemsContainer(), this.getCreateButton());
	      });
	    }
	  }, {
	    key: "getItemsContainer",
	    value: function getItemsContainer() {
	      return this.cache.remember('items-container', () => {
	        return main_core.Tag.render(_t3$3 || (_t3$3 = _$6`
				<div class="ui-tag-selector-items">
					${0}
					${0}
				</div>
			`), this.getTextBox(), this.getAddButton());
	      });
	    }
	  }, {
	    key: "getTextBox",
	    value: function getTextBox() {
	      return this.cache.remember('text-box', () => {
	        const className = this.textBoxVisible ? '' : ' ui-tag-selector-item-hidden';
	        const input = main_core.Tag.render(_t4$3 || (_t4$3 = _$6`
				<input 
					type="text" 
					class="ui-tag-selector-item ui-tag-selector-text-box${0}" 
					autocomplete="off"
					placeholder="${0}"
					oninput="${0}"
					onblur="${0}"
					onkeyup="${0}"
					onkeydown="${0}"
					value=""
				>
			`), className, main_core.Text.encode(this.getPlaceholder()), this.handleTextBoxInput.bind(this), this.handleTextBoxBlur.bind(this), this.handleTextBoxKeyUp.bind(this), this.handleTextBoxKeyDown.bind(this));
	        const width = this.getTextBoxWidth();
	        if (width !== null) {
	          main_core.Dom.style(input, 'width', main_core.Type.isStringFilled(width) ? width : `${width}px`);
	        }
	        if (this.isLocked()) {
	          input.disabled = true;
	        }
	        return input;
	      });
	    }
	  }, {
	    key: "getItemsHeight",
	    value: function getItemsHeight() {
	      return this.getItemsContainer().scrollHeight;
	    }
	  }, {
	    key: "calcHeight",
	    value: function calcHeight() {
	      if (this.getMaxHeight() !== null) {
	        return Math.min(this.getItemsHeight(), this.getMaxHeight());
	      }
	      return Math.max(this.getItemsHeight(), this.getMinHeight());
	    }
	  }, {
	    key: "getTextBoxValue",
	    value: function getTextBoxValue() {
	      return this.getTextBox().value;
	    }
	  }, {
	    key: "clearTextBox",
	    value: function clearTextBox() {
	      this.getTextBox().value = '';
	      this.textBoxOldValue = '';
	    }
	  }, {
	    key: "showTextBox",
	    value: function showTextBox() {
	      this.textBoxVisible = true;
	      main_core.Dom.removeClass(this.getTextBox(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "hideTextBox",
	    value: function hideTextBox() {
	      this.textBoxVisible = false;
	      main_core.Dom.addClass(this.getTextBox(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "focusTextBox",
	    value: function focusTextBox() {
	      this.getTextBox().focus();
	    }
	  }, {
	    key: "setTextBoxAutoHide",
	    value: function setTextBoxAutoHide(autoHide) {
	      if (main_core.Type.isBoolean(autoHide)) {
	        this.textBoxAutoHide = autoHide;
	      }
	    }
	  }, {
	    key: "getTextBoxWidth",
	    value: function getTextBoxWidth() {
	      return this.textBoxWidth;
	    }
	  }, {
	    key: "setTextBoxWidth",
	    value: function setTextBoxWidth(width) {
	      if (main_core.Type.isStringFilled(width) || width === null) {
	        this.textBoxWidth = width;
	        if (this.isRendered()) {
	          main_core.Dom.style(this.getTextBox(), 'width', width);
	        }
	      } else if (main_core.Type.isNumber(width) && width > 0) {
	        this.textBoxWidth = width;
	        if (this.isRendered()) {
	          main_core.Dom.style(this.getTextBox(), 'width', `${width}px`);
	        }
	      }
	    }
	  }, {
	    key: "getTagMaxWidth",
	    value: function getTagMaxWidth() {
	      return this.tagMaxWidth;
	    }
	  }, {
	    key: "setTagMaxWidth",
	    value: function setTagMaxWidth(width) {
	      if (main_core.Type.isNumber(width) && width >= 0 || width === null) {
	        this.tagMaxWidth = width;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getTagAvatar",
	    value: function getTagAvatar() {
	      return this.tagAvatar;
	    }
	  }, {
	    key: "setTagAvatar",
	    value: function setTagAvatar(tagAvatar) {
	      if (main_core.Type.isString(tagAvatar) || tagAvatar === null) {
	        this.tagAvatar = tagAvatar;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getTagClickable",
	    value: function getTagClickable() {
	      return this.tagClickable;
	    }
	  }, {
	    key: "setTagClickable",
	    value: function setTagClickable(flag) {
	      if (main_core.Type.isBoolean(flag) || flag === null) {
	        this.tagClickable = flag;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getTagAvatarOptions",
	    value: function getTagAvatarOptions() {
	      return this.tagAvatarOptions;
	    }
	  }, {
	    key: "getTagAvatarOption",
	    value: function getTagAvatarOption(option) {
	      if (this.tagAvatarOptions !== null && !main_core.Type.isUndefined(this.tagAvatarOptions[option])) {
	        return this.tagAvatarOptions[option];
	      }
	      return null;
	    }
	  }, {
	    key: "setTagAvatarOption",
	    value: function setTagAvatarOption(option, value) {
	      if (main_core.Type.isStringFilled(option) && !main_core.Type.isUndefined(value)) {
	        if (this.tagAvatarOptions === null) {
	          this.tagAvatarOptions = {};
	        }
	        this.tagAvatarOptions[option] = value;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "setTagAvatarOptions",
	    value: function setTagAvatarOptions(options) {
	      if (main_core.Type.isPlainObject(options)) {
	        Object.keys(options).forEach(option => {
	          this.setTagAvatarOption(option, options[option]);
	        });
	      }
	    }
	  }, {
	    key: "getTagTextColor",
	    value: function getTagTextColor() {
	      return this.tagTextColor;
	    }
	  }, {
	    key: "setTagTextColor",
	    value: function setTagTextColor(textColor) {
	      if (main_core.Type.isString(textColor) || textColor === null) {
	        this.tagTextColor = textColor;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getTagBgColor",
	    value: function getTagBgColor() {
	      return this.tagBgColor;
	    }
	  }, {
	    key: "setTagBgColor",
	    value: function setTagBgColor(bgColor) {
	      if (main_core.Type.isString(bgColor) || bgColor === null) {
	        this.tagBgColor = bgColor;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getTagFontWeight",
	    value: function getTagFontWeight() {
	      return this.tagFontWeight;
	    }
	  }, {
	    key: "setTagFontWeight",
	    value: function setTagFontWeight(fontWeight) {
	      if (main_core.Type.isString(fontWeight) || fontWeight === null) {
	        this.tagFontWeight = fontWeight;
	        this.updateTags();
	      }
	    }
	  }, {
	    key: "getPlaceholder",
	    value: function getPlaceholder() {
	      return this.placeholder;
	    }
	  }, {
	    key: "setPlaceholder",
	    value: function setPlaceholder(placeholder) {
	      if (main_core.Type.isStringFilled(placeholder)) {
	        this.placeholder = placeholder;
	        if (this.isRendered()) {
	          this.getTextBox().placeholder = placeholder;
	        }
	      }
	    }
	  }, {
	    key: "getMaxHeight",
	    value: function getMaxHeight() {
	      return this.maxHeight;
	    }
	  }, {
	    key: "getMinHeight",
	    value: function getMinHeight() {
	      return 34;
	    }
	  }, {
	    key: "setMaxHeight",
	    value: function setMaxHeight(height) {
	      if (main_core.Type.isNumber(height) && height > 0 || height === null) {
	        this.maxHeight = height;
	        if (this.isRendered()) {
	          main_core.Dom.style(this.getContainer(), 'max-height', height > 0 ? `${height}px` : null);
	          main_core.Dom.style(this.getContainer(), '-ms-overflow-style', height > 0 ? '-ms-autohiding-scrollbar' : null);
	        }
	      }
	    }
	  }, {
	    key: "getAddButton",
	    value: function getAddButton() {
	      return this.cache.remember('add-button', () => {
	        const className = this.addButtonVisible ? '' : ' ui-tag-selector-item-hidden';
	        return main_core.Tag.render(_t5$2 || (_t5$2 = _$6`
				<span class="ui-tag-selector-item ui-tag-selector-add-button${0}">
					${0}
				</span>
			`), className, this.getAddButtonLink());
	      });
	    }
	  }, {
	    key: "getAddButtonLink",
	    value: function getAddButtonLink() {
	      return this.cache.remember('add-button-link', () => {
	        const caption = main_core.Text.encode(this.getActualButtonCaption());
	        return main_core.Tag.render(_t6$1 || (_t6$1 = _$6`
				<span 
					class="ui-tag-selector-add-button-caption" 
					onclick="${0}">${0}</span>
			`), this.handleAddButtonClick.bind(this), caption);
	      });
	    }
	  }, {
	    key: "getAddButtonCaption",
	    value: function getAddButtonCaption() {
	      return this.addButtonCaption === null ? main_core.Loc.getMessage('UI_TAG_SELECTOR_ADD_BUTTON_CAPTION') : this.addButtonCaption;
	    }
	  }, {
	    key: "setAddButtonCaption",
	    value: function setAddButtonCaption(caption) {
	      if (main_core.Type.isStringFilled(caption)) {
	        this.addButtonCaption = caption;
	        if (this.isRendered()) {
	          this.toggleAddButtonCaption();
	        }
	      }
	    }
	  }, {
	    key: "getAddButtonCaptionMore",
	    value: function getAddButtonCaptionMore() {
	      return this.addButtonCaptionMore === null ? this.isMultiple() ? main_core.Loc.getMessage('UI_TAG_SELECTOR_ADD_BUTTON_CAPTION') : main_core.Loc.getMessage('UI_TAG_SELECTOR_ADD_BUTTON_CAPTION_SINGLE') : this.addButtonCaptionMore;
	    }
	  }, {
	    key: "setAddButtonCaptionMore",
	    value: function setAddButtonCaptionMore(caption) {
	      if (main_core.Type.isStringFilled(caption)) {
	        this.addButtonCaptionMore = caption;
	        if (this.isRendered()) {
	          this.toggleAddButtonCaption();
	        }
	      }
	    }
	  }, {
	    key: "toggleAddButtonCaption",
	    value: function toggleAddButtonCaption() {
	      if (this.getAddButtonCaptionMore() === null) {
	        return;
	      }
	      this.getAddButtonLink().textContent = this.getActualButtonCaption();
	    }
	  }, {
	    key: "getActualButtonCaption",
	    value: function getActualButtonCaption() {
	      return this.getTags().length > 0 && this.getAddButtonCaptionMore() !== null ? this.getAddButtonCaptionMore() : this.getAddButtonCaption();
	    }
	  }, {
	    key: "showAddButton",
	    value: function showAddButton() {
	      this.addButtonVisible = true;
	      main_core.Dom.removeClass(this.getAddButton(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "hideAddButton",
	    value: function hideAddButton() {
	      this.addButtonVisible = false;
	      main_core.Dom.addClass(this.getAddButton(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "getCreateButton",
	    value: function getCreateButton() {
	      return this.cache.remember('create-button', () => {
	        const className = this.createButtonVisible ? '' : ' ui-tag-selector-item-hidden';
	        return main_core.Tag.render(_t7 || (_t7 = _$6`
				<div class="ui-tag-selector-create-button${0}">
					<span 
						class="ui-tag-selector-create-button-caption"
						onclick="${0}"
					>${0}</span>
				</div>
			`), className, this.handleCreateButtonClick.bind(this), main_core.Text.encode(this.getCreateButtonCaption()));
	      });
	    }
	  }, {
	    key: "showCreateButton",
	    value: function showCreateButton() {
	      this.createButtonVisible = true;
	      main_core.Dom.removeClass(this.getCreateButton(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "hideCreateButton",
	    value: function hideCreateButton() {
	      this.createButtonVisible = false;
	      main_core.Dom.addClass(this.getCreateButton(), 'ui-tag-selector-item-hidden');
	    }
	  }, {
	    key: "getCreateButtonCaption",
	    value: function getCreateButtonCaption() {
	      return this.createButtonCaption === null ? main_core.Loc.getMessage('UI_TAG_SELECTOR_CREATE_BUTTON_CAPTION') : this.createButtonCaption;
	    }
	  }, {
	    key: "setCreateButtonCaption",
	    value: function setCreateButtonCaption(caption) {
	      if (main_core.Type.isStringFilled(caption)) {
	        this.createButtonCaption = caption;
	        if (this.isRendered()) {
	          this.getCreateButton().children[0].textContent = caption;
	        }
	      }
	    }
	  }, {
	    key: "handleContainerClick",
	    value: function handleContainerClick(event) {
	      this.emit('onContainerClick', {
	        event
	      });
	    }
	  }, {
	    key: "handleTextBoxInput",
	    value: function handleTextBoxInput(event) {
	      const newValue = this.getTextBoxValue();
	      if (newValue !== this.textBoxOldValue) {
	        this.textBoxOldValue = newValue;
	        this.emit('onInput', {
	          event
	        });
	      }
	    }
	  }, {
	    key: "handleTextBoxBlur",
	    value: function handleTextBoxBlur(event) {
	      this.emit('onBlur', {
	        event
	      });
	      if (this.textBoxAutoHide) {
	        this.clearTextBox();
	        this.showAddButton();
	        this.hideTextBox();
	      }
	    }
	  }, {
	    key: "handleTextBoxKeyUp",
	    value: function handleTextBoxKeyUp(event) {
	      this.emit('onKeyUp', {
	        event
	      });
	      if (event.key === 'Enter') {
	        this.emit('onEnter', {
	          event
	        });
	        if (this.textBoxAutoHide) {
	          this.clearTextBox();
	          this.showAddButton();
	          this.hideTextBox();
	        }
	      }
	    }
	  }, {
	    key: "handleTextBoxKeyDown",
	    value: function handleTextBoxKeyDown(event) {
	      if (event.key === 'Enter') {
	        // prevent a form submit
	        event.preventDefault();
	        if (main_core.Browser.isMac() && event.metaKey || event.ctrlKey) {
	          this.emit('onMetaEnter', {
	            event
	          });
	        }
	      }
	      this.emit('onKeyDown', {
	        event
	      });
	    }
	  }, {
	    key: "handleAddButtonClick",
	    value: function handleAddButtonClick(event) {
	      this.hideAddButton();
	      this.showTextBox();
	      this.focusTextBox();
	      this.emit('onAddButtonClick', {
	        event
	      });
	    }
	  }, {
	    key: "handleCreateButtonClick",
	    value: function handleCreateButtonClick(event) {
	      this.emit('onCreateButtonClick', {
	        event
	      });
	    }
	  }]);
	  return TagSelector;
	}(main_core_events.EventEmitter);

	let Navigation = /*#__PURE__*/function () {
	  // IE/Edge compatible event names

	  function Navigation(dialog) {
	    babelHelpers.classCallCheck(this, Navigation);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "lockedTab", null);
	    babelHelpers.defineProperty(this, "enabled", false);
	    this.dialog = dialog;
	    this.dialog.subscribe('onShow', this.handleDialogShow.bind(this));
	    this.dialog.subscribe('onHide', this.handleDialogHide.bind(this));
	    this.dialog.subscribe('onDestroy', this.handleDialogDestroy.bind(this));
	    this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);
	    this.handleDocumentMouseMove = this.handleDocumentMouseMove.bind(this);
	  }
	  babelHelpers.createClass(Navigation, [{
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "enable",
	    value: function enable() {
	      if (!this.isEnabled()) {
	        this.bindEvents();
	      }
	      this.enabled = true;
	    }
	  }, {
	    key: "disable",
	    value: function disable() {
	      if (this.isEnabled()) {
	        this.unbindEvents();
	        this.unlockTab();
	      }
	      this.enabled = false;
	    }
	  }, {
	    key: "isEnabled",
	    value: function isEnabled() {
	      return this.enabled;
	    }
	  }, {
	    key: "bindEvents",
	    value: function bindEvents() {
	      main_core.Event.bind(document, 'keydown', this.handleDocumentKeyDown);
	    }
	  }, {
	    key: "unbindEvents",
	    value: function unbindEvents() {
	      main_core.Event.unbind(document, 'keydown', this.handleDocumentKeyDown);
	    }
	  }, {
	    key: "getNextNode",
	    value: function getNextNode() {
	      if (!this.getActiveNode()) {
	        return null;
	      }
	      let nextNode = null;
	      let currentNode = this.getActiveNode();
	      if (currentNode.hasChildren() && currentNode.isOpen()) {
	        nextNode = currentNode.getFirstChild();
	      }
	      while (nextNode === null && currentNode !== null) {
	        nextNode = currentNode.getNextSibling();
	        if (nextNode) {
	          break;
	        }
	        currentNode = currentNode.getParentNode();
	      }
	      return nextNode;
	    }
	  }, {
	    key: "getPreviousNode",
	    value: function getPreviousNode() {
	      if (!this.getActiveNode()) {
	        return null;
	      }
	      let previousNode = this.getActiveNode().getPreviousSibling();
	      if (previousNode) {
	        while (previousNode.hasChildren() && previousNode.isOpen()) {
	          const lastChild = previousNode.getLastChild();
	          if (lastChild === null) {
	            break;
	          }
	          previousNode = lastChild;
	        }
	      } else {
	        if (this.getActiveNode().getParentNode() && !this.getActiveNode().getParentNode().isRoot()) {
	          previousNode = this.getActiveNode().getParentNode();
	        }
	      }
	      return previousNode;
	    }
	  }, {
	    key: "getFirstNode",
	    value: function getFirstNode() {
	      const tab = this.getDialog().getActiveTab();
	      return tab && tab.getRootNode().getFirstChild();
	    }
	  }, {
	    key: "getLastNode",
	    value: function getLastNode() {
	      const tab = this.getDialog().getActiveTab();
	      if (!tab) {
	        return null;
	      }
	      let lastNode = tab.getRootNode().getLastChild();
	      if (lastNode !== null) {
	        while (lastNode.hasChildren() && lastNode.isOpen()) {
	          const lastChild = lastNode.getLastChild();
	          if (lastChild === null) {
	            break;
	          }
	          lastNode = lastChild;
	        }
	      }
	      return lastNode;
	    }
	  }, {
	    key: "getActiveNode",
	    value: function getActiveNode() {
	      return this.getDialog().getFocusedNode();
	    }
	  }, {
	    key: "focusOnNode",
	    value: function focusOnNode(node) {
	      if (node) {
	        node.focus();
	        node.scrollIntoView();
	      }
	    }
	  }, {
	    key: "lockTab",
	    value: function lockTab() {
	      const activeTab = this.getDialog().getActiveTab();
	      if (this.lockedTab === activeTab) {
	        return;
	      } else if (this.lockedTab !== null) {
	        this.unlockTab();
	      }
	      this.lockedTab = activeTab;
	      this.lockedTab.lock();
	      main_core.Event.bind(document, 'mousemove', this.handleDocumentMouseMove);
	    }
	  }, {
	    key: "unlockTab",
	    value: function unlockTab() {
	      if (this.lockedTab === null) {
	        return;
	      }
	      this.lockedTab.unlock();
	      this.lockedTab = null;
	      main_core.Event.unbind(document, 'mousemove', this.handleDocumentMouseMove);
	    }
	  }, {
	    key: "handleDialogShow",
	    value: function handleDialogShow() {
	      this.enable();
	    }
	  }, {
	    key: "handleDialogHide",
	    value: function handleDialogHide() {
	      this.disable();
	    }
	  }, {
	    key: "handleDialogDestroy",
	    value: function handleDialogDestroy() {
	      this.disable();
	    }
	  }, {
	    key: "handleDocumentMouseMove",
	    value: function handleDocumentMouseMove() {
	      this.unlockTab();
	    }
	  }, {
	    key: "handleDocumentKeyDown",
	    value: function handleDocumentKeyDown(event) {
	      if (!this.getDialog().isOpen()) {
	        this.unbindEvents();
	        return;
	      }
	      if (event.metaKey || event.ctrlKey || event.altKey) {
	        return;
	      }
	      const activeTab = this.getDialog().getActiveTab();
	      if (!activeTab) {
	        return;
	      }
	      const keyName = this.constructor.keyMap[event.key] || event.key;
	      if (activeTab === this.getDialog().getSearchTab() && ['ArrowLeft', 'ArrowRight'].includes(keyName)) {
	        return;
	      }
	      const handler = this[`handle${keyName}Press`];
	      if (handler) {
	        handler.call(this, event);
	        this.lockTab(activeTab);
	        event.preventDefault();
	      }
	    }
	  }, {
	    key: "handleArrowDownPress",
	    value: function handleArrowDownPress() {
	      if (!this.getActiveNode()) {
	        const firstNode = this.getFirstNode();
	        this.focusOnNode(firstNode);
	      } else {
	        const nextNode = this.getNextNode();
	        if (nextNode) {
	          this.focusOnNode(nextNode);
	        } else {
	          const firstNode = this.getFirstNode();
	          this.focusOnNode(firstNode);
	        }
	      }
	    }
	  }, {
	    key: "handleArrowUpPress",
	    value: function handleArrowUpPress() {
	      if (!this.getActiveNode()) {
	        const lastNode = this.getLastNode();
	        this.focusOnNode(lastNode);
	      } else {
	        const previousNode = this.getPreviousNode();
	        if (previousNode) {
	          this.focusOnNode(previousNode);
	        } else {
	          const lastNode = this.getLastNode();
	          this.focusOnNode(lastNode);
	        }
	      }
	    }
	  }, {
	    key: "handleArrowRightPress",
	    value: function handleArrowRightPress() {
	      if (this.getActiveNode()) {
	        this.getActiveNode().expand();
	      }
	    }
	  }, {
	    key: "handleArrowLeftPress",
	    value: function handleArrowLeftPress() {
	      if (!this.getActiveNode()) {
	        return;
	      }
	      if (this.getActiveNode().isOpen()) {
	        this.getActiveNode().collapse();
	      } else {
	        const parentNode = this.getActiveNode().getParentNode();
	        if (parentNode && !parentNode.isRoot()) {
	          this.focusOnNode(parentNode);
	        }
	      }
	    }
	  }, {
	    key: "handleEnterPress",
	    value: function handleEnterPress() {
	      if (this.getActiveNode()) {
	        this.getActiveNode().click();
	      }
	    }
	    /*handleSpacePress(event: KeyboardEvent): void
	    {
	    	const searchQuery = this.getDialog().getTagSelector() && this.getDialog().getTagSelector().getTextBoxValue();
	    	if (this.getActiveNode() && !Type.isStringFilled(searchQuery))
	    	{
	    		this.getActiveNode().click();
	    		event.preventDefault();
	    	}
	    }*/
	  }, {
	    key: "handleTabPress",
	    value: function handleTabPress(event) {
	      const activeTab = this.getDialog().getActiveTab();
	      if (!activeTab) {
	        this.getDialog().selectFirstTab();
	        return;
	      }
	      if (event.shiftKey) {
	        const previousTab = this.getDialog().getPreviousTab();
	        if (previousTab) {
	          this.getDialog().selectTab(previousTab.getId());
	        } else {
	          this.getDialog().selectLastTab();
	        }
	      } else {
	        const nextTab = this.getDialog().getNextTab();
	        if (nextTab) {
	          this.getDialog().selectTab(nextTab.getId());
	        } else {
	          this.getDialog().selectFirstTab();
	        }
	      }
	    }
	  }]);
	  return Navigation;
	}();
	babelHelpers.defineProperty(Navigation, "keyMap", {
	  'Down': 'ArrowDown',
	  'Up': 'ArrowUp',
	  'Left': 'ArrowLeft',
	  'Right': 'ArrowRight',
	  'Spacebar': 'Space',
	  ' ': 'Space' // For all browsers
	});

	let SliderIntegration = /*#__PURE__*/function () {
	  function SliderIntegration(dialog) {
	    babelHelpers.classCallCheck(this, SliderIntegration);
	    babelHelpers.defineProperty(this, "dialog", null);
	    babelHelpers.defineProperty(this, "sliders", new Set());
	    this.dialog = dialog;
	    this.dialog.subscribe('onShow', this.handleDialogShow.bind(this));
	    this.dialog.subscribe('onHide', this.handleDialogHide.bind(this));
	    this.dialog.subscribe('onDestroy', this.handleDialogDestroy.bind(this));
	    this.handleSliderOpen = this.handleSliderOpen.bind(this);
	    this.handleSliderClose = this.handleSliderClose.bind(this);
	    this.handleSliderDestroy = this.handleSliderDestroy.bind(this);
	  }
	  babelHelpers.createClass(SliderIntegration, [{
	    key: "getDialog",
	    value: function getDialog() {
	      return this.dialog;
	    }
	  }, {
	    key: "bindEvents",
	    value: function bindEvents() {
	      this.unbindEvents();
	      if (top.BX) {
	        top.BX.Event.EventEmitter.subscribe('SidePanel.Slider:onOpen', this.handleSliderOpen);
	        top.BX.Event.EventEmitter.subscribe('SidePanel.Slider:onCloseComplete', this.handleSliderClose);
	        top.BX.Event.EventEmitter.subscribe('SidePanel.Slider:onDestroy', this.handleSliderDestroy);
	      }
	    }
	  }, {
	    key: "unbindEvents",
	    value: function unbindEvents() {
	      if (top.BX) {
	        top.BX.Event.EventEmitter.unsubscribe('SidePanel.Slider:onOpen', this.handleSliderOpen);
	        top.BX.Event.EventEmitter.unsubscribe('SidePanel.Slider:onCloseComplete', this.handleSliderClose);
	        top.BX.Event.EventEmitter.unsubscribe('SidePanel.Slider:onDestroy', this.handleSliderDestroy);
	      }
	    }
	  }, {
	    key: "isDialogInSlider",
	    value: function isDialogInSlider(slider) {
	      if (slider.getFrameWindow()) {
	        return slider.getFrameWindow().document.contains(this.getDialog().getContainer());
	      } else {
	        return slider.getContainer().contains(this.getDialog().getContainer());
	      }
	    }
	  }, {
	    key: "handleDialogShow",
	    value: function handleDialogShow() {
	      this.bindEvents();
	    }
	  }, {
	    key: "handleDialogHide",
	    value: function handleDialogHide() {
	      this.sliders.clear();
	      this.unbindEvents();
	      this.getDialog().unfreeze();
	    }
	  }, {
	    key: "handleDialogDestroy",
	    value: function handleDialogDestroy() {
	      this.sliders.clear();
	      this.unbindEvents();
	    }
	  }, {
	    key: "handleSliderOpen",
	    value: function handleSliderOpen(event) {
	      const [sliderEvent] = event.getData();
	      const slider = sliderEvent.getSlider();
	      if (!this.isDialogInSlider(slider)) {
	        this.sliders.add(slider);
	        this.getDialog().freeze();
	      }
	    }
	  }, {
	    key: "handleSliderClose",
	    value: function handleSliderClose(event) {
	      const [sliderEvent] = event.getData();
	      const slider = sliderEvent.getSlider();
	      this.sliders.delete(slider);
	      if (this.sliders.size === 0) {
	        this.getDialog().unfreeze();
	      }
	    }
	  }, {
	    key: "handleSliderDestroy",
	    value: function handleSliderDestroy(event) {
	      const [sliderEvent] = event.getData();
	      const slider = sliderEvent.getSlider();
	      if (this.isDialogInSlider(slider)) {
	        this.unbindEvents();
	        this.dialog.destroy();
	      } else {
	        this.sliders.delete(slider);
	        if (this.sliders.size === 0) {
	          this.getDialog().unfreeze();
	        }
	      }
	    }
	  }]);
	  return SliderIntegration;
	}();

	let _$7 = t => t,
	  _t$7;
	let DefaultHeader = /*#__PURE__*/function (_BaseHeader) {
	  babelHelpers.inherits(DefaultHeader, _BaseHeader);
	  function DefaultHeader(context, options) {
	    var _this;
	    babelHelpers.classCallCheck(this, DefaultHeader);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(DefaultHeader).call(this, context, options));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "content", null);
	    _this.setContent(_this.getOption('content'));
	    return _this;
	  }
	  babelHelpers.createClass(DefaultHeader, [{
	    key: "render",
	    value: function render() {
	      const container = main_core.Tag.render(_t$7 || (_t$7 = _$7`
			<div>
				${0}
			</div>
		`), this.getContent() ? this.getContent() : '');
	      const className = this.getOption('containerClass', 'ui-selector-header-default');
	      const containerStyles = this.getOption('containerStyles', {});
	      main_core.Dom.addClass(container, className);
	      main_core.Dom.style(container, containerStyles);
	      return container;
	    }
	  }, {
	    key: "getContent",
	    value: function getContent() {
	      return this.content;
	    }
	  }, {
	    key: "setContent",
	    value: function setContent(content) {
	      if (main_core.Type.isStringFilled(content) || main_core.Type.isDomNode(content) || main_core.Type.isArrayFilled(content)) {
	        this.content = content;
	      }
	    }
	  }]);
	  return DefaultHeader;
	}(BaseHeader);

	let _$8 = t => t,
	  _t$8;
	let DefaultFooter = /*#__PURE__*/function (_BaseFooter) {
	  babelHelpers.inherits(DefaultFooter, _BaseFooter);
	  function DefaultFooter(context, options) {
	    var _this;
	    babelHelpers.classCallCheck(this, DefaultFooter);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(DefaultFooter).call(this, context, options));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "content", null);
	    _this.setContent(_this.getOption('content'));
	    return _this;
	  }
	  babelHelpers.createClass(DefaultFooter, [{
	    key: "render",
	    value: function render() {
	      const container = main_core.Tag.render(_t$8 || (_t$8 = _$8`
			<div>
				${0}
			</div>
		`), this.getContent() ? this.getContent() : '');
	      const className = this.getOption('containerClass', 'ui-selector-footer-default');
	      const containerStyles = this.getOption('containerStyles', {});
	      main_core.Dom.addClass(container, className);
	      main_core.Dom.style(container, containerStyles);
	      return container;
	    }
	  }, {
	    key: "getContent",
	    value: function getContent() {
	      return this.content;
	    }
	  }, {
	    key: "setContent",
	    value: function setContent(content) {
	      if (main_core.Type.isStringFilled(content) || main_core.Type.isDomNode(content) || main_core.Type.isArrayFilled(content)) {
	        this.content = content;
	      }
	    }
	  }]);
	  return DefaultFooter;
	}(BaseFooter);

	let RecentTab = /*#__PURE__*/function (_Tab) {
	  babelHelpers.inherits(RecentTab, _Tab);
	  function RecentTab(dialog, tabOptions) {
	    babelHelpers.classCallCheck(this, RecentTab);
	    const icon = 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2223%22%20height%3D%2223%22%20fill%3D%' + '22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M14.432%2013.985a.96.' + '96%200%2000-.96-.96H8.505a.96.96%200%20000%201.92h4.967c.53%200%20.96-.43.96-.96zM14.432%2011.' + '009a.96.96%200%2000-.96-.96H8.505a.96.96%200%20000%201.92h4.967c.53%200%20.96-.43.96-.96zM14.' + '432%208.033a.96.96%200%2000-.96-.96H8.505a.96.96%200%20000%201.92h4.967c.53%200%20.96-.43.96-.' + '96z%22%20fill%3D%22%23ABB1B8%22/%3E%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd' + '%22%20d%3D%22M10.988%2019.52c1.8%200%203.469-.558%204.844-1.51l2.205%202.204a1.525%201.525%200%20' + '102.157-2.157l-2.205-2.205a8.512%208.512%200%2010-7%203.668zm0-2.403a6.108%206.108%200%20100-12.2' + '16%206.108%206.108%200%20000%2012.216z%22%20fill%3D%22%23ABB1B8%22/%3E%3C/svg%3E';
	    const defaults = {
	      title: main_core.Loc.getMessage('UI_SELECTOR_RECENT_TAB_TITLE'),
	      itemOrder: {
	        sort: 'asc'
	      },
	      visible: !dialog.isDropdownMode(),
	      stub: !dialog.isDropdownMode(),
	      icon: {
	        //default: '/bitrix/js/ui/entity-selector/src/css/images/recent-tab-icon.svg',
	        //selected: '/bitrix/js/ui/entity-selector/src/css/images/recent-tab-icon-selected.svg'
	        default: icon,
	        selected: icon.replace(/ABB1B8/g, 'fff')
	      }
	    };
	    const options = Object.assign({}, defaults, tabOptions);
	    options.id = 'recents';
	    return babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(RecentTab).call(this, dialog, options));
	  }
	  return RecentTab;
	}(Tab);

	let MatchResult = /*#__PURE__*/function () {
	  function MatchResult(item, queryWords, matchIndexes = []) {
	    babelHelpers.classCallCheck(this, MatchResult);
	    babelHelpers.defineProperty(this, "item", null);
	    babelHelpers.defineProperty(this, "queryWords", null);
	    babelHelpers.defineProperty(this, "matchFields", new Map());
	    babelHelpers.defineProperty(this, "sort", null);
	    this.item = item;
	    this.queryWords = queryWords;
	    this.addIndexes(matchIndexes);
	  }
	  babelHelpers.createClass(MatchResult, [{
	    key: "getItem",
	    value: function getItem() {
	      return this.item;
	    }
	  }, {
	    key: "getQueryWords",
	    value: function getQueryWords() {
	      return this.queryWords;
	    }
	  }, {
	    key: "getMatchFields",
	    value: function getMatchFields() {
	      return this.matchFields;
	    }
	  }, {
	    key: "getSort",
	    value: function getSort() {
	      return this.sort;
	    }
	  }, {
	    key: "addIndex",
	    value: function addIndex(matchIndex) {
	      let matchField = this.matchFields.get(matchIndex.getField());
	      if (!matchField) {
	        matchField = new MatchField(matchIndex.getField());
	        this.matchFields.set(matchIndex.getField(), matchField);
	        const fieldSort = matchIndex.getField().getSort();
	        if (fieldSort !== null) {
	          this.sort = this.sort === null ? fieldSort : Math.min(this.sort, fieldSort);
	        }
	      }
	      matchField.addIndex(matchIndex);
	    }
	  }, {
	    key: "addIndexes",
	    value: function addIndexes(matchIndexes) {
	      matchIndexes.forEach(matchIndex => {
	        this.addIndex(matchIndex);
	      });
	    }
	  }]);
	  return MatchResult;
	}();

	const collator = new Intl.Collator(undefined, {
	  sensitivity: 'base'
	});
	let SearchEngine = /*#__PURE__*/function () {
	  function SearchEngine() {
	    babelHelpers.classCallCheck(this, SearchEngine);
	  }
	  babelHelpers.createClass(SearchEngine, null, [{
	    key: "matchItems",
	    value: function matchItems(items, searchQuery) {
	      const matchResults = [];
	      const queryWords = searchQuery.getQueryWords();
	      let limit = searchQuery.getResultLimit();
	      for (let i = 0; i < items.length; i++) {
	        if (limit === 0) {
	          break;
	        }
	        const item = items[i];
	        if (item.isSelected() || !item.isSearchable() || item.isHidden() || !item.getEntity().isSearchable()) {
	          continue;
	        }
	        const matchResult = this.matchItem(item, queryWords);
	        if (matchResult) {
	          matchResults.push(matchResult);
	          limit--;
	        }
	      }
	      return matchResults;
	    }
	  }, {
	    key: "matchItem",
	    value: function matchItem(item, queryWords) {
	      let matches = [];
	      for (let i = 0; i < queryWords.length; i++) {
	        const queryWord = queryWords[i];
	        const results = this.matchWord(item, queryWord);
	        //const match = this.matchWord(item, queryWord);
	        //if (match === null)
	        if (results.length === 0) {
	          return null;
	        } else {
	          matches = matches.concat(results);
	          //matches.push(match);
	        }
	      }

	      if (matches.length > 0) {
	        return new MatchResult(item, queryWords, matches);
	      } else {
	        return null;
	      }
	    }
	  }, {
	    key: "matchWord",
	    value: function matchWord(item, queryWord) {
	      const searchIndexes = item.getSearchIndex().getIndexes();
	      const matches = [];
	      for (let i = 0; i < searchIndexes.length; i++) {
	        const fieldIndex = searchIndexes[i];
	        const indexes = fieldIndex.getIndexes();
	        for (let j = 0; j < indexes.length; j++) {
	          const index = indexes[j];
	          const word = index.getWord().substring(0, queryWord.length);
	          if (collator.compare(queryWord, word) === 0) {
	            matches.push(new MatchIndex(fieldIndex.getField(), queryWord, index.getStartIndex()));
	            //return new MatchIndex(field, queryWord, index[i][1]);
	          }
	        }

	        if (matches.length > 0) {
	          break;
	        }
	      }
	      return matches;
	      //return null;
	    }
	  }]);
	  return SearchEngine;
	}();

	let SearchQuery = /*#__PURE__*/function () {
	  function SearchQuery(query) {
	    babelHelpers.classCallCheck(this, SearchQuery);
	    babelHelpers.defineProperty(this, "queryWords", []);
	    babelHelpers.defineProperty(this, "query", '');
	    babelHelpers.defineProperty(this, "cacheable", true);
	    babelHelpers.defineProperty(this, "dynamicSearchEntities", []);
	    babelHelpers.defineProperty(this, "resultLimit", 100);
	    this.query = query.trim().replace(/\s\s+/g, ' ');
	    this.queryWords = main_core.Type.isStringFilled(this.query) ? this.query.split(' ') : [];
	  }
	  babelHelpers.createClass(SearchQuery, [{
	    key: "getQueryWords",
	    value: function getQueryWords() {
	      return this.queryWords;
	    }
	  }, {
	    key: "getQuery",
	    value: function getQuery() {
	      return this.query;
	    }
	  }, {
	    key: "isEmpty",
	    value: function isEmpty() {
	      return this.getQueryWords().length === 0;
	    }
	  }, {
	    key: "setCacheable",
	    value: function setCacheable(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.cacheable = flag;
	      }
	    }
	  }, {
	    key: "isCacheable",
	    value: function isCacheable() {
	      return this.cacheable;
	    }
	  }, {
	    key: "setResultLimit",
	    value: function setResultLimit(limit) {
	      if (main_core.Type.isNumber(limit) && limit >= 0) {
	        this.resultLimit = limit;
	      }
	    }
	  }, {
	    key: "getResultLimit",
	    value: function getResultLimit() {
	      return this.resultLimit;
	    }
	  }, {
	    key: "hasDynamicSearch",
	    value: function hasDynamicSearch() {
	      return this.getDynamicSearchEntities().length > 0;
	    }
	  }, {
	    key: "hasDynamicSearchEntity",
	    value: function hasDynamicSearchEntity(entityId) {
	      return this.getDynamicSearchEntities().includes(entityId);
	    }
	  }, {
	    key: "setDynamicSearchEntities",
	    value: function setDynamicSearchEntities(entities) {
	      if (main_core.Type.isArrayFilled(entities)) {
	        entities.forEach(entityId => {
	          if (main_core.Type.isStringFilled(entityId) && !this.hasDynamicSearchEntity(entityId)) {
	            this.dynamicSearchEntities.push(entityId);
	          }
	        });
	      }
	      return this.dynamicSearchEntities;
	    }
	  }, {
	    key: "getDynamicSearchEntities",
	    value: function getDynamicSearchEntities() {
	      return this.dynamicSearchEntities;
	    }
	  }, {
	    key: "getAjaxJson",
	    value: function getAjaxJson() {
	      return this.toJSON();
	    }
	  }, {
	    key: "toJSON",
	    value: function toJSON() {
	      return {
	        queryWords: this.getQueryWords(),
	        query: this.getQuery(),
	        dynamicSearchEntities: this.getDynamicSearchEntities()
	      };
	    }
	  }]);
	  return SearchQuery;
	}();

	let _$9 = t => t,
	  _t$9,
	  _t2$4,
	  _t3$4,
	  _t4$4,
	  _t5$3;
	let SearchLoader = /*#__PURE__*/function () {
	  function SearchLoader(tab) {
	    babelHelpers.classCallCheck(this, SearchLoader);
	    babelHelpers.defineProperty(this, "tab", null);
	    babelHelpers.defineProperty(this, "loader", null);
	    babelHelpers.defineProperty(this, "cache", new main_core.Cache.MemoryCache());
	    this.tab = tab;
	  }
	  babelHelpers.createClass(SearchLoader, [{
	    key: "getTab",
	    value: function getTab() {
	      return this.tab;
	    }
	  }, {
	    key: "getLoader",
	    value: function getLoader() {
	      if (this.loader === null) {
	        this.loader = new main_loader.Loader({
	          target: this.getIconContainer(),
	          size: 32
	        });
	      }
	      return this.loader;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        return main_core.Tag.render(_t$9 || (_t$9 = _$9`
				<div class="ui-selector-search-loader">
					${0}
					${0}
				</div>
			`), this.getBoxContainer(), this.getSpacerContainer());
	      });
	    }
	  }, {
	    key: "getBoxContainer",
	    value: function getBoxContainer() {
	      return this.cache.remember('box-container', () => {
	        return main_core.Tag.render(_t2$4 || (_t2$4 = _$9`
				<div class="ui-selector-search-loader-box">
					${0}
					${0}
				</div>`), this.getIconContainer(), this.getTextContainer());
	      });
	    }
	  }, {
	    key: "getIconContainer",
	    value: function getIconContainer() {
	      return this.cache.remember('icon', () => {
	        return main_core.Tag.render(_t3$4 || (_t3$4 = _$9`<div class="ui-selector-search-loader-icon"></div>`));
	      });
	    }
	  }, {
	    key: "getTextContainer",
	    value: function getTextContainer() {
	      return this.cache.remember('text', () => {
	        return main_core.Tag.render(_t4$4 || (_t4$4 = _$9`
				<div class="ui-selector-search-loader-text">${0}</div>
			`), main_core.Loc.getMessage('UI_SELECTOR_SEARCH_LOADER_TEXT'));
	      });
	    }
	  }, {
	    key: "getSpacerContainer",
	    value: function getSpacerContainer() {
	      return this.cache.remember('spacer', () => {
	        return main_core.Tag.render(_t5$3 || (_t5$3 = _$9`<div class="ui-selector-search-loader-spacer"></div>`));
	      });
	    }
	  }, {
	    key: "show",
	    value: function show() {
	      if (!this.getContainer().parentNode) {
	        main_core.Dom.append(this.getContainer(), this.getTab().getContainer());
	      }
	      void this.getLoader().show();
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-search-loader--show');
	      requestAnimationFrame(() => {
	        main_core.Dom.addClass(this.getContainer(), 'ui-selector-search-loader--animate');
	      });
	    }
	  }, {
	    key: "hide",
	    value: function hide() {
	      if (this.loader === null) {
	        return;
	      }
	      main_core.Dom.removeClass(this.getContainer(), ['ui-selector-search-loader--show', 'ui-selector-search-loader--animate']);
	      void this.getLoader().hide();
	    }
	  }, {
	    key: "isShown",
	    value: function isShown() {
	      return this.loader !== null && this.loader.isShown();
	    }
	  }]);
	  return SearchLoader;
	}();

	let _$a = t => t,
	  _t$a,
	  _t2$5,
	  _t3$5,
	  _t4$5;
	let SearchTabFooter = /*#__PURE__*/function (_BaseFooter) {
	  babelHelpers.inherits(SearchTabFooter, _BaseFooter);
	  function SearchTabFooter(tab, options) {
	    var _this;
	    babelHelpers.classCallCheck(this, SearchTabFooter);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(SearchTabFooter).call(this, tab, options));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "loader", null);
	    _this.getDialog().subscribe('onSearch', _this.handleOnSearch.bind(babelHelpers.assertThisInitialized(_this)));
	    const tagSelector = _this.getDialog().getTagSelector();
	    if (tagSelector) {
	      tagSelector.subscribe('onMetaEnter', _this.handleMetaEnter.bind(babelHelpers.assertThisInitialized(_this)));
	    }
	    return _this;
	  }
	  babelHelpers.createClass(SearchTabFooter, [{
	    key: "render",
	    value: function render() {
	      return main_core.Tag.render(_t$a || (_t$a = _$a`
			<div class="ui-selector-search-footer" onclick="${0}">
				<div class="ui-selector-search-footer-box">
					${0}
					${0}
					${0}
				</div>
				<div class="ui-selector-search-footer-cmd">${0}</div>
			</div>
		`), this.handleClick.bind(this), this.getLabelContainer(), this.getQueryContainer(), this.getLoaderContainer(), main_core.Browser.isMac() ? '&#8984;+Enter' : 'Ctrl+Enter');
	    }
	  }, {
	    key: "getLoader",
	    value: function getLoader() {
	      if (this.loader === null) {
	        this.loader = new main_loader.Loader({
	          target: this.getLoaderContainer(),
	          size: 17,
	          color: 'rgba(82, 92, 105, 0.9)'
	        });
	      }
	      return this.loader;
	    }
	  }, {
	    key: "showLoader",
	    value: function showLoader() {
	      void this.getLoader().show();
	    }
	  }, {
	    key: "hideLoader",
	    value: function hideLoader() {
	      void this.getLoader().hide();
	    }
	  }, {
	    key: "setLabel",
	    value: function setLabel(label) {
	      if (main_core.Type.isString(label)) {
	        this.getLabelContainer().textContent = label;
	      }
	    }
	  }, {
	    key: "getLabelContainer",
	    value: function getLabelContainer() {
	      return this.cache.remember('label', () => {
	        return main_core.Tag.render(_t2$5 || (_t2$5 = _$a`
				<span class="ui-selector-search-footer-label">${0}</span>
			`), this.getOption('label', main_core.Loc.getMessage('UI_SELECTOR_CREATE_ITEM_LABEL')));
	      });
	    }
	  }, {
	    key: "getQueryContainer",
	    value: function getQueryContainer() {
	      return this.cache.remember('name-container', () => {
	        return main_core.Tag.render(_t3$5 || (_t3$5 = _$a`
				<span class="ui-selector-search-footer-query"></span>
			`));
	      });
	    }
	  }, {
	    key: "getLoaderContainer",
	    value: function getLoaderContainer() {
	      return this.cache.remember('loader', () => {
	        return main_core.Tag.render(_t4$5 || (_t4$5 = _$a`
				<div class="ui-selector-search-footer-loader"></div>
			`));
	      });
	    }
	  }, {
	    key: "createItem",
	    value: function createItem() {
	      const tagSelector = this.getDialog().getTagSelector();
	      if (tagSelector && tagSelector.isLocked()) {
	        return;
	      }
	      const finalize = () => {
	        this.hideLoader();
	        if (this.getDialog().getTagSelector()) {
	          this.getDialog().getTagSelector().unlock();
	          this.getDialog().focusSearch();
	        }
	      };
	      event.preventDefault();
	      this.showLoader();
	      if (tagSelector) {
	        tagSelector.lock();
	      }
	      this.getDialog().emitAsync('Search:onItemCreateAsync', {
	        searchQuery: this.getTab().getLastSearchQuery()
	      }).then(() => {
	        this.getTab().clearResults();
	        this.getDialog().clearSearch();
	        if (this.getDialog().getActiveTab() === this.getTab()) {
	          this.getDialog().selectFirstTab();
	        }
	        finalize();
	      }).catch(() => {
	        finalize();
	      });
	    }
	  }, {
	    key: "handleClick",
	    value: function handleClick() {
	      this.createItem();
	    }
	  }, {
	    key: "handleMetaEnter",
	    value: function handleMetaEnter(event) {
	      const keyboardEvent = event.getData().event;
	      keyboardEvent.stopPropagation();
	      if (this.getDialog().getActiveTab() !== this.getTab()) {
	        return;
	      }
	      this.handleClick();
	    }
	  }, {
	    key: "handleOnSearch",
	    value: function handleOnSearch(event) {
	      const {
	        query
	      } = event.getData();
	      this.getQueryContainer().textContent = query;
	    }
	  }]);
	  return SearchTabFooter;
	}(BaseFooter);

	let SearchTab = /*#__PURE__*/function (_Tab) {
	  babelHelpers.inherits(SearchTab, _Tab);
	  function SearchTab(dialog, tabOptions, searchOptions) {
	    var _this;
	    babelHelpers.classCallCheck(this, SearchTab);
	    const defaults = {
	      title: main_core.Loc.getMessage('UI_SELECTOR_SEARCH_TAB_TITLE'),
	      visible: false,
	      stub: true,
	      stubOptions: {
	        autoShow: false,
	        title: main_core.Loc.getMessage('UI_SELECTOR_SEARCH_STUB_TITLE'),
	        subtitle: main_core.Loc.getMessage('UI_SELECTOR_SEARCH_STUB_SUBTITLE_MSGVER_1')
	      }
	    };
	    const options = {
	      ...defaults,
	      ...tabOptions
	    };
	    options.id = 'search';
	    options.stubOptions.autoShow = false;
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(SearchTab).call(this, dialog, options));

	    // eslint-disable-next-line no-param-reassign
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "lastSearchQuery", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "queryCache", new Set());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "queryXhr", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "searchLoader", new SearchLoader(babelHelpers.assertThisInitialized(_this)));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "allowCreateItem", false);
	    searchOptions = main_core.Type.isPlainObject(searchOptions) ? searchOptions : {};
	    _this.setAllowCreateItem(searchOptions.allowCreateItem, searchOptions.footerOptions);
	    _this.loadWithDebounce = main_core.Runtime.debounce(() => {
	      _this.load(_this.getLastSearchQuery());
	    }, 500);
	    return _this;
	  }
	  babelHelpers.createClass(SearchTab, [{
	    key: "search",
	    value: function search(query) {
	      const searchQuery = new SearchQuery(query);
	      const dynamicEntities = this.getDynamicEntities(searchQuery);
	      searchQuery.setDynamicSearchEntities(dynamicEntities);
	      if (searchQuery.isEmpty()) {
	        this.getSearchLoader().hide();
	        return;
	      }
	      this.lastSearchQuery = searchQuery;
	      const matchResults = SearchEngine.matchItems(this.getDialog().getItems(), searchQuery);
	      this.clearResults();
	      this.appendResults(matchResults);
	      if (this.getDialog().shouldFocusOnFirst()) {
	        this.getDialog().focusOnFirstNode();
	      }
	      if (this.shouldLoad(searchQuery)) {
	        this.loadWithDebounce();
	        if (!this.isEmptyResult()) {
	          this.getStub().hide();
	        }
	      } else if (!this.getSearchLoader().isShown()) {
	        this.toggleEmptyResult();
	      }
	    }
	  }, {
	    key: "getLastSearchQuery",
	    value: function getLastSearchQuery() {
	      return this.lastSearchQuery;
	    }
	  }, {
	    key: "setAllowCreateItem",
	    value: function setAllowCreateItem(flag, options) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.allowCreateItem = flag;
	        if (flag) {
	          this.setFooter(SearchTabFooter, options);
	        } else {
	          this.setFooter(null);
	        }
	      }
	    }
	  }, {
	    key: "canCreateItem",
	    value: function canCreateItem() {
	      return this.allowCreateItem;
	    }
	  }, {
	    key: "appendResults",
	    value: function appendResults(matchResults) {
	      matchResults.sort((a, b) => {
	        const matchSortA = a.getSort();
	        const matchSortB = b.getSort();
	        if (matchSortA !== null && matchSortB !== null && matchSortA !== matchSortB) {
	          return matchSortA - matchSortB;
	        }
	        if (matchSortA !== null && matchSortB === null) {
	          return -1;
	        }
	        if (matchSortA === null && matchSortB !== null) {
	          return 1;
	        }
	        const contextSortA = a.getItem().getContextSort();
	        const contextSortB = b.getItem().getContextSort();
	        if (contextSortA !== null && contextSortB === null) {
	          return -1;
	        }
	        if (contextSortA === null && contextSortB !== null) {
	          return 1;
	        }
	        if (contextSortA !== null && contextSortB !== null) {
	          return contextSortB - contextSortA;
	        }
	        const globalSortA = a.getItem().getGlobalSort();
	        const globalSortB = b.getItem().getGlobalSort();
	        if (globalSortA !== null && globalSortB === null) {
	          return -1;
	        }
	        if (globalSortA === null && globalSortB !== null) {
	          return 1;
	        }
	        if (globalSortA !== null && globalSortB !== null) {
	          return globalSortB - globalSortA;
	        }
	        return 0;
	      });
	      this.getRootNode().disableRender();
	      matchResults.forEach(matchResult => {
	        const item = matchResult.getItem();
	        if (!this.getRootNode().hasItem(item)) {
	          const node = this.getRootNode().addItem(item);
	          node.setHighlights(matchResult.getMatchFields());
	        }
	      });
	      this.getRootNode().enableRender();
	      this.getRootNode().render(true);
	    }
	  }, {
	    key: "getDynamicEntities",
	    value: function getDynamicEntities(searchQuery) {
	      const result = [];
	      this.getDialog().getEntities().forEach(entity => {
	        if (entity.isSearchable()) {
	          const hasCacheLimit = entity.getSearchCacheLimits().some(pattern => {
	            return pattern.test(searchQuery.getQuery());
	          });
	          if (hasCacheLimit) {
	            result.push(entity.getId());
	          }
	        }
	      });
	      return result;
	    }
	  }, {
	    key: "isQueryCacheable",
	    value: function isQueryCacheable(searchQuery) {
	      return searchQuery.isCacheable() && !searchQuery.hasDynamicSearch();
	    }
	  }, {
	    key: "isQueryLoaded",
	    value: function isQueryLoaded(searchQuery) {
	      let found = false;
	      this.queryCache.forEach(query => {
	        if (found === false && searchQuery.getQuery().startsWith(query)) {
	          found = true;
	        }
	      });
	      return found;
	    }
	  }, {
	    key: "addCacheQuery",
	    value: function addCacheQuery(searchQuery) {
	      if (this.isQueryCacheable(searchQuery)) {
	        this.queryCache.add(searchQuery.getQuery());
	      }
	    }
	  }, {
	    key: "removeCacheQuery",
	    value: function removeCacheQuery(searchQuery) {
	      this.queryCache.delete(searchQuery.getQuery());
	    }
	  }, {
	    key: "shouldLoad",
	    value: function shouldLoad(searchQuery) {
	      if (!this.isQueryCacheable(searchQuery)) {
	        return true;
	      }
	      if (!this.getDialog().hasDynamicSearch()) {
	        return false;
	      }
	      return !this.isQueryLoaded(searchQuery);
	    }
	  }, {
	    key: "load",
	    value: function load(searchQuery) {
	      if (!this.shouldLoad(searchQuery)) {
	        return;
	      }

	      // if (this.queryXhr)
	      // {
	      // 	this.queryXhr.abort();
	      // }

	      this.addCacheQuery(searchQuery);
	      this.getStub().hide();
	      this.getSearchLoader().show();
	      main_core.ajax.runAction('ui.entityselector.doSearch', {
	        json: {
	          dialog: this.getDialog().getAjaxJson(),
	          searchQuery: searchQuery.getAjaxJson()
	        },
	        onrequeststart: xhr => {
	          this.queryXhr = xhr;
	        },
	        getParameters: {
	          context: this.getDialog().getContext()
	        }
	      }).then(response => {
	        this.getSearchLoader().hide();
	        if (!response || !response.data || !response.data.dialog || !response.data.dialog.items) {
	          this.removeCacheQuery(searchQuery);
	          this.toggleEmptyResult();
	          this.getDialog().emit('SearchTab:onLoad', {
	            searchTab: this
	          });
	          return;
	        }
	        if (response.data.searchQuery && response.data.searchQuery.cacheable === false) {
	          var _this$getLastSearchQu;
	          this.removeCacheQuery(searchQuery);
	          if (((_this$getLastSearchQu = this.getLastSearchQuery()) === null || _this$getLastSearchQu === void 0 ? void 0 : _this$getLastSearchQu.getQuery()) !== searchQuery.getQuery()) {
	            this.loadWithDebounce();
	          }
	        }
	        if (main_core.Type.isArrayFilled(response.data.dialog.items)) {
	          const items = new Set();
	          response.data.dialog.items.forEach(itemOptions => {
	            delete itemOptions.tabs;
	            delete itemOptions.children;
	            const item = this.getDialog().addItem(itemOptions);
	            items.add(item);
	          });
	          const isTabEmpty = this.isEmptyResult();
	          const matchResults = SearchEngine.matchItems([...items.values()], this.getLastSearchQuery());
	          this.appendResults(matchResults);
	          if (isTabEmpty && this.getDialog().shouldFocusOnFirst()) {
	            this.getDialog().focusOnFirstNode();
	          }
	        }
	        if (main_core.Type.isArrayFilled(response.data.dialog.errors)) {
	          this.getDialog().emitEntityErrors(response.data.dialog.errors);
	        }
	        this.toggleEmptyResult();
	        this.getDialog().emit('SearchTab:onLoad', {
	          searchTab: this
	        });
	      }).catch(error => {
	        this.removeCacheQuery(searchQuery);
	        this.getSearchLoader().hide();
	        this.toggleEmptyResult();
	        console.error(error);
	      });
	    }
	  }, {
	    key: "getSearchLoader",
	    value: function getSearchLoader() {
	      return this.searchLoader;
	    }
	  }, {
	    key: "clearResults",
	    value: function clearResults() {
	      this.getRootNode().removeChildren();
	    }
	  }, {
	    key: "isEmptyResult",
	    value: function isEmptyResult() {
	      return !this.getRootNode().hasChildren();
	    }
	  }, {
	    key: "toggleEmptyResult",
	    value: function toggleEmptyResult() {
	      if (this.isEmptyResult()) {
	        this.getStub().show();
	      } else {
	        this.getStub().hide();
	      }
	    }
	  }]);
	  return SearchTab;
	}(Tab);

	let _$b = t => t,
	  _t$b,
	  _t2$6,
	  _t3$6,
	  _t4$6,
	  _t5$4,
	  _t6$2,
	  _t7$1;
	let LoadState = function LoadState() {
	  babelHelpers.classCallCheck(this, LoadState);
	};
	babelHelpers.defineProperty(LoadState, "UNSENT", 'UNSENT');
	babelHelpers.defineProperty(LoadState, "LOADING", 'LOADING');
	babelHelpers.defineProperty(LoadState, "DONE", 'DONE');
	let TagSelectorMode = function TagSelectorMode() {
	  babelHelpers.classCallCheck(this, TagSelectorMode);
	};
	babelHelpers.defineProperty(TagSelectorMode, "INSIDE", 'INSIDE');
	babelHelpers.defineProperty(TagSelectorMode, "OUTSIDE", 'OUTSIDE');
	const instances = new Map();

	/**
	 * @memberof BX.UI.EntitySelector
	 */
	let Dialog = /*#__PURE__*/function (_EventEmitter) {
	  babelHelpers.inherits(Dialog, _EventEmitter);
	  babelHelpers.createClass(Dialog, null, [{
	    key: "getById",
	    value: function getById(id) {
	      return instances.get(id) || null;
	    }
	  }, {
	    key: "getInstances",
	    value: function getInstances() {
	      return Array.from(instances.values());
	    }
	  }]);
	  function Dialog(dialogOptions) {
	    var _this;
	    babelHelpers.classCallCheck(this, Dialog);
	    _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Dialog).call(this));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "id", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "items", new Map());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tabs", new Map());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "entities", new Map());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "targetNode", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "popup", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "cache", new main_core.Cache.MemoryCache());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "multiple", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "hideOnSelect", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "hideOnDeselect", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "addTagOnSelect", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "clearSearchOnSelect", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "context", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "selectedItems", new Set());
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "preselectedItems", []);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "undeselectedItems", []);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "dropdownMode", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "frozen", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "frozenProps", {});
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "hideByEsc", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "autoHide", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "autoHideHandler", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "offsetTop", 5);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "offsetLeft", 0);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "cacheable", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "width", 565);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "height", 420);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "maxLabelWidth", 160);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "minLabelWidth", 45);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "alwaysShowLabels", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "showAvatars", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "compactView", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "activeTab", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "recentTab", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "searchTab", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "rendered", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "loadState", LoadState.UNSENT);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "loader", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagSelector", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagSelectorMode", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "tagSelectorHeight", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "saveRecentItemsWithDebounce", main_core.Runtime.debounce(_this.saveRecentItems, 2000, babelHelpers.assertThisInitialized(_this)));
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "recentItemsToSave", []);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "recentItemsLimit", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "navigation", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "header", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "footer", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "popupOptions", {});
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "focusOnFirst", true);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "focusedNode", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "clearUnavailableItems", false);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "overlappingObserver", null);
	    babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "offsetAnimation", true);
	    _this.setEventNamespace('BX.UI.EntitySelector.Dialog');
	    const options = main_core.Type.isPlainObject(dialogOptions) ? dialogOptions : {};
	    _this.id = main_core.Type.isStringFilled(options.id) ? options.id : `ui-selector-${main_core.Text.getRandom().toLowerCase()}`;
	    _this.multiple = main_core.Type.isBoolean(options.multiple) ? options.multiple : true;
	    _this.context = main_core.Type.isStringFilled(options.context) ? options.context : null;
	    _this.clearUnavailableItems = options.clearUnavailableItems === true;
	    _this.compactView = options.compactView === true;
	    _this.dropdownMode = main_core.Type.isBoolean(options.dropdownMode) ? options.dropdownMode : false;
	    _this.alwaysShowLabels = main_core.Type.isBoolean(options.alwaysShowLabels) ? options.alwaysShowLabels : false;
	    if (main_core.Type.isArray(options.entities)) {
	      options.entities.forEach(entity => {
	        _this.addEntity(entity);
	      });
	    }
	    if (options.tagSelector instanceof TagSelector) {
	      _this.tagSelectorMode = TagSelectorMode.OUTSIDE;
	      _this.setTagSelector(options.tagSelector);
	    } else if (options.enableSearch === true) {
	      const defaultOptions = {
	        placeholder: main_core.Loc.getMessage('UI_TAG_SELECTOR_SEARCH_PLACEHOLDER'),
	        maxHeight: 102,
	        // three lines
	        textBoxWidth: 105
	      };
	      const customOptions = main_core.Type.isPlainObject(options.tagSelectorOptions) ? options.tagSelectorOptions : {};
	      const mandatoryOptions = {
	        dialogOptions: null,
	        showTextBox: true,
	        showAddButton: false,
	        showCreateButton: false,
	        multiple: _this.isMultiple()
	      };
	      const tagSelectorOptions = Object.assign(defaultOptions, customOptions, mandatoryOptions);
	      const tagSelector = new TagSelector(tagSelectorOptions);
	      _this.tagSelectorMode = TagSelectorMode.INSIDE;
	      _this.setTagSelector(tagSelector);
	    }
	    _this.setTargetNode(options.targetNode);
	    _this.setHideOnSelect(options.hideOnSelect);
	    _this.setHideOnDeselect(options.hideOnDeselect);
	    _this.setAddTagOnSelect(options.addTagOnSelect);
	    _this.setClearSearchOnSelect(options.clearSearchOnSelect);
	    _this.setWidth(options.width);
	    void _this.setHeight(options.height);
	    _this.setAutoHide(options.autoHide);
	    _this.setAutoHideHandler(options.autoHideHandler);
	    _this.setHideByEsc(options.hideByEsc);
	    _this.setOffsetLeft(options.offsetLeft);
	    _this.setOffsetTop(options.offsetTop);
	    _this.setCacheable(options.cacheable);
	    _this.setFocusOnFirst(options.focusOnFirst);
	    _this.setShowAvatars(options.showAvatars);
	    _this.setRecentItemsLimit(options.recentItemsLimit);
	    _this.setOffsetAnimation(options.offsetAnimation);
	    _this.recentTab = new RecentTab(babelHelpers.assertThisInitialized(_this), options.recentTabOptions);
	    _this.searchTab = new SearchTab(babelHelpers.assertThisInitialized(_this), options.searchTabOptions, options.searchOptions);
	    _this.addTab(_this.recentTab);
	    _this.addTab(_this.searchTab);
	    _this.setPreselectedItems(options.preselectedItems);
	    _this.setUndeselectedItems(options.undeselectedItems);
	    _this.setOptions(options);
	    const preload = options.preload === true || _this.getPreselectedItems().length > 0;
	    if (preload) {
	      _this.load();
	    }
	    if (main_core.Type.isPlainObject(options.popupOptions)) {
	      const allowedOptions = new Set(['overlay', 'bindOptions', 'targetContainer', 'zIndexOptions', 'events', 'animation', 'className']);
	      const popupOptions = {};
	      Object.keys(options.popupOptions).forEach(option => {
	        if (allowedOptions.has(option)) {
	          popupOptions[option] = options.popupOptions[option];
	        }
	      });
	      _this.popupOptions = popupOptions;
	    }
	    _this.navigation = new Navigation(babelHelpers.assertThisInitialized(_this));
	    new SliderIntegration(babelHelpers.assertThisInitialized(_this));
	    _this.subscribe('ItemNode:onFocus', _this.handleItemNodeFocus.bind(babelHelpers.assertThisInitialized(_this)));
	    _this.subscribe('ItemNode:onUnfocus', _this.handleItemNodeUnfocus.bind(babelHelpers.assertThisInitialized(_this)));
	    _this.subscribeFromOptions(options.events);
	    instances.set(_this.id, babelHelpers.assertThisInitialized(_this));
	    return _this;
	  }
	  babelHelpers.createClass(Dialog, [{
	    key: "show",
	    value: function show() {
	      this.load();
	      this.getPopup().show();
	    }
	  }, {
	    key: "hide",
	    value: function hide() {
	      this.getPopup().close();
	    }
	  }, {
	    key: "destroy",
	    value: function destroy() {
	      if (this.destroying) {
	        return;
	      }
	      this.destroying = true;
	      this.emit('onDestroy');
	      this.disconnectTabOverlapping();
	      instances.delete(this.getId());
	      if (this.isRendered()) {
	        this.getPopup().destroy();
	      }
	      for (const property in this) {
	        if (this.hasOwnProperty(property)) {
	          delete this[property];
	        }
	      }
	      Object.setPrototypeOf(this, null);
	    }
	  }, {
	    key: "isOpen",
	    value: function isOpen() {
	      return this.popup && this.popup.isShown();
	    }
	  }, {
	    key: "adjustPosition",
	    value: function adjustPosition() {
	      if (this.isRendered()) {
	        this.getPopup().adjustPosition();
	      }
	    }
	  }, {
	    key: "search",
	    value: function search(queryString) {
	      const query = main_core.Type.isStringFilled(queryString) ? queryString.trim() : '';
	      const event = new main_core_events.BaseEvent({
	        data: {
	          query
	        }
	      });
	      this.emit('onBeforeSearch', event);
	      if (event.isDefaultPrevented()) {
	        return;
	      }
	      if (!main_core.Type.isStringFilled(query)) {
	        this.selectFirstTab();
	        if (this.getSearchTab()) {
	          this.getSearchTab().clearResults();
	        }
	      } else if (this.getSearchTab()) {
	        this.selectTab(this.getSearchTab().getId());
	        this.getSearchTab().search(query);
	      }
	      this.emit('onSearch', {
	        query
	      });
	    }
	  }, {
	    key: "addItem",
	    value: function addItem(options) {
	      if (!main_core.Type.isPlainObject(options)) {
	        throw new Error('EntitySelector.addItem: wrong item options.');
	      }
	      let item = this.getItem(options);
	      if (!item) {
	        item = new Item(options);
	        const undeselectable = this.getUndeselectedItems().some(itemId => {
	          return itemId[0] === item.getEntityId() && String(itemId[1]) === String(item.getId());
	        });
	        if (undeselectable) {
	          item.setDeselectable(false);
	        }
	        item.setDialog(this);
	        const entity = this.getEntity(item.getEntityId());
	        if (entity === null) {
	          this.addEntity({
	            id: item.getEntityId()
	          });
	        }
	        let entityItems = this.items.get(item.getEntityId());
	        if (!entityItems) {
	          entityItems = new Map();
	          this.items.set(item.getEntityId(), entityItems);
	        }
	        entityItems.set(String(item.getId()), item);
	        if (item.isSelected()) {
	          this.handleItemSelect(item);
	        }
	      }
	      let tabs = [];
	      if (main_core.Type.isArray(options.tabs)) {
	        tabs = options.tabs;
	      } else if (main_core.Type.isStringFilled(options.tabs)) {
	        tabs = [options.tabs];
	      }
	      const children = main_core.Type.isArray(options.children) ? options.children : [];
	      tabs.forEach(tabId => {
	        const tab = this.getTab(tabId);
	        if (tab) {
	          const itemNode = tab.getRootNode().addItem(item, options.nodeOptions);
	          itemNode.addChildren(children);
	        }
	      });
	      return item;
	    }
	  }, {
	    key: "removeItem",
	    value: function removeItem(item) {
	      item = this.getItem(item);
	      if (item) {
	        this.handleItemDeselect(item);
	        item.getNodes().forEach(node => {
	          node.getParentNode().removeChild(node);
	        });
	        const entityItems = this.getEntityItemsInternal(item.getEntityId());
	        if (entityItems) {
	          entityItems.delete(String(item.getId()));
	          if (entityItems.size === 0) {
	            this.items.delete(item.getEntityId());
	          }
	        }
	      }
	      return item;
	    }
	  }, {
	    key: "removeItems",
	    value: function removeItems() {
	      this.getItemsInternal().forEach(items => {
	        items.forEach(item => {
	          this.removeItem(item);
	        });
	      });
	    }
	  }, {
	    key: "getItem",
	    value: function getItem(item) {
	      let id = null;
	      let entityId = null;
	      if (main_core.Type.isArray(item) && item.length === 2) {
	        [entityId, id] = item;
	      } else if (item instanceof Item) {
	        id = item.getId();
	        entityId = item.getEntityId();
	      } else if (main_core.Type.isObjectLike(item)) {
	        ({
	          id,
	          entityId
	        } = item);
	      }
	      const entityItems = this.getEntityItemsInternal(entityId);
	      if (entityItems) {
	        return entityItems.get(String(id)) || null;
	      }
	      return null;
	    }
	  }, {
	    key: "getSelectedItems",
	    value: function getSelectedItems() {
	      return Array.from(this.selectedItems);
	    }
	  }, {
	    key: "getItems",
	    value: function getItems() {
	      const items = [];
	      this.getItemsInternal().forEach(entityItems => {
	        Array.prototype.push.apply(items, Array.from(entityItems.values()));
	      });
	      return items;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "getItemsInternal",
	    value: function getItemsInternal() {
	      return this.items;
	    }
	  }, {
	    key: "getEntityItems",
	    value: function getEntityItems(entityId) {
	      const items = this.getEntityItemsInternal(entityId);
	      return items === null ? [] : Array.from(items.values());
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "getEntityItemsInternal",
	    value: function getEntityItemsInternal(entityId) {
	      return this.items.get(entityId) || null;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "validateItemIds",
	    value: function validateItemIds(itemIds) {
	      if (!main_core.Type.isArrayFilled(itemIds)) {
	        return [];
	      }
	      const result = [];
	      itemIds.forEach(itemId => {
	        if (!main_core.Type.isArray(itemId) || itemId.length !== 2) {
	          return;
	        }
	        const [entityId, id] = itemId;
	        if (main_core.Type.isStringFilled(entityId) && (main_core.Type.isStringFilled(id) || main_core.Type.isNumber(id))) {
	          result.push(itemId);
	        }
	      });
	      return result;
	    }
	  }, {
	    key: "addTab",
	    value: function addTab(tab) {
	      if (main_core.Type.isPlainObject(tab)) {
	        tab = new Tab(this, tab);
	      }
	      if (!(tab instanceof Tab)) {
	        throw new Error('EntitySelector: a tab must be an instance of EntitySelector.Tab.');
	      }
	      if (this.getTab(tab.getId())) {
	        console.error(`EntitySelector: the "${tab.getId()}" tab is already existed.`);
	        return tab;
	      }
	      tab.setDialog(this);
	      this.tabs.set(tab.getId(), tab);
	      if (this.isRendered()) {
	        this.insertTab(tab);
	      }
	      return tab;
	    }
	  }, {
	    key: "getTabs",
	    value: function getTabs() {
	      return Array.from(this.tabs.values());
	    }
	  }, {
	    key: "getTab",
	    value: function getTab(id) {
	      return this.tabs.get(id) || null;
	    }
	  }, {
	    key: "getRecentTab",
	    value: function getRecentTab() {
	      return this.recentTab;
	    }
	  }, {
	    key: "getSearchTab",
	    value: function getSearchTab() {
	      return this.searchTab;
	    }
	  }, {
	    key: "selectTab",
	    value: function selectTab(id) {
	      const newActiveTab = this.getTab(id);
	      if (!newActiveTab || newActiveTab === this.getActiveTab()) {
	        return newActiveTab;
	      }
	      if (this.getActiveTab()) {
	        this.getActiveTab().deselect();
	      }
	      this.activeTab = newActiveTab;
	      newActiveTab.select();
	      if (!newActiveTab.isRendered()) {
	        newActiveTab.render();
	      }
	      requestAnimationFrame(() => {
	        requestAnimationFrame(() => {
	          this.focusSearch();
	        });
	      });
	      this.clearNodeFocus();
	      if (this.shouldFocusOnFirst()) {
	        this.focusOnFirstNode();
	      }
	      this.adjustHeader();
	      this.adjustFooter();
	      return newActiveTab;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "insertTab",
	    value: function insertTab(tab) {
	      tab.renderLabel();
	      tab.renderContainer();
	      main_core.Dom.append(tab.getLabelContainer(), this.getLabelsContainer());
	      main_core.Dom.append(tab.getContainer(), this.getTabContentsContainer());
	      if (tab.getHeader()) {
	        main_core.Dom.append(tab.getHeader().getContainer(), this.getHeaderContainer());
	      }
	      if (tab.getFooter()) {
	        main_core.Dom.append(tab.getFooter().getContainer(), this.getFooterContainer());
	      }
	    }
	  }, {
	    key: "selectFirstTab",
	    value: function selectFirstTab(onlyVisible = true) {
	      const tabs = this.getTabs();
	      for (let i = 0; i < tabs.length; i++) {
	        const tab = tabs[i];
	        if (onlyVisible === false || tab.isVisible()) {
	          return this.selectTab(tab.getId());
	        }
	      }
	      if (this.isDropdownMode()) {
	        return this.selectTab(this.getRecentTab().getId());
	      }
	      return null;
	    }
	  }, {
	    key: "selectLastTab",
	    value: function selectLastTab(onlyVisible = true) {
	      const tabs = this.getTabs();
	      for (let i = tabs.length - 1; i >= 0; i--) {
	        const tab = tabs[i];
	        if (onlyVisible === false || tab.isVisible()) {
	          return this.selectTab(tab.getId());
	        }
	      }
	      if (this.isDropdownMode()) {
	        return this.selectTab(this.getRecentTab().getId());
	      }
	      return null;
	    }
	  }, {
	    key: "getActiveTab",
	    value: function getActiveTab() {
	      return this.activeTab;
	    }
	  }, {
	    key: "getNextTab",
	    value: function getNextTab(onlyVisible = true) {
	      let nextTab = null;
	      let activeFound = false;
	      const tabs = this.getTabs();
	      for (let i = 0; i < tabs.length; i++) {
	        const tab = tabs[i];
	        if (onlyVisible && !tab.isVisible()) {
	          continue;
	        }
	        if (tab === this.getActiveTab()) {
	          activeFound = true;
	        } else if (activeFound) {
	          nextTab = tab;
	          break;
	        }
	      }
	      return nextTab;
	    }
	  }, {
	    key: "getPreviousTab",
	    value: function getPreviousTab(onlyVisible = true) {
	      let previousTab = null;
	      let activeFound = false;
	      const tabs = this.getTabs();
	      for (let i = tabs.length - 1; i >= 0; i--) {
	        const tab = tabs[i];
	        if (onlyVisible && !tab.isVisible()) {
	          continue;
	        }
	        if (tab === this.getActiveTab()) {
	          activeFound = true;
	        } else if (activeFound) {
	          previousTab = tab;
	          break;
	        }
	      }
	      return previousTab;
	    }
	  }, {
	    key: "removeTab",
	    value: function removeTab(id) {
	      const tab = this.getTab(id);
	      if (!tab) {
	        return;
	      }
	      tab.getRootNode().removeChildren();
	      this.tabs.delete(id);
	      main_core.Dom.remove(tab.getLabelContainer(), this.getLabelsContainer());
	      main_core.Dom.remove(tab.getContainer(), this.getTabContentsContainer());
	      if (tab.getHeader()) {
	        main_core.Dom.remove(tab.getHeader().getContainer(), this.getHeaderContainer());
	      }
	      if (tab.getFooter()) {
	        main_core.Dom.remove(tab.getFooter().getContainer(), this.getFooterContainer());
	      }
	      this.selectFirstTab();
	    }
	  }, {
	    key: "addEntity",
	    value: function addEntity(entity) {
	      if (main_core.Type.isPlainObject(entity)) {
	        entity = new Entity(entity);
	      }
	      if (!(entity instanceof Entity)) {
	        throw new Error('EntitySelector: an entity must be an instance of EntitySelector.Entity.');
	      }
	      if (this.hasEntity(entity.getId())) {
	        console.error(`EntitySelector: the "${entity.getId()}" entity is already existed.`);
	        return entity;
	      }
	      this.entities.set(entity.getId(), entity);
	      return entity;
	    }
	  }, {
	    key: "getEntity",
	    value: function getEntity(id) {
	      return this.entities.get(id) || null;
	    }
	  }, {
	    key: "hasEntity",
	    value: function hasEntity(id) {
	      return this.entities.has(id);
	    }
	  }, {
	    key: "getEntities",
	    value: function getEntities() {
	      return Array.from(this.entities.values());
	    }
	  }, {
	    key: "removeEntity",
	    value: function removeEntity(id) {
	      this.removeEntityItems(id);
	      this.entities.delete(id);
	    }
	  }, {
	    key: "removeEntityItems",
	    value: function removeEntityItems(id) {
	      const items = this.getEntityItemsInternal(id);
	      if (items) {
	        items.forEach(item => {
	          this.removeItem(item);
	        });
	      }
	    }
	  }, {
	    key: "getHeader",
	    value: function getHeader() {
	      return this.header;
	    }
	  }, {
	    key: "getActiveHeader",
	    value: function getActiveHeader() {
	      if (!this.getActiveTab()) {
	        return null;
	      }
	      if (this.getActiveTab().getHeader()) {
	        return this.getActiveTab().getHeader();
	      }
	      return this.getHeader() && this.getActiveTab().canShowDefaultHeader() ? this.getHeader() : null;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "adjustHeader",
	    value: function adjustHeader() {
	      if (!this.getActiveTab()) {
	        return;
	      }
	      if (this.getActiveTab().getHeader()) {
	        if (this.getHeader()) {
	          this.getHeader().hide();
	        }
	        this.getActiveTab().getHeader().show();
	      } else {
	        if (this.getHeader()) {
	          if (this.getActiveTab().canShowDefaultHeader()) {
	            this.getHeader().show();
	          } else {
	            this.getHeader().hide();
	          }
	        }
	      }
	    }
	  }, {
	    key: "setHeader",
	    value: function setHeader(headerContent, headerOptions) {
	      /** @var {BaseHeader} */
	      let header = null;
	      if (headerContent !== null) {
	        header = this.constructor.createHeader(this, headerContent, headerOptions);
	        if (header === null) {
	          return null;
	        }
	      }
	      if (this.isRendered() && this.getHeader() !== null) {
	        main_core.Dom.remove(this.getHeader().getContainer());
	        this.adjustHeader();
	      }
	      this.header = header;
	      if (this.isRendered()) {
	        this.appendHeader(header);
	        this.adjustHeader();
	      }
	      return header;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "appendHeader",
	    value: function appendHeader(header) {
	      if (header instanceof BaseHeader) {
	        main_core.Dom.append(header.getContainer(), this.getHeaderContainer());
	      }
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "getFooter",
	    value: function getFooter() {
	      return this.footer;
	    }
	  }, {
	    key: "getActiveFooter",
	    value: function getActiveFooter() {
	      if (!this.getActiveTab()) {
	        return null;
	      }
	      if (this.getActiveTab().getFooter()) {
	        return this.getActiveTab().getFooter();
	      }
	      return this.getFooter() && this.getActiveTab().canShowDefaultFooter() ? this.getFooter() : null;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "adjustFooter",
	    value: function adjustFooter() {
	      if (!this.getActiveTab()) {
	        return;
	      }
	      if (this.getActiveTab().getFooter()) {
	        if (this.getFooter()) {
	          this.getFooter().hide();
	        }
	        this.getActiveTab().getFooter().show();
	      } else {
	        if (this.getFooter()) {
	          if (this.getActiveTab().canShowDefaultFooter()) {
	            this.getFooter().show();
	          } else {
	            this.getFooter().hide();
	          }
	        }
	      }
	    }
	  }, {
	    key: "setFooter",
	    value: function setFooter(footerContent, footerOptions) {
	      /** @var {BaseFooter} */
	      let footer = null;
	      if (footerContent !== null) {
	        footer = this.constructor.createFooter(this, footerContent, footerOptions);
	        if (footer === null) {
	          return null;
	        }
	      }
	      if (this.isRendered() && this.getFooter() !== null) {
	        main_core.Dom.remove(this.getFooter().getContainer());
	        this.adjustFooter();
	      }
	      this.footer = footer;
	      if (this.isRendered()) {
	        this.appendFooter(footer);
	        this.adjustFooter();
	      }
	      return footer;
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "appendFooter",
	    value: function appendFooter(footer) {
	      if (footer instanceof BaseFooter) {
	        main_core.Dom.append(footer.getContainer(), this.getFooterContainer());
	      }
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "getId",
	    value: function getId() {
	      return this.id;
	    }
	  }, {
	    key: "getContext",
	    value: function getContext() {
	      return this.context;
	    }
	  }, {
	    key: "getNavigation",
	    value: function getNavigation() {
	      return this.navigation;
	    }
	  }, {
	    key: "deselectAll",
	    value: function deselectAll() {
	      this.getSelectedItems().forEach(item => {
	        item.deselect();
	      });
	    }
	  }, {
	    key: "isMultiple",
	    value: function isMultiple() {
	      return this.multiple;
	    }
	  }, {
	    key: "setTargetNode",
	    value: function setTargetNode(node) {
	      if (!main_core.Type.isDomNode(node) && !main_core.Type.isNull(node) && !main_core.Type.isObject(node)) {
	        return;
	      }
	      this.targetNode = node;
	      if (this.isRendered()) {
	        this.getPopup().setBindElement(this.targetNode);
	        this.getPopup().adjustPosition();
	      }
	    }
	  }, {
	    key: "getTargetNode",
	    value: function getTargetNode() {
	      if (this.targetNode === null) {
	        if (this.getTagSelectorMode() === TagSelectorMode.OUTSIDE) {
	          return this.getTagSelector().getOuterContainer();
	        }
	      }
	      return this.targetNode;
	    }
	  }, {
	    key: "setHideOnSelect",
	    value: function setHideOnSelect(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.hideOnSelect = flag;
	      }
	    }
	  }, {
	    key: "shouldHideOnSelect",
	    value: function shouldHideOnSelect() {
	      if (this.hideOnSelect !== null) {
	        return this.hideOnSelect;
	      }
	      return !this.isMultiple();
	    }
	  }, {
	    key: "setHideOnDeselect",
	    value: function setHideOnDeselect(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.hideOnDeselect = flag;
	      }
	    }
	  }, {
	    key: "shouldHideOnDeselect",
	    value: function shouldHideOnDeselect() {
	      if (this.hideOnDeselect !== null) {
	        return this.hideOnDeselect;
	      }
	      return false;
	    }
	  }, {
	    key: "setClearSearchOnSelect",
	    value: function setClearSearchOnSelect(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.clearSearchOnSelect = flag;
	      }
	    }
	  }, {
	    key: "shouldClearSearchOnSelect",
	    value: function shouldClearSearchOnSelect() {
	      return this.clearSearchOnSelect;
	    }
	  }, {
	    key: "setAddTagOnSelect",
	    value: function setAddTagOnSelect(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.addTagOnSelect = flag;
	      }
	    }
	  }, {
	    key: "shouldAddTagOnSelect",
	    value: function shouldAddTagOnSelect() {
	      if (this.addTagOnSelect !== null) {
	        return this.addTagOnSelect;
	      }
	      return this.isMultiple() || this.isTagSelectorOutside();
	    }
	  }, {
	    key: "setShowAvatars",
	    value: function setShowAvatars(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.showAvatars = flag;
	        if (this.isRendered()) {
	          this.getTabs().forEach(tab => {
	            tab.renderContainer();
	          });
	        }
	      }
	    }
	  }, {
	    key: "shouldShowAvatars",
	    value: function shouldShowAvatars() {
	      return this.showAvatars;
	    }
	  }, {
	    key: "setRecentItemsLimit",
	    value: function setRecentItemsLimit(recentItemsLimit) {
	      if (main_core.Type.isNumber(recentItemsLimit) && recentItemsLimit > 0) {
	        this.recentItemsLimit = recentItemsLimit;
	      }
	    }
	  }, {
	    key: "getRecentItemsLimit",
	    value: function getRecentItemsLimit() {
	      return this.recentItemsLimit;
	    }
	  }, {
	    key: "setOffsetAnimation",
	    value: function setOffsetAnimation(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.offsetAnimation = flag;
	        if (this.isRendered() && !this.offsetAnimation) {
	          main_core.Dom.removeClass(this.getPopup().getPopupContainer(), 'ui-selector-popup-offset-animation');
	        }
	      }
	    }
	  }, {
	    key: "isCompactView",
	    value: function isCompactView() {
	      return this.compactView;
	    }
	  }, {
	    key: "setAutoHide",
	    value: function setAutoHide(enable) {
	      if (main_core.Type.isBoolean(enable)) {
	        this.autoHide = enable;
	        if (this.isRendered()) {
	          this.getPopup().setAutoHide(enable);
	        }
	      }
	    }
	  }, {
	    key: "isAutoHide",
	    value: function isAutoHide() {
	      return this.autoHide;
	    }
	  }, {
	    key: "setAutoHideHandler",
	    value: function setAutoHideHandler(handler) {
	      if (main_core.Type.isFunction(handler) || handler === null) {
	        this.autoHideHandler = handler;
	      }
	    }
	  }, {
	    key: "setHideByEsc",
	    value: function setHideByEsc(enable) {
	      if (main_core.Type.isBoolean(enable)) {
	        this.hideByEsc = enable;
	        if (this.isRendered()) {
	          this.getPopup().setClosingByEsc(enable);
	        }
	      }
	    }
	  }, {
	    key: "shouldHideByEsc",
	    value: function shouldHideByEsc() {
	      return this.hideByEsc;
	    }
	  }, {
	    key: "getWidth",
	    value: function getWidth() {
	      return this.width;
	    }
	  }, {
	    key: "setWidth",
	    value: function setWidth(width) {
	      if (main_core.Type.isNumber(width) && width > 0) {
	        this.width = width;
	        if (this.isRendered()) {
	          main_core.Dom.style(this.getContainer(), 'width', `${width}px`);
	        }
	      }
	    }
	  }, {
	    key: "getHeight",
	    value: function getHeight() {
	      return this.height;
	    }
	  }, {
	    key: "setHeight",
	    value: function setHeight(height) {
	      if (main_core.Type.isNumber(height) && height > 0) {
	        this.height = height;
	        if (this.isRendered()) {
	          main_core.Dom.style(this.getContainer(), 'height', `${height}px`);
	          return Animation.handleTransitionEnd(this.getContainer(), 'height');
	        } else {
	          return Promise.resolve();
	        }
	      } else {
	        return Promise.resolve();
	      }
	    }
	  }, {
	    key: "getOffsetLeft",
	    value: function getOffsetLeft() {
	      return this.offsetLeft;
	    }
	  }, {
	    key: "setOffsetLeft",
	    value: function setOffsetLeft(offset) {
	      if (main_core.Type.isNumber(offset) && offset >= 0) {
	        this.offsetLeft = offset;
	        if (this.isRendered()) {
	          this.getPopup().setOffset({
	            offsetLeft: offset
	          });
	          this.adjustPosition();
	        }
	      }
	    }
	  }, {
	    key: "getOffsetTop",
	    value: function getOffsetTop() {
	      return this.offsetTop;
	    }
	  }, {
	    key: "setOffsetTop",
	    value: function setOffsetTop(offset) {
	      if (main_core.Type.isNumber(offset) && offset >= 0) {
	        this.offsetTop = offset;
	        if (this.isRendered()) {
	          this.getPopup().setOffset({
	            offsetTop: offset
	          });
	          this.adjustPosition();
	        }
	      }
	    }
	  }, {
	    key: "getZindex",
	    value: function getZindex() {
	      return this.getPopup().getZindex();
	    }
	  }, {
	    key: "isCacheable",
	    value: function isCacheable() {
	      return this.cacheable;
	    }
	  }, {
	    key: "setCacheable",
	    value: function setCacheable(cacheable) {
	      if (main_core.Type.isBoolean(cacheable)) {
	        this.cacheable = cacheable;
	        if (this.isRendered()) {
	          this.getPopup().setCacheable(cacheable);
	        }
	      }
	    }
	  }, {
	    key: "shouldFocusOnFirst",
	    value: function shouldFocusOnFirst() {
	      return this.focusOnFirst;
	    }
	  }, {
	    key: "setFocusOnFirst",
	    value: function setFocusOnFirst(flag) {
	      if (main_core.Type.isBoolean(flag)) {
	        this.focusOnFirst = flag;
	      }
	    }
	  }, {
	    key: "focusOnFirstNode",
	    value: function focusOnFirstNode() {
	      if (this.getActiveTab()) {
	        const itemNode = this.getActiveTab().getRootNode().getFirstChild();
	        if (itemNode) {
	          itemNode.focus();
	          return itemNode;
	        }
	      }
	      return null;
	    }
	  }, {
	    key: "getFocusedNode",
	    value: function getFocusedNode() {
	      return this.focusedNode;
	    }
	  }, {
	    key: "clearNodeFocus",
	    value: function clearNodeFocus() {
	      if (this.focusedNode) {
	        this.focusedNode.unfocus();
	        this.focusedNode = null;
	      }
	    }
	  }, {
	    key: "isDropdownMode",
	    value: function isDropdownMode() {
	      return this.dropdownMode;
	    }
	  }, {
	    key: "setPreselectedItems",
	    value: function setPreselectedItems(itemIds) {
	      this.preselectedItems = this.validateItemIds(itemIds);
	    }
	  }, {
	    key: "getPreselectedItems",
	    value: function getPreselectedItems() {
	      return this.preselectedItems;
	    }
	  }, {
	    key: "setUndeselectedItems",
	    value: function setUndeselectedItems(itemIds) {
	      this.undeselectedItems = this.validateItemIds(itemIds);
	    }
	  }, {
	    key: "getUndeselectedItems",
	    value: function getUndeselectedItems() {
	      return this.undeselectedItems;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "setOptions",
	    value: function setOptions(dialogOptions) {
	      const options = main_core.Type.isPlainObject(dialogOptions) ? dialogOptions : {};
	      if (main_core.Type.isArray(options.tabs)) {
	        options.tabs.forEach(tab => {
	          this.addTab(tab);
	        });
	      }
	      if (main_core.Type.isArray(options.selectedItems)) {
	        options.selectedItems.forEach(itemOptions => {
	          const options = Object.assign({}, main_core.Type.isPlainObject(itemOptions) ? itemOptions : {});
	          options.selected = true;
	          this.addItem(options);
	        });
	      }
	      if (main_core.Type.isArray(options.items)) {
	        options.items.forEach(itemOptions => {
	          this.addItem(itemOptions);
	        });
	      }
	      this.setHeader(options.header, options.headerOptions);
	      this.setFooter(options.footer, options.footerOptions);
	    }
	  }, {
	    key: "getMaxLabelWidth",
	    value: function getMaxLabelWidth() {
	      return this.maxLabelWidth;
	    }
	  }, {
	    key: "getMinLabelWidth",
	    value: function getMinLabelWidth() {
	      return this.minLabelWidth;
	    }
	  }, {
	    key: "expandLabels",
	    value: function expandLabels(animate = true) {
	      const freeSpace = parseInt(this.getPopup().getPopupContainer().style.left, 10);
	      if (freeSpace > this.getMinLabelWidth()) {
	        main_core.Dom.removeClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-hide');
	        if (animate) {
	          main_core.Dom.addClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-show');
	          main_core.Dom.style(this.getLabelsContainer(), 'max-width', `${Math.min(freeSpace, this.getMaxLabelWidth())}px`);
	          Animation.handleTransitionEnd(this.getLabelsContainer(), 'max-width').then(() => {
	            main_core.Dom.removeClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-show');
	            main_core.Dom.addClass(this.getLabelsContainer(), 'ui-selector-tab-labels--active');
	          }).catch(() => {
	            // fail silently
	          });
	        } else {
	          main_core.Dom.style(this.getLabelsContainer(), 'max-width', `${Math.min(freeSpace, this.getMaxLabelWidth())}px`);
	        }
	      } else {
	        main_core.Dom.addClass(this.getLabelsContainer(), 'ui-selector-tab-labels--active');
	      }
	    }
	  }, {
	    key: "collapseLabels",
	    value: function collapseLabels(animate = true) {
	      main_core.Dom.removeClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-show');
	      main_core.Dom.removeClass(this.getLabelsContainer(), 'ui-selector-tab-labels--active');
	      if (animate) {
	        main_core.Dom.addClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-hide');
	        Animation.handleTransitionEnd(this.getLabelsContainer(), 'max-width').then(() => {
	          main_core.Dom.removeClass(this.getLabelsContainer(), 'ui-selector-tab-labels--animate-hide');
	        }).catch(() => {
	          // fail silently
	        });
	      }
	      main_core.Dom.style(this.getLabelsContainer(), 'max-width', null);
	    }
	  }, {
	    key: "getTagSelector",
	    value: function getTagSelector() {
	      return this.tagSelector;
	    }
	  }, {
	    key: "getTagSelectorMode",
	    value: function getTagSelectorMode() {
	      return this.tagSelectorMode;
	    }
	  }, {
	    key: "isTagSelectorInside",
	    value: function isTagSelectorInside() {
	      return this.getTagSelector() && this.getTagSelectorMode() === TagSelectorMode.INSIDE;
	    }
	  }, {
	    key: "isTagSelectorOutside",
	    value: function isTagSelectorOutside() {
	      return this.getTagSelector() && this.getTagSelectorMode() === TagSelectorMode.OUTSIDE;
	    }
	  }, {
	    key: "getTagSelectorQuery",
	    value: function getTagSelectorQuery() {
	      return this.getTagSelector() ? this.getTagSelector().getTextBoxValue() : '';
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "setTagSelector",
	    value: function setTagSelector(tagSelector) {
	      this.tagSelector = tagSelector;
	      this.tagSelector.subscribe('onInput', main_core.Runtime.debounce(this.handleTagSelectorInput, 200, this));
	      this.tagSelector.subscribe('onAddButtonClick', this.handleTagSelectorAddButtonClick.bind(this));
	      this.tagSelector.subscribe('onTagRemove', this.handleTagSelectorTagRemove.bind(this));
	      this.tagSelector.subscribe('onAfterTagRemove', this.handleTagSelectorAfterTagRemove.bind(this));
	      this.tagSelector.subscribe('onAfterTagAdd', this.handleTagSelectorAfterTagAdd.bind(this));
	      this.tagSelector.subscribe('onContainerClick', this.handleTagSelectorClick.bind(this));
	      this.tagSelector.setDialog(this);
	    }
	  }, {
	    key: "focusSearch",
	    value: function focusSearch() {
	      if (this.getTagSelector()) {
	        if (this.getActiveTab() !== this.getSearchTab()) {
	          this.getTagSelector().clearTextBox();
	        }
	        this.getTagSelector().focusTextBox();
	      }
	    }
	  }, {
	    key: "clearSearch",
	    value: function clearSearch() {
	      if (this.getTagSelector()) {
	        this.getTagSelector().clearTextBox();
	        if (this.getActiveTab() === this.getSearchTab()) {
	          this.selectFirstTab();
	        }
	      }
	    }
	  }, {
	    key: "getLoader",
	    value: function getLoader() {
	      if (this.loader === null) {
	        this.loader = new main_loader.Loader({
	          target: this.getTabsContainer(),
	          size: 100
	        });
	      }
	      return this.loader;
	    }
	  }, {
	    key: "showLoader",
	    value: function showLoader() {
	      void this.getLoader().show();
	    }
	  }, {
	    key: "hideLoader",
	    value: function hideLoader() {
	      if (this.loader !== null) {
	        void this.getLoader().hide();
	      }
	    }
	  }, {
	    key: "destroyLoader",
	    value: function destroyLoader() {
	      if (this.loader !== null) {
	        this.getLoader().destroy();
	      }
	      this.loader = null;
	    }
	  }, {
	    key: "getPopup",
	    value: function getPopup() {
	      if (this.popup !== null) {
	        return this.popup;
	      }
	      this.getTabs().forEach(tab => {
	        this.insertTab(tab);
	      });
	      const popupOptions = {
	        ...this.popupOptions
	      };
	      const userEvents = popupOptions.events;
	      delete popupOptions.events;
	      this.popup = new main_popup.Popup({
	        contentPadding: 0,
	        padding: 0,
	        offsetTop: this.getOffsetTop(),
	        offsetLeft: this.getOffsetLeft(),
	        animation: {
	          showClassName: 'ui-selector-popup-animation-show',
	          closeClassName: 'ui-selector-popup-animation-close',
	          closeAnimationType: 'animation'
	        },
	        bindElement: this.getTargetNode(),
	        bindOptions: {
	          forceBindPosition: true
	        },
	        autoHide: this.isAutoHide(),
	        autoHideHandler: this.handleAutoHide.bind(this),
	        closeByEsc: this.shouldHideByEsc(),
	        cacheable: this.isCacheable(),
	        events: {
	          onFirstShow: this.handlePopupFirstShow.bind(this),
	          onShow: this.handlePopupShow.bind(this),
	          onAfterShow: this.handlePopupAfterShow.bind(this),
	          onAfterClose: this.handlePopupAfterClose.bind(this),
	          onDestroy: this.handlePopupDestroy.bind(this)
	        },
	        content: this.getContainer(),
	        ...popupOptions
	      });
	      this.popup.subscribeFromOptions(userEvents);
	      this.rendered = true;
	      this.selectFirstTab();
	      return this.popup;
	    }
	  }, {
	    key: "isRendered",
	    value: function isRendered() {
	      return this.rendered;
	    }
	  }, {
	    key: "getContainer",
	    value: function getContainer() {
	      return this.cache.remember('container', () => {
	        let searchContainer = '';
	        if (this.getTagSelectorMode() === TagSelectorMode.INSIDE) {
	          searchContainer = main_core.Tag.render(_t$b || (_t$b = _$b`<div class="ui-selector-search"></div>`));
	          this.getTagSelector().renderTo(searchContainer);
	        }
	        const className = this.isCompactView() ? ' ui-selector-dialog--compact-view' : '';
	        return main_core.Tag.render(_t2$6 || (_t2$6 = _$b`
				<div
					class="ui-selector-dialog${0}"
					style="width:${0}px; height:${0}px;"
				>
					${0}
					${0}
					${0}
					${0}
				</div>
			`), className, this.getWidth(), this.getHeight(), this.getHeaderContainer(), searchContainer, this.getTabsContainer(), this.getFooterContainer());
	      });
	    }
	  }, {
	    key: "getTabsContainer",
	    value: function getTabsContainer() {
	      return this.cache.remember('tabs-container', () => {
	        return main_core.Tag.render(_t3$6 || (_t3$6 = _$b`
				<div class="ui-selector-tabs">
					${0}
					${0}
				</div>
			`), this.getTabContentsContainer(), this.getLabelsContainer());
	      });
	    }
	  }, {
	    key: "getTabContentsContainer",
	    value: function getTabContentsContainer() {
	      return this.cache.remember('tab-contents', () => {
	        return main_core.Tag.render(_t4$6 || (_t4$6 = _$b`<div class="ui-selector-tab-contents"></div>`));
	      });
	    }
	  }, {
	    key: "getLabelsContainer",
	    value: function getLabelsContainer() {
	      return this.cache.remember('labels-container', () => {
	        return main_core.Tag.render(_t5$4 || (_t5$4 = _$b`
				<div
					class="ui-selector-tab-labels"
					onmouseenter="${0}"
					onmouseleave="${0}"
				></div>
			`), this.alwaysShowLabels ? null : this.handleLabelsMouseEnter.bind(this), this.alwaysShowLabels ? null : this.handleLabelsMouseLeave.bind(this));
	      });
	    }
	  }, {
	    key: "getHeaderContainer",
	    value: function getHeaderContainer() {
	      return this.cache.remember('header', () => {
	        const header = this.getHeader() && this.getHeader().getContainer();
	        return main_core.Tag.render(_t6$2 || (_t6$2 = _$b`
				<div class="ui-selector-header-container">${0}</div>
			`), header ? header : '');
	      });
	    }
	  }, {
	    key: "getFooterContainer",
	    value: function getFooterContainer() {
	      return this.cache.remember('footer', () => {
	        const footer = this.getFooter() && this.getFooter().getContainer();
	        return main_core.Tag.render(_t7$1 || (_t7$1 = _$b`
				<div class="ui-selector-footer-container">${0}</div>
			`), footer ? footer : '');
	      });
	    }
	  }, {
	    key: "freeze",
	    value: function freeze() {
	      if (this.isFrozen()) {
	        return;
	      }
	      this.frozenProps = {
	        autoHide: this.isAutoHide(),
	        hideByEsc: this.shouldHideByEsc()
	      };
	      this.setAutoHide(false);
	      this.setHideByEsc(false);
	      this.getNavigation().disable();
	      main_core.Dom.addClass(this.getContainer(), 'ui-selector-dialog--freeze');
	      this.frozen = true;
	    }
	  }, {
	    key: "unfreeze",
	    value: function unfreeze() {
	      if (!this.isFrozen()) {
	        return;
	      }
	      this.setAutoHide(this.frozenProps.autoHide !== false);
	      this.setHideByEsc(this.frozenProps.hideByEsc !== false);
	      this.getNavigation().enable();
	      main_core.Dom.removeClass(this.getContainer(), 'ui-selector-dialog--freeze');
	      this.frozen = false;
	    }
	  }, {
	    key: "isFrozen",
	    value: function isFrozen() {
	      return this.frozen;
	    }
	  }, {
	    key: "hasRecentItems",
	    value: function hasRecentItems() {
	      return new Promise((resolve, reject) => {
	        main_core.ajax.runAction('ui.entityselector.load', {
	          json: {
	            dialog: this.getAjaxJson()
	          },
	          getParameters: {
	            context: this.getContext()
	          }
	        }).then(response => {
	          resolve(response.data && response.data.dialog && main_core.Type.isArrayFilled(response.data.dialog.recentItems));
	        }).catch(error => {
	          reject(error);
	        });
	      });
	    }
	  }, {
	    key: "load",
	    value: function load() {
	      if (this.loadState !== LoadState.UNSENT || !this.hasDynamicLoad()) {
	        return;
	      }
	      if (this.getTagSelector()) {
	        this.getTagSelector().lock();
	      }
	      setTimeout(() => {
	        if (this.isLoading()) {
	          this.showLoader();
	        }
	      }, 400);
	      this.loadState = LoadState.LOADING;
	      main_core.ajax.runAction('ui.entityselector.load', {
	        json: {
	          dialog: this.getAjaxJson()
	        },
	        getParameters: {
	          context: this.getContext()
	        }
	      }).then(response => {
	        if (response && response.data && main_core.Type.isPlainObject(response.data.dialog)) {
	          this.loadState = LoadState.DONE;
	          const entities = main_core.Type.isArrayFilled(response.data.dialog.entities) ? response.data.dialog.entities : [];
	          entities.forEach(entityOptions => {
	            const entity = this.getEntity(entityOptions.id);
	            if (entity) {
	              entity.setDynamicSearch(entityOptions.dynamicSearch);
	            }
	          });
	          this.setOptions(response.data.dialog);
	          this.getPreselectedItems().forEach(preselectedItem => {
	            const item = this.getItem(preselectedItem);
	            if (item) {
	              item.select(true);
	            }
	          });
	          const recentItems = response.data.dialog.recentItems;
	          if (main_core.Type.isArray(recentItems)) {
	            const nodeOptionsMap = new Map();
	            const itemsOptions = response.data.dialog.items;
	            if (main_core.Type.isArray(itemsOptions)) {
	              itemsOptions.forEach(itemOptions => {
	                if (itemOptions.nodeOptions) {
	                  const item = this.getItem(itemOptions);
	                  if (item) {
	                    nodeOptionsMap.set(item, itemOptions.nodeOptions);
	                  }
	                }
	              });
	            }
	            const items = recentItems.map(recentItem => {
	              const item = this.getItem(recentItem);
	              return [item, nodeOptionsMap.get(item)];
	            });
	            this.getRecentTab().getRootNode().addItems(items);
	          }
	          if (!this.getRecentTab().getRootNode().hasChildren() && this.getRecentTab().getStub()) {
	            this.getRecentTab().getStub().show();
	          }
	          if (this.getTagSelector()) {
	            this.getTagSelector().unlock();
	          }
	          if (this.isRendered()) {
	            if (this.isDropdownMode() && this.getActiveTab() === this.getRecentTab()) {
	              this.selectFirstTab();
	            } else if (!this.getActiveTab()) {
	              this.selectFirstTab();
	            }
	          }
	          this.focusSearch();
	          this.destroyLoader();
	          if (this.shouldFocusOnFirst()) {
	            this.focusOnFirstNode();
	          }
	          if (main_core.Type.isArrayFilled(response.data.dialog.errors)) {
	            this.emitEntityErrors(response.data.dialog.errors);
	          }
	          this.emit('onLoad');
	        }
	      }).catch(error => {
	        this.loadState = LoadState.UNSENT;
	        if (this.getTagSelector()) {
	          this.getTagSelector().unlock();
	        }
	        this.focusSearch();
	        this.destroyLoader();
	        this.emit('onLoadError', {
	          error
	        });
	        console.error(error);
	      });
	    }
	  }, {
	    key: "isLoaded",
	    value: function isLoaded() {
	      return this.loadState === LoadState.DONE;
	    }
	  }, {
	    key: "isLoading",
	    value: function isLoading() {
	      return this.loadState === LoadState.LOADING;
	    }
	  }, {
	    key: "hasDynamicLoad",
	    value: function hasDynamicLoad() {
	      let hasDynamicLoad = false;
	      this.entities.forEach(entity => {
	        hasDynamicLoad = hasDynamicLoad || entity.hasDynamicLoad();
	      });
	      return hasDynamicLoad;
	    }
	  }, {
	    key: "hasDynamicSearch",
	    value: function hasDynamicSearch() {
	      let hasDynamicSearch = false;
	      this.entities.forEach(entity => {
	        hasDynamicSearch = hasDynamicSearch || entity.isSearchable() && entity.hasDynamicSearch();
	      });
	      return hasDynamicSearch;
	    }
	  }, {
	    key: "saveRecentItem",
	    value: function saveRecentItem(item) {
	      if (this.getContext() === null || !item.isSaveable()) {
	        return;
	      }
	      this.recentItemsToSave.push(item);
	      this.saveRecentItemsWithDebounce();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "saveRecentItems",
	    value: function saveRecentItems() {
	      if (!main_core.Type.isArrayFilled(this.recentItemsToSave)) {
	        return;
	      }
	      main_core.ajax.runAction('ui.entityselector.saveRecentItems', {
	        json: {
	          dialog: this.getAjaxJson(),
	          recentItems: this.recentItemsToSave.map(item => item.getAjaxJson())
	        },
	        getParameters: {
	          context: this.getContext()
	        }
	      }).then(response => {}).catch(error => {
	        console.error(error);
	      });
	      this.recentItemsToSave = [];
	    }
	  }, {
	    key: "shouldClearUnavailableItems",
	    value: function shouldClearUnavailableItems() {
	      return this.clearUnavailableItems;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorInput",
	    value: function handleTagSelectorInput() {
	      if (this.getTagSelectorMode() === TagSelectorMode.OUTSIDE && !this.isOpen()) {
	        this.show();
	      }
	      const query = this.getTagSelector().getTextBoxValue();
	      this.search(query);
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorAddButtonClick",
	    value: function handleTagSelectorAddButtonClick() {
	      this.show();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorTagRemove",
	    value: function handleTagSelectorTagRemove(event) {
	      const {
	        tag
	      } = event.getData();
	      const item = this.getItem({
	        id: tag.getId(),
	        entityId: tag.getEntityId()
	      });
	      if (item) {
	        item.deselect();
	      }
	      this.focusSearch();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorAfterTagRemove",
	    value: function handleTagSelectorAfterTagRemove() {
	      this.adjustByTagSelector();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorAfterTagAdd",
	    value: function handleTagSelectorAfterTagAdd() {
	      this.adjustByTagSelector();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "adjustByTagSelector",
	    value: function adjustByTagSelector() {
	      if (this.getTagSelectorMode() === TagSelectorMode.OUTSIDE) {
	        this.adjustPosition();
	      } else if (this.getTagSelectorMode() === TagSelectorMode.INSIDE) {
	        const newTagSelectorHeight = this.getTagSelector().calcHeight();
	        if (newTagSelectorHeight > 0) {
	          const offset = newTagSelectorHeight - (this.tagSelectorHeight || this.getTagSelector().getMinHeight());
	          this.tagSelectorHeight = newTagSelectorHeight;
	          if (offset !== 0) {
	            const height = this.getHeight();
	            this.setHeight(height + offset).then(() => {
	              this.adjustPosition();
	            });
	          }
	        }
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleTagSelectorClick",
	    value: function handleTagSelectorClick() {
	      this.focusSearch();
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "handleItemSelect",
	    value: function handleItemSelect(item, animate = true) {
	      const shouldAnimate = this.isMultiple() ? animate : this.getSelectedItems().length === 0;
	      if (!this.isMultiple()) {
	        this.deselectAll();
	        if (this.getSelectedItems().length > 0) {
	          console.error('EntitySelector: some items are still selected.', this.getSelectedItems());
	        }
	      }
	      if (this.getTagSelector() && this.shouldAddTagOnSelect()) {
	        const tag = item.createTag();
	        tag.animate = shouldAnimate;
	        this.getTagSelector().addTag(tag);
	      }
	      this.selectedItems.add(item);
	    }
	    /**
	     * @internal
	     */
	  }, {
	    key: "handleItemDeselect",
	    value: function handleItemDeselect(item, animate = true) {
	      const shouldAnimate = animate && this.isMultiple();
	      this.selectedItems.delete(item);
	      if (this.getTagSelector()) {
	        this.getTagSelector().removeTag({
	          id: item.getId(),
	          entityId: item.getEntityId()
	        }, shouldAnimate);
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handlePopupAfterShow",
	    value: function handlePopupAfterShow() {
	      this.focusSearch();
	      this.adjustByTagSelector();
	      this.emit('onShow');
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handlePopupFirstShow",
	    value: function handlePopupFirstShow() {
	      this.emit('onFirstShow');
	      this.observeTabOverlapping();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handlePopupShow",
	    value: function handlePopupShow() {
	      if (this.offsetAnimation) {
	        requestAnimationFrame(() => {
	          requestAnimationFrame(() => {
	            main_core.Dom.addClass(this.getPopup().getPopupContainer(), 'ui-selector-popup-offset-animation');
	          });
	        });
	      }
	      if (this.alwaysShowLabels) {
	        setTimeout(() => {
	          // We have to call the method after adjustPosition()
	          this.expandLabels(false);
	        }, 0);
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleAutoHide",
	    value: function handleAutoHide(event) {
	      const target = event.target;
	      const el = this.getPopup().getPopupContainer();
	      if (target === el || el.contains(target)) {
	        return false;
	      }
	      if (this.isTagSelectorOutside() && target === this.getTagSelector().getTextBox() && main_core.Type.isStringFilled(this.getTagSelector().getTextBoxValue())) {
	        return false;
	      }
	      if (this.autoHideHandler !== null) {
	        const result = this.autoHideHandler(event, this);
	        if (main_core.Type.isBoolean(result)) {
	          return result;
	        }
	      }
	      return true;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "observeTabOverlapping",
	    value: function observeTabOverlapping() {
	      this.disconnectTabOverlapping();
	      this.overlappingObserver = new MutationObserver(() => {
	        if (this.getLabelsContainer().offsetWidth > 0) {
	          const left = parseInt(this.getPopup().getPopupContainer().style.left, 10);
	          if (left < this.getMinLabelWidth()) {
	            main_core.Dom.style(this.getPopup().getPopupContainer(), 'left', `${this.getMinLabelWidth()}px`);
	            this.collapseLabels(false);
	          } else if (this.alwaysShowLabels) {
	            this.expandLabels(false);
	          }
	        }
	      });
	      this.overlappingObserver.observe(this.getPopup().getPopupContainer(), {
	        attributes: true,
	        attributeFilter: ['style']
	      });
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "disconnectTabOverlapping",
	    value: function disconnectTabOverlapping() {
	      if (this.overlappingObserver) {
	        this.overlappingObserver.disconnect();
	      }
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handlePopupAfterClose",
	    value: function handlePopupAfterClose() {
	      if (this.isTagSelectorOutside()) {
	        if (this.getActiveTab() && this.getActiveTab() === this.getSearchTab()) {
	          this.selectFirstTab();
	        }
	        this.getTagSelector().clearTextBox();
	        this.getTagSelector().showAddButton();
	        this.getTagSelector().hideTextBox();
	      }
	      if (this.offsetAnimation) {
	        main_core.Dom.removeClass(this.getPopup().getPopupContainer(), 'ui-selector-popup-offset-animation');
	      }
	      this.emit('onHide');
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handlePopupDestroy",
	    value: function handlePopupDestroy() {
	      this.destroy();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleLabelsMouseEnter",
	    value: function handleLabelsMouseEnter() {
	      this.expandLabels();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleLabelsMouseLeave",
	    value: function handleLabelsMouseLeave() {
	      this.collapseLabels();
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleItemNodeFocus",
	    value: function handleItemNodeFocus(event) {
	      const {
	        node
	      } = event.getData();
	      if (this.focusedNode === node) {
	        return;
	      }
	      this.clearNodeFocus();
	      this.focusedNode = node;
	    }
	    /**
	     * @private
	     */
	  }, {
	    key: "handleItemNodeUnfocus",
	    value: function handleItemNodeUnfocus() {
	      this.clearNodeFocus();
	    }
	  }, {
	    key: "getAjaxJson",
	    value: function getAjaxJson() {
	      return {
	        id: this.getId(),
	        context: this.getContext(),
	        entities: this.getEntities(),
	        preselectedItems: this.getPreselectedItems(),
	        recentItemsLimit: this.getRecentItemsLimit(),
	        clearUnavailableItems: this.shouldClearUnavailableItems()
	      };
	    } /** @internal */
	  }, {
	    key: "emitEntityErrors",
	    value: function emitEntityErrors(errorOptions) {
	      const errorCollection = EntityErrorCollection.create(errorOptions);
	      this.emit('Entity:onError', {
	        errors: [...errorCollection]
	      });
	      this.getEntities().forEach(entity => {
	        const entityId = entity.getId();
	        this.emit(`Entity:${entityId}:onError`, {
	          errors: errorCollection.getByEntityId(entityId)
	        });
	      });
	    }
	  }], [{
	    key: "createHeader",
	    value: function createHeader(context, headerContent, headerOptions) {
	      if (!main_core.Type.isStringFilled(headerContent) && !main_core.Type.isArrayFilled(headerContent) && !main_core.Type.isDomNode(headerContent) && !main_core.Type.isFunction(headerContent)) {
	        return null;
	      }

	      /** @var {BaseHeader} */
	      let header = null;
	      const options = main_core.Type.isPlainObject(headerOptions) ? headerOptions : {};
	      if (main_core.Type.isFunction(headerContent) || main_core.Type.isString(headerContent)) {
	        const className = main_core.Type.isString(headerContent) ? main_core.Reflection.getClass(headerContent) : headerContent;
	        if (main_core.Type.isFunction(className)) {
	          header = new className(context, options);
	          if (!(header instanceof BaseHeader)) {
	            console.error('EntitySelector: header is not an instance of BaseHeader.');
	            header = null;
	          }
	        }
	      }
	      if (headerContent !== null && !header) {
	        header = new DefaultHeader(context, Object.assign({}, options, {
	          content: headerContent
	        }));
	      }
	      return header;
	    }
	  }, {
	    key: "createFooter",
	    value: function createFooter(context, footerContent, footerOptions) {
	      if (!main_core.Type.isStringFilled(footerContent) && !main_core.Type.isArrayFilled(footerContent) && !main_core.Type.isDomNode(footerContent) && !main_core.Type.isFunction(footerContent)) {
	        return null;
	      }

	      /** @var {BaseFooter} */
	      let footer = null;
	      const options = main_core.Type.isPlainObject(footerOptions) ? footerOptions : {};
	      if (main_core.Type.isFunction(footerContent) || main_core.Type.isString(footerContent)) {
	        const className = main_core.Type.isString(footerContent) ? main_core.Reflection.getClass(footerContent) : footerContent;
	        if (main_core.Type.isFunction(className)) {
	          footer = new className(context, options);
	          if (!(footer instanceof BaseFooter)) {
	            console.error('EntitySelector: footer is not an instance of BaseFooter.');
	            footer = null;
	          }
	        }
	      }
	      if (footerContent !== null && !footer) {
	        footer = new DefaultFooter(context, Object.assign({}, options, {
	          content: footerContent
	        }));
	      }
	      return footer;
	    }
	  }]);
	  return Dialog;
	}(main_core_events.EventEmitter);

	const EntitySelector = {
	  Dialog,
	  Item,
	  Tab,
	  Entity,
	  TagSelector,
	  TagItem,
	  BaseHeader,
	  DefaultHeader,
	  BaseFooter,
	  DefaultFooter,
	  BaseStub,
	  DefaultStub,
	  EntityError
	};

	exports.EntitySelector = EntitySelector;
	exports.Dialog = Dialog;
	exports.Item = Item;
	exports.Tab = Tab;
	exports.Entity = Entity;
	exports.TagSelector = TagSelector;
	exports.TagItem = TagItem;
	exports.BaseHeader = BaseHeader;
	exports.DefaultHeader = DefaultHeader;
	exports.BaseFooter = BaseFooter;
	exports.DefaultFooter = DefaultFooter;
	exports.BaseStub = BaseStub;
	exports.DefaultStub = DefaultStub;
	exports.EntityError = EntityError;

}((this.BX.UI.EntitySelector = this.BX.UI.EntitySelector || {}),BX.Main,BX.Collections,BX.Event,BX,BX));
//# sourceMappingURL=entity-selector.bundle.js.map

Youez - 2016 - github.com/yon3zu
LinuXploit