diff --git a/application/controllers/api/frontend/v1/LvPlan.php b/application/controllers/api/frontend/v1/LvPlan.php index 07435c9e5..3e0bf3d50 100644 --- a/application/controllers/api/frontend/v1/LvPlan.php +++ b/application/controllers/api/frontend/v1/LvPlan.php @@ -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 diff --git a/application/core/Events.php b/application/core/Events.php index 9ad474fc5..b689a99d3 100644 --- a/application/core/Events.php +++ b/application/core/Events.php @@ -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' + ); +}); + diff --git a/application/libraries/StundenplanLib.php b/application/libraries/StundenplanLib.php index 8cb37658e..b2c82fd77 100644 --- a/application/libraries/StundenplanLib.php +++ b/application/libraries/StundenplanLib.php @@ -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( diff --git a/public/css/Cis4/CoreCalendarEvents.css b/public/css/Cis4/CoreCalendarEvents.css index 17dc817ef..99dd58b49 100644 --- a/public/css/Cis4/CoreCalendarEvents.css +++ b/public/css/Cis4/CoreCalendarEvents.css @@ -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 {} \ No newline at end of file diff --git a/public/js/components/Cis/Renderer/Feiertage/calendarEvent.js b/public/js/components/Cis/Renderer/Feiertage/calendarEvent.js new file mode 100644 index 000000000..b3367b64e --- /dev/null +++ b/public/js/components/Cis/Renderer/Feiertage/calendarEvent.js @@ -0,0 +1,14 @@ + +export default { + props: { + event: { + type: Object, + required: true, + }, + }, + template: ` +
+ + {{event.titel}} +
`, +}; \ No newline at end of file diff --git a/public/js/components/Cis/Renderer/Feiertage/modalContent.js b/public/js/components/Cis/Renderer/Feiertage/modalContent.js new file mode 100644 index 000000000..aa0db470c --- /dev/null +++ b/public/js/components/Cis/Renderer/Feiertage/modalContent.js @@ -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: ` +
+

{{event.titel ? event.titel : event.topic}}

+

{{methodFormatDate(event?.datum)}}

+
`, +} \ No newline at end of file diff --git a/public/js/components/Cis/Renderer/Feiertage/modalTitle.js b/public/js/components/Cis/Renderer/Feiertage/modalTitle.js new file mode 100644 index 000000000..59feee375 --- /dev/null +++ b/public/js/components/Cis/Renderer/Feiertage/modalTitle.js @@ -0,0 +1,11 @@ +export default { + props:{ + event: { + type: Object, + required: true, + } + }, + template:` +
{{ $p.t('global','feiertag') }}
+` +} \ No newline at end of file diff --git a/system/phrasesupdate.php b/system/phrasesupdate.php index 43913661a..6aeeca9cd 100644 --- a/system/phrasesupdate.php +++ b/system/phrasesupdate.php @@ -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',