diff --git a/netbox/project-static/bundle.js b/netbox/project-static/bundle.js index 100b70ac8..76a1581ad 100644 --- a/netbox/project-static/bundle.js +++ b/netbox/project-static/bundle.js @@ -40,7 +40,6 @@ async function bundleGraphIQL() { async function bundleNetBox() { const entryPoints = { netbox: 'src/index.ts', - jobs: 'src/jobs.ts', lldp: 'src/device/lldp.ts', config: 'src/device/config.ts', status: 'src/device/status.ts', diff --git a/netbox/project-static/dist/jobs.js b/netbox/project-static/dist/jobs.js deleted file mode 100644 index 2aedf1219..000000000 Binary files a/netbox/project-static/dist/jobs.js and /dev/null differ diff --git a/netbox/project-static/dist/jobs.js.map b/netbox/project-static/dist/jobs.js.map deleted file mode 100644 index d7c1dbcbf..000000000 Binary files a/netbox/project-static/dist/jobs.js.map and /dev/null differ diff --git a/netbox/project-static/src/global.d.ts b/netbox/project-static/src/global.d.ts index bad12c795..89c106e9c 100644 --- a/netbox/project-static/src/global.d.ts +++ b/netbox/project-static/src/global.d.ts @@ -98,38 +98,6 @@ type APISecret = { url: string; }; -type JobResultLog = { - message: string; - status: 'success' | 'warning' | 'danger' | 'info'; -}; - -type JobStatus = { - label: string; - value: 'completed' | 'failed' | 'errored' | 'running'; -}; - -type APIJobResult = { - completed: string; - created: string; - data: { - log: JobResultLog[]; - output: string; - }; - display: string; - id: number; - job_id: string; - name: string; - obj_type: string; - status: JobStatus; - url: string; - user: { - display: string; - username: string; - id: number; - url: string; - }; -}; - type APIUserConfig = { tables: { [k: string]: { columns: string[]; available_columns: string[] } }; [k: string]: unknown; diff --git a/netbox/project-static/src/jobs.ts b/netbox/project-static/src/jobs.ts deleted file mode 100644 index dedf0706d..000000000 --- a/netbox/project-static/src/jobs.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { createToast } from './bs'; -import { apiGetBase, hasError, getNetboxData } from './util'; - -let timeout: number = 1000; - -interface JobInfo { - url: Nullable; - complete: boolean; -} - -/** - * Mimic the behavior of setTimeout() in an async function. - */ -function asyncTimeout(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -/** - * Job ID & Completion state are only from Django context, which can only be used from the HTML - * template. Hidden elements are present in the template to provide access to these values from - * JavaScript. - */ -function getJobInfo(): JobInfo { - let complete = false; - - // Determine the API URL for the job status - const url = getNetboxData('data-job-url'); - - // Determine the job completion status, if present. If the job is not complete, the value will be - // "None". Otherwise, it will be a stringified date. - const jobComplete = getNetboxData('data-job-complete'); - if (typeof jobComplete === 'string' && jobComplete.toLowerCase() !== 'none') { - complete = true; - } - return { url, complete }; -} - -/** - * Update the job status label element based on the API response. - */ -function updateLabel(status: JobStatus) { - const element = document.querySelector('#pending-result-label > span.badge'); - if (element !== null) { - let labelClass = 'secondary'; - switch (status.value) { - case 'failed' || 'errored': - labelClass = 'danger'; - break; - case 'running': - labelClass = 'warning'; - break; - case 'completed': - labelClass = 'success'; - break; - } - element.setAttribute('class', `badge bg-${labelClass}`); - element.innerText = status.label; - } -} - -/** - * Recursively check the job's status. - * @param url API URL for job result - */ -async function checkJobStatus(url: string) { - const res = await apiGetBase(url); - if (hasError(res)) { - // If the response is an API error, display an error message and stop checking for job status. - const toast = createToast('danger', 'Error', res.error); - toast.show(); - return; - } else { - // Update the job status label. - updateLabel(res.status); - - // If the job is complete, reload the page. - if (['completed', 'failed', 'errored'].includes(res.status.value)) { - location.reload(); - return; - } else { - // Otherwise, keep checking the job's status, backing off 1 second each time, until a 10 - // second interval is reached. - if (timeout < 10000) { - timeout += 1000; - } - await Promise.all([checkJobStatus(url), asyncTimeout(timeout)]); - } - } -} - -function initJobs() { - const { url, complete } = getJobInfo(); - - if (url !== null && !complete) { - // If there is a job ID and it is not completed, check for the job's status. - Promise.resolve(checkJobStatus(url)); - } -} - -if (document.readyState !== 'loading') { - initJobs(); -} else { - document.addEventListener('DOMContentLoaded', initJobs); -}