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/components/bitrix/socialnetwork.spaces.toolbar/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/components/bitrix/socialnetwork.spaces.toolbar/class.php
<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true)
{
	die();
}

use Bitrix\Disk;
use Bitrix\Main\Application;
use Bitrix\Main\ArgumentTypeException;
use Bitrix\Main\Context;
use Bitrix\Main\Engine\Contract\Controllerable;
use Bitrix\Main\Error;
use Bitrix\Main\Errorable;
use Bitrix\Main\ErrorCollection;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\UI\Filter\Options;
use Bitrix\Socialnetwork;
use Bitrix\Socialnetwork\Component\WorkgroupUserList;
use Bitrix\Socialnetwork\Helper;
use Bitrix\Socialnetwork\Helper\AvatarManager;
use Bitrix\Socialnetwork\Helper\UI\Discussions\DiscussionsFilterSpaces;
use Bitrix\Socialnetwork\Space\Toolbar\Composition;
use Bitrix\Socialnetwork\Space\Toolbar\Switcher\Mode\SmartTracking;
use Bitrix\Tasks\Helper\Filter;
use Bitrix\Tasks\Helper\FilterRegistry;
use Bitrix\Tasks\Helper\Grid;
use Bitrix\Tasks\Integration\Bizproc\Automation\Factory;
use Bitrix\Tasks\Internals\Counter;
use Bitrix\Tasks\Internals\Counter\CounterDictionary;
use Bitrix\Tasks\Internals\Routes\RouteDictionary;
use Bitrix\Tasks\Scrum;
use Bitrix\Tasks\Scrum\Service\KanbanService;
use Bitrix\Tasks\Scrum\Service\TaskService;
use Bitrix\Tasks\Scrum\Service\SprintService;
use Bitrix\Tasks\Slider\Path\PathMaker;
use Bitrix\Tasks\Slider\Path\TaskPathMaker;
use Bitrix\Tasks\Slider\Path\TemplatePathMaker;
use Bitrix\Tasks\Ui;
use Bitrix\Tasks\Access\ActionDictionary;
use Bitrix\Tasks\Access\TaskAccessController;
use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\TaskLimit;

class SpacesToolbarComponent extends CBitrixComponent implements Controllerable, Errorable
{
	private const ORDER_OPTION = 'order_new_task_v2';

	private Application $application;
	private ErrorCollection $errorCollection;
	private string $componentTemplate;
	private DiscussionsFilterSpaces $discussionsFilter;
	private int $userId;
	private int $spaceId;

	public function __construct($component = null)
	{
		parent::__construct($component);
		$this->application = Application::getInstance();
		$this->errorCollection = new ErrorCollection();
	}

	public function configureActions(): array
	{
		return [];
	}

	public function getErrors(): array
	{
		return $this->errorCollection->toArray();
	}

	public function getErrorByCode($code): ?Error
	{
		return $this->errorCollection->getErrorByCode($code);
	}

	public function onIncludeComponentLang(): void
	{
		$this->includeComponentLang(basename(__FILE__));

		Loc::loadMessages(__FILE__);
	}

	public function onPrepareComponentParams($arParams): array
	{
		$arParams['GROUP_ID'] = (is_numeric($arParams['GROUP_ID'] ?? null) ? (int) $arParams['GROUP_ID'] : 0);
		$arParams['PAGE_ID'] = (is_string($arParams['PAGE_ID'] ?? null) ? $arParams['PAGE_ID'] : 'discussions');

		$arParams['STORAGE'] = (
			(($arParams['STORAGE'] ?? null) instanceof Disk\Storage)
				? $arParams['STORAGE']
				: null
		);

		$arParams['VIEW_MODE_LIST'] = (
			is_array($arParams['VIEW_MODE_LIST'] ?? null)
				? $arParams['VIEW_MODE_LIST']
				: []
		);

		$arParams['IS_TRASH_MODE'] = ($arParams['IS_TRASH_MODE'] ?? null) === true;

		$arParams['PATH_TO_USER_FILES_VOLUME'] = (
			is_string($arParams['PATH_TO_USER_FILES_VOLUME'] ?? null)
				? $arParams['PATH_TO_USER_FILES_VOLUME']
				: ''
		);
		$arParams['PATH_TO_GROUP_FILES_BIZPROC_WORKFLOW_ADMIN'] = (
			is_string($arParams['PATH_TO_GROUP_FILES_BIZPROC_WORKFLOW_ADMIN'] ?? null)
				? $arParams['PATH_TO_GROUP_FILES_BIZPROC_WORKFLOW_ADMIN']
				: ''
		);

		return $arParams;
	}

