[TikiWiki-commits] [Git][tikiwiki/tiki][master] [REF] Make the calendar plugin work using the same library as the main calendar

"Victor Emanouilov \(@kroky\) via TikiWiki-cvs" <[email protected]>
Newsgroups gmane.comp.cms.tiki.cvs
Message-ID <68b9af34aeed_2c4d51987406e@gitlab-sidekiq-low-urgency-cpu-bound-v2-77ffcd4d7b-264gb.mail>

Victor Emanouilov pushed to branch master at Tiki Wiki CMS Groupware / Tiki


Commits:
be566548 by franck franck kalunga at 2025-09-04T15:16:43+00:00
[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

- - - - -


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(
+        'eventCalendarParams',
+        [
+            '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
=====================================
@@ -95,35 +95,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)}
@@ -190,61 +162,7 @@
         <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>
-    <style type='text/css'>
-        /* Fix pb with DatePicker */
-        .ui-datepicker {
-            z-index:9999 !important;
-        }
-        .ec .ec-scrollgrid, .ec .ec-scrollgrid table,
-        .ec .ec-day-grid {
-            width: 100% !important;
-        }
-        .ec-day-grid-harness {
-            border-radius: 4px;
-            margin: 0px 3px 0px;
-        }
-        .ec-event {
-            display: block;
-            white-space: break-spaces;
-            margin-top: 1px;
-        }
-        .ec-events .ec-event-time {
-            color: #ffffff;
-            font-weight: bold;
-        }
-        .ec-events .ec-event-title {
-            color: #ffffff;
-            font-weight: normal;
-        }
-        .ec-time-grid-event .ec-event-time {
-            font-weight: bold;
-        }
-        .ec-time-grid .ec-event-title {
-            font-weight: normal;
-        }
-        .ec-dark .ec-active {
-            color: white;
-        }
-        article.tips {
-            display: flex;
-        }
-        .ec-event-tag {
-            height: auto;
-        }
-        @media only screen and (max-width: 767px) {
-            .ec-toolbar {
-                display: block !important;
-            }
-            .ec-toolbar .ec-button .btn-group .btn {
-                padding: 0.375rem 0.1rem;
-            }
-        }
-        @media print {
-            .ec .ec-day-grid-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").setupEventCalendar({{$eventCalendarParams|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>
\ No newline at end of file


=====================================
themes/base_files/scss/_tiki-calendar.scss
=====================================
@@ -130,3 +130,57 @@ h4.ec-event-title {
 .ec-days > time {
     display: block;
 }
+
+
+.ui-datepicker {
+    z-index:9999 !important;
+}
+.ec .ec-scrollgrid, .ec .ec-scrollgrid table,
+.ec .ec-day-grid {
+    width: 100% !important;
+}
+.ec-day-grid-harness {
+    border-radius: 4px;
+    margin: 0px 3px 0px;
+}
+.ec-event {
+    display: block;
+    white-space: break-spaces;
+    margin-top: 1px;
+}
+.ec-events .ec-event-time {
+    color: #ffffff;
+    font-weight: bold;
+}
+.ec-events .ec-event-title {
+    color: #ffffff;
+    font-weight: normal;
+}
+.ec-time-grid-event .ec-event-time {
+    font-weight: bold;
+}
+.ec-time-grid .ec-event-title {
+    font-weight: normal;
+}
+.ec-dark .ec-active {
+    color: white;
+}
+article.tips {
+    display: flex;
+}
+.ec-event-tag {
+    height: auto;
+}
+@media only screen and (max-width: 767px) {
+    .ec-toolbar {
+        display: block !important;
+    }
+    .ec-toolbar .ec-button .btn-group .btn {
+        padding: 0.375rem 0.1rem;
+    }
+}
+@media print {
+    .ec .ec-day-grid-day-top {
+        border-bottom: 1px solid #dee2e6;
+    }
+}


=====================================
tiki-calendar_setup.php
=====================================
@@ -439,15 +439,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/be566548a037e5e083e4df0051cb5959d5d81d16

-- 
View it on GitLab: https://gitlab.com/tikiwiki/tiki/-/commit/be566548a037e5e083e4df0051cb5959d5d81d16
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.