130 lines
4.2 KiB
PHP
130 lines
4.2 KiB
PHP
<?php
|
|
|
|
use dokuwiki\Extension\SyntaxPlugin;
|
|
use dokuwiki\plugin\luxtools\CalendarService;
|
|
use dokuwiki\plugin\luxtools\CalendarSlot;
|
|
use dokuwiki\plugin\luxtools\ChronoID;
|
|
|
|
require_once(__DIR__ . '/../autoload.php');
|
|
|
|
/**
|
|
* luxtools Plugin: Maintenance task list syntax.
|
|
*
|
|
* Renders a list of all non-completed maintenance tasks due today or earlier.
|
|
*
|
|
* Syntax:
|
|
* {{maintenance_tasks>}}
|
|
*/
|
|
class syntax_plugin_luxtools_maintenance extends SyntaxPlugin
|
|
{
|
|
/** @inheritdoc */
|
|
public function getType()
|
|
{
|
|
return 'substition';
|
|
}
|
|
|
|
/** @inheritdoc */
|
|
public function getPType()
|
|
{
|
|
return 'block';
|
|
}
|
|
|
|
/** @inheritdoc */
|
|
public function getSort()
|
|
{
|
|
return 225;
|
|
}
|
|
|
|
/** @inheritdoc */
|
|
public function connectTo($mode)
|
|
{
|
|
$this->Lexer->addSpecialPattern(
|
|
'\{\{maintenance_tasks>\}\}',
|
|
$mode,
|
|
'plugin_luxtools_maintenance'
|
|
);
|
|
}
|
|
|
|
/** @inheritdoc */
|
|
public function handle($match, $state, $pos, Doku_Handler $handler)
|
|
{
|
|
return ['ok' => true];
|
|
}
|
|
|
|
/** @inheritdoc */
|
|
public function render($format, Doku_Renderer $renderer, $data)
|
|
{
|
|
if ($data === false || !is_array($data)) return false;
|
|
if ($format !== 'xhtml') return false;
|
|
if (!($renderer instanceof Doku_Renderer_xhtml)) return false;
|
|
|
|
$renderer->nocache();
|
|
|
|
$slots = CalendarSlot::loadAll($this);
|
|
$maintenanceSlot = $slots['maintenance'] ?? null;
|
|
|
|
if ($maintenanceSlot === null || !$maintenanceSlot->isEnabled()) {
|
|
$renderer->doc .= '<div class="luxtools-plugin luxtools-maintenance-tasks">'
|
|
. '<p class="luxtools-empty">'
|
|
. hsc($this->getLang('maintenance_no_tasks'))
|
|
. '</p></div>';
|
|
return true;
|
|
}
|
|
|
|
$todayIso = date('Y-m-d');
|
|
$tasks = CalendarService::openMaintenanceTasks($maintenanceSlot, $todayIso);
|
|
|
|
$title = (string)$this->getLang('chronological_maintenance_title');
|
|
if ($title === '') $title = 'Tasks';
|
|
|
|
$renderer->doc .= '<div class="luxtools-plugin luxtools-maintenance-tasks">';
|
|
$renderer->doc .= '<h3>' . hsc($title) . '</h3>';
|
|
|
|
if ($tasks === []) {
|
|
$noTasks = (string)$this->getLang('maintenance_no_tasks');
|
|
if ($noTasks === '') $noTasks = 'No open tasks.';
|
|
$renderer->doc .= '<p class="luxtools-empty">' . hsc($noTasks) . '</p>';
|
|
} else {
|
|
$renderer->doc .= '<ul class="luxtools-maintenance-task-list">';
|
|
foreach ($tasks as $task) {
|
|
$overdue = ($task->dateIso < $todayIso);
|
|
$classes = 'luxtools-maintenance-task-item';
|
|
if ($overdue) {
|
|
$classes .= ' luxtools-task-overdue';
|
|
}
|
|
|
|
$renderer->doc .= '<li class="' . $classes . '"';
|
|
$renderer->doc .= ' data-uid="' . hsc($task->uid) . '"';
|
|
$renderer->doc .= ' data-date="' . hsc($task->dateIso) . '"';
|
|
$renderer->doc .= ' data-recurrence="' . hsc($task->recurrenceId) . '"';
|
|
$renderer->doc .= '>';
|
|
|
|
// Date badge
|
|
$renderer->doc .= '<span class="luxtools-task-date">' . hsc($task->dateIso) . '</span> ';
|
|
|
|
// Time if not all-day
|
|
if ($task->time !== '') {
|
|
$renderer->doc .= '<span class="luxtools-task-time">' . hsc($task->time) . '</span> ';
|
|
}
|
|
|
|
// Summary
|
|
$renderer->doc .= '<span class="luxtools-task-summary">' . hsc($task->summary) . '</span>';
|
|
|
|
// Complete button
|
|
$completeLabel = (string)$this->getLang('maintenance_task_complete');
|
|
if ($completeLabel === '') $completeLabel = 'Complete';
|
|
$renderer->doc .= ' <button class="luxtools-task-complete-btn" type="button"'
|
|
. ' data-action="complete"'
|
|
. '>' . hsc($completeLabel) . '</button>';
|
|
|
|
$renderer->doc .= '</li>';
|
|
}
|
|
$renderer->doc .= '</ul>';
|
|
}
|
|
|
|
$renderer->doc .= '</div>';
|
|
|
|
return true;
|
|
}
|
|
}
|