Просмотр исходного кода

Closes #6863: Add search fields back to filter forms

Matt 4 лет назад
Родитель
Сommit
58862e115c

+ 20 - 3
netbox/circuits/forms.py

@@ -107,9 +107,15 @@ class ProviderBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBu
 class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class ProviderFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Provider
     model = Provider
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_id'],
         ['region_id', 'site_id'],
         ['asn', 'tag'],
         ['asn', 'tag'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -196,7 +202,12 @@ class ProviderNetworkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
 
 
 class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class ProviderNetworkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = ProviderNetwork
     model = ProviderNetwork
-    field_order = ['provider_id']
+    field_order = ['q', 'provider_id', 'tag']
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     provider_id = DynamicModelMultipleChoiceField(
     provider_id = DynamicModelMultipleChoiceField(
         queryset=Provider.objects.all(),
         queryset=Provider.objects.all(),
         required=False,
         required=False,
@@ -358,16 +369,22 @@ class CircuitBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
 class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class CircuitFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Circuit
     model = Circuit
     field_order = [
     field_order = [
-        'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id', 'tenant_id',
-        'commit_rate',
+        'q', 'type_id', 'provider_id', 'provider_network_id', 'status', 'region_id', 'site_id', 'tenant_group_id',
+        'tenant_id', 'commit_rate',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['type_id', 'status', 'commit_rate'],
         ['type_id', 'status', 'commit_rate'],
         ['provider_id', 'provider_network_id'],
         ['provider_id', 'provider_network_id'],
         ['region_id', 'site_id'],
         ['region_id', 'site_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     type_id = DynamicModelMultipleChoiceField(
     type_id = DynamicModelMultipleChoiceField(
         queryset=CircuitType.objects.all(),
         queryset=CircuitType.objects.all(),
         required=False,
         required=False,

+ 103 - 8
netbox/dcim/forms.py

@@ -56,12 +56,18 @@ def get_device_by_name_or_pk(name):
 
 
 class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class DeviceComponentFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     field_order = [
     field_order = [
-        'name', 'label', 'region_id', 'site_group_id', 'site_id',
+        'q', 'name', 'label', 'region_id', 'site_group_id', 'site_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label'],
         ['name', 'label'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     name = forms.CharField(
     name = forms.CharField(
         required=False
         required=False
     )
     )
@@ -452,12 +458,18 @@ class SiteBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
 
 
 class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class SiteFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Site
     model = Site
-    field_order = ['status', 'region_id', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'status', 'region_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['status', 'region_id'],
         ['status', 'region_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     status = forms.MultipleChoiceField(
     status = forms.MultipleChoiceField(
         choices=SiteStatusChoices,
         choices=SiteStatusChoices,
         required=False,
         required=False,
@@ -568,6 +580,11 @@ class LocationBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
 
 
 class LocationFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class LocationFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Location
     model = Location
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -862,12 +879,18 @@ class RackBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
 
 
 class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Rack
     model = Rack
-    field_order = ['region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'region_id', 'site_id', 'location_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['status', 'role_id'],
         ['status', 'role_id'],
         ['region_id', 'site_id', 'location_id'],
         ['region_id', 'site_id', 'location_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -927,7 +950,8 @@ class RackFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterFo
 
 
 class RackElevationFilterForm(RackFilterForm):
 class RackElevationFilterForm(RackFilterForm):
     field_order = [
     field_order = [
-        'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
+        'q', 'region_id', 'site_id', 'location_id', 'id', 'status', 'role_id', 'tenant_group_id',
+        'tenant_id',
     ]
     ]
     id = DynamicModelMultipleChoiceField(
     id = DynamicModelMultipleChoiceField(
         queryset=Rack.objects.all(),
         queryset=Rack.objects.all(),
@@ -1092,11 +1116,17 @@ class RackReservationBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomField
 
 
 class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class RackReservationFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = RackReservation
     model = RackReservation
-    field_order = ['region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'region_id', 'site_id', 'location_id', 'user_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_id', 'location_id'],
         ['region_id', 'site_id', 'location_id'],
         ['user_id', 'tenant_group_id', 'tenant_id'],
         ['user_id', 'tenant_group_id', 'tenant_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -1246,12 +1276,18 @@ class DeviceTypeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
 class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class DeviceTypeFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = DeviceType
     model = DeviceType
     field_groups = [
     field_groups = [
+        ['q'],
         ['manufacturer_id', 'subdevice_role'],
         ['manufacturer_id', 'subdevice_role'],
         ['console_ports', 'console_server_ports'],
         ['console_ports', 'console_server_ports'],
         ['power_ports', 'power_outlets'],
         ['power_ports', 'power_outlets'],
         ['interfaces', 'pass_through_ports'],
         ['interfaces', 'pass_through_ports'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     manufacturer_id = DynamicModelMultipleChoiceField(
     manufacturer_id = DynamicModelMultipleChoiceField(
         queryset=Manufacturer.objects.all(),
         queryset=Manufacturer.objects.all(),
         required=False,
         required=False,
@@ -2058,6 +2094,11 @@ class PlatformBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
 
 
 class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class PlatformFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Platform
     model = Platform
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     manufacturer_id = DynamicModelMultipleChoiceField(
     manufacturer_id = DynamicModelMultipleChoiceField(
         queryset=Manufacturer.objects.all(),
         queryset=Manufacturer.objects.all(),
         required=False,
         required=False,
@@ -2465,16 +2506,23 @@ class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
 class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm):
 class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Device
     model = Device
     field_order = [
     field_order = [
-        'region_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
-        'manufacturer_id', 'device_type_id', 'asset_tag', 'mac_address', 'has_primary_ip',
+        'q', 'region_id', 'site_id', 'location_id', 'rack_id', 'status', 'role_id',
+        'tenant_group_id', 'tenant_id', 'manufacturer_id', 'device_type_id', 'asset_tag',
+        'mac_address', 'has_primary_ip',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_id', 'location_id', 'rack_id'],
         ['region_id', 'site_id', 'location_id', 'rack_id'],
         ['status', 'role_id', 'asset_tag'],
         ['status', 'role_id', 'asset_tag'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['manufacturer_id', 'device_type_id'],
         ['manufacturer_id', 'device_type_id'],
         ['mac_address', 'has_primary_ip'],
         ['mac_address', 'has_primary_ip'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -2654,6 +2702,7 @@ class DeviceBulkAddComponentForm(BootstrapMixin, CustomFieldsMixin, ComponentFor
 class ConsolePortFilterForm(DeviceComponentFilterForm):
 class ConsolePortFilterForm(DeviceComponentFilterForm):
     model = ConsolePort
     model = ConsolePort
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label'],
         ['name', 'label'],
         ['type', 'speed'],
         ['type', 'speed'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
@@ -2761,6 +2810,7 @@ class ConsolePortCSVForm(CustomFieldModelCSVForm):
 class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
 class ConsoleServerPortFilterForm(DeviceComponentFilterForm):
     model = ConsoleServerPort
     model = ConsoleServerPort
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label'],
         ['name', 'label'],
         ['type', 'speed'],
         ['type', 'speed'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
@@ -2868,6 +2918,7 @@ class ConsoleServerPortCSVForm(CustomFieldModelCSVForm):
 class PowerPortFilterForm(DeviceComponentFilterForm):
 class PowerPortFilterForm(DeviceComponentFilterForm):
     model = PowerPort
     model = PowerPort
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'type'],
         ['name', 'label', 'type'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tag'],
         ['tag'],
@@ -2973,6 +3024,7 @@ class PowerPortCSVForm(CustomFieldModelCSVForm):
 class PowerOutletFilterForm(DeviceComponentFilterForm):
 class PowerOutletFilterForm(DeviceComponentFilterForm):
     model = PowerOutlet
     model = PowerOutlet
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'type'],
         ['name', 'label', 'type'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tag'],
         ['tag'],
@@ -3145,6 +3197,7 @@ class PowerOutletCSVForm(CustomFieldModelCSVForm):
 class InterfaceFilterForm(DeviceComponentFilterForm):
 class InterfaceFilterForm(DeviceComponentFilterForm):
     model = Interface
     model = Interface
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'type', 'enabled'],
         ['name', 'label', 'type', 'enabled'],
         ['mgmt_only', 'mac_address'],
         ['mgmt_only', 'mac_address'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
@@ -3493,6 +3546,7 @@ class InterfaceCSVForm(CustomFieldModelCSVForm):
 
 
 class FrontPortFilterForm(DeviceComponentFilterForm):
 class FrontPortFilterForm(DeviceComponentFilterForm):
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'type', 'color'],
         ['name', 'label', 'type', 'color'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tag']
         ['tag']
@@ -3682,6 +3736,7 @@ class FrontPortCSVForm(CustomFieldModelCSVForm):
 class RearPortFilterForm(DeviceComponentFilterForm):
 class RearPortFilterForm(DeviceComponentFilterForm):
     model = RearPort
     model = RearPort
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'type', 'color'],
         ['name', 'label', 'type', 'color'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tag']
         ['tag']
@@ -3783,6 +3838,7 @@ class RearPortCSVForm(CustomFieldModelCSVForm):
 class DeviceBayFilterForm(DeviceComponentFilterForm):
 class DeviceBayFilterForm(DeviceComponentFilterForm):
     model = DeviceBay
     model = DeviceBay
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label'],
         ['name', 'label'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tag']
         ['tag']
@@ -4013,6 +4069,7 @@ class InventoryItemBulkEditForm(
 class InventoryItemFilterForm(DeviceComponentFilterForm):
 class InventoryItemFilterForm(DeviceComponentFilterForm):
     model = InventoryItem
     model = InventoryItem
     field_groups = [
     field_groups = [
+        ['q'],
         ['name', 'label', 'manufacturer_id'],
         ['name', 'label', 'manufacturer_id'],
         ['serial', 'asset_tag', 'discovered'],
         ['serial', 'asset_tag', 'discovered'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
@@ -4488,11 +4545,17 @@ class CableBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkE
 class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Cable
     model = Cable
     field_groups = [
     field_groups = [
+        ['q'],
         ['type', 'status', 'color'],
         ['type', 'status', 'color'],
         ['device_id', 'rack_id'],
         ['device_id', 'rack_id'],
         ['region_id', 'site_id', 'tenant_id'],
         ['region_id', 'site_id', 'tenant_id'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -4556,6 +4619,11 @@ class CableFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 #
 #
 
 
 class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
 class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -4583,6 +4651,11 @@ class ConsoleConnectionFilterForm(BootstrapMixin, forms.Form):
 
 
 
 
 class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
 class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -4610,6 +4683,11 @@ class PowerConnectionFilterForm(BootstrapMixin, forms.Form):
 
 
 
 
 class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form):
 class InterfaceConnectionFilterForm(BootstrapMixin, forms.Form):
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -4877,12 +4955,18 @@ class VirtualChassisCSVForm(CustomFieldModelCSVForm):
 
 
 class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class VirtualChassisFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = VirtualChassis
     model = VirtualChassis
-    field_order = ['region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'region_id', 'site_group_id', 'site_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -5022,6 +5106,11 @@ class PowerPanelBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModel
 
 
 class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class PowerPanelFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = PowerPanel
     model = PowerPanel
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -5260,12 +5349,18 @@ class PowerFeedBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
 class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class PowerFeedFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = PowerFeed
     model = PowerFeed
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['power_panel_id', 'rack_id'],
         ['power_panel_id', 'rack_id'],
         ['type', 'supply', 'max_utilization'],
         ['type', 'supply', 'max_utilization'],
         ['phase', 'voltage', 'amperage'],
         ['phase', 'voltage', 'amperage'],
         ['status', 'tag']
         ['status', 'tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,

+ 44 - 2
netbox/extras/forms.py

@@ -77,9 +77,15 @@ class CustomFieldBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class CustomFieldFilterForm(BootstrapMixin, forms.Form):
 class CustomFieldFilterForm(BootstrapMixin, forms.Form):
     field_groups = [
     field_groups = [
+        ['q'],
         ['type', 'content_types'],
         ['type', 'content_types'],
         ['weight', 'required'],
         ['weight', 'required'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     content_types = ContentTypeMultipleChoiceField(
     content_types = ContentTypeMultipleChoiceField(
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
         limit_choices_to=FeatureQuery('custom_fields')
         limit_choices_to=FeatureQuery('custom_fields')
@@ -167,9 +173,15 @@ class CustomLinkBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class CustomLinkFilterForm(BootstrapMixin, forms.Form):
 class CustomLinkFilterForm(BootstrapMixin, forms.Form):
     field_groups = [
     field_groups = [
+        ['q'],
         ['content_type'],
         ['content_type'],
         ['weight', 'new_window'],
         ['weight', 'new_window'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     content_type = ContentTypeChoiceField(
     content_type = ContentTypeChoiceField(
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
         limit_choices_to=FeatureQuery('custom_fields')
         limit_choices_to=FeatureQuery('custom_fields')
@@ -252,9 +264,15 @@ class ExportTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class ExportTemplateFilterForm(BootstrapMixin, forms.Form):
 class ExportTemplateFilterForm(BootstrapMixin, forms.Form):
     field_groups = [
     field_groups = [
+        ['q'],
         ['content_type', 'mime_type'],
         ['content_type', 'mime_type'],
         ['file_extension', 'as_attachment'],
         ['file_extension', 'as_attachment'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     content_type = ContentTypeChoiceField(
     content_type = ContentTypeChoiceField(
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
         limit_choices_to=FeatureQuery('custom_fields')
         limit_choices_to=FeatureQuery('custom_fields')
@@ -358,9 +376,15 @@ class WebhookBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class WebhookFilterForm(BootstrapMixin, forms.Form):
 class WebhookFilterForm(BootstrapMixin, forms.Form):
     field_groups = [
     field_groups = [
+        ['q'],
         ['content_types', 'http_method'],
         ['content_types', 'http_method'],
         ['enabled', 'type_create', 'type_update', 'type_delete'],
         ['enabled', 'type_create', 'type_update', 'type_delete'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     content_types = ContentTypeMultipleChoiceField(
     content_types = ContentTypeMultipleChoiceField(
         queryset=ContentType.objects.all(),
         queryset=ContentType.objects.all(),
         limit_choices_to=FeatureQuery('custom_fields')
         limit_choices_to=FeatureQuery('custom_fields')
@@ -664,15 +688,21 @@ class ConfigContextBulkEditForm(BootstrapMixin, BulkEditForm):
 
 
 class ConfigContextFilterForm(BootstrapMixin, forms.Form):
 class ConfigContextFilterForm(BootstrapMixin, forms.Form):
     field_order = [
     field_order = [
-        'region_id', 'site_group_id', 'site_id', 'role_id', 'platform_id', 'cluster_group_id', 'cluster_id',
-        'tenant_group_id', 'tenant_id',
+        'q', 'region_id', 'site_group_id', 'site_id', 'role_id', 'platform_id', 'cluster_group_id',
+        'cluster_id', 'tenant_group_id', 'tenant_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['device_type_id', 'role_id', 'platform_id'],
         ['device_type_id', 'role_id', 'platform_id'],
         ['cluster_group_id', 'cluster_id'],
         ['cluster_group_id', 'cluster_id'],
         ['tenant_group_id', 'tenant_id', 'tag']
         ['tenant_group_id', 'tenant_id', 'tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -812,9 +842,15 @@ class JournalEntryBulkEditForm(BootstrapMixin, BulkEditForm):
 class JournalEntryFilterForm(BootstrapMixin, forms.Form):
 class JournalEntryFilterForm(BootstrapMixin, forms.Form):
     model = JournalEntry
     model = JournalEntry
     field_groups = [
     field_groups = [
+        ['q'],
         ['created_before', 'created_after', 'created_by_id'],
         ['created_before', 'created_after', 'created_by_id'],
         ['assigned_object_type_id', 'kind']
         ['assigned_object_type_id', 'kind']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     created_after = forms.DateTimeField(
     created_after = forms.DateTimeField(
         required=False,
         required=False,
         label=_('After'),
         label=_('After'),
@@ -857,9 +893,15 @@ class JournalEntryFilterForm(BootstrapMixin, forms.Form):
 class ObjectChangeFilterForm(BootstrapMixin, forms.Form):
 class ObjectChangeFilterForm(BootstrapMixin, forms.Form):
     model = ObjectChange
     model = ObjectChange
     field_groups = [
     field_groups = [
+        ['q'],
         ['time_before', 'time_after', 'action'],
         ['time_before', 'time_after', 'action'],
         ['user_id', 'changed_object_type_id'],
         ['user_id', 'changed_object_type_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     time_after = forms.DateTimeField(
     time_after = forms.DateTimeField(
         required=False,
         required=False,
         label=_('After'),
         label=_('After'),

+ 59 - 8
netbox/ipam/forms.py

@@ -106,12 +106,18 @@ class VRFBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEdi
 
 
 class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class VRFFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = VRF
     model = VRF
-    field_order = ['import_target_id', 'export_target_id', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'import_target_id', 'export_target_id', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['import_target_id', 'export_target_id'],
         ['import_target_id', 'export_target_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     import_target_id = DynamicModelMultipleChoiceField(
     import_target_id = DynamicModelMultipleChoiceField(
         queryset=RouteTarget.objects.all(),
         queryset=RouteTarget.objects.all(),
         required=False,
         required=False,
@@ -179,11 +185,17 @@ class RouteTargetBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
 
 
 class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class RouteTargetFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = RouteTarget
     model = RouteTarget
-    field_order = ['name', 'tenant_group_id', 'tenant_id', 'importing_vrfs', 'exporting_vrfs']
+    field_order = ['q', 'name', 'tenant_group_id', 'tenant_id', 'importing_vrfs', 'exporting_vrfs']
     field_groups = [
     field_groups = [
+        ['q'],
         ['importing_vrf_id', 'exporting_vrf_id'],
         ['importing_vrf_id', 'exporting_vrf_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     importing_vrf_id = DynamicModelMultipleChoiceField(
     importing_vrf_id = DynamicModelMultipleChoiceField(
         queryset=VRF.objects.all(),
         queryset=VRF.objects.all(),
         required=False,
         required=False,
@@ -335,11 +347,17 @@ class AggregateBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelB
 
 
 class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class AggregateFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Aggregate
     model = Aggregate
-    field_order = ['family', 'rir', 'tenant_group_id', 'tenant_id']
+    field_order = ['q', 'family', 'rir', 'tenant_group_id', 'tenant_id']
     field_groups = [
     field_groups = [
+        ['q'],
         ['family', 'rir_id'],
         ['family', 'rir_id'],
         ['tenant_group_id', 'tenant_id']
         ['tenant_group_id', 'tenant_id']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     family = forms.ChoiceField(
     family = forms.ChoiceField(
         required=False,
         required=False,
         choices=add_blank_choice(IPAddressFamilyChoices),
         choices=add_blank_choice(IPAddressFamilyChoices),
@@ -610,15 +628,22 @@ class PrefixBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulk
 class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class PrefixFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Prefix
     model = Prefix
     field_order = [
     field_order = [
-        'within_include', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'region_id',
-        'site_group_id', 'site_id', 'role_id', 'tenant_group_id', 'tenant_id', 'is_pool', 'mark_utilized',
+        'q', 'within_include', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status',
+        'region_id', 'site_group_id', 'site_id', 'role_id', 'tenant_group_id', 'tenant_id',
+        'is_pool', 'mark_utilized',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['role_id', 'within_include', 'family', 'mask_length'],
         ['role_id', 'within_include', 'family', 'mask_length'],
         ['vrf_id', 'present_in_vrf_id', 'is_pool', 'mark_utilized'],
         ['vrf_id', 'present_in_vrf_id', 'is_pool', 'mark_utilized'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['tenant_group_id', 'tenant_id', 'status', 'tag']
         ['tenant_group_id', 'tenant_id', 'status', 'tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     mask_length__lte = forms.IntegerField(
     mask_length__lte = forms.IntegerField(
         widget=forms.HiddenInput()
         widget=forms.HiddenInput()
     )
     )
@@ -813,12 +838,18 @@ class IPRangeBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
 class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class IPRangeFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = IPRange
     model = IPRange
     field_order = [
     field_order = [
-        'family', 'vrf_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
+        'q', 'family', 'vrf_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['family', 'vrf_id', 'status', 'role_id'],
         ['family', 'vrf_id', 'status', 'role_id'],
         ['tenant_group_id', 'tenant_id', 'tag'],
         ['tenant_group_id', 'tenant_id', 'tag'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     family = forms.ChoiceField(
     family = forms.ChoiceField(
         required=False,
         required=False,
         choices=add_blank_choice(IPAddressFamilyChoices),
         choices=add_blank_choice(IPAddressFamilyChoices),
@@ -1244,15 +1275,21 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form):
 class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = IPAddress
     model = IPAddress
     field_order = [
     field_order = [
-        'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role',
+        'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role',
         'assigned_to_interface', 'tenant_group_id', 'tenant_id',
         'assigned_to_interface', 'tenant_group_id', 'tenant_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['parent', 'family', 'mask_length'],
         ['parent', 'family', 'mask_length'],
         ['status', 'vrf_id', 'present_in_vrf_id'],
         ['status', 'vrf_id', 'present_in_vrf_id'],
         ['role', 'assigned_to_interface'],
         ['role', 'assigned_to_interface'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     parent = forms.CharField(
     parent = forms.CharField(
         required=False,
         required=False,
         widget=forms.TextInput(
         widget=forms.TextInput(
@@ -1444,11 +1481,13 @@ class VLANGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
 
 
 class VLANGroupFilterForm(BootstrapMixin, forms.Form):
 class VLANGroupFilterForm(BootstrapMixin, forms.Form):
     field_groups = [
     field_groups = [
+        ['q'],
         ['region', 'sitegroup', 'site'],
         ['region', 'sitegroup', 'site'],
         ['location', 'rack']
         ['location', 'rack']
     ]
     ]
     q = forms.CharField(
     q = forms.CharField(
         required=False,
         required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
         label=_('Search')
         label=_('Search')
     )
     )
     region = DynamicModelMultipleChoiceField(
     region = DynamicModelMultipleChoiceField(
@@ -1662,13 +1701,20 @@ class VLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEd
 class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class VLANFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = VLAN
     model = VLAN
     field_order = [
     field_order = [
-        'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id', 'tenant_group_id', 'tenant_id',
+        'q', 'region_id', 'site_group_id', 'site_id', 'group_id', 'status', 'role_id',
+        'tenant_group_id', 'tenant_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['region_id', 'site_group_id', 'site_id'],
         ['region_id', 'site_group_id', 'site_id'],
         ['group_id', 'role_id', 'status'],
         ['group_id', 'role_id', 'status'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     region_id = DynamicModelMultipleChoiceField(
     region_id = DynamicModelMultipleChoiceField(
         queryset=Region.objects.all(),
         queryset=Region.objects.all(),
         required=False,
         required=False,
@@ -1765,6 +1811,11 @@ class ServiceForm(BootstrapMixin, CustomFieldModelForm):
 
 
 class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class ServiceFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Service
     model = Service
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     protocol = forms.ChoiceField(
     protocol = forms.ChoiceField(
         choices=add_blank_choice(ServiceProtocolChoices),
         choices=add_blank_choice(ServiceProtocolChoices),
         required=False,
         required=False,

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
netbox/project-static/dist/netbox-dark.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
netbox/project-static/dist/netbox-light.css


+ 15 - 2
netbox/project-static/styles/netbox.scss

@@ -89,8 +89,13 @@ table td > .progress {
   min-width: 6rem;
   min-width: 6rem;
 }
 }
 
 
-// Automatically space out adjacent columns.
-.col:not(:last-child):not(:only-child) {
+// Override Bootstrap form-control font-size when contained by .small element.
+.small .form-control {
+  font-size: $font-size-sm;
+}
+
+// Automatically space out adjacent columns, but not within card bodies.
+:not(.card-body) > .col:not(:last-child):not(:only-child) {
   margin-bottom: $spacer;
   margin-bottom: $spacer;
 }
 }
 
 
@@ -479,6 +484,14 @@ span.color-label {
   .card-body.small .form-select {
   .card-body.small .form-select {
     font-size: $input-font-size-sm;
     font-size: $input-font-size-sm;
   }
   }
+
+  .card-divider {
+    width: 100%;
+    height: 1px;
+    margin: $hr-margin-y 0;
+    border-top: 1px solid $card-border-color;
+    opacity: $hr-opacity;
+  }
 }
 }
 
 
 .form-floating {
 .form-floating {

+ 6 - 3
netbox/templates/inc/filter_list.html

@@ -22,7 +22,7 @@
                                                 {{ field }}
                                                 {{ field }}
                                             </div>
                                             </div>
                                         {% else %}
                                         {% else %}
-                                            <div class="mb-3 mx-3">
+                                            <div class="mb-3 px-2">
                                                 <label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                                 <label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                                 {{ field }}
                                                 {{ field }}
                                             </div>
                                             </div>
@@ -30,17 +30,20 @@
                                     {% endwith %}
                                     {% endwith %}
                                 {% endfor %}
                                 {% endfor %}
                             </div>
                             </div>
+                            {% if forloop.counter != filter_form.field_groups|length %}
+                                <hr class="card-divider mt-0" />
+                            {% endif %}
                         {% endfor %}
                         {% endfor %}
                     {% else %}
                     {% else %}
                         {% for field in filter_form.visible_fields %}
                         {% for field in filter_form.visible_fields %}
-                            <div class="col">
+                            <div class="col col-12">
                                 {% if field|widget_type == 'checkboxinput' %}
                                 {% if field|widget_type == 'checkboxinput' %}
                                     <div class="form-check mb-3">
                                     <div class="form-check mb-3">
                                         <label class="form-check-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                         <label class="form-check-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                         {{ field }}
                                         {{ field }}
                                     </div>
                                     </div>
                                 {% else %}
                                 {% else %}
-                                    <div class="mb-3">
+                                    <div class="mb-3 px-2">
                                     <label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                     <label class="form-label" for="{{ field.id_for_label }}">{{ field.label }}</label>
                                     {{ field }}
                                     {{ field }}
                                     </div>
                                     </div>

+ 6 - 0
netbox/tenancy/forms.py

@@ -64,6 +64,11 @@ class TenantGroupBulkEditForm(BootstrapMixin, CustomFieldModelBulkEditForm):
 
 
 class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
 class TenantGroupFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = TenantGroup
     model = TenantGroup
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     parent_id = DynamicModelMultipleChoiceField(
     parent_id = DynamicModelMultipleChoiceField(
         queryset=TenantGroup.objects.all(),
         queryset=TenantGroup.objects.all(),
         required=False,
         required=False,
@@ -132,6 +137,7 @@ class TenantFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
     model = Tenant
     model = Tenant
     q = forms.CharField(
     q = forms.CharField(
         required=False,
         required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
         label=_('Search')
         label=_('Search')
     )
     )
     group_id = DynamicModelMultipleChoiceField(
     group_id = DynamicModelMultipleChoiceField(

+ 19 - 1
netbox/virtualization/forms.py

@@ -225,14 +225,20 @@ class ClusterBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBul
 class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
 class ClusterFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldModelFilterForm):
     model = Cluster
     model = Cluster
     field_order = [
     field_order = [
-        'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
+        'q', 'type_id', 'region_id', 'site_id', 'group_id', 'tenant_group_id', 'tenant_id',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['type_id'],
         ['type_id'],
         ['region_id', 'site_id'],
         ['region_id', 'site_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
         ['tag'],
         ['tag'],
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     type_id = DynamicModelMultipleChoiceField(
     type_id = DynamicModelMultipleChoiceField(
         queryset=ClusterType.objects.all(),
         queryset=ClusterType.objects.all(),
         required=False,
         required=False,
@@ -540,6 +546,7 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMod
         'site_id', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address',
         'site_id', 'tenant_group_id', 'tenant_id', 'platform_id', 'mac_address',
     ]
     ]
     field_groups = [
     field_groups = [
+        ['q'],
         ['status', 'role_id'],
         ['status', 'role_id'],
         ['platform_id', 'mac_address'],
         ['platform_id', 'mac_address'],
         ['cluster_group_id', 'cluster_type_id', 'cluster_id'],
         ['cluster_group_id', 'cluster_type_id', 'cluster_id'],
@@ -547,6 +554,11 @@ class VirtualMachineFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldMod
         ['tenant_group_id', 'tenant_id'],
         ['tenant_group_id', 'tenant_id'],
 
 
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     cluster_group_id = DynamicModelMultipleChoiceField(
     cluster_group_id = DynamicModelMultipleChoiceField(
         queryset=ClusterGroup.objects.all(),
         queryset=ClusterGroup.objects.all(),
         required=False,
         required=False,
@@ -855,10 +867,16 @@ class VMInterfaceBulkRenameForm(BulkRenameForm):
 class VMInterfaceFilterForm(BootstrapMixin, forms.Form):
 class VMInterfaceFilterForm(BootstrapMixin, forms.Form):
     model = VMInterface
     model = VMInterface
     field_groups = [
     field_groups = [
+        ['q'],
         ['cluster_id', 'virtual_machine_id'],
         ['cluster_id', 'virtual_machine_id'],
         ['enabled', 'mac_address'],
         ['enabled', 'mac_address'],
         ['tag']
         ['tag']
     ]
     ]
+    q = forms.CharField(
+        required=False,
+        widget=forms.TextInput(attrs={'placeholder': _('All Fields')}),
+        label=_('Search')
+    )
     cluster_id = DynamicModelMultipleChoiceField(
     cluster_id = DynamicModelMultipleChoiceField(
         queryset=Cluster.objects.all(),
         queryset=Cluster.objects.all(),
         required=False,
         required=False,

Некоторые файлы не были показаны из-за большого количества измененных файлов