	public function executeComponent(): void
	{
		$this
			->init()
			->preparePageData()
			->prepareOwnerData()
			->prepareComponentData()
			->prepareDiscussionsResult()
			->prepareTasksCountersResult()
			->prepareFilesResult()
			->prepareTasksResult()
			->resetFilter()
			->prepareDiscussionsFilterData()
			->prepareTasksGridData()
			->prepareTasksFilterData()
			->includeSelectedComponentTemplate();
	}

	public function getTasksCountersAction(int $groupId): ?array
	{
		if (
			!Loader::includeModule('socialnetwork')
			|| !Loader::includeModule('tasks')
		)
		{
			$this->errorCollection->setError(
				new Error(Loc::getMessage('SN_SPACES_SCRUM_ACTION_INCLUDE_MODULE_ERROR'))
			);

			return null;
		}

		return $this->getTasksCounters(
			Helper\User::getCurrentUserId(),
			$groupId,
		);
	}

	private function getScrumViewList(): array
	{
		$viewList = [];

		$viewList[] = [
			'id' => 1,
			'key' => 'scrum-plan',
			'title' => Loc::getMessage('SN_SPACES_SCRUM_VIEW_PLAN'),
			'urlParam' => 'tab',
			'urlValue' => 'plan',
		];
		$viewList[] = [
			'id' => 2,
			'key' => 'scrum-active',
			'title' => Loc::getMessage('SN_SPACES_SCRUM_VIEW_ACTIVE_SPRINT'),
			'urlParam' => 'tab',
			'urlValue' => 'active_sprint',
		];
		$viewList[] = [
			'id' => 3,
			'key' => 'scrum-completed',
			'title' => Loc::getMessage('SN_SPACES_SCRUM_VIEW_COMPLETED_SPRINT'),
			'urlParam' => 'tab',
			'urlValue' => 'completed_sprint',
		];

		return $viewList;
	}

	private function getTasksViewList(array $inputViewList): array
	{
		$listState = Ui\Filter\Task::getListStateInstance();
		if (!$listState)
		{
			return [];
		}

		$viewState = $listState->getState();

		$currentViewMode = $this->arResult['viewMode'];
		$viewList = [];

		if ($inputViewList)
		{
			foreach ($inputViewList as $mode)
			{
				if (array_key_exists($mode, $viewState['VIEWS']))
				{
					$view = $viewState['VIEWS'][$mode];

					$viewList[] = [
						'id' => $view['ID'],
						'title' => $view['SHORT_TITLE'],
						'selected' => $this->getTasksViewMode($mode) === $currentViewMode,
						'urlParam' => 'F_STATE',
						'urlValue' => 'sV' . CTaskListState::encodeState($view['ID']),
					];
				}
			}
		}
		else
		{
			foreach ($viewState['VIEWS'] as $viewKey => $view)
			{
				if ($this->arResult['pageType'] === 'user' && $viewKey === 'VIEW_MODE_KANBAN')
				{
					continue;
				}

				$viewList[] = [
					'id' => $view['ID'],
					'key' => $this->convertToKebabCase($viewKey),
					'title' => $view['SHORT_TITLE'],
					'selected' => $this->getTasksViewMode($viewKey) === $currentViewMode,
					'urlParam' => 'F_STATE',
					'urlValue' => 'sV' . CTaskListState::encodeState($view['ID']),
				];
			}
		}

		return $viewList;
	}

	private function getCurrentTasksViewState(int $userId): ?string
	{
		Ui\Filter\Task::setUserId($userId);

		$viewState = Ui\Filter\Task::listStateInit()?->getState()['VIEW_SELECTED']['CODENAME'];

		if ($viewState === 'VIEW_MODE_GANTT')
		{
			return FilterRegistry::FILTER_GANTT;
		}

		return FilterRegistry::FILTER_GRID;
	}

