Skip to content

Commit 518919c

Browse files
committed
dashboard refactoring, auto update home and workers
1 parent adc4119 commit 518919c

File tree

6 files changed

+67
-22
lines changed

6 files changed

+67
-22
lines changed

server/dashboard/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,4 @@ console.log("dashboard");
66
window.addEventListener("load", async () => {
77
console.log("loaded");
88
startNavListener();
9-
10-
await home();
119
});

server/dashboard/static/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616
<div class="content" id="content">
1717
<div class="subcontent" id="box-home">
1818
<div id="projects-list"></div>
19+
<h6 id="projects-update-text">~</h6>
20+
<input type="button" id="projects-update-button" value="Update"/>
1921
</div>
2022
<div class="subcontent hidden" id="box-workers">
2123
<div id="workers-list"></div>
24+
<h6 id="workers-update-text">~</h6>
25+
<input type="button" id="workers-update-button" value="Update"/>
2226
</div>
2327
<div class="subcontent hidden" id="box-upload">
2428
<form ref="uploadform" id="uploadform" method="post" action="#" enctype="multipart/form-data">

server/dashboard/ts/dom.ts

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,17 @@ import settings from "./settings";
77
* Start up the navbar handler so that clicking the buttons changes what "page" you are on
88
*/
99
export async function startNavListener() {
10+
await home();
11+
await workers();
12+
await upload();
13+
await settings();
14+
1015
let boxes = ["home", "workers", "upload", "settings"];
1116
for(let box of boxes) {
1217
let button = document.getElementById(`nav-${box}`)!;
1318
button.addEventListener("click", async e => {
1419
if(button.classList.contains("active")) return; // if we are already on this page, ignore
1520

16-
switch(box) {
17-
case "home":
18-
await home();
19-
break;
20-
case "workers":
21-
await workers();
22-
break;
23-
case "upload":
24-
await upload();
25-
break;
26-
case "settings":
27-
await settings();
28-
break;
29-
default:
30-
await (async () => {})();
31-
break;
32-
}
33-
3421
// hide all the other boxes
3522
for(let otherBox of boxes.filter(b => b != box)) {
3623
document.getElementById(`box-${otherBox}`)?.classList.add("hidden");

server/dashboard/ts/home.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
import axios from "axios";
22
import {apiurl, networkOptions} from "./networking";
3+
import {autoUpdate} from "./util/autoupdate";
34
import * as types from "./types/api";
45

6+
const UPDATE_RATE = 30; // ten seconds
7+
58
let projectsList = document.getElementById("projects-list")!;
9+
let projectsUpdateText = document.getElementById("projects-update-text")! as HTMLHeadingElement;
10+
let projectsUpdateButton = document.getElementById("projects-update-button")! as HTMLInputElement;
611

712
export default async function home() {
13+
await homeTask();
14+
15+
autoUpdate(projectsUpdateText, projectsUpdateButton, UPDATE_RATE, async () => {
16+
await homeTask();
17+
});
18+
}
19+
20+
async function homeTask() {
821
projectsList.innerHTML = "";
922

1023
let projects:types.ProjectsIndexResponse = (await axios.post(`${apiurl()}/api/projectsindex`, {unfinishedonly: false}, networkOptions())).data;
@@ -80,7 +93,7 @@ export default async function home() {
8093

8194
await axios.post(`${apiurl()}/api/deleteproject`, {projectid: project.id}, networkOptions());
8295

83-
home();
96+
await homeTask();
8497
});
8598
section.appendChild(deleteButton);
8699

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* Automatically update (via an external function) a thing every x seconds
3+
* Uses provided element to display how long, and a button to update now
4+
*
5+
* @param text Text element to display "Updating in 3s" etc
6+
* @param updateButton Button to update now
7+
* @param cooldownTime Time between update (in seconds)
8+
* @param doTask Task to do, async allowed
9+
*/
10+
export function autoUpdate(text:HTMLElement, updateButton:HTMLInputElement, cooldownTime:number, doTask:() => Promise<void>) {
11+
let countdown = cooldownTime;
12+
setInterval(async () => {
13+
text.innerHTML = `Updating in ${Math.max(countdown, 0)}s`;
14+
15+
countdown -= 1;
16+
if(countdown !== -1) return;
17+
18+
text.innerHTML = "Updating...";
19+
await doTask();
20+
countdown = cooldownTime;
21+
}, 1000);
22+
23+
updateButton.addEventListener("click", async () => {
24+
text.innerHTML = "Updating...";
25+
await doTask();
26+
countdown = cooldownTime;
27+
});
28+
}

server/dashboard/ts/workers.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
import axios from "axios";
2+
import {autoUpdate} from "./util/autoupdate";
23
import {apiurl, networkOptions} from "./networking";
34
import * as types from "./types/api";
45

6+
const UPDATE_RATE = 10;
7+
58
let workersList = document.getElementById("workers-list")!;
9+
let workersUpdateText = document.getElementById("workers-update-text")! as HTMLElement;
10+
let workersUpdateButton = document.getElementById("workers-update-button")! as HTMLInputElement;
611

712
export default async function workers() {
8-
workersList.innerHTML = "";
13+
await workersTask();
14+
15+
autoUpdate(workersUpdateText, workersUpdateButton, UPDATE_RATE, async () => {
16+
await workersTask();
17+
});
18+
}
19+
20+
async function workersTask() {
921

1022
let workers:types.OnlineWorkersResponse = (await axios.post(`${apiurl()}/api/onlineworkers`, {}, networkOptions())).data;
1123
if(!workers.success) {
@@ -16,6 +28,9 @@ export default async function workers() {
1628
return;
1729
}
1830

31+
32+
workersList.innerHTML = "";
33+
1934
for(let i = 0; i < workers.workers.length; i++) {
2035
let worker = workers.workers[i];
2136

0 commit comments

Comments
 (0)