27 :
'bx_calendar_planner'
28 . mb_substr(uniqid(mt_rand(),
true), 0, 4)
32 $APPLICATION->AddHeadScript(
'/bitrix/js/calendar/planner.js');
33 $APPLICATION->SetAdditionalCSS(
"/bitrix/js/calendar/planner.css");
37 <div
id=
"<?= htmlspecialcharsbx($config['id'])?>" class=
"calendar-planner-wrapper"></div>
39 BX.namespace(
'BX.Calendar');
40 if(typeof BX.Calendar.PlannerManager ===
'undefined')
42 BX.Calendar.PlannerManager = {
46 return BX.Calendar.PlannerManager.planners[id] ||
false;
48 Init:
function(id, config, initialParams)
50 if (window.CalendarPlanner)
52 BX.Calendar.PlannerManager.planners[id] =
new window.CalendarPlanner(config, initialParams);
58 BX.message(<?=CUtil::PhpToJSObject($mess_lang,
false);?>);
61 BX.Calendar.PlannerManager.Init(
62 '<?= CUtil::JSEscape($config['id'])?>',
73 $parentId = (int)(
$params[
'parent_id'] ??
null);
74 $entryId = (int)(
$params[
'entry_id'] ??
null);
76 $skipEntryId = $parentId !== 0 ? $parentId : $entryId;
77 $curUserId = (int)(
$params[
'user_id'] ??
null);
78 $hostUserId = (int)(
$params[
'host_id'] ??
null);
79 $skipFeatureCheck =
$params[
'skipFeatureCheck'] ??
false;
81 $isPlannerFeatureEnabled = $skipFeatureCheck || Bitrix24Manager::isPlannerFeatureEnabled();
83 $skipEntryList = (isset(
$params[
'skipEntryList']) && is_array(
$params[
'skipEntryList']))
99 $users = CCalendar::GetDestinationUsers(
$params[
'codes'],
true);
102 $prevUsersId = (isset(
$params[
'prevUserList']) && is_array(
$params[
'prevUserList']))
103 ? array_unique(array_map(
'intval',
$params[
'prevUserList']))
108 foreach($users as
$user)
110 if (!in_array((
int)
$user[
'USER_ID'], $prevUsersId,
true))
112 $userIds[] = (int)
$user[
'USER_ID'];
115 $status = (($hostUserId && $hostUserId === (int)
$user[
'USER_ID'])
116 || (!$hostUserId && $curUserId === (int)
$user[
'USER_ID']))
123 'id' =>
$user[
'USER_ID'],
124 'name' => CCalendar::GetUserName(
$user),
126 'url' => CCalendar::GetUserUrl(
$user[
'USER_ID']),
127 'avatar' => CCalendar::GetUserAvatarSrc(
$user),
128 'strictStatus' => $userSettings[
'denyBusyInvitation'],
129 'emailUser' => isset(
$user[
'EXTERNAL_AUTH_ID']) && (
$user[
'EXTERNAL_AUTH_ID'] ===
'email'),
130 'sharingUser' => isset(
$user[
'EXTERNAL_AUTH_ID']) && (
$user[
'EXTERNAL_AUTH_ID'] === SharingUser::EXTERNAL_AUTH_ID),
131 'timezoneName' => CCalendar::GetUserTimezoneName((
int)
$user[
'USER_ID']),
144 if (isset(
$params[
'resources']) && is_array(
$params[
'resources']))
146 foreach(
$params[
'resources'] as $resource)
150 $resource[
'type'] = preg_replace(
"/[^a-zA-Z0-9_]/i",
"", $resource[
'type']);
152 'type' => $resource[
'type'],
154 'name' => $resource[
'name']
160 $from =
$params[
'date_from'] ??
null;
161 $to =
$params[
'date_to'] ??
null;
163 if (empty($from) || empty($to))
168 $maxPlannerUsers = \CCalendar::GetMaxPlannerUsers();
169 $dontLoadAccessibility = $maxPlannerUsers > 0 &&
count($userIds) > $maxPlannerUsers;
170 if ($isPlannerFeatureEnabled && !$dontLoadAccessibility)
173 ->setSkipEventId($skipEntryId)
174 ->getAccessibility($userIds, CCalendar::TimestampUTC($from), CCalendar::TimestampUTC($to))
177 $timezoneName = \CCalendar::GetUserTimezoneName(\CCalendar::GetUserId());
178 foreach ($accessibility as
$userId => $entries)
181 foreach ($entries as $entry)
183 if (isset($entry[
'id']) && in_array($entry[
'id'], $skipEntryList))
188 if ($entry[
'isFullDay'])
190 $dateFrom = $entry[
'from'];
191 $dateTo = $entry[
'to'];
200 'name' => $entry[
'name'],
201 'dateFrom' => $dateFrom,
203 'isFullDay' => $entry[
'isFullDay'],
204 'isVacation' => $entry[
'isVacation'] ??
false,
210 if (isset(
$params[
'location']))
212 $location = \Bitrix\Calendar\Rooms\Util::parseLocation(
$params[
'location']);
213 $entryLocation = \Bitrix\Calendar\Rooms\Util::parseLocation(
$params[
'entryLocation'] ??
null);
214 $roomEventId = $entryLocation[
'room_event_id'] ??
null;
216 if ($roomEventId && !in_array($roomEventId, $skipEntryList))
218 $skipEntryList[] = $roomEventId;
227 'name' =>
'meeting room'
231 foreach ($roomList as $room)
233 if ((
int)$room[
'ID'] === (
int)
$location[
'mrid'])
235 $entry[
'name'] = $room[
'NAME'];
236 $entry[
'url'] = $room[
'URL'];
242 $result[
'accessibility'][$mrid] = [];
244 if ($isPlannerFeatureEnabled)
247 'allowReserveMeeting' =>
true,
251 'curEventId' => $roomEventId
254 foreach ($meetingRoomRes as $entry)
256 if (!in_array($entry[
'ID'], $skipEntryList))
258 $result[
'accessibility'][$mrid][] = [
259 'id' => $entry[
'ID'],
260 'dateFrom' => $entry[
'DT_FROM'],
261 'dateTo' => $entry[
'DT_TO']
269 $roomId =
'room_' .
$location[
'room_id'];
274 'name' =>
'meeting room'
278 foreach($sectionList as $room)
280 if ((
int)$room[
'ID'] === (
int)
$location[
'room_id'])
282 $entry[
'name'] = $room[
'NAME'];
288 $result[
'accessibility'][$roomId] = [];
290 if ($isPlannerFeatureEnabled)
298 foreach ($meetingRoomRes as $entry)
300 if ((
int)$entry[
'PARENT_ID'] === $skipEntryId || in_array((
int)$entry[
'ID'], $skipEntryList))
305 $dateFrom = $entry[
'DATE_FROM'];
306 if ($entry[
'DT_SKIP_TIME'] !==
"Y")
308 $dateFrom = CCalendar::Date(
309 CCalendar::Timestamp($entry[
'DATE_FROM']) - $entry[
'~USER_OFFSET_FROM']
311 $dateTo = CCalendar::Date(
312 CCalendar::Timestamp($entry[
'DATE_TO']) - $entry[
'~USER_OFFSET_TO']
317 $dateTo = CCalendar::Date(
318 CCalendar::Timestamp($entry[
'DATE_TO']) + CCalendar::GetDayLen()
322 $result[
'accessibility'][$roomId][] = [
323 'id' => $entry[
'ID'],
324 'name' => $entry[
'NAME'],
325 'dateFrom' => $dateFrom,
333 if (!empty($resourceIdList) && $isPlannerFeatureEnabled)
335 $resEntries = CCalendarEvent::GetList(
338 "FROM_LIMIT" => $from,
340 "CAL_TYPE" =>
'resource',
341 "ACTIVE_SECTION" =>
"Y",
342 "SECTION" => $resourceIdList
344 'parseRecursion' =>
true,
345 'setDefaultLimit' =>
false
349 foreach($resEntries as $entry)
351 if (in_array($entry[
'ID'], $skipEntryList))
356 $dateFrom = $entry[
'DATE_FROM'];
357 $dateTo = $entry[
'DATE_TO'];
359 if ($entry[
'DT_SKIP_TIME'] !==
"Y")
361 $dateFrom = CCalendar::Date(
362 CCalendar::Timestamp($entry[
'DATE_FROM'])
363 - $entry[
'~USER_OFFSET_FROM']
365 $dateTo = CCalendar::Date(
366 CCalendar::Timestamp($entry[
'DATE_TO'])
367 - $entry[
'~USER_OFFSET_TO']
372 'id' => $entry[
"ID"],
373 'name' => $entry[
"NAME"],
374 'dateFrom' => $dateFrom,
380 if ((
$params[
'initPullWatches'] ??
null) ===
true)