	/**
	 * @throws \Bitrix\Main\ArgumentNullException
	 * @throws ArgumentTypeException
	 * @throws \Bitrix\Main\LoaderException
	 */
	private function prepareFilesResult(): static
	{
		if ($this->arResult['pageId'] !== 'files')
		{
			return $this;
		}

		$storage = $this->arParams['STORAGE'];
		if (is_null($storage))
		{
			throw new ArgumentTypeException('No disk storage');
		}

		$proxyType = $storage->getProxyType();

		$isTrashMode = $this->arParams['IS_TRASH_MODE'];
		$pathToUserFilesVolume = $this->arParams['PATH_TO_USER_FILES_VOLUME'];
		$userId = Socialnetwork\Helper\User::getCurrentUserId();

		$this->arResult['pathToUserFilesVolume'] = $this->buildPathToFilesVolume(
			$storage,
			$pathToUserFilesVolume,
			$userId
		);
		$this->arResult['pathToFilesBizprocWorkflowAdmin'] = $this->arParams[
			'PATH_TO_GROUP_FILES_BIZPROC_WORKFLOW_ADMIN'
		];
		$this->arResult['networkDriveLink'] = Disk\Driver::getInstance()->getUrlManager()->getHostUrl()
			. $proxyType->getBaseUrlFolderList()
		;

		$this->arResult['storageId'] = $storage->getId();
		$this->arResult['documentHandlers'] = $this->getDocumentHandlersForCreatingFile();
		$this->arResult['permissions'] = $this->getFilesPermissions(
			$storage,
			$this->isShowFilesBizproc($storage, $isTrashMode),
			$this->arResult['pathToUserFilesVolume'] !== ''
		);
		$this->arResult['featureRestrictionMap'] = Disk\Integration\Bitrix24Manager::getFeatureRestrictionMap();
		$this->arResult['listAvailableFeatures'] = [
			'disk_folder_sharing' => Disk\Integration\Bitrix24Manager::isFeatureEnabled('disk_folder_sharing'),
		];

		return $this;
	}

	private function prepareTasksResult(): static
	{
		Loader::includeModule('tasks');

		if ($this->arResult['pageType'] === 'user')
		{
			if ($this->isTasksView())
			{
				$this->prepareUserTasksResult();
			}
		}
		else
		{
			if ($this->isTasksView())
			{
				$group = Socialnetwork\Item\Workgroup::getById($this->arResult['groupId']);
				$isScrum = $group && $group->isScrumProject();
				if ($isScrum)
				{
					$this->componentTemplate = $this->componentTemplate . '_scrum';
				}

				$this->prepareGroupTasksResult($isScrum);
			}

			if ($this->arResult['pageId'] === 'users')
			{
				$this->prepareGroupUsersResult();
			}
		}

		$this->arResult['pathToUserSpaceTasks'] = CComponentEngine::makePathFromTemplate(
			$this->arParams['PATH_TO_USER_TASKS']
		);

		$this->prepareTemplateListUrl();

		return $this;
	}

	private function prepareComponentData(): static
	{
		$this->arResult['viewList'] = [];
		$this->discussionsFilter = new DiscussionsFilterSpaces($this->arResult['groupId']);
		return $this;
	}

	private function resetFilter(): static
	{
		$filterId = $this->discussionsFilter->getContainerId();
		(new Options($filterId))->reset();
		return $this;
	}

	private function prepareDiscussionsFilterData(): static
	{
		if (!$this->isDiscussionsView())
		{
			return $this;
		}
		$this->arResult['FILTER'] = $this->discussionsFilter->getFilter();
		$this->arResult['FILTER_PRESETS'] = $this->discussionsFilter->getPresets(
			$this->discussionsFilter->getParamsForPresets()
		);
		$this->arResult['FILTER_ID'] = $this->discussionsFilter->getContainerId();

		return $this;
	}

	private function prepareTasksGridData(): static
	{
		if (!$this->isTasksView())
		{
			return $this;
		}

		$this->arResult['GRID_ID'] = Grid::getInstance($this->arResult['userId'], $this->arResult['groupId'])
			->setContext($this->arResult['taskCurrentViewMode'])
			->setScope(Socialnetwork\Livefeed\Context\Context::SPACES)
			->getId();

		return $this;
	}

