mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-17 01:02:18 -06:00
Compare commits
1 Commits
20911-drop
...
21118-site
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cbfe94fba |
@@ -733,10 +733,9 @@ class ModuleForm(ModuleCommonForm, PrimaryModelForm):
|
|||||||
)
|
)
|
||||||
module_bay = DynamicModelChoiceField(
|
module_bay = DynamicModelChoiceField(
|
||||||
label=_('Module bay'),
|
label=_('Module bay'),
|
||||||
queryset=ModuleBay.objects.order_by('name'),
|
queryset=ModuleBay.objects.all(),
|
||||||
query_params={
|
query_params={
|
||||||
'device_id': '$device',
|
'device_id': '$device'
|
||||||
'ordering': 'name',
|
|
||||||
},
|
},
|
||||||
context={
|
context={
|
||||||
'disabled': 'installed_module',
|
'disabled': 'installed_module',
|
||||||
|
|||||||
@@ -211,12 +211,16 @@ def sync_cached_scope_fields(instance, created, **kwargs):
|
|||||||
for model in (Prefix, Cluster, WirelessLAN):
|
for model in (Prefix, Cluster, WirelessLAN):
|
||||||
qs = model.objects.filter(**filters)
|
qs = model.objects.filter(**filters)
|
||||||
|
|
||||||
|
# Bulk update cached fields to avoid O(N) performance issues with large datasets.
|
||||||
|
# This does not trigger post_save signals, avoiding spurious change log entries.
|
||||||
|
objects_to_update = []
|
||||||
for obj in qs:
|
for obj in qs:
|
||||||
# Recompute cache using the same logic as save()
|
# Recompute cache using the same logic as save()
|
||||||
obj.cache_related_objects()
|
obj.cache_related_objects()
|
||||||
obj.save(update_fields=[
|
objects_to_update.append(obj)
|
||||||
'_location',
|
|
||||||
'_site',
|
if objects_to_update:
|
||||||
'_site_group',
|
model.objects.bulk_update(
|
||||||
'_region',
|
objects_to_update,
|
||||||
])
|
['_location', '_site', '_site_group', '_region']
|
||||||
|
)
|
||||||
|
|||||||
2
netbox/project-static/dist/netbox.js
vendored
2
netbox/project-static/dist/netbox.js
vendored
File diff suppressed because one or more lines are too long
6
netbox/project-static/dist/netbox.js.map
vendored
6
netbox/project-static/dist/netbox.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -75,16 +75,10 @@ export class DynamicTomSelect extends TomSelect {
|
|||||||
load(value: string) {
|
load(value: string) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
// Save current selection before clearing
|
|
||||||
const currentValue = self.getValue();
|
|
||||||
|
|
||||||
// Automatically clear any cached options. (Only options included
|
// Automatically clear any cached options. (Only options included
|
||||||
// in the API response should be present.)
|
// in the API response should be present.)
|
||||||
self.clearOptions();
|
self.clearOptions();
|
||||||
|
|
||||||
// Clear user_options to prevent the pre-selected option from being treated specially
|
|
||||||
(self as any).user_options = {};
|
|
||||||
|
|
||||||
// Populate the null option (if any) if not searching
|
// Populate the null option (if any) if not searching
|
||||||
if (self.nullOption && !value) {
|
if (self.nullOption && !value) {
|
||||||
self.addOption(self.nullOption);
|
self.addOption(self.nullOption);
|
||||||
@@ -104,29 +98,16 @@ export class DynamicTomSelect extends TomSelect {
|
|||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(apiData => {
|
.then(apiData => {
|
||||||
const results: Dict[] = apiData.results;
|
const results: Dict[] = apiData.results;
|
||||||
|
const options: Dict[] = [];
|
||||||
// Add options and manually set $order to ensure correct sorting
|
for (const result of results) {
|
||||||
results.forEach((result, index) => {
|
|
||||||
const option = self.getOptionFromData(result);
|
const option = self.getOptionFromData(result);
|
||||||
self.addOption(option);
|
options.push(option);
|
||||||
// Set $order after addOption() to override any special handling of pre-selected items
|
|
||||||
const key = option[self.settings.valueField as string] as string;
|
|
||||||
if (self.options[key]) {
|
|
||||||
(self.options[key] as any).$order = index;
|
|
||||||
}
|
}
|
||||||
});
|
return options;
|
||||||
|
})
|
||||||
self.loading--;
|
// Pass the options to the callback function
|
||||||
if (self.loading === 0) {
|
.then(options => {
|
||||||
self.wrapper.classList.remove(self.settings.loadingClass as string);
|
self.loadCallback(options, []);
|
||||||
}
|
|
||||||
|
|
||||||
// Restore the current selection
|
|
||||||
if (currentValue && !self.items.includes(currentValue as string)) {
|
|
||||||
self.items.push(currentValue as string);
|
|
||||||
}
|
|
||||||
|
|
||||||
self.refreshOptions(false);
|
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
self.loadCallback([], []);
|
self.loadCallback([], []);
|
||||||
|
|||||||
@@ -49,9 +49,6 @@ export function initDynamicSelects(): void {
|
|||||||
labelField: LABEL_FIELD,
|
labelField: LABEL_FIELD,
|
||||||
maxOptions: MAX_OPTIONS,
|
maxOptions: MAX_OPTIONS,
|
||||||
|
|
||||||
// Preserve API response order
|
|
||||||
sortField: '$order',
|
|
||||||
|
|
||||||
// Disable local search (search is performed on the backend)
|
// Disable local search (search is performed on the backend)
|
||||||
searchField: [],
|
searchField: [],
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user