Basic release

This commit is contained in:
2023-12-30 14:28:21 +01:00
parent 4869f1ef2f
commit bf2892ab29
125 changed files with 10729 additions and 0 deletions
assets
bdp-kompass.php
buena
core
holz.jpgicon.icoicon.pngicon.svg
lib/ics-parser
modules
plugins/pfadfinden-theme-updater
style.css

@ -0,0 +1,13 @@
<?php
require_once dirname(__FILE__) . '/../../../../../wp-config.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/option.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/plugin.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/load.php';
require_once dirname(__FILE__) . '/../../../../../wp-includes/cache.php';
require_once dirname(__FILE__) . '/../../lib/ics-parser/Event.php';
require_once dirname(__FILE__) . '/../../lib/ics-parser/ICal.php';
require_once 'calendar.php';
$calendar = new Calendar();
echo $calendar->show();

@ -0,0 +1,22 @@
// Funktion zum Laden des Kalenders über AJAX
function loadCalendar(month, year) {
// Erstelle ein XMLHttpRequest-Objekt
var xhr = new XMLHttpRequest();
// Definiere die URL zum Laden des Kalenders (angepasst an deine Bedürfnisse)
var url = '/wp-content/plugins/bdp-kompass/modules/calendar/ajax-calendar.php?month=' + month + '&year=' + year;
// Öffne eine GET-Anfrage
xhr.open('GET', url, true);
// Setze die Callback-Funktion für die Antwort
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
// Aktualisiere den Inhalt des Container-Divs mit der Kalenderantwort
document.getElementById('calendarContainer').innerHTML = xhr.responseText;
}
};
// Sende die Anfrage
xhr.send();
}

@ -0,0 +1,217 @@
/*******************************Calendar Top Navigation*********************************/
div#calendar{
margin:0px auto;
padding:0px;
width: 100%;
font-family:Helvetica, "Times New Roman", Times, serif;
}
div#calendar div.box{
position:relative;
top:0px;
left:0px;
width:100%;
height:40px;
background-color: #ffcb04;
}
div#calendar div.header{
line-height:40px;
vertical-align:middle;
position:absolute;
left:11px;
top:0px;
width:100%;
height:40px;
text-align:center;
}
div#calendar div.header a.prev,div#calendar div.header a.next{
position:absolute;
top:0px;
padding-right: 20px;
height: 17px;
display:block;
cursor:pointer;
text-decoration:none;
color:#3163bd;
font-weight: bold;
}
div#calendar div.header span.title{
color:#3163bd;
font-weight: bold;
font-size:18px;
}
div#calendar div.header a.prev{
left:0px;
}
div#calendar div.header a.next{
right:0px;
}
/*******************************Calendar Content Cells*********************************/
div#calendar div.box-content{
border-top:none;
width: 100%;
}
div#calendar ul.label{
float:left;
margin: 0px;
padding: 0px;
margin-top:5px;
margin-left: 5px;
width: 100%;
}
div#calendar ul.label li{
margin:0px;
padding:0px;
float:left;
list-style-type:none;
height:40px;
line-height:40px;
vertical-align:middle;
text-align:center;
color:#000;
font-size: 15px;
background-color: transparent;
}
div#calendar ul.dates{
float:left;
margin: 0px;
padding: 0px;
margin-left: 5px;
margin-bottom: 5px;
}
.bdp_cal_day
{
padding-left: 5px;
color: #a0a0a0;
}
bdp_cal_day td {
min-height: 100px;
}
.bdp_event_table {
width:95%;
}
.bdp_cal_day ul {
padding: 0;
}
.bdp_cal_day li {
list-style-type: none;
width:95%;
font-size: 8pt;
font-weight: bold;
padding: 2px;
margin-bottom: 2px;
}
.bdp_cal_event_red,
.bdp_cal_event_yellow,
.bdp_cal_event_blue,
.bdp_cal_event_green,
.bdp_cal_event_grey,
.bdp_cal_event_fuchsia,
.bdp_cal_event_orange
{
padding: 2px 4px;
border-radius: 5px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.bdp_cal_event_blue {
background-color: #1e88e5;
color: #FFFFFF;
}
.bdp_cal_event_green {
background-color: #00d084;
color: #000000;
}
.bdp_cal_event_red
{
.bdp_cal_event_entry;
background-color: #e91e63;
color: #ffffff;
}
.bdp_cal_event_yellow
{
.bdp_cal_event_entry;
background-color: #eeee88;
color: #000000;
}
.bdp_cal_event_orange
{
.bdp_cal_event_entry;
background-color: #ffa747;
color: #000000;
}
.bdp_cal_event_grey
{
.bdp_cal_event_entry;
background-color: #D5D5D5;
color: #000000;
}
.bdp_cal_event_fuchsia
{
.bdp_cal_event_entry;
background-color: #FF6EFF;
color: #000000;
}
/** overall width = width+padding-right**/
div#calendar ul.dates li{
margin:0px;
padding:0px;
padding-left: 2px;
padding-top: 10px;
vertical-align:bottom;
float:left;
list-style-type:none;
width:15%;
height:100px;
font-size:12pt;
background-color: #fff;
color:#000;
border-style: solid;
border-width:1px;
border-color: #add8e6;
}
:focus{
outline:none;
}
div.clear{
clear:both;
}

