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/cvetdv.ru/bitrix/components/bitrix/socialnetwork.group.user.list/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/cvetdv.ru/bitrix/components/bitrix/socialnetwork.group.user.list/class.php
<?php

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Main\Context;
use Bitrix\Main\Entity\ExpressionField;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ModuleManager;
use Bitrix\Socialnetwork\Component\WorkgroupUserList;
use Bitrix\Main\Loader;
use Bitrix\Main\Error;
use Bitrix\Main\Config\Option;
use Bitrix\Socialnetwork\Helper;
use Bitrix\Socialnetwork\Item\Workgroup;
use Bitrix\Socialnetwork\Item\Workgroup\AccessManager;
use Bitrix\Socialnetwork\UserToGroupTable;
use Bitrix\Main\Search;
use Bitrix\Socialnetwork\WorkgroupTable;

Loader::includeModule('socialnetwork');

class CSocialnetworkGroupUserListComponent extends WorkgroupUserList
{
	protected $fieldsList = [
		'ID',
		'FULL_NAME',
		'NAME',
		'LAST_NAME',
		'EMAIL',
		'SECOND_NAME',
		'ROLE',
		'INITIATED_BY_TYPE',
		'DEPARTMENT',
		'AUTO_MEMBER',
		'ACTIONS',
	];

	protected $availableEntityFields = [
		'ID',
		'NAME',
		'LAST_NAME',
		'SECOND_NAME',
		'PERSONAL_PHOTO',
		'ROLE',
		'AUTO_MEMBER',
		'INITIATED_BY_TYPE',
		'INITIATED_BY_USER_ID',
		'USER_ID',
		'GROUP_ID',
		'DEPARTMENT',
		'DATE_CREATE',
		'IS_SCRUM_MASTER',
		'AUTO_MEMBER_DEPARTMENT',
	];

	protected $actionData;

	protected function listKeysSignedParameters()
	{
		return [
			'GROUP_ID',
		];
	}

	private function getGridHeaders(): array
	{
		static $result = null;
		if ($result === null)
		{
			$result = [];

			$columns = [
				[
					'id' => 'ID',
					'name' => Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_COLUMN_ID'),
					'sort' => 'ID',
					'editable' => false
				],
				[
					'id' => 'FULL_NAME',
					'name' => Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_COLUMN_PERSON'),
					'sort' => 'FULL_NAME',
					'default' => true,
					'editable' => false,
					'prevent_default' => false,
				],
			];

			if (!$this->isInvitationFilter())
			{
				$columns[] = [
					'id' => 'ROLE',
					'name' => Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_COLUMN_ROLE'),
					'sort' => 'ROLE',
					'default' => true,
					'editable' => false
				];
			}

			if (ModuleManager::isModuleInstalled('intranet'))
			{
				$columns[] = [
					'id' => 'DEPARTMENT',
					'name' => Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_COLUMN_DEPARTMENT'),
					'sort' => false,
					'default' => false,
					'editable' => false,
					'prevent_default' => true,
				];
			}

			$columns[] = [
				'id' => 'ACTIONS',
				'name' => Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_COLUMN_ACTIONS'),
				'default' => true,
				'editable' => false,
				'prevent_default' => false,
			];

			foreach ($columns as $column)
			{
				$fieldId = ($column['fieldId'] ?? $column['id']);
				if (in_array($fieldId, $this->fieldsList, true))
				{
					$result[] = $column;
				}
			}

			$defaultSelectedGridHeaders = $this->getDefaultGridSelectedHeaders();

			foreach ($result as $key => $column)
			{
				if (
					!($column['default'] ?? false)
					&& in_array($column['id'], $defaultSelectedGridHeaders, true)
				)
				{
					$result[$key]['default'] = true;
				}
			}
		}

		return $result;
	}

	private function getDefaultGridHeaders(): array
	{
		$result = [];
		$gridHeaders = $this->getGridHeaders();
		foreach ($gridHeaders as $header)
		{
			if (!empty($header['default']))
			{
				$result[] = $header['id'];
			}
		}

		return $result;
	}

	private function getDefaultGridSelectedHeaders(): array
	{
		return [
			'FULL_NAME',
			'EMAIL',
		];
	}

	private function clearFilter($componentResult): void
	{
		$filterOptions = new \Bitrix\Main\UI\Filter\Options(self::$filterId, $componentResult['FILTER_PRESETS']);
		$currentPresetId = $componentResult['CURRENT_PRESET_ID'];
		$customFilterData = $componentResult['CUSTOM_FILTER'];

		if (!empty($customFilterData))
		{
			$filterSettings = [
				'fields' => $customFilterData,
			];
		}
		else
		{
			$filterSettings = $filterOptions->getFilterSettings($currentPresetId);
			if (isset($componentResult['FILTER_PRESETS'][$currentPresetId]))
			{
				$filterSettings['fields'] = $componentResult['FILTER_PRESETS'][$currentPresetId]['fields'];
			}
		}

		$filterOptions->setFilterSettings($currentPresetId, $filterSettings, true, false);
		$filterOptions->save();
	}

	private function getOrder(\Bitrix\Main\Grid\Options $gridOptions, array $componentResult = []): array
	{
		$result = [];
		$gridSort = $gridOptions->getSorting();

		$useDepartments = ModuleManager::isModuleInstalled('intranet');

		if (!empty($gridSort['sort']))
		{
			if ($useDepartments)
			{
				$result['AUTO_MEMBER'] = 'ASC';
				$result['AUTO_MEMBER_DEPARTMENT'] = 'ASC';
			}

			foreach ($gridSort['sort'] as $by => $order)
			{
				switch ($by)
				{
					case 'FULL_NAME':
						$by = 'USER.LAST_NAME';
						break;
					default:
				}
				$result[$by] = mb_strtoupper($order);

				if (
					$by === 'ROLE'
					&& $componentResult['SCRUM'] === 'Y'
				)
				{
					$result['IS_SCRUM_MASTER'] = 'DESC';
				}
			}
		}
		else
		{
			$result = [
				'ROLE' => 'ASC',
			];

			if ($componentResult['SCRUM'] === 'Y')
			{
				$result['IS_SCRUM_MASTER'] = 'DESC';
			}

			if ($useDepartments)
			{
				$result['AUTO_MEMBER'] = 'ASC';
				$result['AUTO_MEMBER_DEPARTMENT'] = 'ASC';
			}

			$result['USER.LAST_NAME'] = 'ASC';
		}

		return $result;
	}

