[TikiWiki-commits] [Git][tikiwiki/tiki][27.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 <68c2b8b58c96a_2c1646d8c94816@gitlab-sidekiq-low-urgency-cpu-bound-v2-c6f5977fd-cgzbk.mail>

franck franck kalunga pushed to branch 27.x at Tiki Wiki CMS Groupware / Tiki


Commits:
18fd52c2 by franck franck kalunga at 2025-09-11T11:49:06+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 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

See merge request tikiwiki/tiki!8564

- - - - -


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
=====================================
@@ -117,35 +117,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)}
@@ -212,51 +184,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
=====================================
@@ -445,15 +445,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/18fd52c26e0905f3eb97a226410947745590f98e

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/18fd52c26e0905f3eb97a226410947745590f98e
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.