@ -0,0 +1,6 @@
<?php
add_filter('the_content', ['Calendar', 'printCalendar']);
wp_enqueue_style('bdp_calendar_css', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/calendar.css');
wp_enqueue_script( 'loadCalendar', BDP_LV_PLUGIN_URL . '/modules/calendar/assets/ajaxscript.js');
require_once dirname(__FILE__) . '/classes/Calendar.class.php';

@ -0,0 +1,315 @@
<?php
class Calendar
{
public $ical;
private $categories = [];
public static function setup()
{
$pageName = 'Kalender';
$page_exists = get_page_by_path($pageName, OBJECT, 'page');
// Wenn die Seite nicht existiert, erstelle sie
if (!$page_exists) {
$page_id = wp_insert_post(array(
'post_title' => $pageName,
'post_content' => '{{calendar}}',
'post_status' => 'publish',
'post_type' => 'page',
));
update_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
}
}
public static function printCalendar($content) {
// Der zu ersetzende String
$original_string = '{{calendar}}';
$calendar = new Calendar();
// Der Ersatzstring
$replacement_string = $calendar->show();
// Ersetze den Originalstring durch den Ersatzstring im Seiteninhalt
$content = str_replace($original_string, $replacement_string, $content);
return $content;
}
/**
* Constructor
*/
public function __construct()
{
$categories = get_option('bdp_calendar_categories', null);
if (null !== $categories) {
$categories = json_decode($categories, true);
} else {
$categories = [
'yellow' => 'Meute',
'blue' => 'Sippe',
'red' => 'Runde',
'green' => 'StaFü',
'fuchsia' => '',
'orange' => ''
];
}
foreach ($categories as $color => $keyname) {
$this->categories[$keyname] = $color;
}
$calendarUrl = get_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
$this->ical = new \ICal('', array(
'defaultSpan' => 2, // Default value
'defaultTimeZone' => '',
'defaultWeekStart' => 'MO', // Default value
'disableCharacterReplacement' => false, // Default value
'filterDaysAfter' => null, // Default value
'filterDaysBefore' => null, // Default value
'httpUserAgent' => null, // Default value
'skipRecurrence' => false, // Default value
));
$this->ical->initUrl($calendarUrl);
$this->ical->events();
$this->naviHref = htmlentities($_SERVER['PHP_SELF']);
}
/********************* PROPERTY ********************/
private $dayLabels = array("Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son");
private $monthLabels = ['', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
private $currentYear = 0;
private $currentMonth = 0;
private $currentDay = 0;
private $currentDate = null;
private $daysInMonth = 0;
private $naviHref = null;
/********************* PUBLIC **********************/
/**
* print out the calendar
*/
public function show()
{
$year = null;
$month = null;
if (null == $year && isset($_GET['year'])) {
$year = $_GET['year'];
} else if (null == $year) {
$year = date("Y", time());
}
if (null == $month && isset($_GET['month'])) {
$month = $_GET['month'];
} else if (null == $month) {
$month = date("m", time());
}
$this->currentYear = $year;
$this->currentMonth = $month;
$this->daysInMonth = $this->_daysInMonth($month, $year);
$content = ' <div id="calendarContainer"><div id="calendar">' .
'<div class="box">' .
$this->_createNavi() .
'</div>' .
'<div class="box-content">' .
'<table style=" border-collapse: collapse; border-spacing: 0; table-layout: fixed;width: 100%;">
<tr>' . $this->_createLabels() . '</tr>';
$weeksInMonth = $this->_weeksInMonth($month, $year);
// Create weeks in a month
for ($i = 0; $i < $weeksInMonth; $i++) {
//Create days in a week
for ($j = 1; $j <= 7; $j++) {
if ($j % 7 == 1) {
$content .= '</tr><tr class="bdp_cal_day">';
}
$content .= $this->_showDay($i * 7 + $j);
}
}
$content .= '</table></div>';
return $content;
}
private function getCssClass($category)
{
$cssClass = 'bdp_cal_event_' . ($this->categories[$category] ?? 'grey');
return $cssClass;
}
private function getEvent($date)
{
$eventString = '<ul>';
#echo '<pre>';
foreach ($this->ical->filterByDate($date) as $curEvent) {
$time = $curEvent->getEventTime() ?? 'Ganztags';
#print_r($curEvent);
$eventString .= '<li class="' . $this->getCssClass($curEvent->category) . '">' .
$time . ':<br />' .
$curEvent->summary . '</li>';
}
return $eventString;
}
/********************* PRIVATE **********************/
/**
* create the li element for ul
*/
private function _showDay($cellNumber)
{
if ($this->currentDay == 0) {
$firstDayOfTheWeek = date('N', strtotime($this->currentYear . '-' . $this->currentMonth . '-01'));
if (intval($cellNumber) == intval($firstDayOfTheWeek)) {
$this->currentDay = 1;
}
}
if (($this->currentDay != 0) && ($this->currentDay <= $this->daysInMonth)) {
$date =
str_pad($this->currentDay, 2, '0', STR_PAD_LEFT) . '.' .
str_pad($this->currentMonth, 2, '0', STR_PAD_LEFT) . '.' .
$this->currentYear;
$this->currentDate = date('Y-m-d', strtotime($this->currentYear . '-' . $this->currentMonth . '-' . ($this->currentDay)));
$cellContent = '<span class="bdp_cal_day">' . $this->currentDay . '</span>' . $this->getEvent($date);
$this->currentDay++;
} else {
$this->currentDate = null;
$cellContent = null;
}
return '<td style="padding-top: 5px; border-color: #a0a0a0; height: 120px; border-style: solid; border-width:1px; vertical-align: top;">' . $cellContent . '</td>';
}
/**
* create navigation
*/
private function _createNavi()
{
$nextMonth = $this->currentMonth == 12 ? 1 : intval($this->currentMonth) + 1;
$nextYear = $this->currentMonth == 12 ? intval($this->currentYear) + 1 : $this->currentYear;
$preMonth = $this->currentMonth == 1 ? 12 : intval($this->currentMonth) - 1;
$preYear = $this->currentMonth == 1 ? intval($this->currentYear) - 1 : $this->currentYear;
return
'<div class="header">' .
'<a class="prev" href="javascript:void(0);" onclick="loadCalendar(' . $preMonth . ',' . $preYear . ');"><< Vorheriger Monat</a>' .
'<span class="title">' . $this->monthLabels[(int)date('m', strtotime($this->currentYear . '-' . $this->currentMonth . '-1'))] . ' ' . date('Y', strtotime($this->currentYear . '-' . $this->currentMonth . '-1')) . '</span>' .
'<a class="next" href="javascript:void(0);" onclick="loadCalendar(' . $nextMonth . ',' . $nextYear . ');">Nächster Monat >></a>' .
'</div>';
}
/**
* create calendar week labels
*/
private function _createLabels()
{
$content = '';
foreach ($this->dayLabels as $index => $label) {
$content .= '<td style="max-width: 14.287%;">' . $label . '</td>';
}
return $content;
}
/**
* calculate number of weeks in a particular month
*/
private function _weeksInMonth($month = null, $year = null)
{
if (null == ($year)) {
$year = date("Y", time());
}
if (null == ($month)) {
$month = date("m", time());
}
// find number of days in this month
$daysInMonths = $this->_daysInMonth($month, $year);
$numOfweeks = ($daysInMonths % 7 == 0 ? 0 : 1) + intval($daysInMonths / 7);
$monthEndingDay = date('N', strtotime($year . '-' . $month . '-' . $daysInMonths));
$monthStartDay = date('N', strtotime($year . '-' . $month . '-01'));
if ($monthEndingDay < $monthStartDay) {
$numOfweeks++;
}
return $numOfweeks;
}
/**
* calculate number of days in a particular month
*/
private function _daysInMonth($month = null, $year = null)
{
if (null == ($year))
$year = date("Y", time());
if (null == ($month))
$month = date("m", time());
return date('t', strtotime($year . '-' . $month . '-01'));
}
}

@ -0,0 +1,91 @@
<?php
echo '<div id="wpbody-content">';
echo '<h1>Kalender-Einstellungen</h1>';
if (isset($_POST['submit'])) {
echo '<div id="bdp_success">Die Einstellungen wurden gespeichert.</div>';
update_option('bdp_calendar_categories', json_encode($_POST['category']));
update_option('bdp_calendar_source_url', $_POST['ical_url']);
}
$categories = get_option('bdp_calendar_categories', null);
if (null !== $categories) {
$categories = json_decode($categories, true);
} else {
$categories = [
'yellow' => 'Meute',
'blue' => 'Sippe',
'red' => 'Runde',
'green' => 'Stammesführung',
'fuchsia' => '',
'orange' => ''
];
}
?>
<form method="post" action="admin.php?page=bdp-kompass%2Fmodules%2Findex.php&loadmodule=calendar">
<div class="bdp_cal_outer">
<fieldset class="bdp_cal_inner">
<legend>Datenabfrage</legend>
<table>
<tr style="vertical-align: top;">
<td>Kalender-URL:</td>
<td><input class="long_text" type="text" name="ical_url" id="ical_url" required
value = "<?php echo get_option('bdp_calendar_source_url', ''); ?>"
><br />
<label style="font-weight: normal; color: #a0a0a0; font-style: italic">
Bitte gib hier die URL zur .ics - Datei eures Kalenbders im Wiki ein.
</label>
</td>
</tr>
</table>
</fieldset>
<fieldset class="bdp_cal_inner">
<legend>Labels</legend>
<table>
<tr>
<td>Gelb:</td>
<td><input type="text" name="category[yellow]" value="<?php echo $categories['yellow']; ?>" /></td>
<td class="bdp_cal_event_yellow"></td>
</tr>
<tr>
<td>Blau:</td>
<td><input type="text" name="category[blue]" value="<?php echo $categories['blue']; ?>" /></td>
<td class="bdp_cal_event_blue"></td>
</tr>
<tr>
<td>Rot:</td>
<td><input type="text" name="category[red]" value="<?php echo $categories['red']; ?>" /></td>
<td class="bdp_cal_event_red"></td>
</tr>
<tr>
<td>Grün:</td>
<td><input type="text" name="category[green]" value="<?php echo $categories['green']; ?>" /></td>
<td class="bdp_cal_event_green"></td>
</tr>
<tr>
<td>Fuchsia:</td>
<td><input type="text" name="category[fuchsia]" value="<?php echo $categories['fuchsia']; ?>" /></td>
<td class="bdp_cal_event_fuchsia"></td>
</tr>
<tr>
<td>Orange:</td>
<td><input type="text" name="category[orange]" value="<?php echo $categories['orange']; ?>" /></td>
<td class="bdp_cal_event_orange"></td>
</tr>
<tr>
<td>Grau:</td>
<td>Standard</td>
<td class="bdp_cal_event_grey"></td>
</tr>
</table>
</fieldset>
<input class="bdp_submit" type="submit" name="submit" value="Einstellungen speichern">
</form>
</div>
</div>