19 private const ENTITY_ID =
'project-access-codes';
20 private const TAB_ID = self::ENTITY_ID;
21 private const RECENT_LIMIT = 30;
22 private const FILL_LIMIT = self::RECENT_LIMIT;
23 private const SEARCH_LIMIT = 100;
27 parent::__construct();
29 $this->options[
'fillAccessCodesTab'] =
true;
30 if (isset(
$options[
'fillAccessCodesTab']) && is_bool(
$options[
'fillAccessCodesTab']))
32 $this->options[
'fillAccessCodesTab'] =
$options[
'fillAccessCodesTab'];
35 $this->options[
'fillRecentTab'] =
null;
38 $this->options[
'fillRecentTab'] =
$options[
'fillRecentTab'];
44 return $GLOBALS[
'USER']->isAuthorized();
52 $ids = array_map(strval(...), $ids);
54 $projectIdsToFetch = $this->getProjectIds($ids);
55 if (empty($projectIdsToFetch))
61 'projectId' => $projectIdsToFetch,
63 if ($projects->isEmpty())
68 $allProjectsRoles = [];
69 foreach ($projects as $project)
71 foreach ($this->makeFlatItems($project) as $role)
73 $allProjectsRoles[$role->getId()] = $role;
78 foreach ($ids as $originalId)
80 if (isset($allProjectsRoles[$originalId]))
82 $items[] = $allProjectsRoles[$originalId];
89 private function getProjectIds(
array $itemIds):
array
92 foreach ($itemIds as $id)
95 if ($accessCode->getEntityType() === AccessCode::TYPE_SOCNETGROUP)
97 $projectIds[] = $accessCode->getEntityId();
101 Collection::normalizeArrayValuesByInt($projectIds);
112 foreach ($this->getProjectRoles($project) as $role => $roleName)
115 'id' => $this->makeId($project->getId(), $role),
116 'entityId' => self::ENTITY_ID,
119 'link' => $this->makeLink($project),
120 'title' => $project->requireName() .
'. ' . $roleName,
130 private function makeId(
int $projectId,
string $role): string
132 return 'SG' . $projectId .
'_' . $role;
135 private function makeLink(EO_Workgroup $project): string
137 $url = \Bitrix\Socialnetwork\Site\GroupUrl::get($project->getId(), $project->getType());
138 if ($project->requireType() !== Type::Collab->value)
146 private function getProjectRoles(EO_Workgroup $project):
array
148 $roles = $this->getProjectTypeToRolesMap()[$project->requireType()] ??
null;
151 return $this->getProjectTypeToRolesMap()[Type::getDefault()->value];
157 private function getProjectTypeToRolesMap():
array
159 static $rolesMapCache =
null;
163 Type::Group->value => [
164 SONET_ROLES_OWNER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_GROUP_OWNER'),
165 SONET_ROLES_MODERATOR => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_GROUP_MODERATOR'),
166 SONET_ROLES_USER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_GROUP_USER'),
168 Type::Project->value => [
169 SONET_ROLES_OWNER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_PROJECT_OWNER'),
170 SONET_ROLES_MODERATOR => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_PROJECT_MODERATOR'),
171 SONET_ROLES_USER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_PROJECT_USER'),
173 Type::Scrum->value => [
174 SONET_ROLES_OWNER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_SCRUM_OWNER'),
175 SONET_ROLES_MODERATOR => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_SCRUM_MODERATOR'),
176 SONET_ROLES_USER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_SCRUM_USER'),
178 Type::Collab->value => [
179 SONET_ROLES_OWNER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_COLLAB_OWNER'),
180 SONET_ROLES_MODERATOR => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_COLLAB_MODERATOR'),
181 SONET_ROLES_USER => Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_COLLAB_USER'),
185 return $rolesMapCache;
190 $this->addAccessCodesTab($dialog);
192 $dialogHasOnlyThisEntity =
count($dialog->getEntities()) === 1;
195 $this->options[
'fillRecentTab'] ===
true ||
196 ($this->options[
'fillRecentTab'] !==
false && $dialogHasOnlyThisEntity)
201 $this->fillRecentTab($dialog);
204 if ($this->
getOption(
'fillAccessCodesTab'))
206 $this->fillAccessCodesTab($dialog);
210 private function addAccessCodesTab(
Dialog $dialog): void
213 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2223%22%20height%3D%2223%22%20'.
214 'fill%3D%22none%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%3E%3Cpath%20d%3D%22M11'.
215 '.934%202.213a.719.719%200%2001.719%200l3.103%201.79c.222.13.36.367.36.623V8.21a.719.71'.
216 '9%200%2001-.36.623l-3.103%201.791a.72.72%200%2001-.719%200L8.831%208.832a.719.719%200%'.
217 '2001-.36-.623V4.627c0-.257.138-.495.36-.623l3.103-1.791zM7.038%2010.605a.719.719%200%2'.
218 '001.719%200l3.103%201.792a.72.72%200%2001.359.622v3.583a.72.72%200%2001-.36.622l-3.102'.
219 '%201.792a.719.719%200%2001-.72%200l-3.102-1.791a.72.72%200%2001-.36-.623v-3.583c0-.257'.
220 '.138-.494.36-.622l3.103-1.792zM20.829%2013.02a.719.719%200%2000-.36-.623l-3.102-1.792a'.
221 '.719.719%200%2000-.72%200l-3.102%201.792a.72.72%200%2000-.36.622v3.583a.72.72%200%2000'.
222 '.36.622l3.103%201.792a.719.719%200%2000.719%200l3.102-1.791a.719.719%200%2000.36-.623v'.
223 '-3.583z%22%20fill%3D%22%23ABB1B8%22/%3E%3C/svg%3E';
225 $dialog->addTab(
new Tab([
226 'id' => self::TAB_ID,
227 'title' => (
string)Loc::getMessage(
'SOCNET_ENTITY_SELECTOR_PROJECT_ACCESS_CODES_TAB'),
230 'selected' => str_replace(
'ABB1B8',
'fff', $icon),
235 private function fillRecentTab(Dialog $dialog): void
237 $howMuchLeftToFill = self::RECENT_LIMIT;
238 $recentItems = $dialog->getRecentItems()->getEntityItems(self::ENTITY_ID);
240 $howMuchLeftToFill -=
count($recentItems);
241 if ($howMuchLeftToFill <= 0)
246 $globalRecentItems = $dialog->getGlobalRecentItems()->getEntityItems(self::ENTITY_ID);
247 foreach ($globalRecentItems as $globalRecentItem)
249 if ($howMuchLeftToFill <= 0)
254 $dialog->getRecentItems()->add($globalRecentItem);
255 $howMuchLeftToFill--;
258 if ($howMuchLeftToFill <= 0)
264 'limit' => $howMuchLeftToFill,
267 foreach ($projects as $project)
269 foreach (array_keys($this->getProjectRoles($project)) as $role)
271 $dialog->getRecentItems()->add(
273 'id' => $this->makeId($project->getId(), $role),
274 'entityId' => self::ENTITY_ID,
281 private function fillAccessCodesTab(Dialog $dialog): void
284 'limit' => self::FILL_LIMIT,
287 foreach ($projects as $project)
289 $roles = $this->getProjectRoles($project);
292 $root = array_key_last($roles);
294 $rootItem =
new Item([
295 'id' => $this->makeId($project->getId(), $root),
296 'entityId' => self::ENTITY_ID,
297 'title' => $project->requireName(),
300 'link' => $this->makeLink($project),
306 foreach ($roles as $role => $roleName)
310 $rootItem->addChild(
new Item([
311 'id' => $this->makeId($project->getId(), $role),
312 'entityId' => self::ENTITY_ID,
314 'title' => $project->requireName() .
'. ' . $roleName,
316 'link' => $this->makeLink($project),
318 'title' => $roleName,
326 $dialog->addItem($rootItem);
333 'searchQuery' => $searchQuery->
getQuery(),
334 'searchLimit' => self::SEARCH_LIMIT,
337 if ($projects->count() >= self::SEARCH_LIMIT)
343 foreach ($projects as $project)
345 $items = [...$items, ...$this->makeFlatItems($project)];
348 $dialog->addItems(
$items);
$GLOBALS['____1690880296']