From c80d97eaa154ad7f6bdf0b52852428d09197ff36 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Mon, 13 Jan 2025 11:04:22 -0400 Subject: [PATCH 1/2] FOUR-15298: [37189] Session Inactivity Option --- resources/js/bootstrap.js | 27 +++-- resources/js/components/Session.vue | 158 ++++++++++++++++------------ resources/js/timeout.js | 17 ++- 3 files changed, 125 insertions(+), 77 deletions(-) diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 770631fcb5..42f55ae442 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -32,7 +32,7 @@ import DataTreeToggle from "./components/common/data-tree-toggle.vue"; import TreeView from "./components/TreeView.vue"; import FilterTable from "./components/shared/FilterTable.vue"; import PaginationTable from "./components/shared/PaginationTable.vue"; -import PMDropdownSuggest from './components/PMDropdownSuggest'; +import PMDropdownSuggest from "./components/PMDropdownSuggest"; import "@processmaker/screen-builder/dist/vue-form-builder.css"; window.__ = translator; @@ -345,7 +345,14 @@ if (userID) { window.ProcessMaker.AccountTimeoutWarnSeconds = parseInt(document.head.querySelector("meta[name=\"timeout-warn-seconds\"]")?.content); window.ProcessMaker.AccountTimeoutEnabled = document.head.querySelector("meta[name=\"timeout-enabled\"]") ? parseInt(document.head.querySelector("meta[name=\"timeout-enabled\"]")?.content) : 1; window.ProcessMaker.AccountTimeoutWorker = new Worker(timeoutScript); - window.ProcessMaker.AccountTimeoutWorker.addEventListener("message", (e) => { + + const payloadAccountTimeoutWorker = { + timeout: window.ProcessMaker.AccountTimeoutLength, + warnSeconds: window.ProcessMaker.AccountTimeoutWarnSeconds, + enabled: window.ProcessMaker.AccountTimeoutEnabled, + }; + + window.ProcessMaker.AccountTimeoutWorker.onmessage = (e) => { if (e.data.method === "countdown") { window.ProcessMaker.sessionModal( "Session Warning", @@ -357,17 +364,21 @@ if (userID) { if (e.data.method === "timedOut") { window.location = "/logout?timeout=true"; } - }); + }; // in some cases it's necessary to start manually window.ProcessMaker.AccountTimeoutWorker.postMessage({ method: "start", - data: { - timeout: window.ProcessMaker.AccountTimeoutLength, - warnSeconds: window.ProcessMaker.AccountTimeoutWarnSeconds, - enabled: window.ProcessMaker.AccountTimeoutEnabled, - }, + data: payloadAccountTimeoutWorker, + }); + + // Restart the timeout worker (when the user interacts with the page) + document.addEventListener("click", () => { + window.ProcessMaker.AccountTimeoutWorker.postMessage({ + method: "restart", + }); }); + // End -> Restart the timeout worker (when the user interacts with the page) const isSameDevice = (e) => { const localDeviceId = Vue.$cookies.get(e.device_variable); diff --git a/resources/js/components/Session.vue b/resources/js/components/Session.vue index 52d7e46230..42cc587dc1 100644 --- a/resources/js/components/Session.vue +++ b/resources/js/components/Session.vue @@ -1,75 +1,98 @@ - diff --git a/resources/js/timeout.js b/resources/js/timeout.js index be086f612f..d4d43b2f3f 100644 --- a/resources/js/timeout.js +++ b/resources/js/timeout.js @@ -1,5 +1,6 @@ self.time = 0; self.interval = null; +self.restartWorker = false; self.addEventListener("message", (e) => { if (self.hasOwnProperty(e.data.method)) { @@ -18,8 +19,10 @@ self.start = function (data) { const timestampAtStart = Math.floor(Date.now() / 1000); const timeoutAt = timestampAtStart + (data.timeout * 60); + self.restartWorker = false; + clearInterval(self.interval); - self.interval = setInterval(function () { + self.interval = setInterval(() => { const currentTimestamp = Math.floor(Date.now() / 1000); const timeRemaining = timeoutAt - currentTimestamp; @@ -27,6 +30,13 @@ self.start = function (data) { self.postMessage({ method: "countdown", data: { time: timeRemaining } }); } + if (timeRemaining > data.warnSeconds && self.restartWorker) { + clearInterval(self.interval); + self.start(data); + self.restartWorker = false; + return; + } + if (timeRemaining < 1) { clearInterval(self.interval); self.postMessage({ method: "timedOut", data: { time: timeRemaining } }); @@ -35,5 +45,10 @@ self.start = function (data) { }; self.stop = function () { + self.restartWorker = false; clearInterval(self.interval); }; + +self.restart = function (data) { + self.restartWorker = true; +}; From 63c543ac3ddcc8328193c09596b538d227340d67 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Tue, 14 Jan 2025 09:54:31 -0400 Subject: [PATCH 2/2] FOUR-15298: [37189] Session Inactivity Option --- resources/js/bootstrap.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 42f55ae442..cbf9ad811a 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -373,11 +373,16 @@ if (userID) { }); // Restart the timeout worker (when the user interacts with the page) - document.addEventListener("click", () => { - window.ProcessMaker.AccountTimeoutWorker.postMessage({ - method: "restart", + const eventsTimeoutWorker = ["click", "keypress"]; + + eventsTimeoutWorker.forEach((event) => { + document.addEventListener(event, () => { + window.ProcessMaker.AccountTimeoutWorker.postMessage({ + method: "restart", + }); }); }); + // End -> Restart the timeout worker (when the user interacts with the page) const isSameDevice = (e) => {