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/calendar/open-events/list/dist/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/calendar/open-events/list/dist/list.bundle.js
/* eslint-disable */
this.BX = this.BX || {};
this.BX.Calendar = this.BX.Calendar || {};
(function (exports,ui_vue3,ui_entitySelector,ui_switcher,calendar_openEvents_filter,main_loader,main_polyfill_intersectionobserver,main_core_events,im_public_iframe,im_v2_const,main_date,ui_iconSet_main,ui_buttons,ui_iconSet_actions,main_core,main_popup,ui_cnt,ui_vue3_vuex) {
	'use strict';

	var _id = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _closed = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("closed");
	var _name = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("name");
	var _description = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("description");
	var _eventsCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("eventsCount");
	var _permissions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("permissions");
	var _channelId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("channelId");
	var _isMuted = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isMuted");
	var _isBanned = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isBanned");
	var _newCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("newCount");
	var _updatedAt = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updatedAt");
	var _channel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("channel");
	var _isSelected = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isSelected");
	class CategoryModel {
	  constructor(fields = {}) {
	    Object.defineProperty(this, _id, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _closed, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _name, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _description, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _eventsCount, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _permissions, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _channelId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isMuted, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isBanned, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _newCount, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _updatedAt, {
	      writable: true,
	      value: 0
	    });
	    Object.defineProperty(this, _channel, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isSelected, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _id)[_id] = fields.id;
	    babelHelpers.classPrivateFieldLooseBase(this, _closed)[_closed] = fields.closed;
	    babelHelpers.classPrivateFieldLooseBase(this, _name)[_name] = fields.name;
	    babelHelpers.classPrivateFieldLooseBase(this, _description)[_description] = fields.description;
	    babelHelpers.classPrivateFieldLooseBase(this, _eventsCount)[_eventsCount] = fields.eventsCount;
	    babelHelpers.classPrivateFieldLooseBase(this, _permissions)[_permissions] = fields.permissions;
	    babelHelpers.classPrivateFieldLooseBase(this, _channelId)[_channelId] = fields.channelId;
	    babelHelpers.classPrivateFieldLooseBase(this, _isMuted)[_isMuted] = fields.isMuted;
	    babelHelpers.classPrivateFieldLooseBase(this, _isBanned)[_isBanned] = fields.isBanned;
	    babelHelpers.classPrivateFieldLooseBase(this, _newCount)[_newCount] = fields.newCount;
	    babelHelpers.classPrivateFieldLooseBase(this, _updatedAt)[_updatedAt] = fields.updatedAt || 0;
	    babelHelpers.classPrivateFieldLooseBase(this, _channel)[_channel] = fields.channel;
	    babelHelpers.classPrivateFieldLooseBase(this, _isSelected)[_isSelected] = false;
	    this.fields = fields;
	  }
	  get id() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _id)[_id];
	  }
	  get closed() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _closed)[_closed];
	  }
	  get name() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _name)[_name];
	  }
	  get description() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _description)[_description];
	  }
	  get eventsCount() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _eventsCount)[_eventsCount];
	  }
	  get permissions() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _permissions)[_permissions];
	  }
	  get channelId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _channelId)[_channelId];
	  }
	  get isMuted() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isMuted)[_isMuted];
	  }
	  set isMuted(isMuted) {
	    babelHelpers.classPrivateFieldLooseBase(this, _isMuted)[_isMuted] = isMuted;
	  }
	  get isBanned() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isBanned)[_isBanned];
	  }
	  set isBanned(isBanned) {
	    babelHelpers.classPrivateFieldLooseBase(this, _isBanned)[_isBanned] = isBanned;
	  }
	  get newCount() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _newCount)[_newCount];
	  }
	  get isSelected() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isSelected)[_isSelected];
	  }
	  set isSelected(isSelected) {
	    babelHelpers.classPrivateFieldLooseBase(this, _isSelected)[_isSelected] = isSelected;
	  }
	  get updatedAt() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _updatedAt)[_updatedAt];
	  }
	  get channel() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _channel)[_channel];
	  }
	  set channel(channel) {
	    babelHelpers.classPrivateFieldLooseBase(this, _channel)[_channel] = channel;
	  }
	}

	var _update = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("update");
	var _create = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("create");
	var _delete = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("delete");
	var _eventScorerUpdated = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("eventScorerUpdated");
	class PullRequests extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    Object.defineProperty(this, _eventScorerUpdated, {
	      value: _eventScorerUpdated2
	    });
	    Object.defineProperty(this, _delete, {
	      value: _delete2
	    });
	    Object.defineProperty(this, _create, {
	      value: _create2
	    });
	    Object.defineProperty(this, _update, {
	      value: _update2
	    });
	    this.setEventNamespace('Calendar.OpenEvents.List.CategoryManager.PullRequests');
	  }
	  getModuleId() {
	    return 'calendar';
	  }
	  getMap() {
	    return {
	      EVENT_CATEGORY_CREATED: babelHelpers.classPrivateFieldLooseBase(this, _create)[_create].bind(this),
	      EVENT_CATEGORY_UPDATED: babelHelpers.classPrivateFieldLooseBase(this, _update)[_update].bind(this),
	      EVENT_CATEGORY_DELETED: babelHelpers.classPrivateFieldLooseBase(this, _delete)[_delete].bind(this),
	      OPEN_EVENT_SCORER_UPDATED: babelHelpers.classPrivateFieldLooseBase(this, _eventScorerUpdated)[_eventScorerUpdated].bind(this)
	    };
	  }
	}
	function _update2(event) {
	  this.emit('update', event);
	}
	function _create2(event) {
	  this.emit('create', event);
	}
	function _delete2(event) {
	  this.emit('delete', event);
	}
	function _eventScorerUpdated2(event) {
	  this.emit('eventScorerUpdated', event);
	}

	class CategoryApi {
	  static async list(params) {
	    const response = await BX.ajax.runAction('calendar.open-events.Category.list', {
	      data: params
	    });
	    return response.data;
	  }
	  static async add(fields) {
	    const response = await BX.ajax.runAction('calendar.open-events.Category.add', {
	      data: {
	        name: fields.name,
	        description: fields.description,
	        closed: fields.closed,
	        attendees: fields.attendees,
	        departmentIds: fields.departmentIds,
	        channelId: fields.channelId
	      }
	    });
	    return response.data;
	  }
	  static update(fields) {
	    return BX.ajax.runAction('calendar.open-events.Category.update', {
	      data: {
	        id: fields.id,
	        name: fields.name,
	        description: fields.description
	      }
	    });
	  }
	  static setMute(id, muteState) {
	    return BX.ajax.runAction('calendar.open-events.Category.setMute', {
	      data: {
	        id,
	        muteState
	      }
	    });
	  }
	  static setBan(id, banState) {
	    return BX.ajax.runAction('calendar.open-events.Category.setBan', {
	      data: {
	        id,
	        banState
	      }
	    });
	  }
	  static async getChannelInfo(id) {
	    const response = await BX.ajax.runAction('calendar.open-events.Category.getChannelInfo', {
	      data: {
	        id
	      }
	    });
	    return response.data;
	  }
	}

	const ListKeys = Object.freeze({
	  notBanned: 'notBanned',
	  banned: 'banned',
	  search: 'search'
	});
	var _categories = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categories");
	var _categoryIds = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categoryIds");
	var _categoryPromises = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categoryPromises");
	var _lastLoadedPage = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("lastLoadedPage");
	var _loadedLists = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadedLists");
	var _query = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("query");
	var _subscribeToPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("subscribeToPull");
	var _createCategoryPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("createCategoryPull");
	var _updateCategoryPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateCategoryPull");
	var _deleteCategoryPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deleteCategoryPull");
	var _onPullEventScorerUpdated = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onPullEventScorerUpdated");
	var _addNewCategory = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("addNewCategory");
	var _prepareCategories = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("prepareCategories");
	var _getListIds = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getListIds");
	var _loadCategories = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadCategories");
	var _getListKey = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getListKey");
	var _loadCategoryById = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadCategoryById");
	var _updateCounters = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateCounters");
	var _getCategory = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getCategory");
	var _updateCategory = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateCategory");
	var _buildCategoryModel = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("buildCategoryModel");
	class Manager extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    Object.defineProperty(this, _buildCategoryModel, {
	      value: _buildCategoryModel2
	    });
	    Object.defineProperty(this, _updateCategory, {
	      value: _updateCategory2
	    });
	    Object.defineProperty(this, _getCategory, {
	      value: _getCategory2
	    });
	    Object.defineProperty(this, _updateCounters, {
	      value: _updateCounters2
	    });
	    Object.defineProperty(this, _loadCategoryById, {
	      value: _loadCategoryById2
	    });
	    Object.defineProperty(this, _getListKey, {
	      value: _getListKey2
	    });
	    Object.defineProperty(this, _loadCategories, {
	      value: _loadCategories2
	    });
	    Object.defineProperty(this, _getListIds, {
	      value: _getListIds2
	    });
	    Object.defineProperty(this, _prepareCategories, {
	      value: _prepareCategories2
	    });
	    Object.defineProperty(this, _addNewCategory, {
	      value: _addNewCategory2
	    });
	    Object.defineProperty(this, _onPullEventScorerUpdated, {
	      value: _onPullEventScorerUpdated2
	    });
	    Object.defineProperty(this, _deleteCategoryPull, {
	      value: _deleteCategoryPull2
	    });
	    Object.defineProperty(this, _updateCategoryPull, {
	      value: _updateCategoryPull2
	    });
	    Object.defineProperty(this, _createCategoryPull, {
	      value: _createCategoryPull2
	    });
	    Object.defineProperty(this, _subscribeToPull, {
	      value: _subscribeToPull2
	    });
	    Object.defineProperty(this, _categories, {
	      writable: true,
	      value: []
	    });
	    Object.defineProperty(this, _categoryIds, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _categoryPromises, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _lastLoadedPage, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _loadedLists, {
	      writable: true,
	      value: {
	        [ListKeys.notBanned]: false,
	        [ListKeys.banned]: false,
	        [ListKeys.search]: false
	      }
	    });
	    Object.defineProperty(this, _query, {
	      writable: true,
	      value: void 0
	    });
	    this.setEventNamespace('Calendar.OpenEvents.List.CategoryManager');
	    babelHelpers.classPrivateFieldLooseBase(this, _subscribeToPull)[_subscribeToPull]();
	  }
	  async addCategory(fields) {
	    const categoryDto = await CategoryApi.add(fields);
	    babelHelpers.classPrivateFieldLooseBase(this, _addNewCategory)[_addNewCategory](categoryDto);
	  }
	  async updateCategory(fields) {
	    const category = babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](fields.id);
	    category.channel.title = fields.name;
	    return CategoryApi.update(fields);
	  }
	  async setMute(categoryId, isMuted) {
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](categoryId, {
	      isMuted
	    });
	    void CategoryApi.setMute(categoryId, isMuted);
	  }
	  async setBan(categoryId, isBanned) {
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](categoryId, {
	      isBanned
	    });
	    void CategoryApi.setBan(categoryId, isBanned);
	  }
	  async getChannelInfo(categoryId) {
	    var _category$channel;
	    const category = babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].find(category => category.id === categoryId);
	    (_category$channel = category.channel) != null ? _category$channel : category.channel = await CategoryApi.getChannelInfo(categoryId);
	    return category.channel;
	  }
	  async bubbleUp(categoryId) {
	    var _babelHelpers$classPr;
	    const category = (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](categoryId)) != null ? _babelHelpers$classPr : await babelHelpers.classPrivateFieldLooseBase(this, _loadCategoryById)[_loadCategoryById](categoryId);
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](category.id, {
	      updatedAt: Date.now()
	    });
	  }
	  async searchMore() {
	    var _babelHelpers$classPr2;
	    if (babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.search]) {
	      return [];
	    }
	    const query = babelHelpers.classPrivateFieldLooseBase(this, _query)[_query];
	    const listKey = babelHelpers.classPrivateFieldLooseBase(this, _getListKey)[_getListKey]({
	      query
	    });
	    const countBefore = babelHelpers.classPrivateFieldLooseBase(this, _getListIds)[_getListIds](listKey).length;
	    const lastPage = (_babelHelpers$classPr2 = babelHelpers.classPrivateFieldLooseBase(this, _lastLoadedPage)[_lastLoadedPage][listKey]) != null ? _babelHelpers$classPr2 : -1;
	    const categories = await this.getCategories({
	      query,
	      page: lastPage + 1
	    });
	    if (categories.length === countBefore) {
	      babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][listKey] = true;
	    }
	    return categories;
	  }
	  async loadMore() {
	    var _babelHelpers$classPr3;
	    if (babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.notBanned] && babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.banned]) {
	      return [];
	    }
	    const isBanned = babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.notBanned] && !babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.banned];
	    const listKey = babelHelpers.classPrivateFieldLooseBase(this, _getListKey)[_getListKey]({
	      isBanned
	    });
	    const countBefore = babelHelpers.classPrivateFieldLooseBase(this, _getListIds)[_getListIds](listKey).length;
	    const lastPage = (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(this, _lastLoadedPage)[_lastLoadedPage][listKey]) != null ? _babelHelpers$classPr3 : -1;
	    const categories = await this.getCategories({
	      isBanned,
	      page: lastPage + 1
	    });
	    if (categories.length === countBefore) {
	      babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][listKey] = true;
	      return this.loadMore();
	    }
	    return categories;
	  }
	  async searchCategories(query) {
	    if (query !== babelHelpers.classPrivateFieldLooseBase(this, _query)[_query]) {
	      babelHelpers.classPrivateFieldLooseBase(this, _loadedLists)[_loadedLists][ListKeys.search] = false;
	      delete babelHelpers.classPrivateFieldLooseBase(this, _lastLoadedPage)[_lastLoadedPage][ListKeys.search];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises][ListKeys.search];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds][ListKeys.search];
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _query)[_query] = query;
	    return this.getCategories({
	      query
	    });
	  }
	  async getCategories(params = {
	    isBanned: false
	  }) {
	    var _babelHelpers$classPr4, _babelHelpers$classPr5;
	    const listKey = babelHelpers.classPrivateFieldLooseBase(this, _getListKey)[_getListKey](params);
	    const categories = await babelHelpers.classPrivateFieldLooseBase(this, _loadCategories)[_loadCategories](params);
	    const alreadyLoadedIds = babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].map(it => it.id);
	    const newCategories = categories.filter(it => !alreadyLoadedIds.includes(it.id));
	    babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].push(...newCategories);
	    const alreadyLoadedListIds = babelHelpers.classPrivateFieldLooseBase(this, _getListIds)[_getListIds](listKey);
	    const newListCategories = categories.filter(it => !alreadyLoadedListIds.includes(it.id));
	    (_babelHelpers$classPr5 = (_babelHelpers$classPr4 = babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds])[listKey]) != null ? _babelHelpers$classPr5 : _babelHelpers$classPr4[listKey] = [];
	    babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds][listKey].push(...newListCategories.map(it => it.id));
	    return babelHelpers.classPrivateFieldLooseBase(this, _prepareCategories)[_prepareCategories](listKey);
	  }
	  incrementNewCounter(categoryId) {
	    const category = babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](categoryId);
	    if (category === null) {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](categoryId, {
	      newCount: category.newCount + 1
	    });
	  }
	  decrementNewCounter(categoryId) {
	    const category = babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](categoryId);
	    if (category === null) {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](categoryId, {
	      newCount: category.newCount - 1
	    });
	  }
	}
	function _subscribeToPull2() {
	  if (!BX.PULL) {
	    console.info('BX.PULL not initialized');
	    return;
	  }
	  const pullRequests = new PullRequests();
	  pullRequests.subscribe('create', babelHelpers.classPrivateFieldLooseBase(this, _createCategoryPull)[_createCategoryPull].bind(this));
	  pullRequests.subscribe('update', babelHelpers.classPrivateFieldLooseBase(this, _updateCategoryPull)[_updateCategoryPull].bind(this));
	  pullRequests.subscribe('delete', babelHelpers.classPrivateFieldLooseBase(this, _deleteCategoryPull)[_deleteCategoryPull].bind(this));
	  pullRequests.subscribe('eventScorerUpdated', babelHelpers.classPrivateFieldLooseBase(this, _onPullEventScorerUpdated)[_onPullEventScorerUpdated].bind(this));
	  BX.PULL.subscribe(pullRequests);
	}
	function _createCategoryPull2(event) {
	  const {
	    fields
	  } = event.getData();
	  if (babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](fields.id)) {
	    return;
	  }
	  babelHelpers.classPrivateFieldLooseBase(this, _addNewCategory)[_addNewCategory](fields);
	}
	function _updateCategoryPull2(event) {
	  const {
	    fields
	  } = event.getData();
	  babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](fields.id, fields);
	}
	function _deleteCategoryPull2(event) {
	  const {
	    fields
	  } = event.getData();
	  babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories] = babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].filter(category => category.id !== fields.id);
	  this.emit('update');
	}
	function _onPullEventScorerUpdated2(event) {
	  const {
	    fields: {
	      categoriesCounter
	    }
	  } = event.getData();
	  babelHelpers.classPrivateFieldLooseBase(this, _updateCounters)[_updateCounters](categoriesCounter);
	}
	function _addNewCategory2(categoryDto) {
	  var _babelHelpers$classPr6;
	  categoryDto.updatedAt = Date.now();
	  const category = new CategoryModel(categoryDto);
	  babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].push(category);
	  (_babelHelpers$classPr6 = babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds][ListKeys.notBanned]) == null ? void 0 : _babelHelpers$classPr6.push(category.id);
	  this.emit('update');
	}
	function _prepareCategories2(listKey) {
	  const listIds = babelHelpers.classPrivateFieldLooseBase(this, _getListIds)[_getListIds](listKey);
	  return babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].filter(category => listIds.includes(category.id)).map(category => new CategoryModel(category.fields));
	}
	function _getListIds2(listKey) {
	  const listKeys = listKey === ListKeys.search ? [ListKeys.search] : [ListKeys.notBanned, ListKeys.banned];
	  const listIds = Object.entries(babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds]).filter(([listKey]) => listKeys.includes(listKey)).flatMap(([, categoryIds]) => categoryIds);
	  return [...new Set(listIds)];
	}
	async function _loadCategories2(params) {
	  var _params$isBanned, _params$query, _params$page, _babelHelpers$classPr7, _babelHelpers$classPr8, _babelHelpers$classPr9, _babelHelpers$classPr10;
	  const isBanned = (_params$isBanned = params.isBanned) != null ? _params$isBanned : null;
	  const query = (_params$query = params.query) != null ? _params$query : '';
	  const page = (_params$page = params.page) != null ? _params$page : 0;
	  const listKey = babelHelpers.classPrivateFieldLooseBase(this, _getListKey)[_getListKey](params);
	  (_babelHelpers$classPr8 = (_babelHelpers$classPr7 = babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises])[listKey]) != null ? _babelHelpers$classPr8 : _babelHelpers$classPr7[listKey] = {};
	  (_babelHelpers$classPr10 = (_babelHelpers$classPr9 = babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises][listKey])[page]) != null ? _babelHelpers$classPr10 : _babelHelpers$classPr9[page] = CategoryApi.list({
	    isBanned,
	    query,
	    page
	  });
	  const categories = await babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises][listKey][page];
	  babelHelpers.classPrivateFieldLooseBase(this, _lastLoadedPage)[_lastLoadedPage][listKey] = page;
	  return categories.map(category => new CategoryModel(category));
	}
	function _getListKey2({
	  isBanned,
	  query
	}) {
	  if (main_core.Type.isStringFilled(query)) {
	    return ListKeys.search;
	  }
	  if (isBanned === true) {
	    return ListKeys.banned;
	  }
	  return ListKeys.notBanned;
	}
	async function _loadCategoryById2(categoryId) {
	  var _babelHelpers$classPr11, _babelHelpers$classPr12, _babelHelpers$classPr13, _babelHelpers$classPr14, _babelHelpers$classPr15;
	  const promiseByIdKey = 'byId';
	  (_babelHelpers$classPr12 = (_babelHelpers$classPr11 = babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises])[promiseByIdKey]) != null ? _babelHelpers$classPr12 : _babelHelpers$classPr11[promiseByIdKey] = {};
	  (_babelHelpers$classPr14 = (_babelHelpers$classPr13 = babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises][promiseByIdKey])[categoryId]) != null ? _babelHelpers$classPr14 : _babelHelpers$classPr13[categoryId] = CategoryApi.list({
	    categoryId
	  });
	  const categories = await babelHelpers.classPrivateFieldLooseBase(this, _categoryPromises)[_categoryPromises][promiseByIdKey][categoryId];
	  const categoryDto = categories.find(it => it.id === categoryId);
	  const category = new CategoryModel(categoryDto);
	  babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].push(category);
	  const listKey = category.isBanned ? ListKeys.banned : ListKeys.notBanned;
	  (_babelHelpers$classPr15 = babelHelpers.classPrivateFieldLooseBase(this, _categoryIds)[_categoryIds][listKey]) == null ? void 0 : _babelHelpers$classPr15.push(category.id);
	  return category;
	}
	function _updateCounters2(categoryCounters) {
	  for (const [id, newCount] of Object.entries(categoryCounters)) {
	    const categoryId = parseInt(id, 10);
	    const category = babelHelpers.classPrivateFieldLooseBase(this, _getCategory)[_getCategory](categoryId);
	    if (category === null) {
	      continue;
	    }
	    const eventsCreated = newCount > category.newCount;
	    const updatedAt = eventsCreated ? Date.now() : category.updatedAt;
	    babelHelpers.classPrivateFieldLooseBase(this, _updateCategory)[_updateCategory](categoryId, {
	      newCount,
	      updatedAt
	    });
	  }
	}
	function _getCategory2(categoryId) {
	  var _babelHelpers$classPr16;
	  return (_babelHelpers$classPr16 = babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].find(category => category.id === categoryId)) != null ? _babelHelpers$classPr16 : null;
	}
	function _updateCategory2(categoryId, fields) {
	  babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories] = babelHelpers.classPrivateFieldLooseBase(this, _categories)[_categories].map(category => {
	    if (category.id !== categoryId) {
	      return category;
	    }
	    return babelHelpers.classPrivateFieldLooseBase(this, _buildCategoryModel)[_buildCategoryModel](category, fields);
	  });
	  this.emit('update');
	}
	function _buildCategoryModel2(category, fields = {}) {
	  var _fields$closed, _fields$name, _fields$description, _fields$eventsCount, _fields$isMuted, _fields$isBanned, _fields$newCount, _fields$isSelected, _fields$updatedAt, _fields$channel;
	  return new CategoryModel({
	    id: category.id,
	    closed: (_fields$closed = fields.closed) != null ? _fields$closed : category.closed,
	    name: (_fields$name = fields.name) != null ? _fields$name : category.name,
	    description: (_fields$description = fields.description) != null ? _fields$description : category.description,
	    eventsCount: (_fields$eventsCount = fields.eventsCount) != null ? _fields$eventsCount : category.eventsCount,
	    permissions: category.permissions,
	    channelId: category.channelId,
	    isMuted: (_fields$isMuted = fields.isMuted) != null ? _fields$isMuted : category.isMuted,
	    isBanned: (_fields$isBanned = fields.isBanned) != null ? _fields$isBanned : category.isBanned,
	    newCount: (_fields$newCount = fields.newCount) != null ? _fields$newCount : category.newCount,
	    isSelected: (_fields$isSelected = fields.isSelected) != null ? _fields$isSelected : category.isSelected,
	    updatedAt: (_fields$updatedAt = fields.updatedAt) != null ? _fields$updatedAt : category.updatedAt,
	    channel: (_fields$channel = fields.channel) != null ? _fields$channel : category.channel
	  });
	}
	const CategoryManager = new Manager();

	var _config = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("config");
	class ExtensionSettings {
	  constructor() {
	    Object.defineProperty(this, _config, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _config)[_config] = main_core.Extension.getSettings('calendar.open-events.list');
	  }
	  get currentUserId() {
	    return main_core.Text.toNumber(babelHelpers.classPrivateFieldLooseBase(this, _config)[_config].currentUserId);
	  }
	  get openEventSection() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _config)[_config].openEventSection;
	  }
	  get currentUserTimeOffset() {
	    return main_core.Text.toNumber(babelHelpers.classPrivateFieldLooseBase(this, _config)[_config].currentUserTimeOffset);
	  }
	  get pullEventUserFieldsKey() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _config)[_config].pullEventUserFieldsKey.toString();
	  }
	}
	const AppSettings = new ExtensionSettings();

	const CategoryEditForm = {
	  data() {
	    return {
	      id: 'calendar-open-events-category-edit-popup',
	      params: {},
	      category: null,
	      create: false,
	      popup: null,
	      name: '',
	      description: '',
	      closed: false,
	      selectedChannelId: null
	    };
	  },
	  computed: {
	    isEdit() {
	      return !this.create;
	    }
	  },
	  methods: {
	    show(params = {}) {
	      var _PopupManager$getPopu;
	      this.create = params.create;
	      this.category = params.category;
	      if (this.category) {
	        if (!this.category.channel) {
	          CategoryManager.getChannelInfo(this.category.id).then(channelInfo => {
	            this.category.channel = channelInfo;
	          });
	        }
	        this.name = this.category.name;
	        this.description = this.category.description;
	        this.closed = this.category.closed;
	      }
	      (_PopupManager$getPopu = main_popup.PopupManager.getPopupById(this.id)) == null ? void 0 : _PopupManager$getPopu.destroy();
	      this.popup = main_popup.PopupManager.create({
	        id: this.id,
	        autoHide: true,
	        autoHideHandler: event => {
	          const isClickInside = this.popup.getPopupContainer().contains(event.target);
	          let isClickUserSelector = false;
	          if (this.userSelector) {
	            const userSelectorPopup = this.userSelector.getDialog().getPopup();
	            isClickUserSelector = userSelectorPopup.getPopupContainer().contains(event.target);
	          }
	          let isClickChannelSelector = false;
	          if (this.channelSelector) {
	            const channelSelectorPopup = this.channelSelector.getDialog().getPopup();
	            isClickChannelSelector = channelSelectorPopup.getPopupContainer().contains(event.target);
	          }
	          return !isClickInside && !isClickUserSelector && !isClickChannelSelector;
	        },
	        width: 600,
	        content: this.$refs.popupContent,
	        className: 'calendar-open-events-category-edit-popup-container',
	        titleBar: true,
	        draggable: true
	      });
	      this.renderSwitcher();
	      if (this.create) {
	        this.renderChannelSelector();
	        this.renderUserSelector();
	      }
	      this.popup.show();
	      this.$refs.inputName.focus();
	    },
	    async onCreateButtonClick() {
	      var _this$userSelector, _this$userSelector2;
	      const attendees = (_this$userSelector = this.userSelector) == null ? void 0 : _this$userSelector.getTags().filter(tag => tag.entityId === 'user').map(tag => tag.id);
	      const departmentIds = (_this$userSelector2 = this.userSelector) == null ? void 0 : _this$userSelector2.getTags().filter(tag => tag.entityId === 'department').map(tag => tag.id);
	      await CategoryManager.addCategory({
	        name: this.name,
	        description: this.description,
	        closed: this.closed,
	        attendees: this.closed ? attendees : [],
	        departmentIds: this.closed ? departmentIds : [],
	        channelId: this.selectedChannelId
	      });
	      this.clearFields();
	      this.popup.close();
	    },
	    async onSaveButtonClick() {
	      await CategoryManager.updateCategory({
	        id: this.category.id,
	        name: this.name,
	        description: this.description
	      });
	      this.clearFields();
	      this.popup.close();
	    },
	    onCancelButtonClick() {
	      this.clearFields();
	      this.popup.close();
	    },
	    clearFields() {
	      var _this$userSelector3, _this$channelSelector;
	      this.name = '';
	      this.description = '';
	      this.closed = false;
	      (_this$userSelector3 = this.userSelector) == null ? void 0 : _this$userSelector3.getTags().forEach(tag => {
	        if (tag.getEntityId() === 'user' && tag.getId() === AppSettings.currentUserId) {
	          return;
	        }
	        this.userSelector.removeTag(tag, false);
	      });
	      (_this$channelSelector = this.channelSelector) == null ? void 0 : _this$channelSelector.getTags().forEach(tag => this.channelSelector.removeTag(tag, false));
	      this.selectedChannelId = null;
	    },
	    renderSwitcher() {
	      if (this.switcher) {
	        this.switcher.check(this.closed);
	        this.switcher.disable(Boolean(this.selectedChannelId));
	        return;
	      }
	      this.switcher = new ui_switcher.Switcher({
	        node: this.$refs.closedSwitcher,
	        checked: this.closed,
	        size: ui_switcher.SwitcherSize.extraSmall,
	        disabled: Boolean(this.selectedChannelId),
	        handlers: {
	          toggled: () => {
	            this.closed = this.switcher.isChecked();
	          }
	        }
	      });
	    },
	    renderUserSelector() {
	      if (this.userSelector) {
	        this.userSelector.renderTo(this.$refs.userSelector);
	        return;
	      }
	      const currentUserItem = ['user', AppSettings.currentUserId];
	      this.userSelector = new ui_entitySelector.TagSelector({
	        dialogOptions: {
	          context: 'CALENDAR_OPEN_EVENTS_CATEGORY_EDIT_FORM',
	          showAvatars: true,
	          dropdownMode: true,
	          preload: true,
	          entities: [{
	            id: 'user'
	          }, {
	            id: 'department',
	            options: {
	              selectMode: 'usersAndDepartments',
	              allowFlatDepartments: true,
	              allowSelectRootDepartment: true
	            }
	          }],
	          preselectedItems: [currentUserItem],
	          undeselectedItems: [currentUserItem]
	        }
	      });
	      this.userSelector.renderTo(this.$refs.userSelector);
	    },
	    renderChannelSelector() {
	      if (this.channelSelector) {
	        this.channelSelector.renderTo(this.$refs.channelSelector);
	        return;
	      }
	      this.channelSelector = new ui_entitySelector.TagSelector({
	        multiple: false,
	        dialogOptions: {
	          context: 'CALENDAR_OPEN_EVENTS_CATEGORY_EDIT_FORM',
	          dropdownMode: true,
	          preload: true,
	          entities: [{
	            id: 'im-channel',
	            dynamicLoad: true
	          }],
	          events: {
	            'Item:onSelect': this.onChannelSelected.bind(this),
	            'Item:onDeselect': this.onChannelDeselected.bind(this)
	          },
	          multiple: false
	        }
	      });
	      this.channelSelector.renderTo(this.$refs.channelSelector);
	    },
	    onChannelSelected(event) {
	      const {
	        item: tag
	      } = event.getData();
	      this.selectedChannelId = tag.id;
	      this.closed = tag.customData.get('closed');
	      if (!this.name || !this.userChangedName) {
	        this.name = tag.getTitle();
	      }
	      this.renderSwitcher();
	    },
	    onChannelDeselected(event) {
	      const {
	        item: tag
	      } = event.getData();
	      this.selectedChannelId = null;
	      this.closed = false;
	      if (this.name === tag.getTitle()) {
	        this.name = '';
	        this.userChangedName = false;
	      }
	      this.renderSwitcher();
	    },
	    getFirstLetters(text) {
	      var _words$0$, _words$, _words$1$, _words$2;
	      const words = text.split(/[\s,]/).filter(word => /[\p{L}\p{N} ]/u.test(word[0]));
	      return ((_words$0$ = (_words$ = words[0]) == null ? void 0 : _words$[0]) != null ? _words$0$ : '') + ((_words$1$ = (_words$2 = words[1]) == null ? void 0 : _words$2[0]) != null ? _words$1$ : '');
	    },
	    onNameInput() {
	      this.userChangedName = true;
	    }
	  },
	  template: `
		<div class="calendar-open-events-category-edit-popup" ref="popupContent">
			<input
				class="calendar-open-events-category-edit-name-input"
				:placeholder="$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_NAME')"
				v-model="name"
				@input="onNameInput"
				ref="inputName"
			>
			<div class="calendar-open-events-category-edit-channel --edit" v-show="create">
				<div class="ui-icon-set --speaker-mouthpiece" v-if="create"></div>
				<div class="calendar-open-events-category-edit-channel-text" v-if="create">
					{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_CHOOSE_CHANNEL') }}
				</div>
				<div
					class="calendar-open-events-category-edit-channel-selector"
					ref="channelSelector"
					v-show="create"
				></div>
			</div>
			<div class="calendar-open-events-category-edit-channel --edit" v-if="!create && !category?.channel">
				<div class="ui-icon-set --speaker-mouthpiece"></div>
				<div class="calendar-open-events-category-edit-channel-loader"></div>
			</div>
			<div class="calendar-open-events-category-edit-channel" v-if="category?.channel">
				<div class="ui-icon-set --speaker-mouthpiece"></div>
				<img
					v-if="category.channel.avatar"
					class="calendar-open-events-category-edit-channel-avatar"
					:src="category.channel.avatar"
				>
				<div
					v-if="!category.channel.avatar && getFirstLetters(category.channel.title)"
					class="calendar-open-events-category-edit-channel-avatar"
					:style="'background-color: ' + category.channel.color"
				>
					{{ getFirstLetters(category.channel.title) }}
				</div>
				<div class="calendar-open-events-category-edit-channel-name">{{ category.channel.title }}</div>
			</div>
			<div
				class="calendar-open-events-category-edit-close"
				:class="{
					'--closed': closed,
					'--disabled': !create,
				}"
			>
				<div class="calendar-open-events-category-edit-close-switcher">
					<div ref="closedSwitcher"></div>
				</div>
				<div class="calendar-open-events-category-edit-close-body">
					<div class="calendar-open-events-category-edit-close-title">
						{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_CLOSE') }}
					</div>
					<div class="calendar-open-events-category-edit-close-hint">
						{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_CLOSE_HINT') }}
					</div>
					<div
						class="calendar-open-events-category-edit-close-users"
						ref="userSelector"
						v-show="create && closed && !selectedChannelId"
					></div>
				</div>
			</div>
			<textarea
				class="calendar-open-events-category-edit-description-textarea"
				:placeholder="$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_DESCRIPTION')"
				v-model="description"
			></textarea>
			<div class="calendar-open-events-category-edit-buttons">
				<div
					v-if="create"
					class="calendar-open-events-category-edit-button-create"
					@click="onCreateButtonClick"
				>
					<div class="ui-icon-set --calendar-1"></div>
					<div class="calendar-open-events-category-edit-button-create-text">
						{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_CREATE') }}
					</div>
				</div>
				<div
					v-if="isEdit"
					class="calendar-open-events-category-edit-button-create"
					@click="onSaveButtonClick"
				>
					<div class="ui-icon-set --calendar-1"></div>
					<div class="calendar-open-events-category-edit-button-create-text">
						{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_SAVE') }}
					</div>
				</div>
				<div class="calendar-open-events-category-edit-button-cancel" @click="onCancelButtonClick">
					{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_CANCEL') }}
				</div>
			</div>
		</div>
	`
	};

	const CategoriesTitle = {
	  methods: {
	    onSearchClick() {
	      this.$store.dispatch('setSearchMode', true);
	    },
	    onAddClick() {
	      this.$refs.editForm.show({
	        create: true
	      });
	    }
	  },
	  components: {
	    CategoryEditForm
	  },
	  template: `
		<div class="calendar-open-events-list-categories-title">
			<div class="calendar-open-events-list-categories-title-text">
				{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_CATEGORIES') }}
			</div>
			<div class="calendar-open-events-list-categories-title-button" @click="onSearchClick()">
				<div class="ui-icon-set --search-2"></div>
			</div>
			<div class="calendar-open-events-list-categories-title-button" @click="onAddClick()">
				<div class="ui-icon-set --plus-30"></div>
			</div>
		</div>
		<CategoryEditForm ref="editForm"/>
	`
	};

	const CategoriesSearch = {
	  created() {
	    this.searchDebounced = main_core.Runtime.debounce(this.search, 500, this);
	  },
	  mounted() {
	    this.$refs.input.focus();
	    main_core.Event.bind(document, 'click', this.handleAutoHide, true);
	  },
	  unmounted() {
	    main_core.Event.unbind(document, 'click', this.handleAutoHide, true);
	  },
	  methods: {
	    handleAutoHide(event) {
	      if (this.shouldHideForm(event)) {
	        void this.closeSearch();
	      }
	    },
	    shouldHideForm(event) {
	      const queryIsEmpty = !main_core.Type.isStringFilled(this.getSearchQuery());
	      const clickOnSelf = this.$refs.search.contains(event.target);
	      return queryIsEmpty && !clickOnSelf;
	    },
	    onCloseSearchClick() {
	      void this.closeSearch();
	    },
	    async closeSearch() {
	      const categories = await CategoryManager.getCategories();
	      await this.$store.dispatch('setCategories', categories);
	      await this.$store.dispatch('setSearchMode', false);
	    },
	    async onSearchInput() {
	      const query = this.getSearchQuery();
	      if (main_core.Type.isStringFilled(query)) {
	        this.searchDebounced(query);
	      } else {
	        const categories = await CategoryManager.getCategories();
	        this.$store.dispatch('setCategories', categories);
	      }
	    },
	    async search(query) {
	      await this.$store.dispatch('setCategoriesQuery', query);
	      const categories = await CategoryManager.searchCategories(query);
	      if (query === this.getSearchQuery()) {
	        this.$store.dispatch('setCategories', categories);
	      }
	    },
	    getSearchQuery() {
	      return this.$refs.input.value.trim();
	    }
	  },
	  template: `
		<div class="calendar-open-events-list-categories-search" ref="search">
			<input
				ref="input"
				class="calendar-open-events-list-categories-search-input"
				type="text"
				:placeholder="$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_SEARCH_CATEGORY')"
				@input="onSearchInput()"
			>
			<div class="calendar-open-events-list-categories-close-search-button" @click="onCloseSearchClick()">
				<div class="ui-icon-set --cross-circle-70"></div>
			</div>
		</div>
	`
	};

	const CategoriesHeader = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      isSearchMode: 'isSearchMode'
	    })
	  },
	  components: {
	    CategoriesTitle,
	    CategoriesSearch
	  },
	  template: `
		<div class="calendar-open-events-list-categories-title-container">
			<CategoriesSearch v-if="isSearchMode"/>
			<CategoriesTitle v-else/>
		</div>
	`
	};

	var _create$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("create");
	var _update$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("update");
	var _delete$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("delete");
	class PullRequests$1 extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    Object.defineProperty(this, _delete$1, {
	      value: _delete2$1
	    });
	    Object.defineProperty(this, _update$1, {
	      value: _update2$1
	    });
	    Object.defineProperty(this, _create$1, {
	      value: _create2$1
	    });
	    this.setEventNamespace('Calendar.OpenEvents.List.EventManager.PullRequests');
	  }
	  getModuleId() {
	    return 'calendar';
	  }
	  getMap() {
	    return {
	      OPEN_EVENT_CREATED: babelHelpers.classPrivateFieldLooseBase(this, _create$1)[_create$1].bind(this),
	      OPEN_EVENT_UPDATED: babelHelpers.classPrivateFieldLooseBase(this, _update$1)[_update$1].bind(this),
	      OPEN_EVENT_DELETED: babelHelpers.classPrivateFieldLooseBase(this, _delete$1)[_delete$1].bind(this)
	    };
	  }
	}
	function _create2$1(event) {
	  this.emit('create', event);
	}
	function _update2$1(event) {
	  this.emit('update', event);
	}
	function _delete2$1(event) {
	  this.emit('delete', event);
	}

	var _id$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id");
	var _name$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("name");
	var _isFullDay = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isFullDay");
	var _dateFromTs = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("dateFromTs");
	var _dateToTs = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("dateToTs");
	var _commentsCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("commentsCount");
	var _isAttendee = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isAttendee");
	var _attendeesCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("attendeesCount");
	var _creatorId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("creatorId");
	var _eventOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("eventOptions");
	var _categoryId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categoryId");
	var _categoryName = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categoryName");
	var _color = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("color");
	var _categoryChannelId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("categoryChannelId");
	var _threadId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("threadId");
	var _isNew = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("isNew");
	var _rrule = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("rrule");
	var _rruleDescription = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("rruleDescription");
	var _exdate = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("exdate");
	var _initFields = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("initFields");
	var _getDateCode = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getDateCode");
	class EventModel {
	  constructor(_fields = {}) {
	    Object.defineProperty(this, _getDateCode, {
	      value: _getDateCode2
	    });
	    Object.defineProperty(this, _initFields, {
	      value: _initFields2
	    });
	    Object.defineProperty(this, _id$1, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _name$1, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isFullDay, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _dateFromTs, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _dateToTs, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _commentsCount, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isAttendee, {
	      writable: true,
	      value: false
	    });
	    Object.defineProperty(this, _attendeesCount, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _creatorId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _eventOptions, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _categoryId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _categoryName, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _color, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _categoryChannelId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _threadId, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _isNew, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _rrule, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _rruleDescription, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _exdate, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _initFields)[_initFields](_fields);
	  }
	  updateFields(fields) {
	    if ('name' in fields) {
	      babelHelpers.classPrivateFieldLooseBase(this, _name$1)[_name$1] = fields.name;
	    }
	    if (!main_core.Type.isBoolean(fields.isAttendee)) {
	      delete fields.isAttendee;
	    }
	    if (!main_core.Type.isNumber(fields.commentsCount)) {
	      delete fields.commentsCount;
	    }
	    if ('isAttendee' in fields) {
	      if (!babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee] && fields.isAttendee) {
	        this.incrementAttendeesCount();
	      }
	      if (babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee] && !fields.isAttendee) {
	        this.decrementAttendeesCount();
	      }
	      babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee] = fields.isAttendee;
	    }
	    if ('attendeesCount' in fields) {
	      babelHelpers.classPrivateFieldLooseBase(this, _attendeesCount)[_attendeesCount] = fields.attendeesCount;
	    }
	    Object.assign(this.fields, fields);
	  }
	  get uniqueId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1].toString() + '|' + babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs].toString();
	  }
	  get id() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1];
	  }
	  get name() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _name$1)[_name$1];
	  }
	  get commentsCount() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _commentsCount)[_commentsCount];
	  }
	  get isAttendee() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee];
	  }
	  set isAttendee(isAttendee) {
	    babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee] = isAttendee;
	    this.updateFields({
	      isAttendee
	    });
	  }
	  get attendeesCount() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _attendeesCount)[_attendeesCount];
	  }
	  set attendeesCount(attendeesCount) {
	    babelHelpers.classPrivateFieldLooseBase(this, _attendeesCount)[_attendeesCount] = attendeesCount;
	    this.updateFields({
	      attendeesCount
	    });
	  }
	  incrementAttendeesCount() {
	    this.attendeesCount = ++this.attendeesCount;
	  }
	  decrementAttendeesCount() {
	    this.attendeesCount = --this.attendeesCount;
	  }
	  get creatorId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _creatorId)[_creatorId];
	  }
	  get eventOptions() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _eventOptions)[_eventOptions];
	  }
	  get categoryId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _categoryId)[_categoryId];
	  }
	  get categoryName() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _categoryName)[_categoryName];
	  }
	  get duration() {
	    return this.dateTo.getTime() - this.dateFrom.getTime();
	  }
	  get dateFrom() {
	    return new Date(babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs] * 1000);
	  }
	  get dateTo() {
	    return new Date(babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs] * 1000);
	  }
	  get formattedDateTime() {
	    const isSameDate = babelHelpers.classPrivateFieldLooseBase(this, _getDateCode)[_getDateCode](babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs]) === babelHelpers.classPrivateFieldLooseBase(this, _getDateCode)[_getDateCode](babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs]);
	    const startsInCurrentYear = this.dateFrom.getFullYear() === new Date().getFullYear();
	    const endsInCurrentYear = this.dateTo.getFullYear() === new Date().getFullYear();
	    if (isSameDate) {
	      const dateFormat = startsInCurrentYear ? 'DAY_OF_WEEK_MONTH_FORMAT' : 'FULL_DATE_FORMAT';
	      const date = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat(dateFormat), babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs]);
	      if (this.isFullDay) {
	        return date;
	      }
	      const from = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat('SHORT_TIME_FORMAT'), babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs]);
	      const to = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat('SHORT_TIME_FORMAT'), babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs]);
	      const time = main_core.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_FORMAT_TIME_RANGE', {
	        '#FROM#': from,
	        '#TO#': to
	      });
	      return main_core.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_FORMAT_DATE_TIME', {
	        '#DATE#': date,
	        '#TIME#': time
	      });
	    }
	    const dateFromFormat = startsInCurrentYear ? 'DAY_MONTH_FORMAT' : 'LONG_DATE_FORMAT';
	    const dateToFormat = endsInCurrentYear ? 'DAY_MONTH_FORMAT' : 'LONG_DATE_FORMAT';
	    const dateFrom = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat(dateFromFormat), babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs]);
	    const dateTo = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat(dateToFormat), babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs]);
	    if (this.isFullDay) {
	      return main_core.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_FORMAT_TIME_RANGE', {
	        '#FROM#': dateFrom,
	        '#TO#': dateTo
	      });
	    }
	    const timeFrom = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat('SHORT_TIME_FORMAT'), babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs]);
	    const timeTo = main_date.DateTimeFormat.format(main_date.DateTimeFormat.getFormat('SHORT_TIME_FORMAT'), babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs]);
	    return main_core.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_FORMAT_DATE_TIME_RANGE', {
	      '#FROM_DATE#': dateFrom,
	      '#FROM_TIME#': timeFrom,
	      '#TO_DATE#': dateTo,
	      '#TO_TIME#': timeTo
	    });
	  }
	  get color() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _color)[_color];
	  }
	  get isFullDay() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isFullDay)[_isFullDay];
	  }
	  get threadId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _threadId)[_threadId];
	  }
	  get categoryChannelId() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _categoryChannelId)[_categoryChannelId];
	  }
	  get isNew() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _isNew)[_isNew];
	  }
	  set isNew(isNew) {
	    babelHelpers.classPrivateFieldLooseBase(this, _isNew)[_isNew] = isNew;
	    this.updateFields({
	      isNew
	    });
	  }
	  get exdate() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _exdate)[_exdate];
	  }
	  get rrule() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _rrule)[_rrule];
	  }
	  get rruleDescription() {
	    return babelHelpers.classPrivateFieldLooseBase(this, _rruleDescription)[_rruleDescription];
	  }
	}
	function _initFields2(fields) {
	  var _fields$eventOptions;
	  babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] = parseInt(fields.id, 10);
	  babelHelpers.classPrivateFieldLooseBase(this, _name$1)[_name$1] = fields.name;
	  babelHelpers.classPrivateFieldLooseBase(this, _isFullDay)[_isFullDay] = fields.isFullDay;
	  const fullDayOffset = this.isFullDay ? new Date().getTimezoneOffset() * 60 : 0;
	  babelHelpers.classPrivateFieldLooseBase(this, _dateFromTs)[_dateFromTs] = fields.dateFromTs + fullDayOffset;
	  babelHelpers.classPrivateFieldLooseBase(this, _dateToTs)[_dateToTs] = fields.dateToTs + fullDayOffset;
	  babelHelpers.classPrivateFieldLooseBase(this, _commentsCount)[_commentsCount] = fields.commentsCount;
	  babelHelpers.classPrivateFieldLooseBase(this, _isAttendee)[_isAttendee] = fields.isAttendee;
	  babelHelpers.classPrivateFieldLooseBase(this, _attendeesCount)[_attendeesCount] = fields.attendeesCount;
	  babelHelpers.classPrivateFieldLooseBase(this, _creatorId)[_creatorId] = parseInt(fields.creatorId, 10);
	  babelHelpers.classPrivateFieldLooseBase(this, _eventOptions)[_eventOptions] = {
	    maxAttendees: ((_fields$eventOptions = fields.eventOptions) == null ? void 0 : _fields$eventOptions.maxAttendees) || 0
	  };
	  babelHelpers.classPrivateFieldLooseBase(this, _categoryId)[_categoryId] = parseInt(fields.categoryId, 10);
	  babelHelpers.classPrivateFieldLooseBase(this, _categoryName)[_categoryName] = fields.categoryName;
	  babelHelpers.classPrivateFieldLooseBase(this, _color)[_color] = fields.color;
	  babelHelpers.classPrivateFieldLooseBase(this, _categoryChannelId)[_categoryChannelId] = fields.categoryChannelId;
	  babelHelpers.classPrivateFieldLooseBase(this, _threadId)[_threadId] = fields.threadId;
	  babelHelpers.classPrivateFieldLooseBase(this, _isNew)[_isNew] = fields.isNew;
	  babelHelpers.classPrivateFieldLooseBase(this, _rrule)[_rrule] = RecursionParser.parseRrule(fields.rrule);
	  babelHelpers.classPrivateFieldLooseBase(this, _rruleDescription)[_rruleDescription] = fields.rruleDescription;
	  if (main_core.Type.isNumber(fields.recursionAmount)) {
	    babelHelpers.classPrivateFieldLooseBase(this, _rrule)[_rrule].amount = fields.recursionAmount;
	  }
	  if (main_core.Type.isNumber(fields.recursionNum)) {
	    babelHelpers.classPrivateFieldLooseBase(this, _rrule)[_rrule].num = fields.recursionNum;
	  }
	  babelHelpers.classPrivateFieldLooseBase(this, _exdate)[_exdate] = fields.exdate;
	  this.fields = fields;
	}
	function _getDateCode2(timestamp) {
	  return main_date.DateTimeFormat.format('d.m.Y', timestamp);
	}

	const END_OF_TIME = 2038;
	class RecursionParser {
	  static parseRecursion(event, {
	    fromLimit,
	    toLimit
	  }) {
	    if (event.rrule === null) {
	      return new EventModel(event.fields);
	    }
	    const {
	      timestamps
	    } = this.parseTimestamps(event, {
	      fromLimit,
	      toLimit
	    });
	    const recursionAmount = this.getAmount(event);
	    return timestamps.map(({
	      fromTs,
	      num
	    }) => new EventModel({
	      ...event.fields,
	      dateFromTs: fromTs / 1000,
	      dateToTs: fromTs / 1000 + event.duration / 1000,
	      recursionAmount,
	      recursionNum: num + 1
	    }));
	  }
	  static getAmount(event) {
	    const rruleCount = parseInt(event.rrule.COUNT, 10) || 0;
	    if (rruleCount > 0) {
	      return rruleCount;
	    }
	    const toLimit = main_date.DateTimeFormat.parse(event.rrule.UNTIL);
	    if (toLimit.getFullYear() === END_OF_TIME) {
	      return Infinity;
	    }
	    const {
	      count
	    } = this.parseTimestamps(event, {
	      fromLimit: null,
	      toLimit
	    });
	    return count;
	  }
	  static parseTimestamps(event, {
	    fromLimit,
	    toLimit
	  }) {
	    const timestamps = [];
	    const rrule = event.rrule;
	    const exDate = event.exdate.split(';');
	    const fullDayOffset = event.isFullDay ? new Date().getTimezoneOffset() * 60000 : 0;
	    let from = new Date(event.dateFrom.getTime() - fullDayOffset);
	    const to = new Date(Math.min(toLimit, main_date.DateTimeFormat.parse(rrule.UNTIL)));
	    to.setHours(from.getHours(), from.getMinutes());
	    const fromYear = from.getFullYear();
	    const fromMonth = from.getMonth();
	    const fromDate = from.getDate();
	    const fromHour = from.getHours();
	    const fromMinute = from.getMinutes();
	    let count = 0;
	    const FORMAT_DATE = main_date.DateTimeFormat.getFormat('FORMAT_DATE');
	    while (from <= to) {
	      if (rrule.COUNT > 0 && count >= rrule.COUNT) {
	        break;
	      }
	      const exclude = exDate.includes(main_date.DateTimeFormat.format(FORMAT_DATE, from.getTime() / 1000));
	      const include = !exclude && (!fromLimit || from.getTime() >= fromLimit.getTime()) && (!toLimit || from.getTime() + event.duration <= toLimit.getTime());
	      if (rrule.FREQ === 'WEEKLY') {
	        const weekDay = this.getWeekDayByInd(main_date.DateTimeFormat.format('w', from.getTime() / 1000));
	        if (main_core.Type.isStringFilled(rrule.BYDAY[weekDay])) {
	          if (include) {
	            timestamps.push({
	              fromTs: from.getTime(),
	              num: count
	            });
	          }
	          count++;
	        }
	        const skipWeek = (rrule.INTERVAL - 1) * 7 + 1;
	        const delta = weekDay === 'SU' ? skipWeek : 1;
	        from = new Date(from.getFullYear(), from.getMonth(), from.getDate() + delta, fromHour, fromMinute);
	      }
	      if (['DAILY', 'MONTHLY', 'YEARLY'].includes(rrule.FREQ)) {
	        if (include) {
	          timestamps.push({
	            fromTs: from.getTime(),
	            num: count
	          });
	        }
	        count++;
	        switch (rrule.FREQ) {
	          case 'DAILY':
	            from = new Date(fromYear, fromMonth, fromDate + count * rrule.INTERVAL, fromHour, fromMinute, 0, 0);
	            break;
	          case 'MONTHLY':
	            from = new Date(fromYear, fromMonth + count * rrule.INTERVAL, fromDate, fromHour, fromMinute, 0, 0);
	            break;
	          case 'YEARLY':
	            from = new Date(fromYear + count * rrule.INTERVAL, fromMonth, fromDate, fromHour, fromMinute, 0, 0);
	            break;
	        }
	      }
	    }
	    return {
	      timestamps,
	      count
	    };
	  }
	  static getWeekDayByInd(index) {
	    return ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'][index];
	  }
	  static parseRrule(rule) {
	    if (!main_core.Type.isStringFilled(rule)) {
	      return null;
	    }
	    const res = {};
	    const pairs = rule.split(';').map(it => it.split('=')).filter(([field]) => main_core.Type.isStringFilled(field));
	    for (const [field, value] of pairs) {
	      if (field === 'FREQ' && ['DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY'].includes(value)) {
	        res.FREQ = value;
	      }
	      if (['COUNT', 'INTERVAL'].includes(field)) {
	        var _parseInt;
	        res[field] = Math.max(1, (_parseInt = parseInt(value, 10)) != null ? _parseInt : 0);
	      }
	      if (field === 'UNTIL') {
	        res.UNTIL = value;
	      }
	      if (field === 'BYDAY') {
	        var _res$BYDAY2;
	        const regex = /(([-+])?\d+)?(MO|TU|WE|TH|FR|SA|SU)/;
	        for (const day of value.split(',').filter(d => regex.test(d))) {
	          var _res$BYDAY, _matches$;
	          const matches = [...day.match(regex)];
	          (_res$BYDAY = res.BYDAY) != null ? _res$BYDAY : res.BYDAY = {};
	          res.BYDAY[matches[3]] = (_matches$ = matches[1]) != null ? _matches$ : matches[3];
	        }
	        (_res$BYDAY2 = res.BYDAY) != null ? _res$BYDAY2 : res.BYDAY = {
	          MO: 'MO'
	        };
	      }
	    }
	    return res;
	  }
	}

	class EventApi {
	  static async list(params) {
	    const {
	      categoryId,
	      fromMonth,
	      fromYear,
	      toMonth,
	      toYear
	    } = params;
	    const response = await BX.ajax.runAction('calendar.open-events.Event.list', {
	      data: {
	        categoryId,
	        fromMonth,
	        fromYear,
	        toMonth,
	        toYear
	      }
	    });
	    return response.data;
	  }
	  static async getTsRange(categoryId) {
	    const response = await BX.ajax.runAction('calendar.open-events.Event.getTsRange', {
	      data: {
	        categoryId
	      }
	    });
	    return {
	      from: new Date(parseInt(response.data.from, 10) * 1000),
	      to: new Date(parseInt(response.data.to, 10) * 1000)
	    };
	  }
	  static async setAttendeeStatus(eventId, attendeeStatus) {
	    const response = await BX.ajax.runAction('calendar.open-events.Event.setAttendeeStatus', {
	      data: {
	        eventId,
	        attendeeStatus
	      }
	    });
	    return response.data;
	  }
	  static async setWatched(eventIds) {
	    const response = await BX.ajax.runAction('calendar.open-events.Event.setWatched', {
	      data: {
	        eventIds
	      }
	    });
	    return response.data;
	  }
	}

	class FilterApi {
	  static async query(params) {
	    const {
	      filterId,
	      fromDate,
	      fromMonth,
	      fromYear,
	      toDate,
	      toMonth,
	      toYear
	    } = params;
	    const response = await BX.ajax.runAction('calendar.open-events.Filter.query', {
	      data: {
	        filterId,
	        fromDate,
	        fromMonth,
	        fromYear,
	        toDate,
	        toMonth,
	        toYear
	      }
	    });
	    return response.data;
	  }
	  static async getTsRange(filterId) {
	    const response = await BX.ajax.runAction('calendar.open-events.Filter.getTsRange', {
	      data: {
	        filterId
	      }
	    });
	    return {
	      from: new Date(parseInt(response.data.from, 10) * 1000),
	      to: new Date(parseInt(response.data.to, 10) * 1000)
	    };
	  }
	}

	const FILTER_CATEGORY_ID = -1;
	var _filter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("filter");
	var _events = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("events");
	var _eventIds = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("eventIds");
	var _shownRanges = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("shownRanges");
	var _loadedRanges = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadedRanges");
	var _tsRanges = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tsRanges");
	var _eventPromises = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("eventPromises");
	var _tsRangePromises = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("tsRangePromises");
	var _subscribeToPull$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("subscribeToPull");
	var _createEventPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("createEventPull");
	var _updateEventPull = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateEventPull");
	var _deletePullEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deletePullEvent");
	var _updateEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateEvent");
	var _deleteEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("deleteEvent");
	var _getEvent = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getEvent");
	var _getFirstDayOfPreviousMonth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getFirstDayOfPreviousMonth");
	var _getLastDayOfNextMonth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getLastDayOfNextMonth");
	var _prepareEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("prepareEvents");
	var _loadEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadEvents");
	var _getDateKey = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getDateKey");
	var _getDateCode$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getDateCode");
	var _requestEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("requestEvents");
	var _loadTsRange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadTsRange");
	var _requestTsRange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("requestTsRange");
	class Manager$1 extends main_core_events.EventEmitter {
	  constructor() {
	    super();
	    Object.defineProperty(this, _requestTsRange, {
	      value: _requestTsRange2
	    });
	    Object.defineProperty(this, _loadTsRange, {
	      value: _loadTsRange2
	    });
	    Object.defineProperty(this, _requestEvents, {
	      value: _requestEvents2
	    });
	    Object.defineProperty(this, _getDateCode$1, {
	      value: _getDateCode2$1
	    });
	    Object.defineProperty(this, _getDateKey, {
	      value: _getDateKey2
	    });
	    Object.defineProperty(this, _loadEvents, {
	      value: _loadEvents2
	    });
	    Object.defineProperty(this, _prepareEvents, {
	      value: _prepareEvents2
	    });
	    Object.defineProperty(this, _getLastDayOfNextMonth, {
	      value: _getLastDayOfNextMonth2
	    });
	    Object.defineProperty(this, _getFirstDayOfPreviousMonth, {
	      value: _getFirstDayOfPreviousMonth2
	    });
	    Object.defineProperty(this, _getEvent, {
	      value: _getEvent2
	    });
	    Object.defineProperty(this, _deleteEvent, {
	      value: _deleteEvent2
	    });
	    Object.defineProperty(this, _updateEvent, {
	      value: _updateEvent2
	    });
	    Object.defineProperty(this, _deletePullEvent, {
	      value: _deletePullEvent2
	    });
	    Object.defineProperty(this, _updateEventPull, {
	      value: _updateEventPull2
	    });
	    Object.defineProperty(this, _createEventPull, {
	      value: _createEventPull2
	    });
	    Object.defineProperty(this, _subscribeToPull$1, {
	      value: _subscribeToPull2$1
	    });
	    Object.defineProperty(this, _filter, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _events, {
	      writable: true,
	      value: []
	    });
	    Object.defineProperty(this, _eventIds, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _shownRanges, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _loadedRanges, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _tsRanges, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _eventPromises, {
	      writable: true,
	      value: {}
	    });
	    Object.defineProperty(this, _tsRangePromises, {
	      writable: true,
	      value: {}
	    });
	    this.setEventNamespace('Calendar.OpenEvents.List.EventManager');
	    babelHelpers.classPrivateFieldLooseBase(this, _subscribeToPull$1)[_subscribeToPull$1]();
	  }
	  setFilter(filter) {
	    babelHelpers.classPrivateFieldLooseBase(this, _filter)[_filter] = filter;
	  }
	  async setEventAttendee(eventId, isAttendee) {
	    babelHelpers.classPrivateFieldLooseBase(this, _updateEvent)[_updateEvent](eventId, {
	      isAttendee
	    });
	    try {
	      await EventApi.setAttendeeStatus(eventId, isAttendee);
	    } catch (e) {
	      babelHelpers.classPrivateFieldLooseBase(this, _updateEvent)[_updateEvent](eventId, {
	        isAttendee: !isAttendee
	      });
	    }
	  }
	  async setEventWatched(eventId) {
	    const event = babelHelpers.classPrivateFieldLooseBase(this, _getEvent)[_getEvent](eventId);
	    if (!event.isNew) {
	      return;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _updateEvent)[_updateEvent](eventId, {
	      isNew: false
	    });
	    try {
	      await EventApi.setWatched([eventId]);
	      CategoryManager.decrementNewCounter(event.categoryId);
	    } catch {
	      babelHelpers.classPrivateFieldLooseBase(this, _updateEvent)[_updateEvent](eventId, {
	        isNew: true
	      });
	    }
	  }
	  async filterEvents() {
	    const filterKey = babelHelpers.classPrivateFieldLooseBase(this, _filter)[_filter].getFilterFieldsKey();
	    if (filterKey !== this.filterEvents.previousFilterKey) {
	      delete babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][FILTER_CATEGORY_ID];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][FILTER_CATEGORY_ID];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds][FILTER_CATEGORY_ID];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _eventPromises)[_eventPromises][FILTER_CATEGORY_ID];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][FILTER_CATEGORY_ID];
	      delete babelHelpers.classPrivateFieldLooseBase(this, _tsRangePromises)[_tsRangePromises][FILTER_CATEGORY_ID];
	    }
	    this.filterEvents.previousFilterKey = filterKey;
	    return this.getEvents(FILTER_CATEGORY_ID);
	  }
	  filterNext() {
	    return this.getNext(FILTER_CATEGORY_ID);
	  }
	  filterPrevious() {
	    return this.getPrevious(FILTER_CATEGORY_ID);
	  }
	  async getNext(categoryId = 0) {
	    const everythingIsLoaded = babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].to >= babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].to;
	    const everythingIsShown = babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to >= babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].to;
	    const events = babelHelpers.classPrivateFieldLooseBase(this, _prepareEvents)[_prepareEvents](categoryId);
	    if (everythingIsShown) {
	      return events;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to = babelHelpers.classPrivateFieldLooseBase(this, _getLastDayOfNextMonth)[_getLastDayOfNextMonth](babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to);
	    const eventsBeforeLoad = babelHelpers.classPrivateFieldLooseBase(this, _prepareEvents)[_prepareEvents](categoryId);
	    if (everythingIsLoaded) {
	      if (eventsBeforeLoad.length === events.length) {
	        return this.getNext(categoryId);
	      }
	      return eventsBeforeLoad;
	    }
	    const loadedEvents = await this.getEvents(categoryId, {
	      from: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to,
	      to: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to
	    });
	    if (loadedEvents.length === eventsBeforeLoad.length) {
	      await this.getEvents(categoryId, {
	        from: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to,
	        to: babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].to
	      });
	      return this.getNext(categoryId);
	    }
	    return loadedEvents;
	  }
	  async getPrevious(categoryId = 0) {
	    const everythingIsLoaded = babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].from <= babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].from;
	    const everythingIsShown = babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from <= babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].from;
	    const events = babelHelpers.classPrivateFieldLooseBase(this, _prepareEvents)[_prepareEvents](categoryId);
	    if (everythingIsShown) {
	      return events;
	    }
	    babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from = babelHelpers.classPrivateFieldLooseBase(this, _getFirstDayOfPreviousMonth)[_getFirstDayOfPreviousMonth](babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from);
	    const eventsBeforeLoad = babelHelpers.classPrivateFieldLooseBase(this, _prepareEvents)[_prepareEvents](categoryId);
	    if (everythingIsLoaded) {
	      if (eventsBeforeLoad.length === events.length) {
	        return this.getPrevious(categoryId);
	      }
	      return eventsBeforeLoad;
	    }
	    const loadedEvents = await this.getEvents(categoryId, {
	      from: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from,
	      to: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from
	    });
	    if (loadedEvents.length === eventsBeforeLoad.length) {
	      await this.getEvents(categoryId, {
	        from: babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].from,
	        to: babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from
	      });
	      return this.getPrevious(categoryId);
	    }
	    return loadedEvents;
	  }
	  async getEvents(categoryId = 0, dateRange = {}) {
	    var _babelHelpers$classPr, _babelHelpers$classPr2, _dateRange$from, _dateRange$to, _babelHelpers$classPr3, _babelHelpers$classPr4, _babelHelpers$classPr5, _babelHelpers$classPr6, _babelHelpers$classPr7, _babelHelpers$classPr8, _babelHelpers$classPr9;
	    (_babelHelpers$classPr2 = (_babelHelpers$classPr = babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges])[categoryId]) != null ? _babelHelpers$classPr2 : _babelHelpers$classPr[categoryId] = await babelHelpers.classPrivateFieldLooseBase(this, _loadTsRange)[_loadTsRange](categoryId);
	    const today = new Date();
	    let from = (_dateRange$from = dateRange.from) != null ? _dateRange$from : babelHelpers.classPrivateFieldLooseBase(this, _getFirstDayOfPreviousMonth)[_getFirstDayOfPreviousMonth](today);
	    let to = (_dateRange$to = dateRange.to) != null ? _dateRange$to : babelHelpers.classPrivateFieldLooseBase(this, _getLastDayOfNextMonth)[_getLastDayOfNextMonth](today);
	    if (categoryId === FILTER_CATEGORY_ID && babelHelpers.classPrivateFieldLooseBase(this, _filter)[_filter].isDateFieldApplied()) {
	      from = babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].from;
	      to = babelHelpers.classPrivateFieldLooseBase(this, _tsRanges)[_tsRanges][categoryId].to;
	    }
	    (_babelHelpers$classPr4 = (_babelHelpers$classPr3 = babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges])[categoryId]) != null ? _babelHelpers$classPr4 : _babelHelpers$classPr3[categoryId] = {
	      from,
	      to
	    };
	    (_babelHelpers$classPr6 = (_babelHelpers$classPr5 = babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges])[categoryId]) != null ? _babelHelpers$classPr6 : _babelHelpers$classPr5[categoryId] = {
	      from,
	      to
	    };
	    babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].from = new Date(Math.min(from, babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].from));
	    babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].to = new Date(Math.max(to, babelHelpers.classPrivateFieldLooseBase(this, _loadedRanges)[_loadedRanges][categoryId].to));
	    const events = await babelHelpers.classPrivateFieldLooseBase(this, _loadEvents)[_loadEvents](categoryId, {
	      from,
	      to
	    });
	    const alreadyLoadedIds = Object.values(babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds]).flat();
	    const newEvents = events.filter(it => !alreadyLoadedIds.includes(it.id));
	    babelHelpers.classPrivateFieldLooseBase(this, _events)[_events].push(...newEvents);
	    const alreadyLoadedCategoryIds = (_babelHelpers$classPr7 = babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds][categoryId]) != null ? _babelHelpers$classPr7 : [];
	    const newCategoryEvents = events.filter(it => !alreadyLoadedCategoryIds.includes(it.id));
	    (_babelHelpers$classPr9 = (_babelHelpers$classPr8 = babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds])[categoryId]) != null ? _babelHelpers$classPr9 : _babelHelpers$classPr8[categoryId] = [];
	    babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds][categoryId].push(...newCategoryEvents.map(it => it.id));
	    return babelHelpers.classPrivateFieldLooseBase(this, _prepareEvents)[_prepareEvents](categoryId);
	  }
	}
	function _subscribeToPull2$1() {
	  if (!BX.PULL) {
	    console.info('BX.PULL not initialized');
	    return;
	  }
	  const pullRequests = new PullRequests$1();
	  pullRequests.subscribe('create', babelHelpers.classPrivateFieldLooseBase(this, _createEventPull)[_createEventPull].bind(this));
	  pullRequests.subscribe('update', babelHelpers.classPrivateFieldLooseBase(this, _updateEventPull)[_updateEventPull].bind(this));
	  pullRequests.subscribe('delete', babelHelpers.classPrivateFieldLooseBase(this, _deletePullEvent)[_deletePullEvent].bind(this));
	  BX.PULL.subscribe(pullRequests);
	}
	function _createEventPull2(event) {
	  const {
	    fields: eventDto
	  } = event.getData();
	  const newEvent = new EventModel(eventDto);
	  babelHelpers.classPrivateFieldLooseBase(this, _events)[_events].push(newEvent);
	  [0, newEvent.categoryId].forEach(categoryId => {
	    var _babelHelpers$classPr10;
	    return (_babelHelpers$classPr10 = babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds][categoryId]) == null ? void 0 : _babelHelpers$classPr10.push(newEvent.id);
	  });
	  if (newEvent.creatorId !== AppSettings.currentUserId) {
	    newEvent.isNew = true;
	    [0, newEvent.categoryId].forEach(categoryId => CategoryManager.incrementNewCounter(categoryId));
	  }
	  CategoryManager.bubbleUp(newEvent.categoryId);
	  this.emit('update', {
	    eventId: newEvent.id
	  });
	}
	function _updateEventPull2(event) {
	  const {
	    fields: eventDto,
	    [AppSettings.pullEventUserFieldsKey]: userFields
	  } = event.getData();
	  Object.assign(eventDto, userFields || {});
	  babelHelpers.classPrivateFieldLooseBase(this, _updateEvent)[_updateEvent](eventDto.id, eventDto);
	}
	function _deletePullEvent2(event) {
	  const {
	    fields: {
	      eventId
	    }
	  } = event.getData();
	  babelHelpers.classPrivateFieldLooseBase(this, _deleteEvent)[_deleteEvent](eventId);
	}
	function _updateEvent2(eventId, fields) {
	  const event = babelHelpers.classPrivateFieldLooseBase(this, _getEvent)[_getEvent](eventId);
	  if (!event) {
	    return;
	  }
	  event.updateFields(fields);
	  this.emit('update', {
	    eventId
	  });
	}
	function _deleteEvent2(eventId) {
	  babelHelpers.classPrivateFieldLooseBase(this, _events)[_events] = babelHelpers.classPrivateFieldLooseBase(this, _events)[_events].filter(it => it.id !== eventId);
	  this.emit('delete', {
	    eventId
	  });
	}
	function _getEvent2(eventId) {
	  var _babelHelpers$classPr11;
	  return (_babelHelpers$classPr11 = babelHelpers.classPrivateFieldLooseBase(this, _events)[_events].find(it => it.id === eventId)) != null ? _babelHelpers$classPr11 : null;
	}
	function _getFirstDayOfPreviousMonth2(date) {
	  return new Date(date.getFullYear(), date.getMonth() - 1, 1);
	}
	function _getLastDayOfNextMonth2(date) {
	  return new Date(date.getFullYear(), date.getMonth() + 2, 0, 23, 59, 59);
	}
	function _prepareEvents2(categoryId) {
	  const fromLimit = babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].from;
	  const toLimit = babelHelpers.classPrivateFieldLooseBase(this, _shownRanges)[_shownRanges][categoryId].to;
	  return babelHelpers.classPrivateFieldLooseBase(this, _events)[_events].filter(it => babelHelpers.classPrivateFieldLooseBase(this, _eventIds)[_eventIds][categoryId].includes(it.id)).flatMap(it => RecursionParser.parseRecursion(it, {
	    fromLimit,
	    toLimit
	  })).filter(it => it.dateFrom >= fromLimit && it.dateTo <= toLimit);
	}
	async function _loadEvents2(categoryId, dateRange) {
	  var _babelHelpers$classPr12, _babelHelpers$classPr13, _babelHelpers$classPr14, _babelHelpers$classPr15;
	  const datesKey = babelHelpers.classPrivateFieldLooseBase(this, _getDateKey)[_getDateKey](dateRange);
	  (_babelHelpers$classPr13 = (_babelHelpers$classPr12 = babelHelpers.classPrivateFieldLooseBase(this, _eventPromises)[_eventPromises])[categoryId]) != null ? _babelHelpers$classPr13 : _babelHelpers$classPr12[categoryId] = {};
	  (_babelHelpers$classPr15 = (_babelHelpers$classPr14 = babelHelpers.classPrivateFieldLooseBase(this, _eventPromises)[_eventPromises][categoryId])[datesKey]) != null ? _babelHelpers$classPr15 : _babelHelpers$classPr14[datesKey] = babelHelpers.classPrivateFieldLooseBase(this, _requestEvents)[_requestEvents](categoryId, dateRange);
	  const response = await babelHelpers.classPrivateFieldLooseBase(this, _eventPromises)[_eventPromises][categoryId][datesKey];
	  return response.map(eventDto => new EventModel(eventDto));
	}
	function _getDateKey2(dateRange) {
	  return `${babelHelpers.classPrivateFieldLooseBase(this, _getDateCode$1)[_getDateCode$1](dateRange.from)}-${babelHelpers.classPrivateFieldLooseBase(this, _getDateCode$1)[_getDateCode$1](dateRange.to)}`;
	}
	function _getDateCode2$1(date) {
	  return main_date.DateTimeFormat.format('d.m.Y', date);
	}
	function _requestEvents2(categoryId, dateRange) {
	  if (categoryId === FILTER_CATEGORY_ID) {
	    return FilterApi.query({
	      filterId: babelHelpers.classPrivateFieldLooseBase(this, _filter)[_filter].id,
	      fromDate: dateRange.from.getDate(),
	      fromMonth: dateRange.from.getMonth() + 1,
	      fromYear: dateRange.from.getFullYear(),
	      toDate: dateRange.to.getDate(),
	      toMonth: dateRange.to.getMonth() + 1,
	      toYear: dateRange.to.getFullYear()
	    });
	  }
	  return EventApi.list({
	    categoryId,
	    fromMonth: dateRange.from.getMonth() + 1,
	    fromYear: dateRange.from.getFullYear(),
	    toMonth: dateRange.to.getMonth() + 1,
	    toYear: dateRange.to.getFullYear()
	  });
	}
	async function _loadTsRange2(categoryId) {
	  var _babelHelpers$classPr16, _babelHelpers$classPr17;
	  (_babelHelpers$classPr17 = (_babelHelpers$classPr16 = babelHelpers.classPrivateFieldLooseBase(this, _tsRangePromises)[_tsRangePromises])[categoryId]) != null ? _babelHelpers$classPr17 : _babelHelpers$classPr16[categoryId] = babelHelpers.classPrivateFieldLooseBase(this, _requestTsRange)[_requestTsRange](categoryId);
	  return babelHelpers.classPrivateFieldLooseBase(this, _tsRangePromises)[_tsRangePromises][categoryId];
	}
	function _requestTsRange2(categoryId) {
	  if (categoryId === FILTER_CATEGORY_ID) {
	    return FilterApi.getTsRange(babelHelpers.classPrivateFieldLooseBase(this, _filter)[_filter].id);
	  }
	  return EventApi.getTsRange(categoryId);
	}
	const EventManager = new Manager$1();

	const Category = {
	  props: {
	    category: CategoryModel
	  },
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      selectedCategoryId: 'selectedCategoryId'
	    })
	  },
	  methods: {
	    async onClick() {
	      await this.$store.dispatch('selectCategory', this.category.id);
	      await this.$store.dispatch('setEventsLoading', true);
	      const events = await EventManager.getEvents(this.category.id);
	      if (this.selectedCategoryId !== this.category.id) {
	        return;
	      }
	      await this.$store.dispatch('setEvents', events);
	      await this.$store.dispatch('setEventsLoading', false);
	    },
	    getEventCountPhrase(eventsCount) {
	      return main_core.Loc.getMessagePlural('CALENDAR_OPEN_EVENTS_LIST_CATEGORY_EVENTS_COUNT', eventsCount, {
	        '#COUNT#': eventsCount
	      });
	    },
	    renderCounter() {
	      this.$refs.counter.innerHTML = '';
	      if (this.category.newCount > 0) {
	        new ui_cnt.Counter({
	          value: this.category.newCount,
	          color: this.category.isMuted ? ui_cnt.Counter.Color.GRAY : ui_cnt.Counter.Color.DANGER
	        }).renderTo(this.$refs.counter);
	      }
	    }
	  },
	  mounted() {
	    this.renderCounter();
	  },
	  watch: {
	    category() {
	      this.renderCounter();
	    }
	  },
	  template: `
		<div
			class="calendar-open-events-list-category"
			:class="{
				'--banned': category.isBanned,
				'--selected': category.isSelected,
				'--all-category': category.id === 0,
			}"
			:data-category-id="category.id"
		>
			<div class="calendar-open-events-list-category-inner" @click="onClick">
				<div class="calendar-open-events-list-category-title">
					<div class="ui-icon-set --calendar-2" v-if="category.id === 0"></div>
					<div
						class="calendar-open-events-list-category-title-name"
						:title="category.name"
					>
						<span>{{ category.name }}</span>
						<div class="ui-icon-set --sound-off" v-if="category.isMuted && !category.isBanned"></div>
						<div class="ui-icon-set --lock" v-if="category.closed"></div>
					</div>
					<div ref="counter"></div>
				</div>
				<div
					class="calendar-open-events-list-category-info"
					v-html="getEventCountPhrase(category.eventsCount)"
					v-if="category.id !== 0"
				>
				</div>
			</div>
		</div>
	`
	};

	const CategoryList = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      categories: 'categories',
	      isSearchMode: 'isSearchMode',
	      categoriesQuery: 'categoriesQuery'
	    }),
	    allCategory() {
	      return this.categories.find(category => category.id === 0);
	    },
	    sortedCategories() {
	      return [...this.categories].filter(category => category.id > 0).sort((a, b) => {
	        if (a.isBanned !== b.isBanned) {
	          return a.isBanned - b.isBanned;
	        }
	        return b.updatedAt - a.updatedAt;
	      });
	    }
	  },
	  mounted() {
	    void this.loadOnScroll();
	    this.$refs.categoryList.addEventListener('scroll', this.loadOnScroll);
	    CategoryManager.subscribe('update', this.onCategoriesUpdatedHandler);
	  },
	  beforeUnmount() {
	    this.$refs.categoryList.removeEventListener('scroll', this.loadOnScroll);
	    CategoryManager.unsubscribe('update', this.onCategoriesUpdatedHandler);
	  },
	  watch: {
	    categories() {
	      void this.$nextTick(() => this.loadOnScroll());
	    }
	  },
	  methods: {
	    async onCategoriesUpdatedHandler() {
	      const categories = await this.getCategories();
	      this.$store.dispatch('setCategories', categories);
	    },
	    async loadOnScroll() {
	      const scrollTop = this.$refs.categoryList.scrollTop;
	      const scrollHeight = this.$refs.categoryList.scrollHeight;
	      const offsetHeight = this.$refs.categoryList.offsetHeight;
	      if (scrollTop + 1 >= scrollHeight - offsetHeight) {
	        const categories = await this.loadMore();
	        if (categories.length > 0) {
	          this.$store.dispatch('setCategories', categories);
	        }
	      }
	    },
	    getCategories() {
	      if (this.isSearchMode) {
	        return CategoryManager.searchCategories(this.categoriesQuery);
	      }
	      return CategoryManager.getCategories();
	    },
	    loadMore() {
	      if (this.isSearchMode) {
	        return CategoryManager.searchMore();
	      }
	      return CategoryManager.loadMore();
	    }
	  },
	  components: {
	    Category
	  },
	  template: `
		<div class="calendar-open-events-list-category-list --calendar-scroll-bar" ref="categoryList">
			<Category :category="allCategory" v-show="!isSearchMode"/>
			<Category v-for="category of sortedCategories" :category="category"/>
		</div>
	`
	};

	const Categories = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      isFilterMode: 'isFilterMode'
	    })
	  },
	  components: {
	    CategoriesHeader,
	    CategoryList
	  },
	  template: `
		<div class="calendar-open-events-list-categories" :class="{ '--filter': isFilterMode }" >
			<CategoriesHeader/>
			<CategoryList/>
		</div>
	`
	};

	const TitleMenu = {
	  props: {
	    category: CategoryModel
	  },
	  data() {
	    return {
	      menu: main_popup.Menu
	    };
	  },
	  methods: {
	    openMenu() {
	      this.menu = new main_popup.Menu({
	        bindElement: this.$refs.menuIcon,
	        closeByEsc: true,
	        items: this.getMenuItems()
	      });
	      this.menu.show();
	    },
	    redrawMenu() {
	      const itemIds = this.menu.getMenuItems().map(item => item.getId());
	      itemIds.forEach(id => this.menu.removeMenuItem(id, {
	        destroyEmptyPopup: false
	      }));
	      this.getMenuItems().forEach(item => this.menu.addMenuItem(item));
	    },
	    getMenuItems() {
	      const items = [this.getInfoItem(), this.getOpenChatItem()];
	      if (!this.category.isBanned) {
	        items.push(this.getMuteItem());
	      }
	      items.push(this.getBanItem());
	      if (this.category.permissions.edit === true) {
	        items.push(this.getEditItem());
	      }
	      if (this.category.permissions.delete === true) {
	        items.push(this.getDeleteItem());
	      }
	      return items;
	    },
	    getInfoItem() {
	      return {
	        html: `
					<div class="calendar-open-events-list-menu-item">
						<div class="ui-icon-set --info-circle"></div>
						<span>${this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_ABOUT_CATEGORY')}</span>
					</div>
				`,
	        onclick: () => {
	          this.menu.close();
	          alert('info');
	        }
	      };
	    },
	    getOpenChatItem() {
	      return {
	        html: `
					<div class="calendar-open-events-list-menu-item">
						<div class="ui-icon-set --chats-2"></div>
						<span>${this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_OPEN_CHANNEL')}</span>
					</div>
				`,
	        onclick: () => {
	          this.menu.close();
	          im_public_iframe.Messenger.openChat(`chat${this.category.channelId}`);
	        }
	      };
	    },
	    getMuteItem() {
	      return {
	        html: this.renderMuteItem(),
	        onclick: () => {
	          this.category.isMuted = !this.category.isMuted;
	          this.muteCategory(this.category.isMuted);
	          this.redrawMenu();
	        }
	      };
	    },
	    renderMuteItem() {
	      const icon = this.category.isMuted ? '--notifications-off' : '--bell-1';
	      const text = this.category.isMuted ? this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_ENABLE_NOTIFY') : this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_DISABLE_NOTIFY');
	      return `
				<div class="calendar-open-events-list-menu-item">
					<div class="ui-icon-set ${icon}"></div>
					<span>${text}</span>
				</div>
			`;
	    },
	    getBanItem() {
	      return {
	        html: this.renderBanItem(),
	        onclick: () => {
	          this.category.isBanned = !this.category.isBanned;
	          this.banCategory(this.category.isBanned);
	          this.redrawMenu();
	        }
	      };
	    },
	    renderBanItem() {
	      const icon = this.category.isBanned ? '--bell-1' : '--unavailable';
	      const text = this.category.isBanned ? this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_SUBSCRIBE') : this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_UNSUBSCRIBE');
	      return `
				<div class="calendar-open-events-list-menu-item">
					<div class="ui-icon-set ${icon}"></div>
					<span>${text}</span>
				</div>
			`;
	    },
	    getEditItem() {
	      return {
	        html: `
					<div class="calendar-open-events-list-menu-item">
						<div class="ui-icon-set --pencil-40"></div>
						<span>${this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_EDIT')}</span>
					</div>
				`,
	        onclick: () => {
	          this.menu.close();
	          this.openEditCategoryForm();
	        }
	      };
	    },
	    getDeleteItem() {
	      return {
	        html: `
					<div class="calendar-open-events-list-menu-item">
						<div class="ui-icon-set --cross-40"></div>
						<span>${this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_MENU_DELETE')}</span>
					</div>
				`,
	        onclick: () => {
	          this.menu.close();
	          this.deleteCategory();
	        }
	      };
	    },
	    muteCategory(isMuted) {
	      void CategoryManager.setMute(this.category.id, isMuted);
	    },
	    banCategory(isBanned) {
	      void CategoryManager.setBan(this.category.id, isBanned);
	    },
	    openEditCategoryForm() {
	      this.$refs.editForm.show({
	        category: this.category
	      });
	    },
	    deleteCategory() {
	      alert('delete category ' + this.category.id);
	    }
	  },
	  components: {
	    CategoryEditForm
	  },
	  template: `
		<div
			class="calendar-open-events-list-item__list-header__menu ui-icon-set --more-information"
			@click="openMenu"
			ref="menuIcon"
		></div>
		<CategoryEditForm ref="editForm"/>
	`
	};

	const EventListTitle = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      isFilterMode: 'isFilterMode',
	      category: 'selectedCategory'
	    }),
	    title() {
	      var _this$category;
	      if (this.isFilterMode) {
	        return this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_SEARCH_RESULT');
	      }
	      return (_this$category = this.category) == null ? void 0 : _this$category.name;
	    }
	  },
	  components: {
	    TitleMenu
	  },
	  template: `
		<div class="calendar__open-event__list-header">
			<div class="calendar__open-event__list-header__title" :title="title">
				{{ title }}
			</div>
			<div class="calendar__open-event__list-header__icon ui-icon-set --lock" v-if="category.closed"></div>
			<TitleMenu v-if="!isFilterMode && category.id" :category="category"/>
		</div>
	`
	};

	const CalendarSheet = {
	  props: {
	    event: EventModel
	  },
	  computed: {
	    calendarDate() {
	      return this.event.dateFrom.getDate();
	    },
	    calendarMonth() {
	      return main_date.DateTimeFormat.format('f', this.event.dateFrom);
	    },
	    calendarTime() {
	      if (this.event.isFullDay) {
	        return this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_ALL_DAY');
	      }
	      const timeFormat = main_date.DateTimeFormat.getFormat('SHORT_TIME_FORMAT');
	      const time = main_date.DateTimeFormat.format(timeFormat, this.event.dateFrom);
	      const dayOfWeek = main_date.DateTimeFormat.format('D', this.event.dateFrom);
	      return this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_FORMAT_WEEKDAY_TIME', {
	        '#WEEKDAY#': dayOfWeek,
	        '#TIME#': time
	      });
	    },
	    isCreator() {
	      return this.event.creatorId === AppSettings.currentUserId;
	    }
	  },
	  template: `
		<div class="calendar-open-events-list-calendar-sheet" :style="{ borderColor: event.color }">
			<div class="calendar-open-events-list-calendar-sheet-header" :style="{ backgroundColor: event.color }">
				<div class="calendar-open-events-list-calendar-sheet-header-hole"></div>
				<div class="calendar-open-events-list-calendar-sheet-header-hole"></div>
			</div>
			<div class="calendar-open-events-list-calendar-sheet-content">
				<div class="calendar-open-events-list-calendar-sheet-date">
					{{ calendarDate }}
				</div>
				<div class="calendar-open-events-list-calendar-sheet-month">
					{{ calendarMonth }}
				</div>
				<div class="calendar-open-events-list-calendar-sheet-time" :style="{ color: event.color }">
					{{ calendarTime }}
				</div>
			</div>
			<div
				class="calendar-open-events-list-calendar-sheet-crown"
				v-if="isCreator"
				:title="$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_EVENT_YOU_ARE_OWNER')"
			>
				<div class="ui-icon-set --crown-2"></div>
			</div>
		</div>
	`
	};

	const AttendButton = {
	  props: {
	    isAttendee: Boolean
	  },
	  methods: {
	    renderButton() {
	      const button = new ui_buttons.Button({
	        color: this.isAttendee ? ui_buttons.ButtonColor.LIGHT_BORDER : ui_buttons.ButtonColor.SUCCESS,
	        size: ui_buttons.ButtonSize.SMALL,
	        round: true,
	        //TODO: replace with icon property when icons ready
	        // icon: this.isAttendee ? ButtonIcon. : ButtonIcon.,
	        className: this.isAttendee ? 'calendar-open-events-list-item__attend-button --off' : 'calendar-open-events-list-item__attend-button --on'
	      });
	      this.$refs.bindBtn.innerHTML = '';
	      button.renderTo(this.$refs.bindBtn);
	    }
	  },
	  watch: {
	    isAttendee() {
	      this.renderButton();
	    }
	  },
	  mounted() {
	    this.renderButton();
	  },
	  template: `
		<div ref="bindBtn"></div>
	`
	};

	const CommentCounter = {
	  props: {
	    commentsCount: Number
	  },
	  methods: {
	    renderCounter() {
	      const value = this.commentsCount;
	      const color = value ? ui_cnt.Counter.Color.PRIMARY : ui_cnt.Counter.Color.GRAY;
	      this.$refs.counter.innerHTML = '';
	      new ui_cnt.Counter({
	        value,
	        color,
	        size: ui_cnt.Counter.Size.LARGE
	      }).renderTo(this.$refs.counter);
	    }
	  },
	  mounted() {
	    this.renderCounter();
	  },
	  watch: {
	    commentsCount() {
	      this.renderCounter();
	    }
	  },
	  template: `
		<div class="calendar-open-events-list-item-comment-counter">
			<div class="ui-icon-set --chats-1"></div>
			<div ref="counter"></div>
		</div>
	`
	};

	const AttendeeCounter = {
	  props: {
	    attendeesCount: Number,
	    maxAttendees: Number | null
	  },
	  computed: {
	    attendeesValue() {
	      if (this.maxAttendees) {
	        return this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_EVENT_ATTENDEE_VALUE', {
	          '#COUNT#': this.attendeesCount,
	          '#COUNT_MAX#': this.maxAttendees
	        });
	      } else {
	        return this.attendeesCount;
	      }
	    }
	  },
	  template: `
		<div class="calendar-open-events-list-item-attendee-counter">
			<div class="ui-icon-set --persons-2"></div>
			<div v-html="attendeesValue"></div>
		</div>
	`
	};

	const NameWithCounter = {
	  emits: ['openEvent'],
	  props: {
	    event: EventModel
	  },
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      selectedCategoryId: 'selectedCategoryId'
	    }),
	    formattedRrule() {
	      if (this.event.rrule.amount === 0 || this.event.rrule.amount === Infinity) {
	        return '';
	      }
	      return this.$Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_NUM_MEETING_OF_AMOUNT', {
	        '#NUM#': this.event.rrule.num,
	        '#AMOUNT#': this.event.rrule.amount
	      });
	    }
	  },
	  methods: {
	    renderCounter() {
	      this.$refs.counter.innerHTML = '';
	      if (this.event.isNew) {
	        new ui_cnt.Counter({
	          value: 1,
	          color: ui_cnt.Counter.Color.DANGER
	        }).renderTo(this.$refs.counter);
	      }
	    },
	    bindRrulePopup() {
	      if (!this.$refs.rrule) {
	        return;
	      }
	      const popup = new main_popup.Popup({
	        bindElement: this.$refs.rrule,
	        content: this.event.rruleDescription,
	        darkMode: true,
	        bindOptions: {
	          position: 'top'
	        },
	        offsetTop: -10,
	        angle: true,
	        autoHide: true
	      });
	      this.bindShowOnHover(popup);
	    },
	    bindShowOnHover(popup) {
	      if (popup instanceof main_popup.Menu) {
	        popup = popup.getPopupWindow();
	      }
	      const bindElement = popup.bindElement;
	      const container = popup.getPopupContainer();
	      let hoverElement = null;
	      const closeMenuHandler = () => {
	        setTimeout(() => {
	          if (!container.contains(hoverElement) && !bindElement.contains(hoverElement)) {
	            popup.close();
	          }
	        }, 100);
	      };
	      const showMenuHandler = () => {
	        setTimeout(() => {
	          if (bindElement.contains(hoverElement)) {
	            popup.show();
	          }
	        }, 300);
	      };
	      const clickHandler = () => {
	        if (!popup.isShown()) {
	          popup.show();
	        }
	      };
	      main_core.Event.bind(document, 'mouseover', event => {
	        hoverElement = event.target;
	      });
	      main_core.Event.bind(bindElement, 'mouseenter', showMenuHandler);
	      main_core.Event.bind(bindElement, 'mouseleave', closeMenuHandler);
	      main_core.Event.bind(container, 'mouseleave', closeMenuHandler);
	      main_core.Event.bind(bindElement, 'click', clickHandler);
	      const adjustPosition = () => {
	        const angleLeft = main_popup.Popup.getOption('angleMinBottom');
	        const popupWidth = popup.getPopupContainer().offsetWidth;
	        const elementWidth = popup.bindElement.offsetWidth;
	        popup.setOffset({
	          offsetLeft: elementWidth / 2 - popupWidth / 2
	        });
	        popup.adjustPosition();
	        if (popup.angle) {
	          popup.setAngle({
	            offset: popupWidth / 2 + angleLeft
	          });
	        }
	      };
	      popup.subscribeFromOptions({
	        onShow: () => {
	          adjustPosition();
	          document.addEventListener('scroll', adjustPosition, true);
	        },
	        onClose: () => {
	          document.removeEventListener('scroll', adjustPosition, true);
	        }
	      });
	    }
	  },
	  mounted() {
	    this.renderCounter();
	    this.bindRrulePopup();
	  },
	  watch: {
	    event() {
	      this.renderCounter();
	    }
	  },
	  template: `
		<div class="calendar-open-events-list-item-name">
			<div
				class="calendar-open-events-list-item__event-name-with-counter"
				@click="$emit('openEvent')"
			>
				<div class="calendar-open-events-list-event-name-category" v-if="selectedCategoryId === 0">
					{{ event.categoryName }}
				</div>
				<div v-show="event.isNew" ref="counter"></div>
				<div class="calendar-open-events-list-item__event-name" :title="event.name">
					{{ event.name }}
				</div>
			</div>
			<div class="calendar-open-events-list-event-time">
				<div class="calendar-open-events-list-event-time-datetime">
					{{ event.formattedDateTime }}
				</div>
				<div class="calendar-open-events-list-event-time-full-day" v-if="event.isFullDay">
					{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_ALL_DAY') }}
				</div>
				<div
					class="calendar-open-events-list-event-time-recursion"
					ref="rrule"
					v-if="event.rrule"
				>
					<div class="ui-icon-set --refresh-3"></div>
					<div class="calendar-open-events-list-event-time-rrule" v-if="formattedRrule">
						{{ formattedRrule }}
					</div>
				</div>
			</div>
		</div>
	`
	};

	const Event = {
	  props: {
	    event: EventModel
	  },
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      selectedCategoryId: 'selectedCategoryId'
	    })
	  },
	  methods: {
	    async openComments() {
	      const categoryChannelId = this.event.categoryChannelId;
	      const messageId = this.event.threadId;
	      await im_public_iframe.Messenger.openChat(`chat${categoryChannelId}`, messageId);
	      main_core_events.EventEmitter.emit(im_v2_const.EventType.dialog.openComments, {
	        messageId
	      });
	    },
	    async openEvent() {
	      const {
	        EntryManager,
	        Entry,
	        CalendarSection
	      } = await main_core.Runtime.loadExtension('calendar.entry');
	      const section = new CalendarSection({
	        ...AppSettings.openEventSection,
	        PERM: {
	          'view_time': true,
	          'view_title': true,
	          'view_full': true,
	          'add': false,
	          'edit': false,
	          'edit_section': false,
	          'access': false
	        }
	      });
	      const entry = new Entry({
	        data: {
	          ID: this.event.id,
	          NAME: this.event.name,
	          SKIP_TIME: this.event.isFullDay,
	          dateFrom: this.event.dateFrom,
	          dateTo: this.event.dateTo,
	          SECT_ID: section.getId(),
	          RRULE: this.event.fields.rrule,
	          COLOR: this.event.color,
	          '~RRULE_DESCRIPTION': this.event.rruleDescription
	        }
	      });
	      EntryManager.openCompactViewForm({
	        entry,
	        sections: [section]
	      });
	      if (this.event.isNew) {
	        EventManager.setEventWatched(this.event.id);
	      }
	    },
	    async attendEvent(isAttendee) {
	      EventManager.setEventAttendee(this.event.id, isAttendee);
	    }
	  },
	  components: {
	    CalendarSheet,
	    AttendButton,
	    CommentCounter,
	    AttendeeCounter,
	    NameWithCounter
	  },
	  template: `
		<div class="calendar-open-events-list-item">
			<div class="calendar-open-events-list-item-info">
				<CalendarSheet :event="event"/>
				<NameWithCounter
					:event="event"
					@openEvent="openEvent()"
				/>
			</div>
			<div class="calendar-open-events-list-item-actions">
				<CommentCounter :commentsCount="event.commentsCount" @click="openComments()"/>
				<AttendeeCounter
					:attendeesCount="event.attendeesCount"
					:maxAttendees="event.eventOptions.maxAttendees"
				/>
				<AttendButton :isAttendee="event.isAttendee" @click="attendEvent(!event.isAttendee)"/>
			</div>
		</div>
	`
	};

	const EmptyState = {
	  template: `
		<div class="calendar-open-events-list-events-empty">
			<div class="calendar-open-events-list-events-empty-icon"></div>
			<div class="calendar-open-events-list-events-empty-title">
				{{ $Bitrix.Loc.getMessage('CALENDAR_OPEN_EVENTS_LIST_EMPTY_STATE') }}
			</div>
		</div>
	`
	};

	const WATCH_EVENT_MS = 2000;
	const EventList = {
	  data() {
	    return {
	      observedEvents: new Map(),
	      eventRefs: []
	    };
	  },
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      events: 'events',
	      selectedCategoryId: 'selectedCategoryId',
	      isFilterMode: 'isFilterMode'
	    }),
	    sortedEvents() {
	      return [...this.events].sort((a, b) => {
	        if (a.dateFrom.getTime() === b.dateFrom.getTime()) {
	          if (a.dateTo.getTime() === b.dateTo.getTime()) {
	            return parseInt(a.id) - parseInt(b.id);
	          }
	          return a.dateTo.getTime() - b.dateTo.getTime();
	        }
	        return a.dateFrom.getTime() - b.dateFrom.getTime();
	      });
	    }
	  },
	  methods: {
	    initObserver() {
	      this.observer = new IntersectionObserver(this.observerCallback, {
	        root: this.$refs.eventList,
	        threshold: 0.9
	      });
	    },
	    observerCallback(entries) {
	      entries.forEach(entry => {
	        if (entry.isIntersecting) {
	          this.processIntersectedElement(entry.target);
	        }
	      });
	    },
	    processIntersectedElement(element) {
	      const eventId = parseInt(element.dataset.eventId, 10);
	      if (this.observedEvents.has(eventId)) {
	        return;
	      }
	      this.observedEvents.set(eventId, eventId);
	      setTimeout(() => {
	        this.observer.unobserve(element);
	        EventManager.setEventWatched(eventId);
	      }, WATCH_EVENT_MS);
	    },
	    scrollToUpcomingEvent() {
	      const today = new Date();
	      today.setHours(0, 0, 0, 0);
	      const upcomingEvent = this.sortedEvents.find(event => event.dateFrom >= today);
	      if (!upcomingEvent) {
	        return;
	      }
	      this.$refs.eventList.scrollTop = this.eventRefs[upcomingEvent.uniqueId].offsetTop;
	    },
	    async loadOnScroll() {
	      const scrollTop = this.$refs.eventList.scrollTop;
	      const scrollHeight = this.$refs.eventList.scrollHeight;
	      const offsetHeight = this.$refs.eventList.offsetHeight;
	      if (scrollTop + 1 >= scrollHeight - offsetHeight) {
	        await this.$store.dispatch('setEventsUpdating', true);
	        const events = await this.getNext();
	        await this.$store.dispatch('setEvents', events);
	        await this.$store.dispatch('setEventsUpdating', false);
	      }
	      if (scrollTop <= 0) {
	        await this.$store.dispatch('setEventsUpdating', true);
	        const events = await this.getPrevious();
	        await this.$store.dispatch('setEvents', events);
	        await this.$store.dispatch('setEventsUpdating', false);
	        this.$refs.eventList.scrollTop += this.$refs.eventList.scrollHeight - scrollHeight;
	      }
	    },
	    getNext() {
	      if (this.isFilterMode) {
	        return EventManager.filterNext();
	      }
	      return EventManager.getNext(this.selectedCategoryId);
	    },
	    getPrevious() {
	      if (this.isFilterMode) {
	        return EventManager.filterPrevious();
	      }
	      return EventManager.getPrevious(this.selectedCategoryId);
	    },
	    setEventRef(ref) {
	      if (!ref) {
	        return;
	      }
	      const {
	        event,
	        $el
	      } = ref;
	      this.eventRefs[event.uniqueId] = $el;
	      if (event.isNew) {
	        this.observer.observe($el);
	      }
	    }
	  },
	  created() {
	    this.initObserver();
	  },
	  mounted() {
	    this.scrollToUpcomingEvent();
	    void this.loadOnScroll();
	    this.$refs.eventList.addEventListener('scroll', this.loadOnScroll);
	  },
	  beforeUnmount() {
	    this.observer.disconnect();
	    this.$refs.eventList.removeEventListener('scroll', this.loadOnScroll);
	  },
	  components: {
	    Event,
	    EmptyState
	  },
	  template: `
		<div class="calendar-open-events-list-events-list --calendar-scroll-bar" ref="eventList">
			<Event
				v-for="event of sortedEvents"
				:event="event"
				:data-event-id="event.id"
				:ref="setEventRef"
			/>
			<EmptyState v-if="events.length === 0"/>
		</div>
	`
	};

	const Events = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      selectedCategoryId: 'selectedCategoryId',
	      areEventsUpdating: 'areEventsUpdating',
	      isFilterMode: 'isFilterMode',
	      events: 'events'
	    })
	  },
	  mounted() {
	    EventManager.subscribe('update', this.eventManagerUpdateHandler);
	    EventManager.subscribe('delete', this.eventManagerDeleteHandler);
	    new main_loader.Loader().show(this.$refs.events);
	  },
	  beforeUnmount() {
	    EventManager.unsubscribe('update', this.eventManagerUpdateHandler);
	    EventManager.unsubscribe('delete', this.eventManagerDeleteHandler);
	  },
	  methods: {
	    async eventManagerUpdateHandler(event) {
	      const {
	        eventId
	      } = event.getData();
	      const events = await this.getEvents();
	      if (!events.find(it => it.id === eventId)) {
	        return;
	      }
	      this.$store.dispatch('setEvents', events);
	    },
	    async eventManagerDeleteHandler(event) {
	      const {
	        eventId
	      } = event.getData();
	      if (!this.events.find(it => it.id === eventId)) {
	        return;
	      }
	      const events = await this.getEvents();
	      this.$store.dispatch('setEvents', events);
	    },
	    async getEvents() {
	      if (this.isFilterMode) {
	        return EventManager.filterEvents();
	      }
	      return EventManager.getEvents(this.selectedCategoryId);
	    }
	  },
	  components: {
	    EventListTitle,
	    EventList
	  },
	  template: `
		<div
			class="calendar-open-events-list-events"
			:class="{ '--updating': areEventsUpdating }"
			ref="events"
		>
			<EventListTitle/>
			<EventList/>
		</div>
	`
	};

	const BaseComponent = {
	  computed: {
	    ...ui_vue3_vuex.mapGetters({
	      areEventsLoading: 'areEventsLoading'
	    })
	  },
	  components: {
	    Categories,
	    Events
	  },
	  template: `
		<Categories/>
		<div class="calendar-open-events-list-events-loader" v-if="areEventsLoading"></div>
		<Events v-else/>
	`
	};

	const CategoriesSearchStore = {
	  state() {
	    return {
	      isSearchMode: false,
	      categoriesQuery: ''
	    };
	  },
	  actions: {
	    setSearchMode: (store, isSearchMode) => {
	      store.commit('setSearchMode', isSearchMode);
	    },
	    setCategoriesQuery: (store, categoriesQuery) => {
	      store.commit('setCategoriesQuery', categoriesQuery);
	    }
	  },
	  mutations: {
	    setSearchMode: (state, isSearchMode) => {
	      state.isSearchMode = isSearchMode;
	    },
	    setCategoriesQuery: (state, categoriesQuery) => {
	      state.categoriesQuery = categoriesQuery;
	    }
	  },
	  getters: {
	    isSearchMode: state => state.isSearchMode,
	    categoriesQuery: state => state.categoriesQuery
	  }
	};

	const CategoriesStore = {
	  state() {
	    return {
	      selectedCategoryId: 0,
	      categories: []
	    };
	  },
	  actions: {
	    setCategories: (store, categories) => {
	      store.commit('setCategories', categories);
	    },
	    selectCategory: (store, categoryId) => {
	      store.commit('selectCategory', categoryId);
	    }
	  },
	  mutations: {
	    setCategories: (state, categories) => {
	      state.categories = categories;
	    },
	    selectCategory: (state, categoryId) => {
	      state.selectedCategoryId = categoryId;
	    }
	  },
	  getters: {
	    categories: state => state.categories.map(category => {
	      category.isSelected = category.id === state.selectedCategoryId;
	      return category;
	    }),
	    selectedCategory: state => state.categories.find(it => it.id === state.selectedCategoryId),
	    selectedCategoryId: state => state.selectedCategoryId
	  }
	};

	const EventsStore = {
	  state() {
	    return {
	      events: [],
	      areEventsLoading: false,
	      areEventsUpdating: false,
	      isFilterMode: false
	    };
	  },
	  actions: {
	    setEventsLoading: (store, areEventsLoading) => {
	      store.commit('setEventsLoading', areEventsLoading);
	    },
	    setEventsUpdating: (store, areEventsUpdating) => {
	      store.commit('setEventsUpdating', areEventsUpdating);
	    },
	    setEvents: (store, events) => {
	      store.commit('setEvents', events);
	    },
	    setFilterMode: (store, isFilterMode) => {
	      store.commit('setFilterMode', isFilterMode);
	    }
	  },
	  mutations: {
	    setEventsLoading: (state, areEventsLoading) => {
	      state.areEventsLoading = areEventsLoading;
	    },
	    setEventsUpdating: (state, areEventsUpdating) => {
	      state.areEventsUpdating = areEventsUpdating;
	    },
	    setEvents: (state, events) => {
	      state.events = events;
	    },
	    setFilterMode: (state, isFilterMode) => {
	      state.isFilterMode = isFilterMode;
	    }
	  },
	  getters: {
	    areEventsLoading: state => state.areEventsLoading,
	    areEventsUpdating: state => state.areEventsUpdating,
	    events: state => state.events,
	    isFilterMode: state => state.isFilterMode
	  }
	};

	const Store = ui_vue3_vuex.createStore({
	  modules: {
	    categories: CategoriesStore,
	    categoriesSearch: CategoriesSearchStore,
	    events: EventsStore
	  }
	});

	var _params = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("params");
	var _application = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("application");
	var _mountApplication = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("mountApplication");
	class List {
	  constructor(params) {
	    Object.defineProperty(this, _mountApplication, {
	      value: _mountApplication2
	    });
	    Object.defineProperty(this, _params, {
	      writable: true,
	      value: void 0
	    });
	    Object.defineProperty(this, _application, {
	      writable: true,
	      value: void 0
	    });
	    babelHelpers.classPrivateFieldLooseBase(this, _params)[_params] = params;
	    babelHelpers.classPrivateFieldLooseBase(this, _mountApplication)[_mountApplication]();
	  }
	}
	function _mountApplication2() {
	  babelHelpers.classPrivateFieldLooseBase(this, _application)[_application] = ui_vue3.BitrixVue.createApp({
	    name: 'List',
	    props: {
	      filterId: String
	    },
	    data() {
	      return {
	        isLoading: true
	      };
	    },
	    computed: {
	      ...ui_vue3_vuex.mapGetters({
	        selectedCategoryId: 'selectedCategoryId'
	      })
	    },
	    async mounted() {
	      this.bindFilter(this.filterId);
	      const categories = await CategoryManager.getCategories();
	      const events = await EventManager.getEvents(this.selectedCategoryId);
	      this.isLoading = false;
	      this.$store.dispatch('setCategories', categories);
	      this.$store.dispatch('setEvents', events);
	    },
	    methods: {
	      bindFilter(filterId) {
	        const filter = new calendar_openEvents_filter.Filter(filterId);
	        EventManager.setFilter(filter);
	        filter.subscribe('beforeApply', () => {
	          this.isLoading = true;
	        });
	        filter.subscribe('apply', async () => {
	          const events = await EventManager.filterEvents();
	          this.$store.dispatch('setEvents', events);
	          this.$store.dispatch('setFilterMode', true);
	          this.isLoading = false;
	        });
	        filter.subscribe('clear', async () => {
	          const events = await EventManager.getEvents(this.selectedCategoryId);
	          this.$store.dispatch('setEvents', events);
	          this.$store.dispatch('setFilterMode', false);
	          this.isLoading = false;
	        });
	      }
	    },
	    components: {
	      BaseComponent
	    },
	    template: `
					<div class="calendar-open-events-list-loader" v-if="isLoading"></div>
					<BaseComponent v-else/>
				`
	  }, {
	    filterId: babelHelpers.classPrivateFieldLooseBase(this, _params)[_params].filterId
	  });
	  babelHelpers.classPrivateFieldLooseBase(this, _application)[_application].use(Store);
	  babelHelpers.classPrivateFieldLooseBase(this, _application)[_application].mount(babelHelpers.classPrivateFieldLooseBase(this, _params)[_params].container);
	}

	exports.List = List;

}((this.BX.Calendar.OpenEvents = this.BX.Calendar.OpenEvents || {}),BX.Vue3,BX.UI.EntitySelector,BX.UI,BX.Calendar.OpenEvents,BX,BX,BX.Event,BX.Messenger.v2.Lib,BX.Messenger.v2.Const,BX.Main,BX,BX.UI,BX,BX,BX.Main,BX.UI,BX.Vue3.Vuex));
//# sourceMappingURL=list.bundle.js.map

Youez - 2016 - github.com/yon3zu
LinuXploit