	private function prepareTasksFilterData(): static
	{
		if (!$this->isTasksView())
		{
			return $this;
		}

		$filterInstance = Filter::getInstance($this->arResult['userId'], $this->arResult['groupId'])
			->setContext($this->arResult['taskCurrentViewMode']);
		$this->arResult['FILTER'] = $filterInstance->getFilters();
		$this->arResult['FILTER_PRESETS'] = $filterInstance->getAllPresets();
		$this->arResult['FILTER_ID'] = $filterInstance->getId();

		return $this;
	}

	private function includeSelectedComponentTemplate(): void
	{
		$membersManager = new Socialnetwork\Space\MembersManager();
		if (
			$this->arResult['pageType'] === 'group'
			&& !$membersManager->isUserMember($this->arResult['userId'], $this->arResult['groupId'])
		)
		{
			$this->componentTemplate = 'empty';
		}

		parent::includeComponentTemplate($this->componentTemplate);
	}

	private function getDocumentHandlersForCreatingFile(): array
	{
		$handlers = [];
		foreach ($this->listCloudHandlersForCreatingFile() as $handler)
		{
			$handlers[] = [
				'code' => $handler::getCode(),
				'name' => $handler::getName(),
			];
		}

		return array_merge($handlers, [
			[
				'code' => Disk\Document\LocalDocumentController::getCode(),
				'name' => Disk\Document\LocalDocumentController::getName(),
			]
		]);
	}

	/**
	 * @return Disk\Document\DocumentHandler[]
	 */
	private function listCloudHandlersForCreatingFile()
	{
		if (!Disk\Configuration::canCreateFileByCloud())
		{
			return [];
		}

		$list = [];
		$documentHandlersManager = Disk\Driver::getInstance()->getDocumentHandlersManager();
		foreach ($documentHandlersManager->getHandlers() as $handler)
		{
			if ($handler instanceof Disk\Document\Contract\FileCreatable)
			{
				$list[] = $handler;
			}
		}

		return $list;
	}

	private function getFilesPermissions(
		Disk\Storage $storage,
		bool $isShowBizproc,
		bool $canClean
	): array
	{
		$securityContext = $storage->getCurrentUserSecurityContext();
		$proxyType = $storage->getProxyType();

		$canChangeBizprocSettingsExceptUser = !($proxyType instanceof Disk\ProxyType\User);

		return [
			'canAdd' => $storage->canAdd($securityContext),
			'canChangeRights' => $storage->canChangeRights($securityContext),
			'canChangeBizprocSettings' => (
				$storage->canChangeSettings($securityContext)
				&& $canChangeBizprocSettingsExceptUser
				&& Disk\Integration\BizProcManager::isAvailable()
			),
			'canChangeBizproc' => (
				$storage->canCreateWorkflow($securityContext)
				&& $canChangeBizprocSettingsExceptUser
				&& $isShowBizproc
			),
			'canCleanFiles' => $canClean,
		];
	}

	private function isShowFilesBizproc(Disk\Storage $storage, bool $isTrashMode): bool
	{
		if ($isTrashMode)
		{
			return false;
		}

		return $storage->isEnabledBizProc() && Disk\Integration\BizProcManager::isAvailable();
	}

	private function buildPathToFilesVolume(Disk\Storage $storage, string $path, int $userId): string
	{
		$proxyType = $storage->getProxyType();
		$isUserStorage = $proxyType instanceof Disk\ProxyType\User;
		if ($isUserStorage)
		{
			return CComponentEngine::makePathFromTemplate(
				$path,
				[
					'ACTION' => '',
					'user_id' => $userId,
				]
			);
		}

		return '';
	}

	private function getTaskUrl(string $view, string $context): string
	{
		$path = new TaskPathMaker(
			0,
			$view,
			$context === PathMaker::GROUP_CONTEXT ? $this->spaceId : $this->userId,
			$context
		);

		$viewMode = Ui\Filter\Task::getListStateInstance()->getViewMode();
		$viewCode = CTaskListState::resolveConstantCodename($viewMode, CTaskListState::VIEW_MODE_LIST);
		$scope = $this->getTasksScope($viewCode);

		!empty($scope) && $path->addQueryParam('SCOPE', $scope);
		$this->isGroupSpace() && $path->addQueryParam('GROUP_ID', $this->spaceId);

		return $path->makeEntityPath();
	}

	private function prepareTemplateListUrl(): static
	{
		$this->arResult['pathToTemplateList'] =
			(new TemplatePathMaker())->setOwnerId($this->userId)->makeEntitiesListPath();

		return $this;
	}

