From c1a1180d1f43a430b38450cb0b64bcd74487b4ae Mon Sep 17 00:00:00 2001 From: Igor Scheller Date: Mon, 10 Sep 2018 17:22:05 +0200 Subject: Moved frontend, templates and lang to resources --- resources/assets/js/forms.js | 94 +++++++++++++++++++++++++++++++++ resources/assets/js/moment-countdown.js | 19 +++++++ resources/assets/js/sticky-headers.js | 31 +++++++++++ resources/assets/js/vendor.js | 16 ++++++ 4 files changed, 160 insertions(+) create mode 100644 resources/assets/js/forms.js create mode 100644 resources/assets/js/moment-countdown.js create mode 100644 resources/assets/js/sticky-headers.js create mode 100644 resources/assets/js/vendor.js (limited to 'resources/assets/js') diff --git a/resources/assets/js/forms.js b/resources/assets/js/forms.js new file mode 100644 index 00000000..13e42d26 --- /dev/null +++ b/resources/assets/js/forms.js @@ -0,0 +1,94 @@ +/** + * 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} shifts_list 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; + }); + + $('.dropdown-menu').css('max-height', function () { + return ($(window).height() - 50) + 'px'; + }).css('overflow-y', 'scroll'); +}); diff --git a/resources/assets/js/moment-countdown.js b/resources/assets/js/moment-countdown.js new file mode 100644 index 00000000..f5effbc0 --- /dev/null +++ b/resources/assets/js/moment-countdown.js @@ -0,0 +1,19 @@ +/* + * Initialize all moment countdowns on the page. A moment countdown has the + * class 'moment-countdown' and the attribute 'data-timestamp' which defines the + * countdown's time goal. + */ +$(document).ready(function () { + if (typeof moment !== 'undefined') { + $.each($('.moment-countdown'), function (i, e) { + var span = $(e); + var text = span.html(); + /* global moment */ + var timestamp = moment(parseInt(span.attr('data-timestamp') * 1000)); + span.html(text.replace('%c', timestamp.fromNow())); + setInterval(function () { + span.html(text.replace('%c', timestamp.fromNow())); + }, 1000); + }); + } +}); diff --git a/resources/assets/js/sticky-headers.js b/resources/assets/js/sticky-headers.js new file mode 100644 index 00000000..c664387c --- /dev/null +++ b/resources/assets/js/sticky-headers.js @@ -0,0 +1,31 @@ +/** + * Enables the fixed headers and time lane for the shift-calendar and datatables + */ +$(document).ready(function () { + if ($('.shift-calendar').length) { + var timeLanes = $('.shift-calendar .time'); + var headers = $('.shift-calendar .header'); + var topReference = $('.container-fluid .row'); + timeLanes.css({ + 'position': 'relative', + 'z-index': 999 + }); + headers.css({ + 'position': 'relative', + 'z-index': 900 + }); + $(window).scroll( + function () { + var top = headers.parent().offset().top; + var left = 15; + timeLanes.css({ + 'left': Math.max(0, $(window).scrollLeft() - left) + 'px' + }); + headers.css({ + 'top': Math.max(0, $(window).scrollTop() - top + + topReference.offset().top) + + 'px' + }); + }); + } +}); diff --git a/resources/assets/js/vendor.js b/resources/assets/js/vendor.js new file mode 100644 index 00000000..dd6b66b3 --- /dev/null +++ b/resources/assets/js/vendor.js @@ -0,0 +1,16 @@ +window.$ = window.jQuery = require('jquery'); +require('imports-loader?define=>false!jquery-ui'); +require('bootstrap'); +require('imports-loader?define=>false&exports=>false!bootstrap-datepicker'); +require('bootstrap-datepicker/js/locales/bootstrap-datepicker.de'); +require('bootstrap-datepicker/dist/css/bootstrap-datepicker3.min.css'); +require('imports-loader?this=>window!chart.js'); +require('imports-loader?this=>window&define=>false&exports=>false!moment'); +require('imports-loader?this=>window&define=>false&exports=>false!moment/locale/de'); +require('./forms'); +require('./sticky-headers'); +require('./moment-countdown'); + +$(function () { + moment.locale($('html').attr('lang')); +}); -- cgit v1.2.3-54-g00ecf