[TikiWiki-commits] [Git][tikiwiki/tiki][28.x] [REF] Make the calendar plugin work using the same library as the main calendar
"franck franck kalunga \(@francksfkal\) via TikiWiki-cvs" <[email protected]>
| Newsgroups | gmane.comp.cms.tiki.cvs |
|---|---|
| Message-ID | <68c2a2811ffba_2c227e88441454@gitlab-sidekiq-low-urgency-cpu-bound-v2-c6f5977fd-26d5f.mail> |
franck franck kalunga pushed to branch 28.x at Tiki Wiki CMS Groupware / Tiki
Commits:
153436bf by franck franck kalunga at 2025-09-11T10:13:51+00:00
[REF] Make the calendar plugin work using the same library as the main calendar
---
* [REF] Make the calendar plugin work using the same library as the main calendar
---
* [REF] Make the calendar plugin work using the same library as the main calendar
---
* [REF] Make the plugin calendar look like the calendar in tiki and use separate file
See merge request tikiwiki/tiki!8359
See merge request tikiwiki/tiki!8535
See merge request tikiwiki/tiki!8557
- - - - -
6 changed files:
- lib/wiki-plugins/wikiplugin_calendar.php
- + templates/export_calendar_in_csv_or_ical.tpl
- templates/tiki-calendar.tpl
- + templates/wiki-plugins/wikiplugin_calendar.tpl
- themes/base_files/scss/_tiki-calendar.scss
- tiki-calendar_setup.php
Changes:
=====================================
lib/wiki-plugins/wikiplugin_calendar.php
=====================================
@@ -100,27 +100,126 @@ function wikiplugin_calendar($data, $params)
$params['viewnavbar'] = 'n';
}
- $module_reference = [
- 'moduleId' => null,
- 'name' => 'calendar_new',
- 'params' => [ 'calIds' => $params['calIds'],
- 'viewnavbar' => $params['viewnavbar'],
- 'viewlist' => $params['viewlist'],
- 'viewmode' => $params['viewmode'],
- 'nobox' => 'y' ],
- 'position' => null,
- 'ord' => null,
- ];
+ $slotDuration = '00:' . str_pad($prefs['calendar_timespan'], 2, '0', STR_PAD_LEFT);
- $modlib = TikiLib::lib('mod');
- $out = '';
- if ($params['viewlist'] == 'table' || $params['viewlist'] == 'both') {
- $out .= $modlib->execute_module($module_reference);
+ $rawcals = $calendarlib->list_calendars();
+ TikiLib::lib('header')
+ ->add_cssfile('themes/base_files/feature_css/calendar.css', 20)
+ ->add_jsfile('lib/jquery_tiki/tiki-calendar_edit_item.js');
+ $rawcals['data'] = Perms::filter(
+ ['type' => 'calendar'],
+ 'object',
+ $rawcals['data'],
+ [ 'object' => 'calendarId' ],
+ 'view_calendar'
+ );
+
+ if (empty($rawcals['data'])) {
+ Feedback::errorAndDie(tra("You do not have permission to view the calendar"), \Laminas\Http\Response::STATUS_CODE_401);
+ }
+
+ $rawcals['data'] = array_filter($rawcals['data'], fn($current) => in_array($current['calendarId'], $params['calIds']));
+
+ switch ($params['viewmode']) {
+ case 'week':
+ $initialView = 'timeGridWeek';
+ break;
+ case 'day':
+ $initialView = 'timeGridDay';
+ break;
+ case 'month':
+ $initialView = 'dayGridMonth';
+ break;
+ default:
+ $initialView = 'dayGridMonth';
+ }
+ $viewstart = $_REQUEST['todate'] ?? $tikilib->now;
+ $viewend = $viewstart + 90 * 86400 - 1; // 1 month approx
+ $listevents = $calendarlib->list_raw_items(
+ $params['calIds'],
+ $user,
+ $viewstart,
+ $viewend,
+ 0,
+ -1
+ );
+
+ $listevents = Perms::filter(
+ ['type' => 'calendaritem'],
+ 'object',
+ $listevents,
+ ['object' => 'calitemId'],
+ ['view_events']
+ );
+ $defaultCalendarId = $params['calIds'][0];
+ $calendars = [];
+ $canEditAnything = false;
+
+ foreach ($rawcals['data'] as $calendar) {
+ $calendar['perms'] = Perms::get([ 'type' => 'calendar', 'object' => $calendar['calendarId']]);
+ $calendars[$calendar['calendarId']] = $calendar;
+ // for week and day views
+ $startOfDayUnix = (int)($calendar['startday'] ?? $prefs['calendar_startday'] ?? 0);
+ $startOfDayHour = $startOfDayUnix / 3600;
+ $startOfDayMinute = ($startOfDayUnix % 3600) / 60;
+ $minHourOfDay = date('H:i:s', mktime($startOfDayHour, $startOfDayMinute, 0));
+ $endOfDayUnix = (int)($calendar['endday'] ?? 0);
+ $endOfDayHour = $endOfDayUnix / 3600;
+ $endOfDayMinute = ($endOfDayUnix % 3600) / 60;
+ $maxHourOfDay = date('H:i:s', mktime($endOfDayHour, $endOfDayMinute, 0));
+
+ $canEditAnything = $canEditAnything || $calendar['perms']->add_events;
+ }
+
+ $smarty->assign(
+ 'fullCalendarParams',
+ [
+ 'firstDayofWeek' => 0,//$firstDayofWeek,
+ 'display_timezone' => $prefs['display_timezone'],
+ 'language' => $prefs['language'],
+ 'minHourOfDay' => $minHourOfDay,
+ 'maxHourOfDay' => $maxHourOfDay,
+ 'slotDuration' => $slotDuration,
+ 'initialView' => $initialView,
+ 'initialDate' => date("Y-m-d"),
+ ]
+ );
+
+ $smarty->assign('displayedcals', $params['calIds']);
+ $thiscal = [];
+ $checkedCalIds = [];
+
+ if (isset($_REQUEST["calIds"]) and is_array($_REQUEST["calIds"]) and count($_REQUEST["calIds"])) {
+ $defaultCalendarId = $_REQUEST["calIds"][0];
}
+
+ $smarty->assign_by_ref('checkedCalIds', $checkedCalIds);
+ $smarty->assign('calendars', $calendars);
+ $smarty->assign('viewlist', $params['viewlist']);
+
+ $out = '';
if ($params['viewlist'] == 'list' || $params['viewlist'] == 'both') {
- $module_reference['params']['viewlist'] = 'list';
- $out .= "<div>" . $modlib->execute_module($module_reference) . "</div>";
+ $module_reference = [
+ 'moduleId' => null,
+ 'name' => 'calendar_new',
+ 'params' => [ 'calIds' => $params['calIds'],
+ 'viewnavbar' => $params['viewnavbar'],
+ 'viewlist' => $params['viewlist'],
+ 'viewmode' => $params['viewmode'],
+ 'nobox' => 'y' ],
+ 'position' => null,
+ 'ord' => null,
+ ];
+
+ $modlib = TikiLib::lib('mod');
+ $out = '';
+ if ($params['viewlist'] == 'list' || $params['viewlist'] == 'both') {
+ $module_reference['params']['viewlist'] = 'list';
+ $out .= "<div>" . $modlib->execute_module($module_reference) . "</div>";
+ }
}
+ $smarty->assign('out', $out);
+ $smarty->assign('viewnavbar', $params['viewnavbar']);
- return "<div>$out</div>";
+ return $smarty->fetch('wiki-plugins/wikiplugin_calendar.tpl');
}
=====================================
templates/export_calendar_in_csv_or_ical.tpl
=====================================
@@ -0,0 +1,29 @@
+{if $tiki_p_view_events eq 'y' and $prefs.calendar_export eq 'y'}
+ {button href="#" _onclick="toggle('exportcal');return false;" _text='{tr}Export{/tr}' _icon_name='export' _type='info'}
+ <div class="d-inline-block">
+ <form id="exportcal" class="card" method="post" action="tiki-calendar_export_ical.php" name="f" style="display:none;">
+ <input type="hidden" name="export" value="y">
+ <div class="card-header caltitle py-1 px-2">
+ <strong>{tr}Export calendars{/tr}</strong>
+ <button type="button" class="btn-close float-end" onclick="toggle('exportcal')" aria-hidden="true"></button>
+ </div>
+ <div class="caltoggle">
+ {select_all checkbox_names='calendarIds[]' label="{tr}Check / Uncheck All{/tr}"}
+ </div>
+ {foreach $calendars as $calendarId => $calendar}
+ <div class="calcheckbox">
+ <input type="checkbox" name="calendarIds[]" value="{$calendarId|escape}" id="groupexcal_{$calendarId}"
+ {if in_array($calendarId, $displayedcals)}checked="checked"{/if}>
+ <label for="groupexcal_{$calendarId}" class="calId{$calendarId}">{$calendar.name|escape} ({tr}Id #{$calendarId}{/tr})</label>
+ </div>
+ {/foreach}
+ <div class="calcheckbox">
+ <a href="{$iCalAdvParamsUrl}">{tr}advanced parameters{/tr}</a>
+ </div>
+ <div class="calinput">
+ <input type="submit" class="btn btn-primary btn-sm" name="ical" value="{tr}Export as iCal{/tr}">
+ <input type="submit" class="btn btn-primary btn-sm" name="csv" value="{tr}Export as CSV{/tr}">
+ </div>
+ </form>
+ </div>
+{/if}
=====================================
templates/tiki-calendar.tpl
=====================================
@@ -118,35 +118,7 @@
{/jq}
</div>
- {if $tiki_p_view_events eq 'y' and $prefs.calendar_export eq 'y'}
- {button href="#" _onclick="toggle('exportcal');return false;" _text='{tr}Export{/tr}' _icon_name='export' _type='info'}
- <div class="d-inline-block">
- <form id="exportcal" class="card" method="post" action="tiki-calendar_export_ical.php" name="f" style="display:none;">
- <input type="hidden" name="export" value="y">
- <div class="card-header caltitle py-1 px-2">
- <strong>{tr}Export calendars{/tr}</strong>
- <button type="button" class="btn-close float-end" onclick="toggle('exportcal')" aria-hidden="true"></button>
- </div>
- <div class="caltoggle">
- {select_all checkbox_names='calendarIds[]' label="{tr}Check / Uncheck All{/tr}"}
- </div>
- {foreach $calendars as $calendarId => $calendar}
- <div class="calcheckbox">
- <input type="checkbox" name="calendarIds[]" value="{$calendarId|escape}" id="groupexcal_{$calendarId}"
- {if in_array($calendarId, $displayedcals)}checked="checked"{/if}>
- <label for="groupexcal_{$calendarId}" class="calId{$calendarId}">{$calendar.name|escape} ({tr}Id #{$calendarId}{/tr})</label>
- </div>
- {/foreach}
- <div class="calcheckbox">
- <a href="{$iCalAdvParamsUrl}">{tr}advanced parameters{/tr}</a>
- </div>
- <div class="calinput">
- <input type="submit" class="btn btn-primary btn-sm" name="ical" value="{tr}Export as iCal{/tr}">
- <input type="submit" class="btn btn-primary btn-sm" name="csv" value="{tr}Export as CSV{/tr}">
- </div>
- </form>
- </div>
- {/if}
+ {include file="export_calendar_in_csv_or_ical.tpl"}
<div id="configlinks" class="mb-3 text-end">
{if count($checkedCalIds)}
@@ -213,51 +185,7 @@
<a id="calendar-pdf-btn" href="#" class="text-end d-none">{icon name='pdf'} {tr}Export as PDF{/tr}</a>
{/if}
<div id="test"></div>
- <style type='text/css'>
- /* Fix pb with DatePicker */
- .ui-datepicker {
- z-index:9999 !important;
- }
- .fc .fc-scrollgrid, .fc .fc-scrollgrid table,
- .fc .fc-daygrid-body {
- width: 100% !important;
- }
- .fc-daygrid-event-harness {
- border-radius: 4px;
- margin: 0px 3px 0px;
- }
- .fc-event {
- display: block;
- white-space: break-spaces;
- }
- .fc-daygrid-day-events .fc-event-time {
- color: #ffffff;
- font-weight: bold;
- }
- .fc-daygrid-day-events .fc-event-title {
- color: #ffffff;
- font-weight: normal;
- }
- .fc-timegrid-event .fc-event-time {
- font-weight: bold;
- }
- .fc-timegrid-event .fc-event-title {
- font-weight: normal;
- }
- @media only screen and (max-width: 767px) {
- .fc-header-toolbar {
- display: block !important;
- }
- .fc-header-toolbar .fc-toolbar-chunk .btn-group .btn {
- padding: 0.375rem 0.1rem;
- }
- }
- @media print {
- .fc .fc-daygrid-day-top {
- border-bottom: 1px solid #dee2e6;
- }
- }
- </style>
+
<div id='currentcalitemId' class='d-none'>{$currentcalitemId}</div>
<div id='calendar'></div>
</div>
=====================================
templates/wiki-plugins/wikiplugin_calendar.tpl
=====================================
@@ -0,0 +1,23 @@
+<div>
+ {if $tiki_p_add_events eq 'y'}
+ <a href="{bootstrap_modal controller='calendar' action='edit_item' size='modal-lg' defaultCalendarId=$defaultCalendarId}" class="btn btn-primary">{icon name='create'} {tr}Add Event{/tr}</a>
+ {/if}
+ {if count($calendars) >= 1 && $viewnavbar eq 'y'}
+ {include file="export_calendar_in_csv_or_ical.tpl"}
+ {/if}
+
+ {if $viewlist neq 'list'}
+ {jq}
+ $("#calendar").setupFullCalendar({{$fullCalendarParams|json_encode}});
+ {{if $prefs.print_pdf_from_url neq 'none'}$("#calendar").addEventCalendarPrint('#calendar-pdf-btn', calendar);{/if}}
+ {/jq}
+ {/if}
+ {if $pdf_export eq 'y' and $pdf_warning eq 'n'}
+ <a id="calendar-pdf-btn" href="#" class="text-end d-none" role="button">{icon name='pdf'} {tr}Export as PDF{/tr}</a>
+ {/if}
+ <div id="test"></div>
+ <div id='calendar'></div>
+ {if $viewlist eq 'list'}
+ {$out}
+ {/if}
+</div>
=====================================
themes/base_files/scss/_tiki-calendar.scss
=====================================
@@ -91,4 +91,47 @@
.fc-semester-view .fc-daygrid-day-number, .fc-quarter-view .fc-daygrid-day-number {
width: fit-content;
border-radius: 8px;
-}
\ No newline at end of file
+}
+
+.ui-datepicker {
+ z-index:9999 !important;
+}
+.fc .fc-scrollgrid, .fc .fc-scrollgrid table,
+.fc .fc-daygrid-body {
+ width: 100% !important;
+}
+.fc-daygrid-event-harness {
+ border-radius: 4px;
+ margin: 0px 3px 0px;
+}
+.fc-event {
+ display: block;
+ white-space: break-spaces;
+}
+.fc-daygrid-day-events .fc-event-time {
+ color: #ffffff;
+ font-weight: bold;
+}
+.fc-daygrid-day-events .fc-event-title {
+ color: #ffffff;
+ font-weight: normal;
+}
+.fc-timegrid-event .fc-event-time {
+ font-weight: bold;
+}
+.fc-timegrid-event .fc-event-title {
+ font-weight: normal;
+}
+@media only screen and (max-width: 767px) {
+ .fc-header-toolbar {
+ display: block !important;
+ }
+ .fc-header-toolbar .fc-toolbar-chunk .btn-group .btn {
+ padding: 0.375rem 0.1rem;
+ }
+}
+@media print {
+ .fc .fc-daygrid-day-top {
+ border-bottom: 1px solid #dee2e6;
+ }
+}
=====================================
tiki-calendar_setup.php
=====================================
@@ -442,15 +442,14 @@ $smarty->assign(
'firstDayofWeek' => $firstDayofWeek,
'display_timezone' => $prefs['display_timezone'],
'language' => $prefs['language'],
- 'minHourOfDay' => $minHourOfDay,
- 'maxHourOfDay' => $maxHourOfDay,
+ 'minHourOfDay' => $minHourOfDay ? $minHourOfDay : "00:00:00",
+ 'maxHourOfDay' => $maxHourOfDay ? $maxHourOfDay : "23:00:00",
'slotDuration' => $slotDuration,
'initialView' => $initialView,
'initialDate' => "$focus_year-$focus_month-$focus_day",
]
);
-
if (empty($myurl)) {
$myurl = 'tiki-calendar.php';
}
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/153436bf4299b1e2ed077bc3093f34a0d1bdad23
--
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/153436bf4299b1e2ed077bc3093f34a0d1bdad23
You're receiving this email because of your account on gitlab.com.
_______________________________________________
TikiWiki-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs