diff --git a/app/routes/Semester.php b/app/routes/Semester.php index 13639534137403ebd8cb7000b31d5a14dc754431..52de1e76c6641ee5102498758becbd9b93dfb525 100644 --- a/app/routes/Semester.php +++ b/app/routes/Semester.php @@ -42,6 +42,44 @@ class Semester extends \RESTAPI\RouteMap return $this->paginated($json, $total); } + /** + * Returns the semester week as string for a given string + * + * @get /semester/:timestamp/week + */ + public function getSemesterWeek(int $timestamp) + { + $semester = \Semester::findByTimestamp($timestamp); + if (!$semester) { + return null; + } + $timestamp = strtotime('today', $timestamp); + $week_begin_timestamp = strtotime('monday this week', $semester->vorles_beginn); + $end_date = $semester->vorles_ende; + + $i = 0; + $result = [ + 'semester_name' => (string)$semester->name, + 'week_number' => sprintf(_('KW %u'), date('W', $timestamp)), + 'current_day' => strftime('%x', $timestamp) + ]; + while ($week_begin_timestamp < $end_date) { + $next_week_timestamp = strtotime('+1 week', $week_begin_timestamp); + if ($week_begin_timestamp <= $timestamp && $timestamp < $next_week_timestamp) { + $result['sem_week'] = sprintf( + _('%u. Vorlesungswoche (ab %s)'), + $i + 1, + strftime('%x', $week_begin_timestamp)); + break; + } + $i += 1; + + $week_begin_timestamp = $next_week_timestamp; + } + + return $result; + } + /** * Returns a single semester. * diff --git a/app/views/resources/room_planning/booking_plan.php b/app/views/resources/room_planning/booking_plan.php index 0c2944ada7dc1ac85e1acc002ca257677fc8f298..d314218c0c59121a960239cfb95247dff9e031b6 100644 --- a/app/views/resources/room_planning/booking_plan.php +++ b/app/views/resources/room_planning/booking_plan.php @@ -19,13 +19,10 @@ <?= htmlReady($resource->name) ?> <? endif ?> <span id="booking-plan-header-semrow"> - <strong> - <span id="booking-plan-header-semname"></span> - <span id="booking-plan-header-semweek-part"> - <?= _('Vorlesungswoche') ?> - <span id="booking-plan-header-semweek"></span> - </span> - </strong> + <strong><span id="booking-plan-header-semname"></span> </strong> + <span id="booking-plan-header-semweek-part"> + <span id="booking-plan-header-semweek"></span> + </span> </span> </span> <? if ($resource->getProperty('room_administrator')): ?> diff --git a/app/views/resources/room_planning/semester_plan.php b/app/views/resources/room_planning/semester_plan.php index 34e8f9d5d91371dc5dc20ac4f82f58fa560e50d0..55d7056a2396a8e624cbfe6a2ee802cfa395e391 100644 --- a/app/views/resources/room_planning/semester_plan.php +++ b/app/views/resources/room_planning/semester_plan.php @@ -50,9 +50,10 @@ <?= htmlReady($resource->name) ?> <? endif ?> <span id="booking-plan-header-semrow"> - <strong> - <?= _('Semester') ?> - <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span> + <strong> + <?= _('Semester') ?> + <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span> + </strong> <span id="booking-plan-header-semspan"> <? if (Request::get("semester_timerange") == 'fullsem') : ?> <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?> @@ -60,7 +61,6 @@ <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?> <? endif ?> </span> - </strong> </span> </div> <? if ($resource->getProperty('room_administrator')): ?> diff --git a/app/views/resources/room_request/planning.php b/app/views/resources/room_request/planning.php index 9b645a64b6765f52d69c719f0425fba21ac8d19a..20e9efb33a2c81d4f02304bb824c9adb0e00dc0e 100644 --- a/app/views/resources/room_request/planning.php +++ b/app/views/resources/room_request/planning.php @@ -32,14 +32,14 @@ <strong> <?= _('Semester') ?> <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span> - <span id="booking-plan-header-semspan"> - <? if (Request::get("semester_timerange") == 'fullsem') : ?> - <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->beginn), date('d.m.Y', $semester->ende)); ?> - <? else : ?> - <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?> - <? endif ?> - </span> </strong> + <span id="booking-plan-header-semspan"> + <? if (Request::get("semester_timerange") == 'fullsem') : ?> + <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->beginn), date('d.m.Y', $semester->ende)); ?> + <? else : ?> + <?= sprintf('(%1$s - %2$s)', date('d.m.Y', $semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?> + <? endif ?> + </span> </span> </div> <? if ($resource->getProperty('room_administrator')): ?> diff --git a/app/views/room_management/planning/index.php b/app/views/room_management/planning/index.php index f42f8a0077583c6b5b6faf8174447863ffe43974..c5d7d5fa250261d33713ff7b07a45cd6e294b210 100644 --- a/app/views/room_management/planning/index.php +++ b/app/views/room_management/planning/index.php @@ -18,18 +18,14 @@ <div> <?= _('Raumgruppe') ?> <span id="booking-plan-header-roomgroup"><?= htmlReady($clipboard->name) ?></span> - <strong> - <?= _('KW') ?> - <span id="booking-plan-header-calweek"></span> - (<span id="booking-plan-header-calbegin"></span>) - <span id="booking-plan-header-semrow"> - <span id="booking-plan-header-semname"></span> - <span id="booking-plan-header-semweek-part"> - <?= _('Vorlesungswoche') ?> - <span id="booking-plan-header-semweek"></span> - </span> + <span id="booking-plan-header-calweek"></span> + <span id="booking-plan-header-calbegin"></span> + <span id="booking-plan-header-semrow"> + <strong><span id="booking-plan-header-semname"></span></strong> + <span id="booking-plan-header-semweek-part"> + <span id="booking-plan-header-semweek"></span> </span> - </strong> + </span> </div> </section> diff --git a/app/views/room_management/planning/semester_plan.php b/app/views/room_management/planning/semester_plan.php index 85d69248dee9501929316f54fb9385c16b0a9099..f5b9c94eb74570ad499b1cc1208d3b1e6fe0f4d6 100644 --- a/app/views/room_management/planning/semester_plan.php +++ b/app/views/room_management/planning/semester_plan.php @@ -24,14 +24,14 @@ <strong> <?= _('Semester')?> <span id="booking-plan-header-semname"><?= htmlReady($semester->name) ?></span> - <span id="booking-plan-header-semspan"> - <? if (Request::get("semester_timerange") == 'fullsem') : ?> - <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?> - <? else : ?> - <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?> - <? endif ?> - </span> </strong> + <span id="booking-plan-header-semspan"> + <? if (Request::get("semester_timerange") == 'fullsem') : ?> + <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->beginn), date('d.m.Y', $semester->ende)); ?> + <? else : ?> + <?= sprintf('(%1$s - %2$s)', date('d.m.Y',$semester->vorles_beginn), date('d.m.Y', $semester->vorles_ende)); ?> + <? endif ?> + </span> </span> </div> </section> diff --git a/db/migrations/5.2.16_activate_semester_routes.php b/db/migrations/5.2.16_activate_semester_routes.php new file mode 100644 index 0000000000000000000000000000000000000000..082a5db829a7d73f7d7b706b27bb78b12d8f8f22 --- /dev/null +++ b/db/migrations/5.2.16_activate_semester_routes.php @@ -0,0 +1,14 @@ +<?php +class ActivateSemesterRoutes extends Migration +{ + public function description() + { + return "Activates all semester routes"; + } + + public function up() + { + require_once 'app/routes/Semester.php'; + RESTAPI\ConsumerPermissions::get()->activateRouteMap(new RESTAPI\Routes\Semester()); + } +} diff --git a/resources/assets/javascripts/lib/fullcalendar.js b/resources/assets/javascripts/lib/fullcalendar.js index 2268305a3d84747e98a5d5b97606121dbe7083a6..1a1945a0ecd31d249f7fad7045ee61c4b11f2be9 100644 --- a/resources/assets/javascripts/lib/fullcalendar.js +++ b/resources/assets/javascripts/lib/fullcalendar.js @@ -535,37 +535,31 @@ class Fullcalendar } }, datesRender (info) { - var activeRange = info.view.props.dateProfile.activeRange; - var start = activeRange.start; - var end = activeRange.end; - + let activeRange = info.view.props.dateProfile.activeRange; + let timestamp = activeRange.start.getTime() / 1000; if ($(info.el).hasClass('institute-plan')) { $('.fc-slats tr:odd .fc-widget-content:not(.fc-axis)').remove(); } - if ($('.booking-plan-header').length) { - end.setDate(end.getDate()); - let semester = $('.booking-plan-header').data('semester'); - let sem_start = null; - let sem_end = null; - if (semester) { - sem_start = semester.seminars_begin; - sem_end = semester.seminars_end; - } + STUDIP.api.GET(`semester/${timestamp}/week`).done((data) => { - if (sem_start && (start.getTime() / 1000 < sem_start || start.getTime() / 1000 > sem_end)) { - sem_start = null; - sem_end = null; - } else if (sem_start) { - STUDIP.Resources.updateBookingPlanDateInfos(activeRange.start, activeRange.end, semester); - } - $('#booking-plan-header-calweek').text(start.getWeekNumber()); - $('#booking-plan-header-calbegin').text(start.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + start.toLocaleDateString('de-DE')); - $('#booking-plan-header-calend').text(end.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + end.toLocaleDateString('de-DE')); - if (!sem_start || !sem_end) { - STUDIP.Resources.updateBookingPlanSemesterByView(activeRange); + if (data) { + $('#booking-plan-header-semname').text(data.semester_name); + if (data.sem_week) { + $('#booking-plan-header-semweek').text(data.sem_week); + $('#booking-plan-header-semweek-part').show(); + } else { + $('#booking-plan-header-semweek').text(''); + $('#booking-plan-header-semweek-part').hide(); + } + $('#booking-plan-header-semrow').show(); + $('#booking-plan-header-calweek').text(data.week_number); + $('#booking-plan-header-calbegin').text('(' + data.current_day + ')'); + } else { + $('#booking-plan-header-semrow').hide(); + $('#booking-plan-header-semweek-part').hide(); } - } + }) }, resourceRender (renderInfo) { if ($(renderInfo.view.context.calendar.el).hasClass('room-group-booking-plan')) { diff --git a/resources/assets/javascripts/lib/resources.js b/resources/assets/javascripts/lib/resources.js index a3192fcb223433b53c3d16620aa447d079121963..57965cea906283a3ddac59ea67d5d817e625f6d3 100644 --- a/resources/assets/javascripts/lib/resources.js +++ b/resources/assets/javascripts/lib/resources.js @@ -705,76 +705,6 @@ class Resources STUDIP.Resources.updateEventUrlsInCalendar(info.event); } - - static updateBookingPlanSemesterByView(activeRange, api_url = 'api.php/semesters') { - let semester = null; - jQuery.ajax( - STUDIP.URLHelper.getURL(api_url), - { - method: 'get', - dataType: 'json', - success: function (data) { - if (data) { - Object.values(data.collection).forEach(item => { - if (activeRange.start.getTime() / 1000 >= item.begin && activeRange.start.getTime() / 1000 < item.end) { - semester = item; - } - }); - if (!semester) { - if (data.pagination && data.pagination.links && data.pagination.links.next != api_url) { - semester = STUDIP.Resources.updateBookingPlanSemesterByView(activeRange, data.pagination.links.next); - } - } - } - STUDIP.Resources.updateBookingPlanDateInfos(activeRange.start, activeRange.end, semester); - } - } - ); - } - - static updateBookingPlanDateInfos(plan_begin, plan_end, semester = null) - { - if (semester) { - let show_lecture_week = false; - let fake_plan_end = new Date(plan_end.getTime() - 1000); - if (plan_begin.getUTCDay() == fake_plan_end.getUTCDay()) { - show_lecture_week = (plan_begin.getTime() / 1000 + 43200) >= semester.seminars_begin && (plan_begin.getTime() / 1000) < semester.seminars_end; - } else { - show_lecture_week = (plan_end.getTime() / 1000 + 43200) >= semester.seminars_begin && (plan_end.getTime() / 1000) < semester.seminars_end; - } - $(".booking-plan-header").data('semester', semester); - $("#booking-plan-header-semname").text(semester.title); - if (show_lecture_week) { - let lecture_week_start = new Date((semester.seminars_begin + 43200) * 1000); - let lecture_week_start_day = lecture_week_start.getDay(); - if (lecture_week_start_day == 0) { - //Sunday is 7, not 0! - lecture_week_start_day = 7; - } - lecture_week_start_day--; - let normal_sem_week_begin = semester.seminars_begin - (lecture_week_start_day * 86400); - let sem_week = Math.floor((plan_end.getTime() / 1000 - 10800 - normal_sem_week_begin) / 604800) + 1; - if (sem_week > 0) { - $("#booking-plan-header-semweek").text(sem_week); - $("#booking-plan-header-semweek-part").show(); - } else { - $("#booking-plan-header-semweek-part").hide(); - } - } else { - $("#booking-plan-header-semweek-part").hide(); - } - $("#booking-plan-header-semrow").show(); - } else { - $(".booking-plan-header").data('semester', null); - $('#booking-plan-header-semrow').hide(); - } - - $('#booking-plan-header-calweek').text(plan_begin.getWeekNumber()); - $('#booking-plan-header-calbegin').text(plan_begin.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + plan_begin.toLocaleDateString('de-DE')); - $('#booking-plan-header-calend').text(plan_end.toLocaleDateString('de-DE', {weekday: 'short'}) + ' ' + plan_end.toLocaleDateString('de-DE')); - } - - static toggleRequestMarked(source_node) { if (!source_node) { diff --git a/resources/assets/stylesheets/less/resources-print.less b/resources/assets/stylesheets/less/resources-print.less index 889f1d4ab011c73ebb3f8c1253dca4ef8ed25a17..a2c8d1f79f68be2338384e4dfe67f7344c2a392f 100644 --- a/resources/assets/stylesheets/less/resources-print.less +++ b/resources/assets/stylesheets/less/resources-print.less @@ -1,5 +1,5 @@ @media print { - #booking-plan-header-semrow-line #booking-plan-header-semweek-part, + #booking-plan-header-semweek-part, #booking-plan-header-resource-name-line, #booking-plan-header-seats-line, #booking-plan-header-administration_url-line {