#6797: Fix API select styles

This commit is contained in:
checktheroads 2021-07-24 18:11:01 -07:00
parent 4489e130f2
commit 0b80d85c6c
9 changed files with 57 additions and 33 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -33,6 +33,7 @@ type APIObjectBase = {
display: string; display: string;
name?: Nullable<string>; name?: Nullable<string>;
url: string; url: string;
_depth?: number;
[k: string]: JSONAble; [k: string]: JSONAble;
}; };

View File

@ -57,12 +57,6 @@ class APISelect {
*/ */
public readonly placeholder: string; public readonly placeholder: string;
/**
* This element's options come from the server pre-sorted and should not be sorted client-side.
* Determined by the existence of the `pre-sorted` attribute on the base `<select/>` element.
*/
private readonly preSorted: boolean = false;
/** /**
* Event to be dispatched when dependent fields' values change. * Event to be dispatched when dependent fields' values change.
*/ */
@ -112,6 +106,13 @@ class APISelect {
*/ */
private queryUrl: string = ''; private queryUrl: string = '';
/**
* This element's options come from the server pre-sorted and should not be sorted client-side.
* Determined by the existence of the `pre-sorted` attribute on the base `<select/>` element, or
* by existence of specific fields such as `_depth`.
*/
private preSorted: boolean = false;
/** /**
* This instance's available options. * This instance's available options.
*/ */
@ -161,7 +162,8 @@ class APISelect {
this.updatePathValues(filter); this.updatePathValues(filter);
} }
this.queryParams.set('brief', true); // TODO: Re-enable this. Disabled because `_depth` field is missing from brief responses.
// this.queryParams.set('brief', true);
this.queryParams.set('limit', 0); this.queryParams.set('limit', 0);
this.updateQueryUrl(); this.updateQueryUrl();
@ -314,7 +316,15 @@ class APISelect {
const options = [PLACEHOLDER] as Option[]; const options = [PLACEHOLDER] as Option[];
for (const result of results) { for (const result of results) {
const text = result.display; let text = result.display;
if (typeof result._depth === 'number') {
// If the object has a `_depth` property, indent its display text.
if (!this.preSorted) {
this.preSorted = true;
}
text = `<span class="depth">${'─'.repeat(result._depth)}</span> ${text}`;
}
const data = {} as Record<string, string>; const data = {} as Record<string, string>;
const value = result.id.toString(); const value = result.id.toString();
let style, selected, disabled; let style, selected, disabled;

View File

@ -21,7 +21,7 @@ $spacing-s: $input-padding-x;
--nbx-select-option-hover-color: #{$white}; --nbx-select-option-hover-color: #{$white};
--nbx-select-placeholder-color: #{$gray-600}; --nbx-select-placeholder-color: #{$gray-600};
--nbx-select-value-color: #{$white}; --nbx-select-value-color: #{$white};
& body[data-netbox-color-mode='dark'] { &[data-netbox-color-mode='dark'] {
// Dark Mode Variables. // Dark Mode Variables.
--nbx-select-content-bg: #{$gray-900}; --nbx-select-content-bg: #{$gray-900};
--nbx-select-option-selected-bg: #{$gray-500}; --nbx-select-option-selected-bg: #{$gray-500};
@ -100,25 +100,36 @@ $spacing-s: $input-padding-x;
.ss-content { .ss-content {
background-color: var(--nbx-select-content-bg); background-color: var(--nbx-select-content-bg);
.ss-list { .ss-list {
.ss-option.ss-option-selected { .ss-option {
&.ss-option-selected {
background-color: var(--nbx-select-option-selected-bg); background-color: var(--nbx-select-option-selected-bg);
color: $body-color; color: $body-color;
} }
.ss-option:hover {
&:hover {
background-color: var(--nbx-select-option-hover-bg); background-color: var(--nbx-select-option-hover-bg);
color: var(--nbx-select-option-hover-color); color: var(--nbx-select-option-hover-color);
} }
.ss-option:last-child {
&:last-child {
border-bottom-left-radius: $form-select-border-radius; border-bottom-left-radius: $form-select-border-radius;
border-bottom-right-radius: $form-select-border-radius; border-bottom-right-radius: $form-select-border-radius;
} }
.ss-option.ss-disabled {
&.ss-disabled {
background-color: transparent; background-color: transparent;
}
.ss-option.ss-disabled:hover { &:hover {
color: $form-select-disabled-color; color: $form-select-disabled-color;
} }
} }
.depth {
// Lighten the dash prefix on nested options.
opacity: 0.3;
}
}
}
border-bottom-left-radius: $form-select-border-radius; border-bottom-left-radius: $form-select-border-radius;
border-bottom-right-radius: $form-select-border-radius; border-bottom-right-radius: $form-select-border-radius;
.ss-search { .ss-search {

View File

@ -96,7 +96,7 @@ $input-group-addon-bg: $gray-700;
$input-group-addon-border-color: $input-border-color; $input-group-addon-border-color: $input-border-color;
$form-select-color: $input-color; $form-select-color: $input-color;
$form-select-disabled-color: $gray-700; $form-select-disabled-color: $gray-500;
$form-select-bg: $input-bg; $form-select-bg: $input-bg;
$form-select-disabled-bg: $input-disabled-bg; $form-select-disabled-bg: $input-disabled-bg;
$form-select-indicator-color: $form-select-color; $form-select-indicator-color: $form-select-color;

View File

@ -6,7 +6,7 @@ $input-border-color: $gray-200;
$theme-colors: map-merge($theme-colors, $theme-color-addons); $theme-colors: map-merge($theme-colors, $theme-color-addons);
$light: $gray-100; $light: $gray-200;
$card-cap-color: $gray-800; $card-cap-color: $gray-800;
@ -26,5 +26,7 @@ $list-group-disabled-color: $gray-500;
$table-flush-header-bg: $gray-100; $table-flush-header-bg: $gray-100;
$form-select-disabled-color: $gray-600;
// Tabbed content // Tabbed content
$tab-content-bg: $gray-100; $tab-content-bg: $gray-100;