feature(LvPlan Feiertage): adds endpoint to fetch feiertage and adds renderer components for the feiertage in the LvPlan

This commit is contained in:
SimonGschnell
2025-06-30 11:40:18 +02:00
parent e3fe20831e
commit 1c29bcd685
8 changed files with 208 additions and 6 deletions
@@ -102,19 +102,37 @@ class LvPlan extends FHCAPI_Controller
'username' => getAuthUID()
]
);
$lvAndMoodleEvents = array_merge($lvplan_events,$moodle_events);
$this->load->model('education/Studentlehrverband_model','StudentLehrverbandModel');
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$current_Studiensemester = $this->StudiensemesterModel->getAkt();
$current_Studiensemester = $this->getDataOrTerminateWithError($current_Studiensemester);
$current_Studiensemester = current($current_Studiensemester)->studiensemester_kurzbz;
$studiengang = $this->StudentLehrverbandModel->loadWhere(["student_uid"=>getAuthUID(),"studiensemester_kurzbz"=>$current_Studiensemester]);
$studiengang = $this->getDataOrTerminateWithError($studiengang);
$studiengang = current($studiengang)->studiengang_kz;
$ferienEvents = $this->stundenplanlib->fetchFerienTageEvents($start_date, $end_date, $studiengang);
$result = array_merge($lvplan_events,$moodle_events);
$allEvents = array_merge($lvAndMoodleEvents,$ferienEvents);
// sort array with moodle events first
usort($result, function($a, $b){
usort($lvAndMoodleEvents, function($a, $b){
if ($a->type === 'moodle' && $b->type !== 'moodle') {
return -1;
} elseif ($a->type !== 'moodle' && $b->type === 'moodle') {
return 1;
} elseif ($a->type === 'ferien' && ($b->type !== 'moodle' && $b->type !== 'ferien')) {
return -1;
} elseif (($a->type !== 'ferien' && $a->type !== 'moodle') && $b->type === 'ferien') {
return 1;
} else {
return 0;
}
});
$this->terminateWithSuccess($result);
$this->terminateWithSuccess($allEvents);
}
//TODO: delete this function if we don't use the old calendar export endpoints anymore
+10
View File
@@ -23,4 +23,14 @@ Events::on('loadRenderers', function ($renderers) {
);
});
Events::on('loadRenderers', function ($renderers) {
$fhc_core_renderers =& $renderers();
$fhc_core_renderers["ferien"] = array(
'calendarEvent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/calendarEvent.js',
'modalTitle' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalTitle.js',
'modalContent' => APP_ROOT.'public/js/components/Cis/Renderer/Feiertage/modalContent.js',
'calendarEventStyles' => APP_ROOT.'public/css/Cis4/CoreCalendarEvents.css'
);
});
+60
View File
@@ -254,6 +254,66 @@ class StundenplanLib{
}
}
public function fetchFerienTageEvents($start_date, $end_date, $studiengang_kz){
$this->_ci =& get_instance();
$this->_ci->load->model('organisation/Ferien_model','FerienModel');
$ferienEvents = $this->_ci->FerienModel->execReadOnlyQuery("
SELECT *
FROM lehre.tbl_ferien
WHERE (bisdatum BETWEEN ? AND ?) AND (studiengang_kz = 0 OR studiengang_kz = ?)
",[$start_date, $end_date, $studiengang_kz]);
if (isError($ferienEvents)) {
return error(getData($ferienEvents));
}
$ferienEvents = getData($ferienEvents);
$ferienEvents = array_map(function($event){
$event_start = new DateTime($event->vondatum);
$event_end = new DateTime($event->bisdatum);
$event_end->modify('+1 day');
$interval = new DateInterval('P1D');
$period = new DatePeriod($event_start, $interval, $event_end);
$event->dates = array_map(function($date){
return $date->format('Y-m-d');
}, iterator_to_array($period));
return $event;
}, $ferienEvents);
$ferienEventsFlattened=[];
foreach($ferienEvents as $ferien_event){
foreach($ferien_event->dates as $date){
$event = new stdClass();
$event->bezeichnung = $ferien_event->bezeichnung;
$event->datum = $date;
$event->type = 'ferien';
$ferienEventsFlattened[] = $event;
}
};
$today=new DateTime();
$ferienEventsFlattened = array_map(function($event) use($today){
$ferien_event = (object) array(
'type' => 'ferien',
'beginn' => $today->format('H:i:s'),
'ende' => $today->format('H:i:s'),
'allDayEvent' => true,
'datum' => $event->datum,
'topic' => $event->bezeichnung,
'titel' => $event->bezeichnung,
'farbe' => '00689E'
);
return $ferien_event;
}, $ferienEventsFlattened);
return $ferienEventsFlattened;
}
// start of the private functions ########################################################################################################
// function used to sort an array of studiensemester strings
private function sortStudienSemester(&$semester_range){
usort(
+51 -3
View File
@@ -1,4 +1,4 @@
/* Moodle Events in Month Page */
/* Lehreinheits Events in Month Page */
.monthPageContainer .lehreinheitEventContent{
display: flex;
border-bottom: 1px solid var(--bs-border-color);
@@ -24,7 +24,7 @@
display:none;
}
/* Moodle Events in Week Page */
/* Lehreinheits Events in Week Page */
.weekPageContainer .lehreinheitEventContent {
display: grid;
grid-template-columns: auto 1fr;
@@ -50,7 +50,7 @@
}
/* Moodle Events in Day Page */
/* Lehreinheits Events in Day Page */
.dayPageContainer .lehreinheitEventContent {
display: flex;
padding-left:4rem;
@@ -72,3 +72,51 @@
font-weight: 500;
}
/* Ferientage Events in Month Page */
.monthPageContainer .feiertagEventContent {
display: grid;
grid-template-columns: auto 1fr;
justify-items: center;
align-items:center;
color: var(--fhc-light);
}
.monthPageContainer .feiertagEventContent #ferienEventIcon{
margin: 0.5rem;
}
.monthPageContainer .feiertagEventContent #ferienEventTitle {
}
/* Ferientage Events in Week Page */
.weekPageContainer .feiertagEventContent {
display: grid;
grid-template-columns: auto 1fr;
justify-items: center;
align-items:center;
color: var(--fhc-light);
}
.weekPageContainer .feiertagEventContent #ferienEventIcon {
margin: 0.25rem;
}
.weekPageContainer .feiertagEventContent #ferienEventTitle {
}
/* Ferientage Events in Day Page */
.dayPageContainer .feiertagEventContent {
display: grid;
grid-template-columns: auto 1fr;
justify-items: center;
align-items: center;
color: var(--fhc-light);
}
.dayPageContainer .feiertagEventContent #ferienEventIcon {
margin: 0.5rem;
}
.dayPageContainer .feiertagEventContent #ferienEventTitle {}
@@ -0,0 +1,14 @@
export default {
props: {
event: {
type: Object,
required: true,
},
},
template: `
<div class="feiertagEventContent " >
<i id="ferienEventIcon" class="fa-regular fa-calendar"></i>
<span id="ferienEventTitle" ><strong>{{event.titel}}</strong></span>
</div>`,
};
@@ -0,0 +1,21 @@
import { formatDate } from "../../../../helpers/DateHelpers.js"
export default {
props:{
event: {
type: Object,
required: true,
},
},
methods:{
methodFormatDate: function (d) {
return formatDate(d);
},
},
template: `
<div>
<h2>{{event.titel ? event.titel : event.topic}}</h2>
<p><i id="ferienEventIcon" class="fa-regular fa-calendar me-2"></i>{{methodFormatDate(event?.datum)}}</p>
</div>`,
}
@@ -0,0 +1,11 @@
export default {
props:{
event: {
type: Object,
required: true,
}
},
template:`
<div>{{ $p.t('global','feiertag') }}</div>
`
}
+20
View File
@@ -188,6 +188,26 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'global',
'phrase' => 'feiertag',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Feiertag',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Holiday',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'global',