diff --git a/netbox/project-static/dist/config.js b/netbox/project-static/dist/config.js index 0e701fc85..7cf3ccb30 100644 Binary files a/netbox/project-static/dist/config.js and b/netbox/project-static/dist/config.js differ diff --git a/netbox/project-static/dist/config.js.map b/netbox/project-static/dist/config.js.map index 63379ab42..d070a0451 100644 Binary files a/netbox/project-static/dist/config.js.map and b/netbox/project-static/dist/config.js.map differ diff --git a/netbox/project-static/dist/jobs.js b/netbox/project-static/dist/jobs.js index a2d9ead62..221d48d56 100644 Binary files a/netbox/project-static/dist/jobs.js and b/netbox/project-static/dist/jobs.js differ diff --git a/netbox/project-static/dist/jobs.js.map b/netbox/project-static/dist/jobs.js.map index c1e2ac34b..f549c87af 100644 Binary files a/netbox/project-static/dist/jobs.js.map and b/netbox/project-static/dist/jobs.js.map differ diff --git a/netbox/project-static/dist/lldp.js b/netbox/project-static/dist/lldp.js index a704b158d..7fac1012a 100644 Binary files a/netbox/project-static/dist/lldp.js and b/netbox/project-static/dist/lldp.js differ diff --git a/netbox/project-static/dist/lldp.js.map b/netbox/project-static/dist/lldp.js.map index ab5d4295a..911cd77c3 100644 Binary files a/netbox/project-static/dist/lldp.js.map and b/netbox/project-static/dist/lldp.js.map differ diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index a60f4eaa8..0a34d582c 100644 Binary files a/netbox/project-static/dist/netbox.js and b/netbox/project-static/dist/netbox.js differ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 984391b01..75a47192a 100644 Binary files a/netbox/project-static/dist/netbox.js.map and b/netbox/project-static/dist/netbox.js.map differ diff --git a/netbox/project-static/dist/status.js b/netbox/project-static/dist/status.js index f4e64b5ef..c817efb4c 100644 Binary files a/netbox/project-static/dist/status.js and b/netbox/project-static/dist/status.js differ diff --git a/netbox/project-static/dist/status.js.map b/netbox/project-static/dist/status.js.map index d2c1a9c49..53b01423e 100644 Binary files a/netbox/project-static/dist/status.js.map and b/netbox/project-static/dist/status.js.map differ diff --git a/netbox/project-static/src/tableConfig.ts b/netbox/project-static/src/tableConfig.ts index ff12e8d68..3d2ae012b 100644 --- a/netbox/project-static/src/tableConfig.ts +++ b/netbox/project-static/src/tableConfig.ts @@ -53,8 +53,8 @@ function removeColumns(event: Event): void { /** * Submit form configuration to the NetBox API. */ -async function submitFormConfig(formConfig: Dict): Promise> { - return await apiPatch('/api/users/config/', formConfig); +async function submitFormConfig(url: string, formConfig: Dict): Promise> { + return await apiPatch(url, formConfig); } /** @@ -66,6 +66,18 @@ function handleSubmit(event: Event): void { const element = event.currentTarget as HTMLFormElement; + // Get the API URL for submitting the form + const url = element.getAttribute('data-url'); + if (url == null) { + const toast = createToast( + 'danger', + 'Error Updating Table Configuration', + 'No API path defined for configuration form.' + ); + toast.show(); + return; + } + // Get all the selected options from any select element in the form. const options = getSelectedOptions(element); @@ -83,7 +95,7 @@ function handleSubmit(event: Event): void { const data = path.reduceRight>((value, key) => ({ [key]: value }), formData); // Submit the resulting object to the API to update the user's preferences for this table. - submitFormConfig(data).then(res => { + submitFormConfig(url, data).then(res => { if (hasError(res)) { const toast = createToast('danger', 'Error Updating Table Configuration', res.error); toast.show(); diff --git a/netbox/project-static/src/util.ts b/netbox/project-static/src/util.ts index 278ccc3e5..d7a8d5b6a 100644 --- a/netbox/project-static/src/util.ts +++ b/netbox/project-static/src/util.ts @@ -1,7 +1,4 @@ import Cookie from 'cookie'; -import queryString from 'query-string'; - -import type { Stringifiable } from 'query-string'; type Method = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'; type ReqData = URLSearchParams | Dict | undefined | unknown; @@ -107,84 +104,8 @@ function getCsrfToken(): string { return csrfToken; } -/** - * Get the NetBox `settings.BASE_PATH` from the `` element's data attributes. - * - * @returns If there is no `BASE_PATH` specified, the return value will be `''`. - */ function getBasePath(): string { - const value = document.documentElement.getAttribute('data-netbox-base-path'); - if (value === null) { - return ''; - } - return value; -} - -/** - * Constrict an object from a URL query param string, with all values as an array. - * - * @param params URL search query string. - * @returns Constructed query object. - */ -function queryParamsToObject(params: string): Record { - const result = {} as Record; - const searchParams = new URLSearchParams(params); - for (const [key, originalValue] of searchParams.entries()) { - let value = [] as Stringifiable[]; - if (key in result) { - value = [...value, ...result[key]]; - } - if (Array.isArray(originalValue)) { - value = [...value, ...originalValue]; - } else { - value = [...value, originalValue]; - } - result[key] = value; - } - return result; -} - -/** - * Build a NetBox URL that includes `settings.BASE_PATH` and enforces leading and trailing slashes. - * - * @example - * ```js - * // With a BASE_PATH of 'netbox/' - * const url = buildUrl('/api/dcim/devices'); - * console.log(url); - * // => /netbox/api/dcim/devices/ - * ``` - * - * @param path Relative path _after_ (excluding) the `BASE_PATH`. - */ -function buildUrl(destination: string): string { - // Separate the path from any URL search params. - const [pathname, search] = destination.split(/(?=\?)/g); - - // If the `origin` exists in the API path (as in the case of paginated responses), remove it. - const origin = new RegExp(window.location.origin, 'g'); - const path = pathname.replaceAll(origin, ''); - - const basePath = getBasePath(); - - // Combine `BASE_PATH` with this request's path, removing _all_ slashes. - let combined = [...basePath.split('/'), ...path.split('/')].filter(p => p); - - if (combined[0] !== '/') { - // Ensure the URL has a leading slash. - combined = ['', ...combined]; - } - if (combined[combined.length - 1] !== '/') { - // Ensure the URL has a trailing slash. - combined = [...combined, '']; - } - const url = combined.join('/'); - // Construct an object from the URL search params so it can be re-serialized with the new URL. - const query = queryParamsToObject(search); - return queryString.stringifyUrl({ url, query }); -} - export async function apiRequest( - path: string, + url: string, method: Method, data?: D, ): Promise> { @@ -196,7 +117,6 @@ export async function apiRequest( body = JSON.stringify(data); headers.set('content-type', 'application/json'); } - const url = buildUrl(path); const res = await fetch(url, { method, body, headers, credentials: 'same-origin' }); const contentType = res.headers.get('Content-Type'); diff --git a/netbox/templates/utilities/templatetags/table_config_form.html b/netbox/templates/utilities/templatetags/table_config_form.html index 5e17497e9..cad3a306a 100644 --- a/netbox/templates/utilities/templatetags/table_config_form.html +++ b/netbox/templates/utilities/templatetags/table_config_form.html @@ -7,7 +7,7 @@ -
+