summaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authormarudor <marudor@marudor.de>2018-01-03 01:19:31 +0100
committermarudor <marudor@marudor.de>2018-01-03 01:19:31 +0100
commit7f722314e4fc21419552ec27eb91e6f7e6347b71 (patch)
tree3868371913da6f6b9b9e9cb09e0fedc05c8f4571 /js
parent14584b96114d2fcb0dabe49a9c857ff241421cc8 (diff)
frontend stuff with babel and webpack
Diffstat (limited to 'js')
-rw-r--r--js/forms.js94
-rw-r--r--js/sticky-headers.js31
-rw-r--r--js/vendor.js31
3 files changed, 156 insertions, 0 deletions
diff --git a/js/forms.js b/js/forms.js
new file mode 100644
index 00000000..5aa4f25a
--- /dev/null
+++ b/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 {bool} checked True if the checkboxes should be checked
+ */
+function 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
+ */
+function checkOwnTypes(id, shifts_list) {
+ $("#" + id + " input[type='checkbox']").each(function () {
+ this.checked = $.inArray(parseInt(this.value), shifts_list) != -1;
+ });
+}
+
+/**
+ * @param {moment} date
+ */
+function formatDay(date) {
+ return date.format("YYYY-MM-DD");
+}
+
+/**
+ * @param {moment} date
+ */
+function formatTime(date) {
+ return date.format("HH:mm");
+}
+
+/**
+ * @param {moment} from
+ * @param {moment} to
+ */
+function 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));
+}
+
+function 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);
+}
+
+function 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/js/sticky-headers.js b/js/sticky-headers.js
new file mode 100644
index 00000000..6e6a75e2
--- /dev/null
+++ b/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/js/vendor.js b/js/vendor.js
new file mode 100644
index 00000000..5857efb1
--- /dev/null
+++ b/js/vendor.js
@@ -0,0 +1,31 @@
+import 'imports-loader?module=>false!jquery';
+import 'imports-loader?define=>false!jquery-ui';
+import 'bootstrap';
+import 'imports-loader?define=>false&exports=>false!bootstrap-datepicker';
+import 'bootstrap-datepicker/js/locales/bootstrap-datepicker.de';
+import 'bootstrap-datepicker/dist/css/bootstrap-datepicker3.min.css';
+import 'imports-loader?this=>window!chart.js';
+import 'imports-loader?this=>window&define=>false&exports=>false!moment';
+import 'imports-loader?this=>window&define=>false&exports=>false!moment/locale/de';
+import './forms';
+import './sticky-headers';
+import 'icomoon/style.css';
+
+$(function () {
+ moment.locale("%locale%");
+});
+
+$(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);
+ });
+ }
+});