	private function getTasksScope(string $viewCode): string
	{
		$scope = '';

		switch ($viewCode)
		{
			case 'VIEW_MODE_LIST':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_GRID;
				break;
			case 'VIEW_MODE_KANBAN':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_KANBAN;
				break;
			case 'VIEW_MODE_TIMELINE':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_KANBAN_TIMELINE;
				break;
			case 'VIEW_MODE_PLAN':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_KANBAN_PERSONAL;
				break;
			case 'VIEW_MODE_CALENDAR':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_CALENDAR;
				break;
			case 'VIEW_MODE_GANTT':
				$scope = Ui\ScopeDictionary::SCOPE_TASKS_GANTT;
				break;
		}

		return $scope;
	}

	private function prepareTasksCountersResult(): static
	{
		if ($this->arResult['pageId'] !== 'tasks')
		{
			return $this;
		}

		$this->arResult['counters'] = $this->getTasksCounters(
			$this->arResult['userId'],
			$this->arResult['groupId'],
		);

		return $this;
	}

	private function prepareUserTasksResult(): void
	{
		$userId = $this->arResult['userId'];

		$this->arResult['viewMode'] = $this->getUserTasksViewMode($userId);
		$this->arResult['viewList'] = $this->getTasksViewList($this->arParams['VIEW_MODE_LIST']);
		$this->arResult['taskCurrentViewMode'] = $this->getCurrentTasksViewState($userId);

		$this->arResult['pathToAddTask'] = $this->getTaskUrl(
			PathMaker::EDIT_ACTION,
			PathMaker::PERSONAL_CONTEXT,
		);
		$this->arResult['pathToViewTask'] = $this->getTaskUrl(
			PathMaker::DEFAULT_ACTION,
			PathMaker::PERSONAL_CONTEXT,
		);

		$pathToTasks = $this->getPathToTasks();
		$this->arResult['pathToTasks'] = $pathToTasks;

		$this->arResult['order'] = $this->getTasksOrder();
		$this->arResult['shouldSubtasksBeGrouped'] = $this->shouldSubtasksBeGrouped($userId);

		$this->arResult['sortFields'] = \Bitrix\Tasks\Ui\Controls\Column::getFieldsForSorting();

		$gridId = $this->getGridId($userId);
		$this->arResult['gridId'] = $gridId;
		$this->arResult['taskSort'] = $this->getTasksSort($userId, 0, $gridId);

		$this->arResult['syncScript'] = \CIntranetUtils::GetStsSyncURL(['LINK_URL' => $pathToTasks], 'tasks');

		$this->arResult['permissions'] = $this->getTasksPermissions($userId);
	}

