upend/webui/src/components/layout/Jobs.svelte

64 lines
1.4 KiB
Svelte
Raw Normal View History

2022-01-30 15:39:19 +01:00
<script lang="ts" context="module">
import mitt from "mitt";
export type JobsEvents = {
reload: undefined;
};
export const jobsEmitter = mitt<JobsEvents>();
</script>
2021-12-21 16:10:16 +01:00
<script lang="ts">
import type { IJob } from "upend/types";
import { fade } from "svelte/transition";
2022-01-30 15:39:19 +01:00
import ProgessBar from "../utils/ProgessBar.svelte";
2021-12-21 16:10:16 +01:00
interface JobWithId extends IJob {
id: string;
}
let jobs: JobWithId[] = [];
let activeJobs: JobWithId[] = [];
2022-01-30 16:50:23 +01:00
let timeout: number;
2021-12-21 16:10:16 +01:00
async function updateJobs() {
2022-01-30 15:39:19 +01:00
clearTimeout(timeout);
let request = await fetch("api/jobs");
2021-12-21 16:10:16 +01:00
jobs = await request.json();
activeJobs = Object.entries(jobs)
.filter(([_, job]) => job.state == "InProgress")
.map(([id, job]) => {
return { id, ...job };
2022-02-19 16:31:38 +01:00
})
.sort((j1, j2) => j1.id.localeCompare(j2.id));
2021-12-21 16:10:16 +01:00
if (activeJobs.length) {
2022-01-30 15:39:19 +01:00
timeout = setTimeout(updateJobs, 500);
2021-12-21 16:10:16 +01:00
} else {
2022-01-30 15:39:19 +01:00
timeout = setTimeout(updateJobs, 5000);
2021-12-21 16:10:16 +01:00
}
}
updateJobs();
2022-01-30 15:39:19 +01:00
jobsEmitter.on("reload", () => {
updateJobs();
});
2021-12-21 16:10:16 +01:00
</script>
{#each activeJobs as job (job.id)}
<div class="job" transition:fade>
<div class="job-label">{job.title}</div>
<ProgessBar value={job.progress} />
</div>
{/each}
2021-12-21 16:10:16 +01:00
<style scoped lang="scss">
.job {
display: flex;
.job-label {
white-space: nowrap;
margin-right: 2em;
}
}
</style>