19 declare(strict_types=1);
70 $this->
logger = $DIC->logger()->cal();
71 $this->
tabs = $DIC->tabs();
72 $this->obj_data_cache = $DIC[
"ilObjDataCache"];
73 $this->
ui = $DIC->ui();
74 $this->
help = $DIC->help();
75 $this->
http = $DIC->http();
78 $this->
lng->loadLanguageModule(
"dateplaner");
79 $this->
help->addHelpSection(
"cal_block");
81 $this->
ctrl->saveParameter($this,
'bkid');
87 $this->allow_moving =
false;
89 $params = $DIC->http()->request()->getQueryParams();
90 $this->requested_cal_agenda_per = (
int) (
$params[
'cal_agenda_per'] ?? null);
95 } elseif (strlen($seed_str)) {
98 $seed_str = date(
'Y-m-d', time());
104 $mode = $this->
user->getPref(
"il_pd_cal_mode");
105 $this->display_mode = $mode ?:
"mmon";
107 if ($this->display_mode !==
"mmon") {
114 if ($this->
http->wrapper()->query()->has(
'bkid')) {
115 return $this->
http->wrapper()->query()->retrieve(
125 if ($this->
http->wrapper()->query()->has(
'seed')) {
126 return $this->
http->wrapper()->query()->retrieve(
128 $this->
refinery->kindlyTo()->string()
136 if ($this->
http->wrapper()->query()->has(
'app_id')) {
137 return $this->
http->wrapper()->query()->retrieve(
147 if ($this->
http->wrapper()->query()->has(
'dt')) {
148 return $this->
http->wrapper()->query()->retrieve(
161 return ($this->
settings->getShowWeeks() && $this->user_settings->getShowWeeks());
169 return self::$block_type;
182 $this->parent_gui = $a_val;
192 $this->force_month_view = $a_val;
194 $this->display_mode =
"mmon";
211 $ilCtrl = $DIC->ctrl();
212 $cmd_class = $ilCtrl->getCmdClass();
214 $cmd = $ilCtrl->getCmd();
216 if ($cmd_class ==
"ilcalendarappointmentgui" ||
217 $cmd_class ==
"ilconsultationhoursgui" ||
218 $cmd ==
'showCalendarSubscription') {
226 $next_class = $this->
ctrl->getNextClass();
227 $cmd = $this->
ctrl->getCmd(
"getHTML");
231 switch ($next_class) {
232 case "ilcalendarappointmentgui":
235 $this->
ctrl->forwardCommand($app_gui);
238 case "ilconsultationhoursgui":
240 $this->
ctrl->forwardCommand($hours);
243 case "ilcalendarappointmentpresentationgui":
249 'Invalid appointment ID for ref_id: ' .
251 (
string) $this->requested_ref_id
259 case "ilcalendarmonthgui":
260 $this->
tabs->setSubTabActive(
'app_month');
262 $this->
ctrl->forwardCommand($month_gui);
266 return $this->$cmd();
273 if ($this->display_mode !=
"mmon") {
274 $this->
setRowTemplate(
"tpl.pd_event_list.html",
"Services/Calendar");
279 "tpl.calendar_block.html",
292 $target_class = array();
294 $target_class = array(
"ildashboardgui",
"ilcalendarpresentationgui");
298 $target_class = array(
"ilobjcoursegui",
"ilcalendarpresentationgui");
302 $target_class = array(
"ilobjgroupgui",
"ilcalendarpresentationgui");
306 return $target_class;
322 $a_tpl->
setVariable(
'TXT_WEEKDAY', $this->
lng->txt(
"cal_week_abbrev"));
325 for (
$i = $this->user_settings->getWeekStart();
$i < (7 + $this->user_settings->getWeekStart());
$i++) {
334 $disable_empty =
true;
336 $user_id = $this->
user->getId();
337 $disable_empty =
false;
340 $this->scheduler->addSubitemCalendars(
true);
341 $this->scheduler->calculate();
347 $this->user_settings->getWeekStart()
351 $events = $this->scheduler->getByDay($date, $this->
user->getTimeZone());
352 $has_events = (bool) count($events);
353 if ($has_events || !$disable_empty) {
359 if ($disable_empty) {
361 $a_tpl->
setVariable(
'DAY_CLASS',
'calminiinactive');
363 $week_has_events =
true;
364 foreach ($events as $event) {
366 if ($booking->hasBooked($event[
'event']->getEntryId())) {
372 } elseif ($has_events) {
373 $week_has_events =
true;
383 $last_gui = end(
$path);
384 $this->
ctrl->setParameterByClass($last_gui,
'seed', $date->get(
IL_CAL_DATE));
385 if ($agenda_view_type = $this->requested_cal_agenda_per) {
386 $this->
ctrl->setParameterByClass($last_gui,
"cal_agenda_per", $agenda_view_type);
388 $a_tpl->
setVariable(
'OPEN_DAY_VIEW', $this->
ctrl->getLinkTargetByClass($this->getTargetGUIClassPath(),
''));
408 if ($counter and !($counter % 7)) {
421 $week_has_events =
false;
425 if ($a_include_view_ctrl) {
437 $first_of_month = substr($this->seed->get(
IL_CAL_DATE), 0, 7) .
"-01";
443 $prev_link = $this->
ctrl->getLinkTarget($this,
"setSeed",
"",
true);
447 $next_link = $this->
ctrl->getLinkTarget($this,
"setSeed",
"",
true);
449 $this->
ctrl->setParameter($this,
'seed',
"");
455 $b1 =
$ui->factory()->button()->standard($this->
lng->txt(
"previous"),
"#")->
withOnLoadCode(
function (
$id) use (
460 "$('#" .
$id .
"').click(function() { ilBlockJSHandler('block_" . $blockgui->getBlockType() .
461 "_" . $blockgui->getBlockId() .
"','" . $prev_link .
"'); return false;});";
465 $this->
ctrl->clearParameterByClass(
"ilcalendarblockgui",
'seed');
466 $month_link = $this->
ctrl->getLinkTarget($this,
"setSeed",
"",
true,
false);
467 $seed_parts = explode(
"-", $this->seed->get(
IL_CAL_DATE));
468 $b2 =
$ui->factory()->button()->month($seed_parts[1] .
"-" . $seed_parts[0])->withOnLoadCode(
function (
$id) use (
472 return "$('#" .
$id .
"').on('il.ui.button.month.changed', function(el, id, month) { var m = month.split('-'); ilBlockJSHandler('block_" . $blockgui->getBlockType() .
473 "_" . $blockgui->getBlockId() .
"','" . $month_link .
"' + '&seed=' + m[1] + '-' + m[0] + '-01'); return false;});";
481 "$('#" .
$id .
"').click(function() { ilBlockJSHandler('block_" . $blockgui->getBlockType() .
482 "_" . $blockgui->getBlockId() .
"','" . $next_link .
"'); return false;});";
485 return $ui->factory()->viewControl()->section($b1, $b2, $b3);
501 $obj_id = $ilObjDataCache->lookupObjId((
int) $this->requested_ref_id);
503 $users = array_unique(array_merge($participants->getTutors(), $participants->getAdmins()));
506 foreach ($users as $user_id) {
511 $next_app = end($appointments);
512 reset($appointments);
514 foreach ($appointments as $entry) {
520 if (!in_array($obj_id, $booking_entry->getTargetObjIds())) {
524 if (!$booking_entry->isAppointmentBookableForUser($entry->getEntryId(),
$user->
getId())) {
532 $this->
ctrl->setParameterByClass(end(
$path),
"ch_user_id", $user_id);
535 $this->cal_footer[] = array(
536 'link' => $this->
ctrl->getLinkTargetByClass(
537 $this->getTargetGUIClassPath(),
538 'selectCHCalendarOfUser' 540 'txt' => str_replace(
543 $this->
lng->txt(
"cal_consultation_hours_for_user")
548 $last_gui = end(
$path);
549 $this->
ctrl->setParameterByClass($last_gui,
"ch_user_id",
"");
550 $this->
ctrl->setParameterByClass($last_gui,
"bkid", $bkid);
551 $this->
ctrl->setParameterByClass($last_gui,
"seed", $this->seed->get(
IL_CAL_DATE));
553 $this->
ctrl->setParameter($this,
"bkid",
"");
554 $this->
ctrl->setParameter($this,
'seed',
'');
556 $this->
ctrl->setParameter($this,
"bkid",
"");
558 $this->
ctrl->getLinkTarget($this),
559 $this->
lng->txt(
"back")
567 $this->
ctrl->getLinkTarget($this,
"editSettings"),
568 $this->
lng->txt(
"settings")
573 $ret = parent::getHTML();
577 if ($this->
ctrl->isAsynch()) {
578 $f = $this->
ui->factory()->legacy(
"");
579 $ret .= $this->
ui->renderer()->renderAsync(
$f);
581 if (count($this->modals) > 0) {
582 if ($this->
ctrl->isAsynch()) {
583 $ret .= $this->
ui->renderer()->renderAsync($this->modals);
585 $ret .= $this->
ui->renderer()->render($this->modals);
596 $events = $schedule->getChangedEvents(
true);
598 $this->
ctrl->setParameterByClass(
'ilcalendarinboxgui',
'changed', 1);
599 $link =
'<a href=' . $this->
ctrl->getLinkTargetByClass(
'ilcalendarinboxgui',
'') .
'>';
600 $this->
ctrl->setParameterByClass(
'ilcalendarinboxgui',
'changed',
'');
601 $text =
'<div class="small">' . (count($events)) .
" " . $this->
lng->txt(
"cal_changed_events_header") .
"</div>";
604 return $link . $text . $end_link;
613 } elseif (!$cats->getMode()) {
616 (
int) $this->requested_ref_id,
624 $this->
tabs->clearSubTabs();
633 if ($this->
ctrl->isAsynch()) {
643 $this->
ctrl->returnToParent($this);
653 $this->
ctrl->getLinkTarget($this,
"setPdModeEvents"),
654 $this->
lng->txt(
"cal_upcoming_events_header"),
661 $this->
ctrl->getLinkTarget($this,
"setPdModeMonth"),
662 $this->
lng->txt(
"app_month"),
663 $this->
ctrl->getLinkTarget($this,
"setPdModeMonth",
"",
true)
668 $this->
ctrl->setParameterByClass(
'ilcalendarpresentationgui',
'seed',
'');
670 $this->
ctrl->getLinkTargetByClass($this->getTargetGUIClassPath(),
""),
671 $this->
lng->txt(
"cal_open_calendar")
674 if ($this->
access->checkAccess(
'edit_event',
'', (
int) $this->requested_ref_id)) {
675 $this->
ctrl->setParameter($this,
"add_mode",
"");
677 $this->
ctrl->getLinkTargetByClass(
"ilCalendarAppointmentGUI",
"add"),
678 $this->
lng->txt(
"add_appointment")
680 $this->
ctrl->setParameter($this,
"add_mode",
"");
690 $this->
user->writePref(
"il_pd_cal_mode",
"evt");
691 $this->display_mode =
"evt";
693 if ($this->
ctrl->isAsynch()) {
697 $this->
ctrl->returnToParent($this);
705 $this->
user->writePref(
"il_pd_cal_mode",
"mmon");
706 $this->display_mode =
"mmon";
708 if ($this->
ctrl->isAsynch()) {
712 $this->
ctrl->redirectByClass(
"ildashboardgui",
"show");
720 array_key_exists(
'event', $event) &&
722 $event[
'event']->getEntryId() === $a_appointment_id
735 $schedule->addSubitemCalendars(
true);
736 $schedule->setEventsLimit(20);
737 $schedule->calculate();
739 return $schedule->getScheduledEvents();
752 if (
sizeof($events)) {
753 foreach ($events as $item) {
754 $this->
ctrl->setParameter($this,
"app_id", $item[
"event"]->getEntryId());
755 $this->
ctrl->setParameter($this,
'dt', $item[
'dstart']);
756 $url = $this->
ctrl->getLinkTarget($this,
"getModalForApp",
"",
true,
false);
759 $modal =
$f->modal()->roundtrip(
'', [])->withAsyncRenderUrl(
$url);
763 $shy =
$f->button()->shy(
764 $item[
"event"]->getPresentationTitle(),
766 )->withOnClick($modal->getShowSignal());
770 "title" => $item[
"event"]->getPresentationTitle(),
772 "shy_button" => $shy,
798 $start = $item[
"dstart"];
799 $end = $item[
"dend"];
800 if ($item[
"fullday"]) {
807 return array(
"start" => $start,
"end" => $end);
820 $r =
$ui->renderer();
824 foreach ($events as $item) {
830 $content = $this->
ctrl->getHTML($next_gui);
832 $modal =
$f->modal()->roundtrip(
836 echo $r->renderAsync($modal);
865 "tpl.calendar_block.html",
873 $panel_tpl = new \ilTemplate(
874 'tpl.cal_block_panel.html',
882 return $tpl->
get() . $panel_tpl->get();
891 if (isset($data[
"modal"])) {
892 $this->modals[] = $data[
"modal"];
894 if (isset($data[
"shy_button"])) {
895 return $factory->item()->standard($data[
"shy_button"])->withDescription($data[
"date"]);
897 return $factory->item()->standard($data[
"date"]);
907 return $this->
lng->txt(
"cal_no_events_block");
917 $ui_factory = $DIC->ui()->factory();
918 $ui_renderer = $DIC->ui()->renderer();
921 $gui_path[] = strtolower(\ilCalendarSubscriptionGUI::class);
922 $url = $this->
ctrl->getLinkTargetByClass($gui_path,
'getModalForSubscription',
"",
true,
false);
924 $roundtrip_modal = $ui_factory->modal()->roundtrip(
'', [])->withAsyncRenderUrl(
$url);
926 $standard_button = $ui_factory->button()->standard($this->
lng->txt(
'btn_ical'),
'')->withOnClick(
927 $roundtrip_modal->getShowSignal()
parseCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
static _getInstance(ilDate $seed, array $a_app)
get singleton instance
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
initBookingUserFromQuery()
static get(string $a_var)
ilCalendarUserSettings $user_settings
ilCalendarSettings $settings
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getDatesForItem(array $item)
Get start/end date for item.
static _buildMonthDayList(int $a_month, int $a_year, int $weekstart)
Build a month day list.
get(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getShowWeeksColumn()
Show weeks column.
static _before(ilDateTime $start, ilDateTime $end, string $a_compare_field='', string $a_tz='')
compare two dates and check start is before end This method does not consider tz offsets.
static _lookupFullname(int $a_user_id)
static getScreenMode()
Get Screen Mode for current command.
setBlockId(string $a_block_id="0")
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
setDataSection(string $a_content)
Call this from overwritten fillDataSection(), if standard row based data is not used.
Class ChatMainBarProvider .
setEnableNumInfo(bool $a_enablenuminfo)
initAppointmentIdFromQuery()
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct()
Constructor.
static string $block_type
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getNoItemFoundContent()
No item entry.
const MODE_REPOSITORY_CONTAINER_ONLY
setParentGUI(string $a_val)
getEventByAppointmentId(int $a_appointment_id)
getModalForApp()
Get modal for appointment (see similar code in ilCalendarAgendaListGUI) todo use all this methods fro...
getHTML()
Get bloch HTML code.
static _getInstanceByUserId(int $a_user_id)
withOnLoadCode(Closure $binder)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setRowTemplate(string $a_rowtemplatename, string $a_rowtemplatedir="")
Set Row Template Name.
ilObjectDataCache $obj_data_cache
static http()
Fetches the global http state from ILIAS.
RefineryFactory $refinery
setVariable($variable, $value='')
Sets a variable value.
static _getInstanceByObjId(int $a_obj_id)
addMiniMonth(ilTemplate $a_tpl, bool $a_include_view_ctrl=false)
Add mini version of monthly overview (Maybe extracted to another class, if used in pd calendar tab...
ilCalendarSchedule $scheduler
static _numericDayToString(int $a_day, bool $a_long=true)
static _getInstance($a_usr_id=0)
get singleton instance
static getAppointments(int $a_user_id)
Get all appointments.
addSubscriptionButton(ilTemplate $panel_template)
Add subscription button.
setCurrentBlock(string $part=ilGlobalTemplateInterface::DEFAULT_BLOCK)
setForceMonthView(bool $a_val)
static formatPeriod(ilDateTime $start, ilDateTime $end, bool $a_skip_starting_day=false)
Format a period of two dates Shows: 14.
This describes a Section Control.
Administrate calendar appointments.
Calendar blocks, displayed in different contexts, e.g.
__construct(Container $dic, ilPlugin $plugin)
static lookupBookableUsersForObject(array $a_obj_id, array $a_user_ids)
Consultation hours are offered if 1) consultation hour owner is admin or tutor and no object assignme...
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
setTitle(string $a_title)
static _equals(ilDateTime $start, ilDateTime $end, string $a_compare_field='', string $a_tz='')
Check if two date are equal.
getListItemForData(array $data)
This class represents a block method of a block.
addBlockCommand(string $a_href, string $a_text, string $a_onclick="")
static _lookupType(int $id, bool $reference=false)
fillDataSection()
Standard implementation for row based data.
getProperty(string $a_property)
setPresentation(int $type)
static set(string $a_var, $a_val)
Set a value.
static _isToday(ilDateTime $date)
Represents a list of calendar appointments (including recurring events) for a specific user in a give...
int $requested_cal_agenda_per