	private function prepareGroupTasksResult(bool $isScrum): void
	{
		$userId = $this->arResult['userId'];
		$groupId = $this->arResult['groupId'];

		$this->arResult['pathToGroupTasks'] = CComponentEngine::makePathFromTemplate(
			$this->arParams['PATH_TO_GROUP_TASKS'],
			['group_id' => $groupId]
		);

		if ($isScrum)
		{
			$request = Context::getCurrent()->getRequest();
			$this->saveScrumActiveView($request->get('tab'), $groupId);

			$this->arResult['viewMode'] = $this->getGroupTasksViewMode($groupId, true);

			$this->arResult['viewList'] = $this->getScrumViewList();
			$this->arResult['displayPriority'] = $this->getDisplayPriorityState($groupId);
			$this->arResult['isShortView'] = $this->getShortViewState($groupId);

			$sprintService = new SprintService($userId);

			$this->arResult['activeSprintId'] = 0;
			$this->arResult['currentCompletedSprint'] = [];
			$this->arResult['taskLimitExceeded'] = false;
			$this->arResult['canUseAutomation'] = false;
			$this->arResult['canCompleteSprint'] = false;
			if ($this->arResult['viewMode'] === 'active')
			{
				$sprint = $sprintService->getActiveSprintByGroupId($groupId);

				$this->arResult['activeSprintId'] = ($sprintService->getErrors() ? 0 : $sprint->getId());

				$this->arResult['taskLimitExceeded'] = TaskLimit::isLimitExceeded();
				$this->arResult['canUseAutomation'] = Factory::canUseAutomation();

				$this->arResult['canCompleteSprint'] = $sprintService->canCompleteSprint($userId, $groupId);
			}

			if ($this->arResult['viewMode'] === 'complete')
			{
				$completedSprint = $sprintService->getLastCompletedSprint($groupId);

				$dateStart = $completedSprint->getDateStart()->format(Bitrix\Main\Type\Date::getFormat());
				$dateEnd = $completedSprint->getDateEnd()->format(Bitrix\Main\Type\Date::getFormat());
				$this->arResult['currentCompletedSprint'] = [
					'id' => $completedSprint->getId(),
					'selectorLabel' => $dateStart . ' - ' . $dateEnd,
				];
			}
		}
		else
		{
			$this->arResult['viewMode'] = $this->getGroupTasksViewMode($groupId, false);

			$this->arResult['viewList'] = $this->getTasksViewList($this->arParams['VIEW_MODE_LIST']);
		}

		$this->arResult['taskCurrentViewMode'] = $this->getCurrentTasksViewState($userId);

		$this->arResult['pathToAddTask'] = $this->getTaskUrl(
			PathMaker::EDIT_ACTION,
			PathMaker::GROUP_CONTEXT,
		);

		$this->arResult['pathToGroupTasksTask'] = CComponentEngine::makePathFromTemplate(
			$this->arParams['PATH_TO_GROUP_TASKS_TASK'],
			['group_id' => $groupId]
		);
		$this->arResult['pathToScrumBurnDown'] = CComponentEngine::makePathFromTemplate(
			$this->arParams['PATH_TO_SCRUM_BURN_DOWN'],
			['group_id' => $groupId]
		);

		$pathToTasks = $this->getPathToTasks();
		$this->arResult['pathToTasks'] = $pathToTasks;

		$this->arResult['order'] = $this->getGroupTasksOrder($groupId);
		$this->arResult['shouldSubtasksBeGrouped'] = $this->shouldSubtasksBeGrouped($userId);

		$this->arResult['sortFields'] = \Bitrix\Tasks\Ui\Controls\Column::getFieldsForSorting();

		$gridId = $this->getGridId($userId, $groupId);
		$this->arResult['gridId'] = $gridId;
		$this->arResult['taskSort'] = $this->getTasksSort($userId, $groupId, $gridId);

		$this->arResult['syncScript'] = \CIntranetUtils::GetStsSyncURL(['LINK_URL' => $pathToTasks], 'tasks');

		$this->arResult['permissions'] = $this->getTasksPermissions($userId);
	}

	private function getPathToTasks(): string
	{
		return str_replace('#user_id#', $this->userId, RouteDictionary::PATH_TO_USER_TASKS_LIST);
	}

	private function getGroupTasksOrder(int $groupId): string
	{
		if ($this->arResult['viewMode'] !== 'plan')
		{
			return (new KanbanService())->getKanbanSortValue($groupId);
		}

		return $this->getTasksOrder();
	}

	private function getTasksOrder(): string
	{
		return \CUserOptions::getOption('tasks', static::ORDER_OPTION, 'actual');
	}

	private function getTasksSort(int $userId, int $groupId = 0, ?string $gridId = null): array
	{
		$sort = Grid::getInstance($userId, $groupId, $gridId)->getOptions()->GetSorting($this->getDefaultSorting())['sort'];
		reset($sort);

		return [
			'field' => key($sort),
			'direction' => current($sort),
		];
	}

	private function getDefaultSorting(): array
	{
		return [
			'sort' => ['ACTIVITY_DATE' => 'desc'],
		];
	}

	private function getGridId(int $userId, int $groupId = 0): string
	{
		$context = $this->arResult['viewMode'] === 'gantt' ? 'gantt' : 'grid';
		$scope = Socialnetwork\Livefeed\Context\Context::SPACES;

		return Grid::getInstance($userId, $groupId)
			->setContext($context)
			->setScope($scope)
			->getId();
	}

	private function shouldSubtasksBeGrouped(int $userId): bool
	{
		$instance = CTaskListState::getInstance($userId);
		$state = $instance->getState();

		return $state['SUBMODES']['VIEW_SUBMODE_WITH_SUBTASKS']['SELECTED'] === 'Y';
	}

	private function getTasksPermissions(int $userId): array
	{
		return [
			'import' => TaskAccessController::can($userId, ActionDictionary::ACTION_TASK_IMPORT),
			'export' => TaskAccessController::can($userId, ActionDictionary::ACTION_TASK_EXPORT),
		];
	}

