engelsystem/resources/assets/js/forms.js

244 lines
6.4 KiB
JavaScript

const moment = require('moment');
require('select2')
/**
* Sets all checkboxes to the wanted state
*
* @param {string} id Id of the element containing all the checkboxes
* @param {boolean} checked True if the checkboxes should be checked
*/
global.checkAll = (id, checked) => {
$('#' + id + ' input[type="checkbox"]').each(function () {
this.checked = checked;
});
};
/**
* Sets the checkboxes according to the given type
*
* @param {string} id The elements ID
* @param {list} shiftsList A list of numbers
*/
global.checkOwnTypes = (id, shiftsList) => {
$('#' + id + ' input[type="checkbox"]').each(function () {
this.checked = $.inArray(parseInt(this.value), shiftsList) != -1;
});
};
/**
* @param {moment} date
*/
global.formatDay = (date) => {
return date.format('YYYY-MM-DD');
};
/**
* @param {moment} date
*/
global.formatTime = (date) => {
return date.format('HH:mm');
};
/**
* @param {moment} from
* @param {moment} to
*/
global.setInput = (from, to) => {
var fromDay = $('#start_day'), fromTime = $('#start_time'), toDay = $('#end_day'), toTime = $('#end_time');
fromDay.val(formatDay(from));
fromTime.val(formatTime(from));
toDay.val(formatDay(to));
toTime.val(formatTime(to));
};
global.setDay = (days) => {
days = days || 0;
var from = moment();
from.hours(0).minutes(0).seconds(0);
from.add(days, 'd');
var to = from.clone();
to.hours(23).minutes(59);
setInput(from, to);
};
global.setHours = (hours) => {
hours = hours || 1;
var from = moment();
var to = from.clone();
to.add(hours, 'h');
if (to < from) {
setInput(to, from);
return;
}
setInput(from, to);
};
$(function () {
/**
* Disable every submit button after clicking (to prevent double-clicking)
*/
$('form').submit(function (ev) {
$('input[type="submit"]').prop('readonly', true).addClass('disabled');
return true;
});
});
/*
* Add a datepicker to all date input fields.
*/
$(function () {
$([
{'select': $('.input-group.date'), 'format': 'YYYY-MM-DD'},
{'select': $('.input-group.datetime'), 'format': 'YYYY-MM-DD HH:mm'},
]).each(function (_, element) {
element.select.each(function () {
var elem = $(this);
var opts = {
minDate: '',
maxDate: '',
locale: $('html').attr('lang'),
format: element.format,
widgetPositioning: {horizontal: 'auto', vertical: 'bottom'},
icons: {
time: 'bi bi-clock',
date: 'bi bi-calendar',
up: 'bi bi-arrow-up',
down: 'bi bi-arrow-down'
}
};
$.extend(opts, elem.data());
if (opts.minDate.length === 0) {
delete opts.minDate;
}
if (opts.maxDate.length === 0) {
delete opts.maxDate;
}
elem.children('input').attr('type', 'text');
elem.children().on('click', function (ev) {
ev.stopImmediatePropagation();
if (typeof elem.data('datetimepicker') === 'undefined') {
elem.datetimepicker(opts);
elem.data('datetimepicker').show();
// close on click anywhere outside
$(document).on('click', () => {
elem.data('datetimepicker').hide()
})
} else {
elem.data('datetimepicker').toggle();
}
});
});
});
});
/*
* Add a timepicker to all time input fields.
*/
$(function () {
$('.input-group.time').each(function () {
var elem = $(this);
var opts = {
locale: $('html').attr('lang'),
format: 'HH:mm',
widgetPositioning: {horizontal: 'auto', vertical: 'bottom'},
icons: {
up: 'bi bi-arrow-up',
down: 'bi bi-arrow-down'
}
};
$.extend(opts, elem.data());
elem.children('input').attr('type', 'text');
elem.children('input').on('click', function (ev) {
ev.stopImmediatePropagation();
if (typeof elem.data('datetimepicker') === 'undefined') {
elem.datetimepicker(opts);
elem.data('datetimepicker').show();
// close on click anywhere outside
$(document).on('click', () => {
elem.data('datetimepicker').hide()
})
} else {
elem.data('datetimepicker').toggle();
}
});
});
});
/*
* Button to set current time in time input fields.
*/
$(function () {
$('.input-group.time').each(function () {
var elem = $(this);
elem.find('button').on('click', function () {
var input = elem.children('input').first();
input.val(moment().format('HH:mm'));
var daySelector = $('#' + input.attr('id').replace('time', 'day'));
var days = daySelector.children('option');
days.each(function (i) {
if ($(days[i]).val() === moment().format('YYYY-MM-DD')) {
daySelector.val($(days[i]).val());
return false;
}
});
});
});
});
$('select').select2({
theme: 'bootstrap-5',
});
/**
* Show oauth buttons on welcome title click
*/
$(function () {
$('#welcome-title').on('click', function () {
$('.btn-group.btn-group .btn.d-none').removeClass('d-none');
});
$('#oauth-settings-title').on('click', function () {
$('table tr.d-none').removeClass('d-none');
});
});
/**
* 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;
}
filter.classList.remove('show');
});
$(() => {
if (typeof (localStorage) === 'undefined') {
return;
}
const onChange = (e) => {
localStorage.setItem('collapseShiftsFilterSelect', e.type);
};
$('#collapseShiftsFilterSelect')
.on('hidden.bs.collapse', onChange)
.on('shown.bs.collapse', onChange);
});