101 lines
3.2 KiB
JavaScript
101 lines
3.2 KiB
JavaScript
// Most of the websites dynamic functionality depends on the content of the logs
|
|
// This file is responsible for:
|
|
// 1) setting and displaying toast messages
|
|
// 2) toggling command execution/cancellation buttons
|
|
// 3) logs scrolling
|
|
|
|
// Each page that uses logs defines its own command execution/cancellation toggle functions with the same names
|
|
// We can safely call these functions and their functionality will be handeled by the page specific js
|
|
|
|
let shouldAutoScroll = true;
|
|
let isScrollingProgrammatically = false;
|
|
// When user manually scrolls, update behaviour
|
|
logsElement.addEventListener("scroll", function () {
|
|
if (!isScrollingProgrammatically) {
|
|
shouldAutoScroll = false;
|
|
}
|
|
});
|
|
|
|
let executedNewCommand = true;
|
|
let logsCount = 0;
|
|
let currentLogFile = null;
|
|
htmx.on("htmx:sseBeforeMessage", function (evt) {
|
|
logsCount += 1;
|
|
// Don't swap content, we want to append
|
|
evt.preventDefault();
|
|
|
|
const stdout = JSON.parse(evt.detail.data);
|
|
const text = document.createTextNode(stdout);
|
|
// First log element contains the name of logging file
|
|
if (logsCount === 1) {
|
|
currentLogFile = text.nodeValue.trim();
|
|
|
|
let lastLogFile = getCookie("last-log-file");
|
|
|
|
// If the new log file name is same as the previous log file name that means
|
|
// we have not executed a new command, they are logs of the last executed command
|
|
if (lastLogFile === currentLogFile) {
|
|
executedNewCommand = false;
|
|
} else {
|
|
// We are indeed executing a new command so show cancel button and update log file name
|
|
ShowCancelCommandButton();
|
|
}
|
|
} else if (logsCount === 2) {
|
|
// Second log element is the running command, make toast here
|
|
cmd = text.nodeValue.trim();
|
|
setToastContent(cmd);
|
|
evt.detail.elt.appendChild(text);
|
|
} else {
|
|
// Only show toast if it was a new command
|
|
if (executedNewCommand === true) {
|
|
// If command has run successfully update UI
|
|
if (stdout.includes("Success!")) {
|
|
setCookie("last-log-file", currentLogFile, 365);
|
|
// Do not show the toast if it is empty
|
|
if (toastTitle.textContent.trim() != "") {
|
|
showToast("info");
|
|
}
|
|
// Check if we are on the plugin page
|
|
if (typeof pluginName !== "undefined") {
|
|
// Successfull command means plugin is either successfully installed or upgraded
|
|
// In either case we can safely display the enable/disable bar
|
|
isPluginInstalled = true;
|
|
showPluginEnableDisableBar();
|
|
}
|
|
ShowRunCommandButton();
|
|
}
|
|
if (stdout.includes("Cancelled!")) {
|
|
ShowRunCommandButton();
|
|
}
|
|
}
|
|
evt.detail.elt.appendChild(text);
|
|
}
|
|
if (shouldAutoScroll) {
|
|
// Set flag so event listner knows we are scrolling programatically
|
|
isScrollingProgrammatically = true;
|
|
evt.detail.elt.scrollTop = evt.detail.elt.scrollHeight;
|
|
|
|
// Reset the flag after a short delay
|
|
setTimeout(() => {
|
|
isScrollingProgrammatically = false;
|
|
}, 10);
|
|
}
|
|
});
|
|
|
|
// Additional handlers for scroll inputs
|
|
logsElement.addEventListener(
|
|
"wheel",
|
|
function () {
|
|
shouldAutoScroll = false;
|
|
},
|
|
{ passive: true }
|
|
);
|
|
|
|
logsElement.addEventListener(
|
|
"touchstart",
|
|
function () {
|
|
shouldAutoScroll = false;
|
|
},
|
|
{ passive: true }
|
|
);
|