3 declare(strict_types=1);
41 public function initialize(
int $a_calendar_presentation_type): void
45 parent::initialize($a_calendar_presentation_type);
49 if ($this->
user->getTimeZone()) {
50 $this->timezone = $this->
user->getTimeZone();
56 $next_class = $this->
ctrl->getNextClass();
57 switch ($next_class) {
58 case "ilcalendarappointmentpresentationgui":
59 $this->
ctrl->setReturn($this,
"");
60 $this->
logger->debug(
"-ExecCommand - representation of ilDate: this->seed->get(IL_CAL_DATE) = " . $this->seed->get(
IL_CAL_DATE));
62 $this->
ctrl->forwardCommand($gui);
64 case 'ilcalendarappointmentgui':
65 $this->
ctrl->setReturn($this,
'');
66 $this->tabs_gui->setSubTabActive((
string)
ilSession::get(
'cal_last_tab'));
75 $cmd = $this->
ctrl->getCmd(
"show");
77 $this->main_tpl->setContent($this->tpl->get());
86 protected function show(): void
90 if ($this->user_settings->getDayStart()) {
92 $morning_aggr = ($this->user_settings->getDayStart() - 1) * 60 + (60 - $raster);
96 $evening_aggr = $this->user_settings->getDayEnd() * 60;
98 $this->tpl =
new ilTemplate(
'tpl.day_view.html',
true,
true,
'Services/Calendar');
107 $user_id = $this->
user->getId();
110 $user_id = $this->
user->getId();
114 $scheduler->addSubitemCalendars(
true);
115 $scheduler->calculate();
116 $daily_apps = $scheduler->getByDay($this->seed, $this->timezone);
119 if (count($daily_apps)) {
120 $this->view_with_appointments =
true;
133 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
139 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
140 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'idate', $this->seed->get(
IL_CAL_DATE));
141 $new_app_url = $this->
ctrl->getLinkTargetByClass(
'ilcalendarappointmentgui',
'add');
143 if (
$settings->getEnableGroupMilestones()) {
144 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
145 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'idate', $this->seed->get(
IL_CAL_DATE));
146 $new_ms_url = $this->
ctrl->getLinkTargetByClass(
'ilcalendarappointmentgui',
'addMilestone');
148 $this->tpl->setCurrentBlock(
"new_ms");
149 $this->tpl->setVariable(
'DD_ID', $this->seed->get(
IL_CAL_UNIX));
150 $this->tpl->setVariable(
152 $this->ui_renderer->render($this->ui_factory->symbol()->glyph()->add())
154 $this->tpl->setVariable(
'URL_DD_NEW_APP', $new_app_url);
155 $this->tpl->setVariable(
'TXT_DD_NEW_APP', $this->
lng->txt(
'cal_new_app'));
156 $this->tpl->setVariable(
'URL_DD_NEW_MS', $new_ms_url);
157 $this->tpl->setVariable(
'TXT_DD_NEW_MS', $this->
lng->txt(
'cal_new_ms'));
158 $this->tpl->parseCurrentBlock();
160 $this->tpl->setCurrentBlock(
"new_app1");
161 $this->tpl->setVariable(
163 $this->ui_renderer->render($this->ui_factory->symbol()->glyph()->add($new_app_url))
165 $this->tpl->parseCurrentBlock();
168 $this->
ctrl->clearParametersByClass(
'ilcalendarappointmentgui');
171 $this->tpl->setVariable(
'NAVIGATION', $navigation->getHTML());
173 $this->tpl->setVariable(
177 $this->tpl->setVariable(
181 $this->tpl->setVariable(
'HCOLSPAN', $colspan - 1);
183 $this->tpl->setVariable(
'TXT_TIME', $this->
lng->txt(
"time"));
186 foreach ($daily_apps as $event) {
187 if ($event[
'fullday']) {
191 $this->tpl->setCurrentBlock(
'fullday_apps');
192 $this->tpl->setVariable(
'TXT_F_DAY', $this->
lng->txt(
"cal_all_day"));
193 $this->tpl->setVariable(
'COLSPAN', $colspan - 1);
194 $this->tpl->parseCurrentBlock();
197 foreach ($hours as $numeric => $hour) {
198 if (!($numeric % 60) || ($numeric == $morning_aggr && $morning_aggr) ||
199 ($numeric == $evening_aggr && $evening_aggr)) {
201 $this->tpl->setCurrentBlock(
"new_app2");
202 $this->
ctrl->clearParametersByClass(
'ilcalendarappointmentgui');
203 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
204 $this->
ctrl->setParameterByClass(
205 'ilcalendarappointmentgui',
209 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'hour', floor($numeric / 60));
210 $this->tpl->setVariable(
212 $this->ui_renderer->render($this->ui_factory->symbol()->glyph()->add(
213 $this->
ctrl->getLinkTargetByClass(
'ilcalendarappointmentgui',
'add')
216 $this->tpl->parseCurrentBlock();
220 if (($numeric == $morning_aggr && $morning_aggr) ||
221 ($numeric == $evening_aggr && $evening_aggr)) {
222 $this->tpl->setVariable(
'TIME_ROWSPAN', 1);
225 $this->tpl->setVariable(
'TIME_ROWSPAN', 60 / $raster);
228 $this->tpl->setCurrentBlock(
'time_txt');
230 $this->tpl->setVariable(
'TIME', $hour[
'txt']);
231 $this->tpl->parseCurrentBlock();
234 foreach ($hour[
'apps_start'] as
$app) {
238 for (
$i = ($colspan - 1);
$i > $hour[
'apps_num'];
$i--) {
239 $this->tpl->setCurrentBlock(
'empty_cell');
240 $this->tpl->setVariable(
'EMPTY_WIDTH', (100 / ($colspan - 1)) .
'%');
243 if ($numeric % 60 == 60 - $raster ||
244 ($numeric == $morning_aggr && $morning_aggr) ||
245 ($numeric == $evening_aggr && $evening_aggr)) {
246 $this->tpl->setVariable(
'EMPTY_STYLE',
' calempty_border');
249 $this->tpl->parseCurrentBlock();
252 $this->tpl->touchBlock(
'time_row');
258 $event_tpl =
new ilTemplate(
'tpl.day_event_view.html',
true,
true,
'Services/Calendar');
261 if ($a_app[
'event']->isMilestone()) {
262 $event_tpl->setCurrentBlock(
'fullday_ms_icon');
263 $event_tpl->setVariable(
'ALT_FD_MS', $this->
lng->txt(
"cal_milestone"));
265 $event_tpl->parseCurrentBlock();
268 $event_tpl->setCurrentBlock(
'fullday_app');
270 $compl = ($a_app[
'event']->isMilestone() && $a_app[
'event']->getCompletion() > 0)
271 ?
" (" . $a_app[
'event']->getCompletion() .
"%)" 278 $content = $shy . $compl;
280 $event_tpl->setVariable(
'EVENT_CONTENT', $content);
282 $color = $this->app_colors->getColorByAppointment($a_app[
'event']->getEntryId());
283 $event_tpl->setVariable(
'F_APP_BGCOLOR', $color);
286 $this->
ctrl->clearParametersByClass(
'ilcalendarappointmentgui');
287 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
288 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'app_id', $a_app[
'event']->getEntryId());
289 $event_tpl->setVariable(
291 $this->
ctrl->getLinkTargetByClass(
'ilcalendarappointmentgui',
'edit')
300 $body_html = $event_html_by_plugin;
302 $event_tpl->parseCurrentBlock();
303 $body_html = $event_tpl->get();
306 $this->tpl->setCurrentBlock(
"content_fd");
307 $this->tpl->setVariable(
"CONTENT_EVENT", $body_html);
308 $this->tpl->parseCurrentBlock();
309 $this->num_appointments++;
314 $event_tpl =
new ilTemplate(
'tpl.day_event_view.html',
true,
true,
'Services/Calendar');
315 $event_tpl->setCurrentBlock(
'app');
316 $this->tpl->setVariable(
'APP_ROWSPAN', $a_app[
'rowspan']);
318 switch ($this->user_settings->getTimeFormat()) {
320 $time = $a_app[
'event']->getStart()->get(
IL_CAL_FKT_DATE,
'H:i', $this->timezone);
324 $time = $a_app[
'event']->getStart()->get(
IL_CAL_FKT_DATE,
'h:ia', $this->timezone);
331 $content = ($time !=
"") ? $time .
" " . $title : $title;
332 $event_tpl->setVariable(
'EVENT_CONTENT', $content);
334 $color = $this->app_colors->getColorByAppointment($a_app[
'event']->getEntryId());
335 $event_tpl->setVariable(
'APP_BGCOLOR', $color);
337 $event_tpl->setVariable(
'APP_ADD_STYLES', $a_app[
'event']->getPresentationStyle());
339 $this->
ctrl->clearParametersByClass(
'ilcalendarappointmentgui');
340 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'seed', $this->seed->get(
IL_CAL_DATE));
341 $this->
ctrl->setParameterByClass(
'ilcalendarappointmentgui',
'app_id', $a_app[
'event']->getEntryId());
342 $event_tpl->setVariable(
'APP_EDIT_LINK', $this->
ctrl->getLinkTargetByClass(
'ilcalendarappointmentgui',
'edit'));
350 $event_html = $event_html_by_plugin;
352 $event_tpl->parseCurrentBlock();
353 $event_html = $event_tpl->get();
356 $this->tpl->setCurrentBlock(
"event_nfd");
357 $this->tpl->setVariable(
"CONTENT_EVENT_NFD", $event_html);
358 $this->tpl->parseCurrentBlock();
360 $this->num_appointments++;
366 protected function parseInfoIntoRaster(array $daily_apps,
int $morning_aggr,
int $evening_aggr,
int $raster): array
369 for (
$i = $morning_aggr;
$i <= $evening_aggr;
$i += $raster) {
370 $hours[
$i][
'apps_start'] = array();
371 $hours[
$i][
'apps_num'] = 0;
373 switch ($this->user_settings->getTimeFormat()) {
375 if ($morning_aggr > 0 &&
$i == $morning_aggr) {
376 $hours[
$i][
'txt'] = sprintf(
'%02d:00', 0) .
' - ' .
377 sprintf(
'%02d:00', ceil((
$i + 1) / 60));
379 if (!isset($hours[
$i][
'txt'])) {
380 $hours[
$i][
'txt'] = sprintf(
'%02d:%02d', floor($i / 60), $i % 60);
382 $hours[
$i][
'txt'] .= sprintf(
'%02d:%02d', floor($i / 60), $i % 60);
385 if ($evening_aggr < 23 * 60 &&
$i == $evening_aggr) {
386 if (!isset($hours[
$i][
'txt'])) {
387 $hours[
$i][
'txt'] =
' - ' . sprintf(
'%02d:00', 0);
389 $hours[
$i][
'txt'] .=
' - ' . sprintf(
'%02d:00', 0);
395 $this->
logger->notice(
'Morning: ' . $morning_aggr .
' and $i:' .
$i);
396 if ($morning_aggr > 0 && $i == $morning_aggr) {
398 date(
'h a', mktime(0, 0, 0, 1, 1, 2000)) .
' - ' .
399 date(
'h a', mktime($this->user_settings->getDayStart(), 0, 0, 1, 1, 2000));
401 $hours[
$i][
'txt'] = date(
'h a', mktime((
int) floor($i / 60), $i % 60, 0, 1, 1, 2000));
403 if ($evening_aggr < 23 * 60 && $i == $evening_aggr) {
404 if (!isset($hours[$i][
'txt'])) {
405 $hours[
$i][
'txt'] =
' - ' . date(
'h a', mktime(0, 0, 0, 1, 1, 2000));
407 $hours[
$i][
'txt'] .=
' - ' . date(
'h a', mktime(0, 0, 0, 1, 1, 2000));
414 foreach ($daily_apps as
$app) {
416 if ($app[
'fullday']) {
421 if ($app[
'start_info'][
'mday'] != $this->seed_info[
'mday']) {
424 $start = $app[
'start_info'][
'hours'] * 60 + $app[
'start_info'][
'minutes'];
430 if ($app[
'end_info'][
'mday'] != $this->seed_info[
'mday']) {
432 } elseif ($app[
'start_info'][
'hours'] == $app[
'end_info'][
'hours']) {
433 $end = $start + $raster;
435 $end = $app[
'end_info'][
'hours'] * 60 + $app[
'end_info'][
'minutes'];
438 if ($start < $morning_aggr) {
439 $start = $morning_aggr;
441 if ($end <= $morning_aggr) {
442 $end = $morning_aggr + $raster;
444 if ($start > $evening_aggr) {
445 $start = $evening_aggr;
447 if ($end > $evening_aggr + $raster) {
448 $end = $evening_aggr + $raster;
450 if ($end <= $start) {
451 $end = $start + $raster;
455 $start = floor($start / $raster) * $raster;
456 $end = ceil($end / $raster) * $raster;
459 for (
$i = $start;
$i < $end;
$i += $raster) {
461 $app[
'rowspan'] = ceil(($end - $start) / $raster);
462 $hours[
$i][
'apps_start'][] =
$app;
465 $hours[
$i][
'apps_num']++;
474 foreach ($hours as $hour) {
475 $colspan = max($colspan, $hour[
'apps_num'] + 1);
477 return max($colspan, 2);
calculateColspan(array $hours)
static _getInstance(ilDate $seed, array $a_app)
get singleton instance
static get(string $a_var)
showAppointment(array $a_app)
ilCalendarUserSettings $user_settings
static _numericMonthToString(int $a_month, bool $a_long=true)
numeric month to string
getContentByPlugins(ilCalendarEntry $a_cal_entry, int $a_start_date, string $a_content, ilTemplate $a_tpl)
static getImagePath(string $img, string $module_path="", string $mode="output", bool $offline=false)
get image path (for images located in a template directory)
parseInfoIntoRaster(array $daily_apps, int $morning_aggr, int $evening_aggr, int $raster)
calculate overlapping hours
initAppointmentIdFromQuery()
__construct(ilDate $seed_date)
static _getInstanceByUserId(int $a_user_id)
showFulldayAppointment(array $a_app)
initBookingUserFromQuery()
static initDragDrop(?ilGlobalTemplateInterface $a_main_tpl=null)
Init YUI Drag and Drop used in Modules/Survey, Services/Calendar, Services/COPage, Services/Form (Jan 2022)
const CAL_PRESENTATION_DAY
static _numericDayToString(int $a_day, bool $a_long=true)
ilCalendarAppointmentColors $app_colors
initInitialDateFromQuery()
Administrate calendar appointments.
__construct(Container $dic, ilPlugin $plugin)
static calculateFontColor(string $a_html_color_code)
Calculate best font color from html hex color code.
show()
fill data section protected
getAppointmentShyButton(ilCalendarEntry $a_calendar_entry, string $a_dstart, string $a_title_forced="")
initialize(int $a_calendar_presentation_type)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Represents a list of calendar appointments (including recurring events) for a specific user in a give...