	private function prepareGroupUsersResult(): void
	{
		$groupPerms = Helper\Workgroup::getPermissions([
			'groupId' => $this->arResult['groupId'],
		]);

		$this->arResult = WorkgroupUserList::prepareFilterResult(
			$this->arResult,
			$groupPerms,
			'MEMBERS'
		);

		$this->arResult['pathToInvite'] = CComponentEngine::makePathFromTemplate(
			$this->arParams['PATH_TO_GROUP_INVITE'],
			['group_id' => $this->arResult['groupId']]
		);
	}

	private function convertToKebabCase(string $string): string
	{
		$string = preg_replace('/[\s.]+/', '_', $string);

		$string = preg_replace('/[^0-9a-zA-Z_\-]/', '-', $string);

		$string = mb_strtolower(preg_replace('/[A-Z]+/', '-\0', $string));
		$string = trim($string, '-_');

		return preg_replace('/[_\-][_\-]+/', '-', $string);
	}

	private function prepareDiscussionsResult(): static
	{
		if ($this->arResult['pageId'] !== 'discussions')
		{
			return $this;
		}

		$this->arResult['spaceName'] = Loc::getMessage('SN_SPACES_DISCUSSIONS_COMPOSITION_GENERAL_SPACES_NAME');

		if ($this->arResult['pageType'] === 'group')
		{
			$group = Socialnetwork\Item\Workgroup::getById($this->arResult['groupId']);
			if ($group)
			{
				$groupFields = $group->getFields();

				$this->arResult['spaceName'] = $groupFields['NAME'];

				$avatarManager = new AvatarManager();

				$imageId = (int) $groupFields['IMAGE_ID'];
				if ($imageId)
				{
					$this->arResult['spaceLogo'] = $avatarManager->getImageAvatar($imageId)->toArray();
				}
				else
				{
					$this->arResult['spaceLogo'] = $avatarManager
						->getIconAvatar($groupFields['AVATAR_TYPE'] ?? '')
						->toArray()
					;
				}
			}
		}

		if ($this->arResult['pageType'] === 'user')
		{
			$this->arResult['pathToFilesPage'] = \CComponentEngine::makePathFromTemplate(
				$this->arParams['PATH_TO_USER_FILES'],
				[
					'user_id' => $this->userId,
					'PATH' => '',
				]
			);
		}
		if ($this->arResult['pageType'] === 'group')
		{
			$this->arResult['pathToFilesPage'] = \CComponentEngine::makePathFromTemplate(
				$this->arParams['PATH_TO_GROUP_FILES'],
				[
					'group_id' => $this->spaceId,
					'PATH' => '',
				]
			);
		}

		$this->arResult['storage'] = null;
		$this->arResult['folder'] = null;
		$storage = $this->getStorageByPageType($this->arResult['pageType']);
		if (!is_null($storage))
		{
			$folder = Disk\Folder::loadById($storage->getRootObjectId());

			$this->arResult['storage'] = $storage;
			$this->arResult['folder'] = $folder;
		}

		return $this
			->prepareSmartTrackingMode()
			->prepareCompositionData();
	}

	/**
	 * @throws SystemException
	 * @throws \Bitrix\Main\ArgumentException
	 */
	private function getStorageByPageType(string $pageType): ?Disk\Storage
	{
		$diskDriver = Disk\Driver::getInstance();

		if ($pageType === 'user')
		{
			return $diskDriver->getStorageByUserId($this->arResult['userId']);
		}

		return $diskDriver->getStorageByGroupId($this->arResult['groupId']);
	}

	private function prepareSmartTrackingMode(): static
	{
		$this->arResult['isSmartTrackingMode'] = SmartTracking::get(
			$this->userId,
			0,
			SmartTracking::getDefaultCode()
		)->getValue();

		return $this;
	}

	private function preparePageData(): static
	{
		$this->arResult['page'] = $this->arParams['PAGE'];
		$this->arResult['pageType'] = $this->arParams['PAGE_TYPE'];
		$this->arResult['pageId'] = $this->arParams['PAGE_ID'];
		$this->componentTemplate = $this->arResult['page'];

		return $this;
	}

