Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions netbox/dcim/forms/model_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -733,9 +733,10 @@ class ModuleForm(ModuleCommonForm, PrimaryModelForm):
)
module_bay = DynamicModelChoiceField(
label=_('Module bay'),
queryset=ModuleBay.objects.all(),
queryset=ModuleBay.objects.order_by('name'),
query_params={
'device_id': '$device'
'device_id': '$device',
'ordering': 'name',
},
context={
'disabled': 'installed_module',
Expand Down
2 changes: 1 addition & 1 deletion netbox/project-static/dist/netbox.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions netbox/project-static/dist/netbox.js.map

Large diffs are not rendered by default.

36 changes: 26 additions & 10 deletions netbox/project-static/src/select/classes/dynamicTomSelect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,15 @@ export class DynamicTomSelect extends TomSelect {
load(value: string) {
const self = this;

const currentValue = self.getValue();

// Automatically clear any cached options. (Only options included
// in the API response should be present.)
self.clearOptions();

// Populate the null option (if any) if not searching
// Clear user_options to prevent the pre-selected option from being treated specially
(self as any).user_options = {};

if (self.nullOption && !value) {
self.addOption(self.nullOption);
}
Expand All @@ -93,21 +97,33 @@ export class DynamicTomSelect extends TomSelect {
addClasses(self.wrapper, self.settings.loadingClass);
self.loading++;

// Make the API request
fetch(url)
.then(response => response.json())
.then(apiData => {
const results: Dict[] = apiData.results;
const options: Dict[] = [];
for (const result of results) {

// Add options and set $order to preserve API response order
results.forEach((result, index) => {
const option = self.getOptionFromData(result);
options.push(option);
self.addOption(option);
const key = option[self.settings.valueField as string] as string;
if (self.options[key]) {
(self.options[key] as any).$order = index;
}
});

if (self.loading > 0) {
self.loading--;
if (self.loading === 0) {
self.wrapper.classList.remove(self.settings.loadingClass as string);
}
}
return options;
})
// Pass the options to the callback function
.then(options => {
self.loadCallback(options, []);

if (currentValue && !self.items.includes(currentValue as string)) {
self.items.push(currentValue as string);
}

self.refreshOptions(false);
})
.catch(() => {
self.loadCallback([], []);
Expand Down
Loading