engine/app/assets/scripts.js in good_job-2.10.0 vs engine/app/assets/scripts.js in good_job-2.11.0

- old
+ new

@@ -1,132 +1,264 @@ -GoodJob = {}; +/*jshint esversion: 6, strict: false */ +const GOOD_JOB_DEFAULT_POLL_INTERVAL_SECONDS = 30; +const GOOD_JOB_MINIMUM_POLL_INTERVAL = 1000; + +const GoodJob = { + // Register functions to execute when the DOM is ready + ready: (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } + }, + + init: () => { + GoodJob.updateSettings(); + GoodJob.addListeners(); + GoodJob.pollUpdates(); + GoodJob.renderCharts(true); + }, + + addListeners: () => { + const gjActionEls = document.querySelectorAll('[data-gj-action]'); + + for (let i = 0; i < gjActionEls.length; i++) { + const el = gjActionEls[i]; + const [eventName, func] = el.dataset.gjAction.split('#'); + + el.addEventListener(eventName, GoodJob[func]); + } + }, + + updateSettings: () => { + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + + // live poll interval and enablement + if (urlParams.has('poll')) { + const parsedInterval = (parseInt(urlParams.get('poll')) || GOOD_JOB_DEFAULT_POLL_INTERVAL_SECONDS) * 1000; + + GoodJob.pollEnabled = true; + GoodJob.pollInterval = Math.max(parsedInterval, GOOD_JOB_MINIMUM_POLL_INTERVAL); + GoodJob.setStorage('pollInterval', GoodJob.pollInterval); + } else { + GoodJob.pollEnabled = GoodJob.getStorage('pollEnabled') || false; + GoodJob.pollInterval = GoodJob.getStorage('pollInterval') || GOOD_JOB_DEFAULT_POLL_INTERVAL_SECONDS; + } + + document.getElementById('toggle-poll').checked = GoodJob.pollEnabled; + }, + + togglePoll: (ev) => { + GoodJob.pollEnabled = ev.currentTarget.checked; + GoodJob.setStorage('pollEnabled', GoodJob.pollEnabled); + }, + + pollUpdates: () => { + setTimeout(() => { + if (GoodJob.pollEnabled === true) { + fetch(window.location.href) + .then(resp => resp.text()) + .then(GoodJob.updateContent) + .finally(GoodJob.pollUpdates); + } else { + GoodJob.pollUpdates(); + } + }, GoodJob.pollInterval); + }, + + updateContent: (newContent) => { + const domParser = new DOMParser(); + const parsedDOM = domParser.parseFromString(newContent, "text/html"); + + const newElements = parsedDOM.querySelectorAll('[data-gj-poll-replace]'); + + for (let i = 0; i < newElements.length; i++) { + const newEl = newElements[i]; + const oldEl = document.getElementById(newEl.id); + + if (oldEl) { + oldEl.replaceWith(newEl); + } + } + + GoodJob.renderCharts(false); + }, + + renderCharts: (animate) => { + const charts = document.querySelectorAll('.chart'); + + for (let i = 0; i < charts.length; i++) { + const chartEl = charts[i]; + const chartData = JSON.parse(chartEl.dataset.json); + + const ctx = chartEl.getContext('2d'); + const chart = new Chart(ctx, { + type: 'line', + data: { + labels: chartData.labels, + datasets: chartData.datasets + }, + options: { + animation: animate, + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + beginAtZero: true + } + } + } + }); + } + }, + + getStorage: (key) => { + const value = localStorage.getItem('good_job-' + key); + + if (value === 'true') { + return true; + } else if (value === 'false') { + return false; + } else { + return value; + } + }, + + setStorage: (key, value) => { + localStorage.setItem('good_job-' + key, value); + } +}; + +GoodJob.ready(GoodJob.init);