	private function prepareOwnerData(): static
	{
		$this->arResult['userId'] = Socialnetwork\Helper\User::getCurrentUserId();
		$this->arResult['groupId'] = $this->arParams['GROUP_ID'];

		return $this;
	}
	private function prepareCompositionData(): static
	{
		$composition = new Composition($this->arResult['userId'], $this->arResult['groupId']);
		$composition->setDefaultSettings();
		$this->arResult['compositionFilters'] = $composition->getDefaultSettings(false);
		$this->arResult['appliedFields'] = $composition->getSettings(false);

		return $this;
	}

	private function getTasksCounters(int $userId, int $groupId)
	{
		$counterInstance = Counter::getInstance($userId);

		$group = Socialnetwork\Item\Workgroup::getById($groupId);
		if ($group && $group->isScrumProject())
		{
			$taskService = new TaskService($userId);

			$filterInstance = $taskService->getFilterInstance(
				$groupId,
				$this->getGroupTasksViewMode($groupId, true)
			);
		}
		else
		{
			$filterInstance = Filter::getInstance($userId, $groupId);
		}

		$filterRole = $this->getFilterRole($filterInstance);
		$this->arResult['filterRole'] = $filterRole;

		$counters = $counterInstance->getCounters($filterRole, $groupId);

		$counters[CounterDictionary::COUNTER_EXPIRED]['filterField'] = 'PROBLEM';
		$counters[CounterDictionary::COUNTER_NEW_COMMENTS]['filterField'] = 'PROBLEM';

		return $counters;
	}

	private function getFilterRole($filterInstance): string
	{
		$filterOptions = $filterInstance->getOptions();
		$filter = $filterOptions->getFilter();

		$possibleRoles = Counter\Role::getRoles();
		$role = Counter\Role::ALL;

		if (
			array_key_exists('ROLEID', $filter)
			&& array_key_exists($filter['ROLEID'], $possibleRoles)
		)
		{
			$role = $filter['ROLEID'];
		}

		return $role;
	}

	private function getDisplayPriorityState(int $groupId)
	{
		return \CUserOptions::getOption('tasks.scrum.'.$groupId, 'display_priority', 'sprint');
	}

	private function getShortViewState(int $groupId)
	{
		return \CUserOptions::getOption('tasks.scrum.'.$groupId, 'short_view', 'Y');
	}

	private function getUserTasksViewMode(int $userId): string
	{
		Ui\Filter\Task::setUserId($userId);

		$viewCode = Ui\Filter\Task::listStateInit()?->getState()['VIEW_SELECTED']['CODENAME'];

		return $this->getTasksViewMode($viewCode);
	}

	private function getGroupTasksViewMode(int $groupId, bool $isScrum): string
	{
		if ($isScrum)
		{
			$viewHelper = new Scrum\Utility\ViewHelper($this->getSiteId());

			return match ($viewHelper->getActiveView($groupId))
			{
				'active_sprint' => 'active',
				'completed_sprint' => 'complete',
				default => 'plan',
			};
		}
		else
		{
			Ui\Filter\Task::setGroupId($groupId);

			$viewCode = Ui\Filter\Task::listStateInit()?->getState()['VIEW_SELECTED']['CODENAME'];

			return $this->getTasksViewMode($viewCode);
		}
	}

	private function getTasksViewMode(string $code): string
	{
		return match ($code)
		{
			'VIEW_MODE_GANTT' => 'gantt',
			'VIEW_MODE_PLAN' => 'plan',
			'VIEW_MODE_KANBAN' => 'kanban',
			'VIEW_MODE_TIMELINE' => 'timeline',
			'VIEW_MODE_CALENDAR' => 'calendar',
			default => 'list',
		};
	}

	private function saveScrumActiveView(?string $view, int $groupId)
	{
		$viewHelper = new Scrum\Utility\ViewHelper($this->getSiteId());

		$viewHelper->saveActiveView($view, $groupId);
	}

	private function isTasksView(): bool
	{
		return $this->arResult['pageId'] === 'tasks'; // todo: replace with const
	}

	private function isDiscussionsView(): bool
	{
		return $this->arResult['pageId'] === 'discussions'; // todo: replace with const
	}

	private function init(): static
	{
		$this->userId = $this->arParams['USER_ID'];
		$this->spaceId = $this->arParams['GROUP_ID'];
		return $this;
	}

	private function isGroupSpace(): bool
	{
		return $this->arResult['pageType'] === 'group';
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit