diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 07d03e299..384a7d572 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 d5ef1dc21..091426df5 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/src/buttons.ts b/netbox/project-static/src/buttons.ts index 0486c9db4..7527bbb9c 100644 --- a/netbox/project-static/src/buttons.ts +++ b/netbox/project-static/src/buttons.ts @@ -1,5 +1,6 @@ import { createToast } from './bs'; import { setColorMode } from './colorMode'; +import { objectDepthState } from './stores'; import { slugify, isTruthy, @@ -10,6 +11,10 @@ import { findFirstAdjacent, } from './util'; +import type { StateManager } from './state'; + +type ObjectDepthState = { hidden: boolean }; + /** * When the toggle button is clicked, swap the connection status via the API and toggle CSS * classes to reflect the connection status. @@ -60,6 +65,79 @@ function initConnectionToggle() { } } +/** + * Change toggle button's text and attribute to reflect the current state. + * + * @param hidden `true` if the current state is hidden, `false` otherwise. + * @param button Toggle element. + */ +function toggleDepthButton(hidden: boolean, button: HTMLButtonElement): void { + button.setAttribute('data-depth-indicators', hidden ? 'hidden' : 'shown'); + button.innerText = hidden ? 'Show Depth Indicators' : 'Hide Depth Indicators'; +} + +/** + * Show all depth indicators. + */ +function showDepthIndicators(): void { + for (const element of getElements('.record-depth')) { + element.style.display = ''; + } +} + +/** + * Hide all depth indicators. + */ +function hideDepthIndicators(): void { + for (const element of getElements('.record-depth')) { + element.style.display = 'none'; + } +} + +/** + * Update object depth local state and visualization when the button is clicked. + * + * @param state State instance. + * @param button Toggle element. + */ +function handleDepthToggle(state: StateManager, button: HTMLButtonElement): void { + const initiallyHidden = state.get('hidden'); + state.set('hidden', !initiallyHidden); + const hidden = state.get('hidden'); + + if (hidden) { + hideDepthIndicators(); + } else { + showDepthIndicators(); + } + toggleDepthButton(hidden, button); +} + +/** + * Initialize object depth toggle buttons. + */ +function initDepthToggle() { + const initiallyHidden = objectDepthState.get('hidden'); + + for (const button of getElements('button.toggle-depth')) { + toggleDepthButton(initiallyHidden, button); + + button.addEventListener( + 'click', + event => { + handleDepthToggle(objectDepthState, event.currentTarget as HTMLButtonElement); + }, + false, + ); + } + // Synchronize local state with default DOM elements. + if (initiallyHidden) { + hideDepthIndicators(); + } else if (!initiallyHidden) { + showDepthIndicators(); + } +} + /** * If a slug field exists, add event listeners to handle automatically generating its value. */ @@ -239,6 +317,7 @@ function initPerPage() { export function initButtons() { for (const func of [ + initDepthToggle, initConnectionToggle, initReslug, initSelectAll, diff --git a/netbox/project-static/src/stores/index.ts b/netbox/project-static/src/stores/index.ts index 5ee4adabb..42d4aa0b5 100644 --- a/netbox/project-static/src/stores/index.ts +++ b/netbox/project-static/src/stores/index.ts @@ -1 +1,2 @@ +export * from './objectDepth'; export * from './rackImages'; diff --git a/netbox/project-static/src/stores/objectDepth.ts b/netbox/project-static/src/stores/objectDepth.ts new file mode 100644 index 000000000..d3116ed6c --- /dev/null +++ b/netbox/project-static/src/stores/objectDepth.ts @@ -0,0 +1,6 @@ +import { createState } from '../state'; + +export const objectDepthState = createState<{ hidden: boolean }>( + { hidden: false }, + { persist: true, key: 'netbox-object-depth' }, +); diff --git a/netbox/templates/ipam/prefix_list.html b/netbox/templates/ipam/prefix_list.html index f65d45c58..d621f455d 100644 --- a/netbox/templates/ipam/prefix_list.html +++ b/netbox/templates/ipam/prefix_list.html @@ -2,6 +2,9 @@ {% load helpers %} {% block extra_controls %} +