	private function checkQueryFieldName($fieldName = ''): bool
	{
		$fieldName = trim($fieldName, '!=<>%*');
		return (
			in_array($fieldName, $this->availableEntityFields)
			|| mb_strpos($fieldName, '.') !== false
		);
	}

	private function addQueryRuntime(\Bitrix\Main\Entity\Query $query, array $componentResult = []): void
	{
		if (ModuleManager::isModuleInstalled('intranet'))
		{
			$query->registerRuntimeField('AUTO_MEMBER_DEPARTMENT',
				new ExpressionField(
					'AUTO_MEMBER_DEPARTMENT',
					"(CASE WHEN %s = 'Y' THEN %s ELSE '0' END)",
					[ 'AUTO_MEMBER', 'USER.UF_DEPARTMENT' ]
				)
			);
		}

		if ($componentResult['SCRUM'] === 'Y')
		{
			$query->registerRuntimeField('IS_SCRUM_MASTER',
				new ExpressionField(
					'IS_SCRUM_MASTER',
					'(CASE WHEN %s = %s THEN 1 ELSE 0 END)',
					[ 'GROUP.SCRUM_MASTER_ID', 'USER.ID' ]
				)
			);
		}
	}

	private function addQueryOrder(\Bitrix\Main\Entity\Query $query, \Bitrix\Main\Grid\Options $gridOptions, array $componentResult = []): void
	{
		$orderFields = $this->getOrder($gridOptions, $componentResult);
		foreach ($orderFields as $fieldName => $value)
		{
			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}

			$query->addOrder($fieldName, $value);
		}
	}

	protected function addQueryFilter(\Bitrix\Main\Entity\Query $query, array $gridFilter, $componentResult)
	{
		$query->addFilter('=GROUP_ID', $this->arParams['GROUP_ID']);

		$filter = $this->getFilter($gridFilter);

		if (!empty($filter['=INITIATED_BY_TYPE']))
		{
			$filter['=ROLE'] = UserToGroupTable::ROLE_REQUEST;
		}

		$departmentId = 0;
		$initiatedByUser = false;

		foreach ($filter as $fieldName => $value)
		{
			if (
				$fieldName === 'DEPARTMENT'
				&& $value === false
			)
			{
				$query->addFilter('=USER.UF_DEPARTMENT', false);
				unset($filter[$fieldName]);
				continue;
			}

			if (
				$fieldName === '!DEPARTMENT'
				&& $value === false
			)
			{
				$query->addFilter('!=USER.UF_DEPARTMENT', false);
				unset($filter[$fieldName]);
				continue;
			}

			if ($fieldName === '=DEPARTMENT')
			{
				$departmentId = (int)$value;
				unset($filter[$fieldName]);
				continue;
			}

			if (preg_match('/([%=]*)(ID|LAST_NAME|NAME|EMAIL)/i', $fieldName, $matches))
			{
				[ , $operation, $fieldName ] = $matches;
				$query->addFilter($operation . 'USER.' . $fieldName, $value);
				continue;
			}

			if ($fieldName === '=INITIATED_BY_TYPE')
			{
				$query->addFilter('=INITIATED_BY_TYPE', $value);

				if ($value === UserToGroupTable::INITIATED_BY_GROUP)
				{
					$initiatedByUser = true;

					if (
						!$componentResult['GROUP_PERMS']['UserCanProcessRequestsIn']
						&& !Helper\Workgroup::isCurrentUserModuleAdmin()
					)
					{
						$query->addFilter('=INITIATED_BY_USER_ID', Helper\User::getCurrentUserId());
					}
				}

				unset($filter[$fieldName]);
				continue;
			}

			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}

			$query->addFilter($fieldName, $value);
		}

		if (
			!$initiatedByUser
			&& !($componentResult['GROUP_PERMS']['UserCanProcessRequestsIn'] ?? null)
			&& !Helper\Workgroup::isCurrentUserModuleAdmin()
		)
		{
			$query->addFilter(null, [
				'LOGIC' => 'OR',
				[
					'=ROLE' => UserToGroupTable::ROLE_REQUEST,
					'=INITIATED_BY_TYPE' => UserToGroupTable::INITIATED_BY_GROUP,
					'=INITIATED_BY_USER_ID' => Helper\User::getCurrentUserId(),
				],
				[
					'!=ROLE' => UserToGroupTable::ROLE_REQUEST,
				],
				[
					'!=INITIATED_BY_TYPE' => UserToGroupTable::INITIATED_BY_GROUP,
				],
			]);
		}

		if ($departmentId > 0)
		{
			$iblockId = (int)Option::get('intranet', 'iblock_structure', 0);
			if (
				$iblockId > 0
				&& Loader::includeModule('iblock')
			)
			{
				$section = \Bitrix\Iblock\SectionTable::getList([
					'filter' => [
						'=IBLOCK_ID' => $iblockId,
						'=ID' => $departmentId
					],
					'select' => [ 'LEFT_MARGIN', 'RIGHT_MARGIN' ],
					'limit' => 1
				])->fetch();

				if ($section)
				{
					$query->registerRuntimeField(
						'',
						new \Bitrix\Main\Entity\ReferenceField(
							'DEPARTMENT',
							\Bitrix\Iblock\SectionTable::getEntity(),
							[
								'=ref.ID' => 'this.USER.UF_DEPARTMENT_SINGLE',
							],
							[ 'join_type' => 'INNER' ]
						)
					);
					$query->addFilter('=DEPARTMENT.IBLOCK_ID', $iblockId);
					$query->addFilter('>=DEPARTMENT.LEFT_MARGIN', $section['LEFT_MARGIN']);
					$query->addFilter('<=DEPARTMENT.RIGHT_MARGIN', $section['RIGHT_MARGIN']);
				}
			}
		}
	}

	private function addQuerySelect(\Bitrix\Main\Entity\Query $query, \Bitrix\Main\Grid\Options $gridOptions, array $componentResult = []): void
	{
		$selectFields = $this->getSelect($gridOptions, $componentResult);
		foreach ($selectFields as $fieldName)
		{
			if (!$this->checkQueryFieldName($fieldName))
			{
				continue;
			}

			$query->addSelect($fieldName);
		}
	}

	private function addFilterInteger(&$filter, array $params = []): void
	{
		$filterFieldName = ($params['FILTER_FIELD_NAME'] ?? '');
		$value = ($params['VALUE'] ?? '');

		if (
			$filterFieldName === ''
			|| (int)$value <= 0
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] !== '' ? $params['FIELD_NAME'] : $filterFieldName);
		$operation = ($params['OPERATION'] ?? '=');

		if (in_array($fieldName, $this->fieldsList, true))
		{
			$filter[$operation . $fieldName] = $value;
		}
	}

	private function addFilterString(&$filter, array $params = []): void
	{
		$filterFieldName = ($params['FILTER_FIELD_NAME'] ?? '');
		$value = ($params['VALUE'] ?? '');

		if ($filterFieldName === '')
		{
			return;

		}
		if (
			!is_array($value)
			&& trim($value, '%') === ''
		)
		{
			return;
		}

		if (
			is_array($value)
			&& empty(array_filter($value, static function($item) {
				return trim($item, '%') !== '';
			}))
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] !== '' ? $params['FIELD_NAME'] : $filterFieldName);
		$operation = ($params['OPERATION'] ?? '%=');

		if (in_array($fieldName, $this->fieldsList, true))
		{
			$filter[$operation . $fieldName] = $value;
		}
	}

	private function addFilterDateTime(&$filter, array $params = []): void
	{
		$filterFieldName = ($params['FILTER_FIELD_NAME'] ?? '');
		$valueFrom = ($params['VALUE_FROM'] ?? '');
		$valueTo = ($params['VALUE_TO'] ?? '');

		if (
			$filterFieldName === ''
			|| (
				$valueFrom === ''
				&& $valueTo === ''
			)
		)
		{
			return;
		}

		$fieldName = (isset($params['FIELD_NAME']) && $params['FIELD_NAME'] !== '' ? $params['FIELD_NAME'] : $filterFieldName);

		if (in_array($fieldName, $this->fieldsList, true))
		{
			if ($valueFrom !== '')
			{
				$filter['>=' . $fieldName] = $valueFrom;
			}
			if ($valueTo !== '')
			{
				$filter['<=' . $fieldName] = $valueTo;
			}
		}

	}

	/**
	 * Get filter for getList.
	 * @param array $gridFilter
	 * @return array
	 */
	private function getFilter(array $gridFilter): array
	{
		$result = [];

		if (!\Bitrix\Main\Filter\UserDataProvider::getFiredAvailability())
		{
			$result['=USER.ACTIVE'] = 'Y';
		}
		elseif (!empty($gridFilter['FIRED']))
		{
			if ($gridFilter['FIRED'] === 'Y')
			{
				$result['=USER.ACTIVE'] = 'N';
			}
			elseif ($gridFilter['FIRED'] === 'N')
			{
				$result['=USER.ACTIVE'] = 'Y';
			}
		}

		if (
			!empty($gridFilter['EXTRANET'])
			&& \Bitrix\Main\Filter\UserDataProvider::getExtranetAvailability()
		)
		{
			if ($gridFilter['EXTRANET'] === 'Y')
			{
				$result['=USER.UF_DEPARTMENT'] = false;
			}
			elseif ($gridFilter['EXTRANET'] === 'N')
			{
				$result['!=USER.UF_DEPARTMENT'] = false;
			}
		}

		$gridFilter['DEPARTMENT'] = ($gridFilter['DEPARTMENT'] ?? '');

		$integerFieldsList = [
			[
				'FILTER_FIELD_NAME' => 'ID',
				'FIELD_NAME' => 'ID',
				'OPERATION' => '=',
				'VALUE' => $gridFilter['ID'] ?? '',
			],
			[
				'FILTER_FIELD_NAME' => 'DEPARTMENT',
				'FIELD_NAME' => 'DEPARTMENT',
				'OPERATION' => '=',
				'VALUE' => (
					$gridFilter['DEPARTMENT']
					&& preg_match('/^DR(\d+)$/', $gridFilter['DEPARTMENT'], $matches)
						? $matches[1]
						: ($gridFilter['DEPARTMENT'] && (int)($gridFilter['DEPARTMENT'] > 0) ? $gridFilter['DEPARTMENT'] : false)
				),
			],
			[
				'FILTER_FIELD_NAME' => 'DEPARTMENT',
				'FIELD_NAME' => 'USER.UF_DEPARTMENT',
				'OPERATION' => '=',
				'VALUE' => (
					$gridFilter['DEPARTMENT']
					&& preg_match('/^D(\d+)$/', $gridFilter['DEPARTMENT'], $matches)
						? $matches[1]
						: false
				),
			]
		];

		$stringFieldsList = [
			[
				'FILTER_FIELD_NAME' => 'NAME',
				'FIELD_NAME' => 'NAME',
				'OPERATION' => '%=',
				'VALUE' => ($gridFilter['NAME'] ?? '') . '%',
			],
			[
				'FILTER_FIELD_NAME' => 'LAST_NAME',
				'FIELD_NAME' => 'LAST_NAME',
				'OPERATION' => '%=',
				'VALUE' => ($gridFilter['LAST_NAME'] ?? '') . '%',
			],
			[
				'FILTER_FIELD_NAME' => 'EMAIL',
				'FIELD_NAME' => 'EMAIL',
				'OPERATION' => '%=',
				'VALUE' => ($gridFilter['EMAIL'] ?? '') . '%',
			],
			[
				'FILTER_FIELD_NAME' => 'ROLE',
				'FIELD_NAME' => 'ROLE',
				'OPERATION' => '=',
				'VALUE' => ($gridFilter['ROLE'] ?? ''),
			],
			[
				'FILTER_FIELD_NAME' => 'INITIATED_BY_TYPE',
				'FIELD_NAME' => 'INITIATED_BY_TYPE',
				'OPERATION' => '=',
				'VALUE' => $gridFilter['INITIATED_BY_TYPE'] ?? '',
			],
			[
				'FILTER_FIELD_NAME' => 'AUTO_MEMBER',
				'FIELD_NAME' => 'AUTO_MEMBER',
				'OPERATION' => '=',
				'VALUE' => $gridFilter['AUTO_MEMBER'] ?? '',
			],
		];

		$dateFieldsList = [
		];

		foreach ($integerFieldsList as $field)
		{
			$value = false;

			if (
				is_array($field['VALUE'])
				&& !empty($field['VALUE'])
			)
			{
				$value = $field['VALUE'];
			}
			elseif (
				!is_array($field['VALUE'])
				&& (string)$field['VALUE'] !== ''
			)
			{
				$value = (int)$field['VALUE'];
			}

			if ($value !== false)
			{
				$this->addFilterInteger($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'OPERATION' => ($field['OPERATION'] ?? '='),
					'VALUE' => $value,
				]);
			}
		}

		foreach ($stringFieldsList as $field)
		{
			if ($field['VALUE'] !== '')
			{
				$this->addFilterString($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'OPERATION' => ($field['OPERATION'] ?? '%='),
					'VALUE' => $field['VALUE'],
				]);
			}
		}

		foreach ($dateFieldsList as $field)
		{
			if (
				!empty($field['VALUE_FROM'])
				|| !empty($field['VALUE_TO'])
			)
			{
				$this->addFilterDateTime($result, [
					'FILTER_FIELD_NAME' => $field['FILTER_FIELD_NAME'],
					'FIELD_NAME' => $field['FIELD_NAME'],
					'VALUE_FROM' => ($field['VALUE_FROM'] ?? $gridFilter[$field['FILTER_FIELD_NAME']]),
					'VALUE_TO' => ($field['VALUE_TO'] ?? $gridFilter[$field['FILTER_FIELD_NAME']]),
				]);
			}
		}

		if (
			isset($gridFilter['FIND'])
			&& $gridFilter['FIND']
		)
		{
			$findFilter = self::getFindFilter($gridFilter['FIND']);
			if (!empty($findFilter))
			{
				$result = array_merge($result, $findFilter);
			}
		}

		return $result;
	}

	protected function getSelect(\Bitrix\Main\Grid\Options $gridOptions, array $componentResult = []): array
	{
		$result = [
			'GROUP_ID', 'USER_ID',
			'ROLE', 'INITIATED_BY_TYPE', 'INITIATED_BY_USER_ID', 'AUTO_MEMBER', 'DATE_CREATE',
			'USER.ID', 'USER.CONFIRM_CODE',
		];
		if (ModuleManager::isModuleInstalled('intranet'))
		{
			$result[] = 'USER.USER_TYPE';
			$result[] = 'USER.UF_DEPARTMENT';
		}

		if ($componentResult['SCRUM'] === 'Y')
		{
			$result[] = 'GROUP.SCRUM_MASTER_ID';
		}

		$gridColumns = $gridOptions->getVisibleColumns();

		if (empty($gridColumns))
		{
			$gridColumns = $this->getDefaultGridHeaders();
		}

		foreach ($gridColumns as $column)
		{
			switch($column)
			{
				case 'EMAIL':
					$result[] = 'USER.EMAIL';
					break;
				case 'FULL_NAME':
					$result[] = 'USER.NAME';
					$result[] = 'USER.LAST_NAME';
					$result[] = 'USER.SECOND_NAME';
					$result[] = 'USER.LOGIN';
					$result[] = 'USER.PERSONAL_PHOTO';
					$result[] = 'USER.PERSONAL_GENDER';
					$result[] = 'USER.WORK_POSITION';
					break;
				case 'DEPARTMENT':
					break;
				default:
					$result[] = $column;
			}
		}

		return $result;
	}

	public function onPrepareComponentParams($params): array
	{
		$params['GROUP_ID'] = (int)($params['GROUP_ID'] ?? 0);
		$params['GROUP_USE_BAN'] = 'N';

		$params['INCLUDE_TOOLBAR'] = (
			!isset($params['INCLUDE_TOOLBAR'])
			|| (bool) $params['INCLUDE_TOOLBAR']
		);
		$params['INCLUDE_COUNTERS_BELOW_TITLE'] = (
			!isset($params['INCLUDE_COUNTERS_BELOW_TITLE'])
			|| (bool) $params['INCLUDE_COUNTERS_BELOW_TITLE']
		);

		if (empty($params['PATH_TO_DEPARTMENT']))
		{
			$params['PATH_TO_DEPARTMENT'] = ($params['PATH_TO_CONPANY_DEPARTMENT'] ?? '');
		}
		if (empty($params['PATH_TO_DEPARTMENT']))
		{
			$params['PATH_TO_DEPARTMENT'] = Helper\Path::get('department_path_template');
		}

		if (empty($params['PATH_TO_USER']))
		{
			$params['PATH_TO_USER'] = Helper\Path::get('user_profile');
		}

		if (empty($params['PATH_TO_GROUP_INVITE']))
		{
			$params['PATH_TO_GROUP_INVITE'] = Helper\Path::get('group_invite_path_template');
		}

		if (empty($params['PATH_TO_GROUP_USERS']))
		{
			$params['PATH_TO_GROUP_USERS'] = Helper\Path::get('group_users_path_template');
		}

		if (empty($params['PATH_TO_GROUP_REQUESTS']))
		{
			$params['PATH_TO_GROUP_REQUESTS'] = Helper\Path::get('group_requests_path_template');
		}

		if (empty($params['PATH_TO_GROUP_REQUESTS_OUT']))
		{
			$params['PATH_TO_GROUP_REQUESTS_OUT'] = Helper\Path::get('group_requests_out_path_template');
		}

		return $params;
	}

	protected function prepareActions(): void
	{
		$this->actionData = [ 'ACTIVE' => false ];

		if (!check_bitrix_sessid())
		{
			return;
		}

		$request = Context::getCurrent()->getRequest();
		$postAction = 'action_button_' .self::$gridId;

		if (
			$request->getRequestMethod() === 'POST'
			&& !empty($request->getPost($postAction))
		)
		{
			$this->actionData['NAME'] = $request->getPost($postAction);
			unset($_POST[$postAction], $_REQUEST[$postAction]);

			if (!empty($request->getPost('ID')))
			{
				$this->actionData['ID'] = $request->getPost('ID');
				unset($_POST['ID'], $_REQUEST['ID']);
			}

			$this->actionData['ACTIVE'] = true;
		}
	}

	protected function processAction(): void
	{
		if (!$this->actionData['ACTIVE'])
		{
			return;
		}

		$idList = [];

		if (
			isset($this->actionData['ID'])
			&& is_array($this->actionData['ID'])
		)
		{
			$idList = $this->actionData['ID'];
		}
		else
		{
			$idList[] = $this->actionData['ID'];
		}

		if (empty($idList))
		{
			return;
		}

		$groupId = $this->arParams['GROUP_ID'];

		$deleteRelationIdList = [];
		$removeModeratorRelationIdList = [];
		$rejectIncomingRequestRelationIdList = [];

		$group = WorkgroupTable::getList([
			'filter' => [
				'=ID' => $groupId,
			],
			'select' => [
				'ID',
				'CLOSED',
				'PROJECT',
				'SCRUM_MASTER_ID',
				'INITIATE_PERMS',
			],
		])->fetchObject();

		$currentUserRelation = UserToGroupTable::getList([
			'filter' => [
				'=GROUP_ID' => $groupId,
				'=USER_ID' => Helper\User::getCurrentUserId(),
			],
			'select' => [ 'ID', 'ROLE', 'USER_ID', 'GROUP_ID', 'INITIATED_BY_TYPE' ],
		])->fetchObject();

		$res = UserToGroupTable::getList([
			'filter' => [
				'=GROUP_ID' => $groupId,
				'@USER_ID' => $idList,
			],
			'select' => [
				'ID',
				'GROUP_ID',
				'USER_ID',
				'USER',
				'ROLE',
				'INITIATED_BY_TYPE',
				'INITIATED_BY_USER_ID',
				'AUTO_MEMBER',
			],
		]);
		$relations = $res->fetchCollection();

		foreach ($relations as $relation)
		{
			$accessManager = new AccessManager(
				$group,
				$relation,
				$currentUserRelation,
			);

			if ($this->actionData['NAME'] === 'delete')
			{
				$canRemoveModerator = $accessManager->canRemoveModerator();
				$canDeleteOutgoingRequest = $accessManager->canDeleteOutgoingRequest();
				$canExclude = $accessManager->canExclude();
				$canProcessIncomingRequest = $accessManager->canProcessIncomingRequest();

				if (
					!$canDeleteOutgoingRequest
					&& !$canProcessIncomingRequest
					&& !$canRemoveModerator
					&& !$canExclude
				)
				{
					continue;
				}

				if ($canRemoveModerator)
				{
					$removeModeratorRelationIdList[] = $relation->getId();
				}
				elseif ($canProcessIncomingRequest)
				{
					$rejectIncomingRequestRelationIdList[] = $relation->getId();
				}
				else
				{
					$deleteRelationIdList[] = $relation->getId();
				}
			}
		}

		if ($this->actionData['NAME'] === 'delete')
		{
			if (
				empty($deleteRelationIdList)
				&& empty($rejectIncomingRequestRelationIdList)
				&& empty($removeModeratorRelationIdList)
			)
			{
				$this->addError(new Error(Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_GROUP_ACTION_EMPTY_LIST')));
				return;
			}

			foreach ($deleteRelationIdList as $relationId)
			{
				Helper\Workgroup::deleteRelation([
					'relationId' => $relationId,
				]);
			}

			if (!empty($removeModeratorRelationIdList))
			{
				CSocNetUserToGroup::TransferModerator2Member(
					Helper\User::getCurrentUserId(),
					$groupId,
					$removeModeratorRelationIdList
				);
			}

			if (!empty($rejectIncomingRequestRelationIdList))
			{
				CSocNetUserToGroup::RejectRequestToBeMember(
					Helper\User::getCurrentUserId(),
					$groupId,
					$rejectIncomingRequestRelationIdList
				);
			}
		}
	}

	protected function prepareData(): array
	{
		$result = [
			'GROUP_ACTION_MESSAGES' => [],
			'FIELDS_LIST' => $this->fieldsList,
		];

		$group = Workgroup::getById($this->arParams['GROUP_ID']);

		if ($group && $group->isScrumProject())
		{
			$result['SCRUM'] = 'Y';
			$result['PROJECT'] = 'Y';
		}
		elseif ($group && $group->isProject())
		{
			$result['SCRUM'] = 'N';
			$result['PROJECT'] = 'Y';
		}
		else
		{
			$result['SCRUM'] = 'N';
			$result['PROJECT'] = 'N';
		}

		$this->initPageFilterData();

		$result['GROUP'] = $this->getGroup();

		if (empty($result['GROUP']))
		{
			$this->addError(new Error(Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_NO_GROUP')));
			return $result;
		}

		$result['GROUP_PERMS'] = Helper\Workgroup::getPermissions([
			'groupId' => $result['GROUP']['ID'],
		]);

		if (
			!$result['GROUP_PERMS']
			|| !$result['GROUP_PERMS']['UserCanViewGroup']
		)
		{
			$this->addError(new Error(
				$result['GROUP']['PROJECT'] === 'Y'
					? Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_NO_GROUP_PERMS_PROJECT')
					: Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_NO_GROUP_PERMS')
			));
			return $result;
		}

		$result['CONNECTED_DEPARTMENTS_LIST'] = $this->getConnectedDepartmentsList([
			'groupFields' => $result['GROUP'],
			'pathToDepartment' => $this->arParams['PATH_TO_DEPARTMENT'],
		]);

		$result['CONNECTED_SUBDEPARTMENTS_LIST'] = $this->getConnectedSubDepartmentsList([
			'groupFields' => $result['GROUP'],
		]);

		$result['EXTRANET_SITE'] = (static::extranetSite() ? 'Y' : 'N');
		$result['HideArchiveLinks'] = (
			$result['GROUP']['CLOSED'] === 'Y'
			&& Option::get('socialnetwork', 'work_with_closed_groups', 'N') !== 'Y'
		);

		$result['GROUP_USE_BAN'] = (
			$this->arParams['GROUP_USE_BAN'] === 'Y'
			&& $result['EXTRANET_SITE'] !== 'Y'
			&& !$result['HideArchiveLinks']
				? 'Y'
				: 'N'
		);

		$result = WorkgroupUserList::prepareFilterResult(
			$result,
			$result['GROUP_PERMS'],
			$this->arParams['MODE']
		);

		$request = Context::getCurrent()->getRequest();

		if (
			($request->getPost('apply_filter') !== 'Y')
			&& ($request->get('grid_action') !== 'pagination')
		)
		{
			$this->clearFilter($result);
		}

		$gridOptions = new \Bitrix\Main\Grid\Options($result['GRID_ID']);

		$navParams = $gridOptions->getNavParams();
		$pageSize = $navParams['nPageSize'];

		$nav = new \Bitrix\Main\UI\PageNavigation('page');

		$nav->allowAllRecords(false)
			->setPageSize($pageSize)
			->initFromUri();

		$result['HEADERS'] = $this->getGridHeaders();
		$result['ROWS'] = [];

		$gridFilter = $this->getGridFilter([
			'FILTER_PRESETS' => $result['FILTER_PRESETS'],
			'FILTER' => $result['FILTER'],
		]);

		$query = new \Bitrix\Main\Entity\Query(UserToGroupTable::getEntity());
		$this->addQueryRuntime($query, $result);
		$this->addQueryOrder($query, $gridOptions, $result);
		$this->addQueryFilter($query, $gridFilter, $result);
		$this->addQuerySelect($query, $gridOptions, $result);
		$query->countTotal(true);
		$query->setOffset($nav->getOffset());
		$query->setLimit($nav->getLimit());
		$query->disableDataDoubling();
		$res = $query->exec();
		$records = $res->fetchCollection();

		$gridColumns = $gridOptions->getVisibleColumns();

		if (empty($gridColumns))
		{
			$gridColumns = $this->getDefaultGridHeaders();
		}
		else
		{
			$availableGridColumns = array_map(static function($gridColumn) {
				return $gridColumn['id'];
			}, $this->getGridHeaders());
			$gridColumns = array_filter($gridColumns, static function ($key) use ($availableGridColumns) {
				return in_array($key, $availableGridColumns, true);
			});
		}

		$rowsList = [];
		$showActionsColumn = false;

		$currentUserRelation = UserToGroupTable::getList([
			'filter' => [
				'=GROUP_ID' => (int)$this->arParams['GROUP_ID'],
				'=USER_ID' => Helper\User::getCurrentUserId(),
			],
			'select' => [ 'ID', 'ROLE', 'USER_ID', 'GROUP_ID', 'INITIATED_BY_TYPE' ],
		])->fetchObject();

		$group = \Bitrix\Socialnetwork\WorkgroupTable::getList([
			'filter' => [
				'=ID' => (int)$this->arParams['GROUP_ID'],
			],
			'select' => [ 'ID', 'CLOSED', 'PROJECT', 'SCRUM_MASTER_ID', 'INITIATE_PERMS' ],
		])->fetchObject();

		foreach ($records as $record)
		{
			$row['ROW_FIELDS'] = $record;

			$row['CAN_EDIT'] = false;
			$row['CAN_DELETE'] = false;

			$actions = self::getActions([
				'RELATION' => $row['ROW_FIELDS'],
				'PATH_TO_USER' => $this->arParams['PATH_TO_USER'],
				'GROUP_ID' => $this->arParams['GROUP_ID'],
				'GROUP' => $group,
				'CURRENT_RELATION' => $currentUserRelation,
			]);

			if (
				!$showActionsColumn
				&& !empty(array_intersect($actions, $this->getViewableActionList()))
			)
			{
				$showActionsColumn = true;
			}

			$rowsList[] = [
				'id' => $record->getUser()->getId(),
				'data' => $row,
				'columns' => [],
				'editable' => true,
				'actions' => $actions,
				'columnClasses' => (
					ModuleManager::isModuleInstalled('intranet')
					&& $record->getUser()->getUserType() === 'extranet'
						? [
							'FULL_NAME' => 'socialnetwork-group-user-list-full-name-extranet'
						]
						: []
				)
			];
		}

		if (!$showActionsColumn)
		{
			$gridColumns = array_filter($gridColumns, static function($item) { return $item !== 'ACTIONS'; });
			$result['HEADERS'] = array_filter($result['HEADERS'], static function($item) { return $item['id'] !== 'ACTIONS'; });
		}

		$result['ROWS'] = $rowsList;
		$result['ROWS_COUNT'] = $res->getCount();

		$nav->setRecordCount($result['ROWS_COUNT']);
		$result['NAV_OBJECT'] = $nav;

		$result['GRID_COLUMNS'] = $gridColumns;

		return $result;
	}

	private function getViewableActionList(): array
	{
		return [
			self::AVAILABLE_ACTION_PROCESS_INCOMING_REQUEST,
			self::AVAILABLE_ACTION_REINVITE,
		];
	}

	protected function initPageFilterData(): void
	{
		if (!empty($this->arParams['FILTER_ID']))
		{
			self::$filterId = $this->arParams['FILTER_ID'];
			self::$gridId = (
				!empty($this->arParams['GRID_ID'])
					? $this->arParams['GRID_ID']
					: $this->arParams['FILTER_ID']
			);
		}
	}

	protected function getGridFilter(array $params = []): array
	{
		$filterPresets = ($params['FILTER_PRESETS'] ?? []);
		$filter = ($params['FILTER'] ?? []);
		$filterOptions = new \Bitrix\Main\UI\Filter\Options(self::$filterId, $filterPresets);

		return $filterOptions->getFilter($filter);

	}

	protected static function extranetSite(): bool
	{
		static $result = null;

		if ($result === null)
		{
			$result = (
				Loader::includeModule('extranet')
				&& CExtranet::isExtranetSite()
			);
		}

		return $result;
	}

	/**
	 * @param string $value
	 * @return array
	 */
	public static function getFindFilter(string $value): array
	{
		$result = [];

		$value = trim($value);

		$value = (
			Search\Content::isIntegerToken($value)
				? Search\Content::prepareIntegerToken($value)
				: Search\Content::prepareStringToken($value)
		);

		if (Search\Content::canUseFulltextSearch($value, Search\Content::TYPE_MIXED))
		{
			$result['*USER.INDEX.SEARCH_ADMIN_CONTENT'] = $value;
		}

		return $result;
	}


	public function executeComponent()
	{
		$this->setTitle();

		if (!$this->checkRequiredParams())
		{
			$this->printErrors();
			return;
		}

		$this->prepareActions();

		if ($this->actionData['ACTIVE'])
		{
			$this->processAction();
		}

		$this->arResult = $this->prepareData();

		if (!empty($this->errorCollection->getValues()))
		{
			if ($this->actionData['ACTIVE'])
			{
				foreach ($this->errorCollection->getValues() as $error)
				{
					$this->arResult['GROUP_ACTION_MESSAGES'][] = $error->getMessage();
				}
			}
			else
			{
				$this->printErrors();
				return;
			}
		}

		$this->includeComponentTemplate();
	}

	protected function setTitle(array $params = []): void
	{
		global $APPLICATION;

		if ($this->arParams['SET_TITLE'] === 'Y')
		{
			$group = Workgroup::getById($this->arParams['GROUP_ID']);

			if ($group && $group->isScrumProject())
			{
				$type = 'scrum';
			}
			elseif ($group && $group->isProject())
			{
				$type = 'project';
			}
			else
			{
				$type = 'group';
			}

			switch ($type)
			{
				case 'scrum':
					$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MEMBERS_SCRUM');
					break;
				case 'project':
					$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MEMBERS_PROJECT');
					break;
				default:
					$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MEMBERS');
			}

			if (SITE_TEMPLATE_ID !== 'bitrix24' && SITE_TEMPLATE_ID !== 'air')
			{
				if ($this->arParams['MODE'] === 'REQUESTS_IN')
				{
					switch ($type)
					{
						case 'scrum':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_IN_SCRUM');
							break;
						case 'project':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_IN_PROJECT');
							break;
						default:
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_IN');
					}
				}
				elseif ($this->arParams['MODE'] === 'REQUESTS_OUT')
				{
					switch ($type)
					{
						case 'scrum':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_OUT_SCRUM');
							break;
						case 'project':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_OUT_PROJECT');
							break;
						default:
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_REQUESTS_OUT');
					}
				}
				elseif ($this->arParams['MODE'] === 'MODERATORS')
				{
					switch ($type)
					{
						case 'scrum':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MODERATORS_SCRUM');
							break;
						case 'project':
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MODERATORS_PROJECT');
							break;
						default:
							$shortTitle = Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_TITLE_MODERATORS');
					}
				}
			}

			$title = \Bitrix\Socialnetwork\ComponentHelper::getWorkgroupPageTitle([
				'WORKGROUP_ID' => $this->arParams['GROUP_ID'],
				'TITLE' => $shortTitle
			]);

			$APPLICATION->SetPageProperty('title', $title);
			$APPLICATION->SetTitle($shortTitle);
		}
	}

	protected function checkRequiredParams(): bool
	{
		if ($this->arParams['GROUP_ID'] <= 0)
		{
			$this->addError(new Error(Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_NO_GROUP')));
			return false;
		}

		return true;
	}

	protected function getGroup()
	{
		$result = \CSocNetGroup::getById($this->arParams['GROUP_ID']);
		if (!empty($result['UF_SG_DEPT']))
		{
			$result['UF_SG_DEPT'] = array_map(static function($value) {
				return (int)$value;
			}, $result['UF_SG_DEPT']);
		}

		return $result;
	}

	protected function getConnectedDepartmentsList(array $params = []): array
	{
		$result = [];

		if (
			empty($params['groupFields'])
			|| !is_array($params['groupFields'])
			|| empty($params['groupFields']['UF_SG_DEPT'])
			|| !is_array($params['groupFields']['UF_SG_DEPT'])
			|| !Loader::includeModule('intranet')
		)
		{
			return $result;
		}

		$departmentsList = CIntranetUtils::getDepartmentsData(CIntranetUtils::GetIBlockSectionChildren($params['groupFields']['UF_SG_DEPT']));
		if (empty($departmentsList))
		{
			return $result;
		}

		foreach ($departmentsList as $departmentId => $departmentName)
		{
			$departmentId = (int)$departmentId;
			if ($departmentId <= 0)
			{
				continue;
			}

			$result[] = [
				'ID' => $departmentId,
				'NAME' => $departmentName,
				'URL' => str_replace('#ID#', $departmentId, (string)($params['pathToDepartment'] ?? '')),
			];
		}

		return $result;
	}

	protected function getConnectedSubDepartmentsList(array $params = []): array
	{
		$result = [];

		if (
			empty($params['groupFields'])
			|| !is_array($params['groupFields'])
			|| empty($params['groupFields']['UF_SG_DEPT'])
			|| !is_array($params['groupFields']['UF_SG_DEPT'])
			|| !Loader::includeModule('intranet')
		)
		{
			return $result;
		}

		foreach ($params['groupFields']['UF_SG_DEPT'] as $departmentId)
		{
			$result[$departmentId] = $this->getSubDepartmentsList((int)$departmentId);
		}

		return $result;
	}

	protected function getSubDepartmentsList(int $departmentId = 0): array
	{
		$result = [];
		if ($departmentId <= 0)
		{
			return $result;
		}

		$subDepartmentsList = \CIntranetUtils::getSubDepartments($departmentId);
		if (empty($subDepartmentsList))
		{
			return $result;
		}

		$result = array_map(static function($value) {
			return (int)$value;
		}, $subDepartmentsList);

		foreach ($subDepartmentsList as $subDepartmentId)
		{
			$result = array_merge($result, $this->getSubDepartmentsList((int)$subDepartmentId));
		}

		return $result;
	}

	public function actAction(string $action = '', array $fields = []): ?array
	{
		if (!$this->checkAction($action))
		{
			$this->errorCollection->setError(
				new Error(
					Loc::getMessage('SOCIALNETWORK_GROUP_USER_LIST_ERROR_ACTION_NOT_SUPPORTED')
				)
			);

			return null;
		}

		try
		{
			switch ($action)
			{
				case self::AJAX_ACTION_SET_OWNER:
					$result = Helper\Workgroup::setOwner([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_SET_SCRUM_MASTER:
					$result = Helper\Workgroup::setScrumMaster([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_SET_MODERATOR:
					$result = Helper\Workgroup::setModerator([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_REMOVE_MODERATOR:
					$result = Helper\Workgroup::removeModerator([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_DELETE_OUTGOING_REQUEST:
					$result = Helper\Workgroup::deleteOutgoingRequest([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_DELETE_INCOMING_REQUEST:
					$result = Helper\Workgroup::deleteIncomingRequest([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_EXCLUDE:
					$result = Helper\Workgroup::exclude([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_ACCEPT_INCOMING_REQUEST:
					$result = Helper\Workgroup::acceptIncomingRequest([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_REJECT_INCOMING_REQUEST:
					$result = Helper\Workgroup::rejectIncomingRequest([
						'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
						'userId' => (int)($fields['userId'] ?? 0),
					]);
					break;
				case self::AJAX_ACTION_REINVITE:
					$result = false;

					if (
						(int)$fields['userId'] > 0
						&& Loader::includeModule('intranet')
					)
					{
						if (
							Loader::includeModule('extranet')
							&& !\CExtranet::IsIntranetUser()
						)
						{
							$result = \CIntranetInviteDialog::reinviteExtranetUser(SITE_ID, (int)$fields['userId']);
						}
						else
						{
							$result = \CIntranetInviteDialog::reinviteUser(SITE_ID, (int)$fields['userId']);
						}
					}
					break;
				default:
					$result = false;
			}

		}
		catch (\Exception $e)
		{
			$this->errorCollection->setError(new Error($e->getMessage()));

			return null;
		}

		return [
			'success' => $result,
		];
	}

	protected function checkAction(string $action = ''): bool
	{
		return in_array($action, [
			self::AJAX_ACTION_SET_OWNER,
			self::AJAX_ACTION_SET_SCRUM_MASTER,
			self::AJAX_ACTION_SET_MODERATOR,
			self::AJAX_ACTION_REMOVE_MODERATOR,
			self::AJAX_ACTION_EXCLUDE,
			self::AJAX_ACTION_DELETE_OUTGOING_REQUEST,
			self::AJAX_ACTION_DELETE_INCOMING_REQUEST,
			self::AJAX_ACTION_ACCEPT_INCOMING_REQUEST,
			self::AJAX_ACTION_REJECT_INCOMING_REQUEST,
			self::AJAX_ACTION_REINVITE,
		], true);
	}

	public function disconnectDepartmentAction(array $fields = []): ?array
	{
		try
		{
			$result = Helper\Workgroup::disconnectDepartment([
				'groupId' => (int)($this->arParams['GROUP_ID'] ?? 0),
				'departmentId' => (int)($fields['id'] ?? 0),
			]);
		}
		catch (\Exception $e)
		{
			$this->errorCollection->setError(new Error($e->getMessage()));

			return null;
		}

		return [
			'success' => $result,
		];
	}

	private function isInvitationFilter(): bool
	{
		$filter = $this->getGridFilter();
		if (in_array(UserToGroupTable::ROLE_REQUEST, $filter['ROLE'] ?? [], true))
		{
			return true;
		}

		return ($this->arParams['MODE'] ?? '') === 'REQUESTS_IN';
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit