Skip to content

Commit a3cc88c

Browse files
labmecanicatecJohnVillalovos
authored andcommitted
feat(schedule): improve default schedule notification and highlight current calendar
- Replaced the old notification for saving the default schedule with a Bootstrap toast for better user feedback. - The currently selected schedule/calendar is now visually highlighted in the schedule style selector. - The make_default button does not appear if the user is not logged in. Assisted-by: Copilot:GPT-4.1
1 parent 4088480 commit a3cc88c

3 files changed

Lines changed: 68 additions & 36 deletions

File tree

Web/css/schedule.css

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,10 @@ ul.jqtree-tree .jqtree-toggler {
348348
top: 10%;
349349
}
350350

351-
#make_default {
352-
padding-right: 10px;
351+
.schedule-style.active {
352+
border-bottom: 2px solid var(--primary);
353+
padding-bottom: 6px;
354+
margin-bottom: 2px;
353355
}
354356

355357
.table-cell-wrapper {

Web/scripts/schedule.js

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -843,27 +843,38 @@ function Schedule(opts, resourceGroups) {
843843
});
844844
};
845845

846-
this.initUserDefaultSchedule = function (anonymous) {
847-
var makeDefaultButton = $('#make_default');
848-
if (anonymous) {
849-
makeDefaultButton.hide();
850-
return;
851-
}
846+
this.initUserDefaultSchedule = function () {
847+
const makeDefaultButton = document.getElementById('make_default');
848+
const scheduleInput = document.getElementById('scheduleId');
852849

853-
makeDefaultButton.show();
850+
if (!makeDefaultButton) return;
854851

855-
var defaultSetMessage = $('#defaultSetMessage');
856-
makeDefaultButton.click(function (e) {
852+
makeDefaultButton.addEventListener('click', function (e) {
857853
e.preventDefault();
858-
var scheduleId = $('#scheduleId').val();
859-
var changeDefaultUrl = options.setDefaultScheduleUrl.replace('[scheduleId]', scheduleId);
860854

861-
$.ajax({
862-
url: changeDefaultUrl,
863-
success: function (data) {
864-
defaultSetMessage.show().delay(5000).fadeOut();
865-
},
866-
});
855+
const scheduleId = scheduleInput.value;
856+
const changeDefaultUrl = options.setDefaultScheduleUrl.replace('[scheduleId]', scheduleId);
857+
858+
fetch(changeDefaultUrl)
859+
.then((response) => {
860+
if (!response.ok) {
861+
throw new Error(
862+
`Request failed with status ${response.status}${response.statusText ? ` ${response.statusText}` : ''}`
863+
);
864+
}
865+
return response.json().catch(() => null);
866+
})
867+
.then(() => {
868+
// Toast to display a success message when changing the default schedule
869+
const toastEl = document.getElementById('defaultSetToast');
870+
if (toastEl && window.bootstrap && window.bootstrap.Toast) {
871+
toastEl.classList.remove('d-none');
872+
window.bootstrap.Toast.getOrCreateInstance(toastEl).show();
873+
}
874+
})
875+
.catch((err) => {
876+
console.error(err);
877+
});
867878
});
868879
};
869880

tpl/Schedule/schedule.tpl

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,17 @@
7474
{/if}
7575

7676
{if $IsAccessible}
77-
<div id="defaultSetMessage" class="alert alert-success d-none">
78-
{translate key=DefaultScheduleSet}
77+
<div class="toast-container position-fixed bottom-0 end-0 p-3">
78+
<div id="defaultSetToast" class="toast align-items-center bg-primary text-white border-0 d-none" role="alert"
79+
aria-live="assertive" aria-atomic="true">
80+
<div class="d-flex">
81+
<div class="toast-body">
82+
<i class="bi bi-check-circle-fill me-2"></i>{translate key=DefaultScheduleSet}
83+
</div>
84+
<button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"
85+
aria-label="{translate key=Close}"></button>
86+
</div>
87+
</div>
7988
</div>
8089
{block name="schedule_control"}
8190
<div class="row">
@@ -85,31 +94,40 @@
8594
<div id="schedule-actions" class="col-sm-3 col-12">
8695
{block name="actions"}
8796
<div class="d-flex align-items-center mb-2">
88-
<a href="#" id="print_schedule" class="link-primary me-1" title="{translate key=Print}">
89-
<span class="bi bi-printer schedule_icon"></span>
90-
</a>
91-
<a href="#" id="make_default" class="link-primary me-2" style="display:none;"
92-
title="{translate key='MakeDefaultSchedule'}">
93-
<i class="bi bi-star-fill schedule_icon"></i>
94-
</a>
95-
<a href="#" class="schedule-style me-2 d-flex align-items-center" id="schedule_standard"
96-
schedule-display="{ScheduleStyle::Standard->value}"
97+
<div class="me-4 d-flex align-items-center gap-2">
98+
<a href="#" id="print_schedule" class="link-primary me-1" title="{translate key=Print}">
99+
<i class="bi bi-printer schedule_icon"></i>
100+
</a>
101+
{if $LoggedIn}
102+
<a href="#" id="make_default" class="link-primary" title="{translate key='MakeDefaultSchedule'}">
103+
<i class="bi bi-star-fill schedule_icon"></i>
104+
</a>
105+
{/if}
106+
</div>
107+
<a href="#"
108+
class="schedule-style me-2 d-inline-flex align-items-center{if $ScheduleStyle == ScheduleStyle::Standard->value} active{/if}"
109+
id="schedule_standard" schedule-display="{ScheduleStyle::Standard->value}"
97110
title="{translate key='StandardScheduleDisplay'}">
98111
<img class="schedule_icon shadow-sm" src="img/table.png"
99112
alt="{translate key='StandardScheduleDisplay'}" />
100113
</a>
101-
<a href="#" class="schedule-style me-2 d-flex align-items-center" id="schedule_tall"
102-
schedule-display="{ScheduleStyle::Tall->value}" title="{translate key='TallScheduleDisplay'}">
114+
<a href="#"
115+
class="schedule-style me-2 d-inline-flex align-items-center{if $ScheduleStyle == ScheduleStyle::Tall->value} active{/if}"
116+
id="schedule_tall" schedule-display="{ScheduleStyle::Tall->value}"
117+
title="{translate key='TallScheduleDisplay'}">
103118
<img class="schedule_icon shadow-sm" src="img/table-tall.png"
104119
alt="{translate key='TallScheduleDisplay'}" />
105120
</a>
106-
<a href="#" class="schedule-style d-none d-md-flex me-2 align-items-center" id="schedule_wide"
107-
schedule-display="{ScheduleStyle::Wide->value}" title="{translate key='WideScheduleDisplay'}">
121+
<a href="#"
122+
class="schedule-style d-none d-md-inline-flex me-2 align-items-center{if $ScheduleStyle == ScheduleStyle::Wide->value} active{/if}"
123+
id="schedule_wide" schedule-display="{ScheduleStyle::Wide->value}"
124+
title="{translate key='WideScheduleDisplay'}">
108125
<img class="schedule_icon shadow-sm" src="img/table-wide.png"
109126
alt="{translate key='WideScheduleDisplay'}" />
110127
</a>
111-
<a href="#" class="schedule-style d-none d-md-flex align-items-center" id="schedule_week"
112-
schedule-display="{ScheduleStyle::CondensedWeek->value}"
128+
<a href="#"
129+
class="schedule-style d-none d-md-inline-flex align-items-center{if $ScheduleStyle == ScheduleStyle::CondensedWeek->value} active{/if}"
130+
id="schedule_week" schedule-display="{ScheduleStyle::CondensedWeek->value}"
113131
title="{translate key='CondensedWeekScheduleDisplay'}">
114132
<img class="schedule_icon shadow-sm" src="img/table-week.png"
115133
alt="{translate key='CondensedWeekScheduleDisplay'}" />
@@ -478,6 +496,7 @@
478496
$(document).ready(function() {
479497
const schedule = new Schedule(scheduleOpts, {$ResourceGroupsAsJson});
480498
schedule.init();
499+
481500
});
482501
483502
$('#schedules').select2({

0 commit comments

Comments
 (0)