2022-11-17 18:49:25 +01:00
|
|
|
require('select2');
|
|
|
|
import { formatDay, formatTime } from './date';
|
2018-12-06 22:45:40 +01:00
|
|
|
|
2016-08-21 20:14:09 +02:00
|
|
|
/**
|
2017-12-27 13:36:38 +01:00
|
|
|
* Sets all checkboxes to the wanted state
|
2017-01-02 15:43:36 +01:00
|
|
|
*
|
2017-12-27 13:36:38 +01:00
|
|
|
* @param {string} id Id of the element containing all the checkboxes
|
2018-08-11 22:16:57 +02:00
|
|
|
* @param {boolean} checked True if the checkboxes should be checked
|
2016-08-21 20:14:09 +02:00
|
|
|
*/
|
2018-08-03 13:58:25 +02:00
|
|
|
global.checkAll = (id, checked) => {
|
2018-08-11 22:16:57 +02:00
|
|
|
$('#' + id + ' input[type="checkbox"]').each(function () {
|
2017-12-27 13:36:38 +01:00
|
|
|
this.checked = checked;
|
|
|
|
});
|
2018-08-12 13:01:03 +02:00
|
|
|
};
|
2017-12-27 13:36:38 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the checkboxes according to the given type
|
|
|
|
*
|
|
|
|
* @param {string} id The elements ID
|
2019-09-06 03:45:56 +02:00
|
|
|
* @param {list} shiftsList A list of numbers
|
2017-12-27 13:36:38 +01:00
|
|
|
*/
|
2018-08-12 12:42:58 +02:00
|
|
|
global.checkOwnTypes = (id, shiftsList) => {
|
2018-08-11 22:16:57 +02:00
|
|
|
$('#' + id + ' input[type="checkbox"]').each(function () {
|
2018-08-06 13:10:53 +02:00
|
|
|
this.checked = $.inArray(parseInt(this.value), shiftsList) != -1;
|
2017-12-27 13:36:38 +01:00
|
|
|
});
|
2018-08-12 13:01:03 +02:00
|
|
|
};
|
2014-12-06 21:39:59 +01:00
|
|
|
|
2017-11-29 13:23:38 +01:00
|
|
|
/**
|
2022-10-22 16:14:21 +02:00
|
|
|
* Sets the values of the input fields with the IDs to from/to:
|
|
|
|
* - date portion of from → start_day
|
|
|
|
* - time portion of from → start_time
|
|
|
|
* - date portion of to → end_day
|
|
|
|
* - time portion of to → end_time
|
|
|
|
*
|
|
|
|
* @param {Date} from
|
|
|
|
* @param {Date} to
|
2017-11-29 13:23:38 +01:00
|
|
|
*/
|
2018-08-03 13:58:25 +02:00
|
|
|
global.setInput = (from, to) => {
|
2022-10-22 16:14:21 +02:00
|
|
|
const fromDay = $('#start_day');
|
|
|
|
const fromTime = $('#start_time');
|
|
|
|
const toDay = $('#end_day');
|
|
|
|
const toTime = $('#end_time');
|
|
|
|
|
|
|
|
if (!fromDay || !fromTime || !toDay || !toTime) {
|
2022-11-17 18:49:25 +01:00
|
|
|
console.warn('cannot set input date because of missing field');
|
2022-10-22 16:14:21 +02:00
|
|
|
return;
|
|
|
|
}
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2021-06-03 23:46:08 +02:00
|
|
|
fromDay.val(formatDay(from)).trigger('change');
|
2017-11-29 13:49:21 +01:00
|
|
|
fromTime.val(formatTime(from));
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2021-06-03 23:46:08 +02:00
|
|
|
toDay.val(formatDay(to)).trigger('change');
|
2017-11-29 13:49:21 +01:00
|
|
|
toTime.val(formatTime(to));
|
2018-08-12 13:01:03 +02:00
|
|
|
};
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2018-08-03 13:58:25 +02:00
|
|
|
global.setDay = (days) => {
|
2017-11-29 13:23:38 +01:00
|
|
|
days = days || 0;
|
|
|
|
|
2022-11-17 18:49:25 +01:00
|
|
|
const from = new Date();
|
2022-10-22 16:14:21 +02:00
|
|
|
from.setHours(0, 0, 0, 0);
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2022-10-22 16:14:21 +02:00
|
|
|
// add days, Date handles the overflow
|
|
|
|
from.setDate(from.getDate() + days);
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2022-11-17 18:49:25 +01:00
|
|
|
const to = new Date(from);
|
2022-10-22 16:14:21 +02:00
|
|
|
to.setHours(23, 59);
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2017-11-29 13:49:21 +01:00
|
|
|
setInput(from, to);
|
2018-08-12 13:01:03 +02:00
|
|
|
};
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2018-08-03 13:58:25 +02:00
|
|
|
global.setHours = (hours) => {
|
2017-11-29 13:23:38 +01:00
|
|
|
hours = hours || 1;
|
|
|
|
|
2022-11-17 18:49:25 +01:00
|
|
|
const from = new Date();
|
|
|
|
const to = new Date(from);
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2022-10-22 16:14:21 +02:00
|
|
|
// convert hours to add to milliseconds (60 minutes * 60 seconds * 1000 for milliseconds)
|
|
|
|
const msToAdd = hours * 60 * 60 * 1000;
|
|
|
|
to.setTime(to.getTime() + msToAdd, 'h');
|
2017-11-29 13:23:38 +01:00
|
|
|
if (to < from) {
|
|
|
|
setInput(to, from);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
setInput(from, to);
|
2018-08-12 13:01:03 +02:00
|
|
|
};
|
2017-11-29 13:23:38 +01:00
|
|
|
|
2017-01-02 15:43:36 +01:00
|
|
|
$(function () {
|
|
|
|
/**
|
|
|
|
* Disable every submit button after clicking (to prevent double-clicking)
|
|
|
|
*/
|
2018-08-11 22:16:57 +02:00
|
|
|
$('form').submit(function (ev) {
|
|
|
|
$('input[type="submit"]').prop('readonly', true).addClass('disabled');
|
2017-01-02 15:43:36 +01:00
|
|
|
return true;
|
|
|
|
});
|
2017-12-27 13:36:38 +01:00
|
|
|
|
2014-12-06 21:39:59 +01:00
|
|
|
});
|
2018-12-04 21:03:32 +01:00
|
|
|
|
2018-12-05 18:43:51 +01:00
|
|
|
/*
|
|
|
|
* Button to set current time in time input fields.
|
|
|
|
*/
|
|
|
|
$(function () {
|
|
|
|
$('.input-group.time').each(function () {
|
2022-11-17 18:49:25 +01:00
|
|
|
const elem = $(this);
|
2018-12-05 18:43:51 +01:00
|
|
|
elem.find('button').on('click', function () {
|
2022-10-22 16:14:21 +02:00
|
|
|
const now = new Date();
|
2022-11-17 18:49:25 +01:00
|
|
|
const input = elem.children('input').first();
|
2022-10-22 16:14:21 +02:00
|
|
|
input.val(formatTime(now));
|
2022-11-17 18:49:25 +01:00
|
|
|
const daySelector = $('#' + input.attr('id').replace('time', 'day'));
|
|
|
|
const days = daySelector.children('option');
|
2022-10-22 16:14:21 +02:00
|
|
|
const yyyyMMDD = formatDay(now);
|
2018-12-05 18:43:51 +01:00
|
|
|
days.each(function (i) {
|
2022-10-22 16:14:21 +02:00
|
|
|
if ($(days[i]).val() === yyyyMMDD) {
|
2018-12-06 22:45:40 +01:00
|
|
|
daySelector.val($(days[i]).val());
|
2018-12-05 18:43:51 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2019-09-06 03:45:56 +02:00
|
|
|
|
2020-10-20 16:07:34 +02:00
|
|
|
$(function () {
|
2021-07-29 20:38:00 +02:00
|
|
|
$('select').select2({
|
|
|
|
theme: 'bootstrap-5',
|
|
|
|
});
|
|
|
|
})
|
2020-10-20 16:07:34 +02:00
|
|
|
|
2020-11-15 18:47:30 +01:00
|
|
|
/**
|
|
|
|
* Show oauth buttons on welcome title click
|
|
|
|
*/
|
|
|
|
$(function () {
|
|
|
|
$('#welcome-title').on('click', function () {
|
2021-07-24 18:19:53 +02:00
|
|
|
$('.btn-group.btn-group .btn.d-none').removeClass('d-none');
|
2020-11-15 18:47:30 +01:00
|
|
|
});
|
2021-12-03 22:27:15 +01:00
|
|
|
$('#settings-title').on('click', function () {
|
|
|
|
$('.user-settings .nav-item').removeClass('d-none');
|
|
|
|
});
|
2020-11-15 18:47:30 +01:00
|
|
|
$('#oauth-settings-title').on('click', function () {
|
2021-07-24 18:19:53 +02:00
|
|
|
$('table tr.d-none').removeClass('d-none');
|
2020-11-15 18:47:30 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-09-06 03:45:56 +02:00
|
|
|
/**
|
|
|
|
* Set the filter selects to latest state
|
|
|
|
*
|
|
|
|
* Uses DOMContentLoaded to prevent flickering
|
|
|
|
*/
|
|
|
|
window.addEventListener('DOMContentLoaded', () => {
|
|
|
|
const filter = document.getElementById('collapseShiftsFilterSelect');
|
|
|
|
if (!filter || localStorage.getItem('collapseShiftsFilterSelect') !== 'hidden') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-07-24 17:04:45 +02:00
|
|
|
filter.classList.remove('show');
|
2019-09-06 03:45:56 +02:00
|
|
|
});
|
2022-10-22 16:14:21 +02:00
|
|
|
|
2019-09-06 03:45:56 +02:00
|
|
|
$(() => {
|
|
|
|
if (typeof (localStorage) === 'undefined') {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const onChange = (e) => {
|
|
|
|
localStorage.setItem('collapseShiftsFilterSelect', e.type);
|
|
|
|
};
|
|
|
|
|
|
|
|
$('#collapseShiftsFilterSelect')
|
|
|
|
.on('hidden.bs.collapse', onChange)
|
|
|
|
.on('shown.bs.collapse', onChange);
|
|
|
|
});
|