Enable HTMX navigation only when selected by user

This commit is contained in:
Jeremy Stretch 2024-03-18 17:03:49 -04:00
parent 7d86d0989d
commit 4d85e9ce34
27 changed files with 57 additions and 59 deletions

View File

@ -8,9 +8,11 @@ def settings_and_registry(request):
""" """
Expose Django settings and NetBox registry stores in the template context. Example: {{ settings.DEBUG }} Expose Django settings and NetBox registry stores in the template context. Example: {{ settings.DEBUG }}
""" """
user_preferences = request.user.config if request.user.is_authenticated else {}
return { return {
'settings': django_settings, 'settings': django_settings,
'config': get_config(), 'config': get_config(),
'registry': registry, 'registry': registry,
'preferences': request.user.config if request.user.is_authenticated else {}, 'preferences': user_preferences,
'htmx_navigation': user_preferences.get('ui.htmx_navigation', False) == 'true'
} }

View File

@ -79,7 +79,7 @@ Blocks:
{# Page content #} {# Page content #}
<div class="page-wrapper"> <div class="page-wrapper">
<div id="page-content" hx-boost="true" hx-target="#page-content" hx-select="#page-content" hx-swap="outerHTML show:window:top"> <div id="page-content"{% if htmx_navigation %} hx-boost="true" hx-target="#page-content" hx-select="#page-content" hx-swap="outerHTML show:window:top"{% endif %}>
{# Page header #} {# Page header #}
{% block header %} {% block header %}

View File

@ -10,7 +10,7 @@
{% endif %} {% endif %}
{% if 'bulk_rename' in actions %} {% if 'bulk_rename' in actions %}
{% with bulk_rename_view=model|validated_viewname:"bulk_rename" %} {% with bulk_rename_view=model|validated_viewname:"bulk_rename" %}
<button type="submit" name="_rename" hx-post="{% url bulk_rename_view %}" hx-push-url="true" class="btn btn-outline-warning"> <button type="submit" name="_rename" {% formaction %}="{% url bulk_rename_view %}" hx-push-url="true" class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename Selected" %} <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename Selected" %}
</button> </button>
{% endwith %} {% endwith %}

View File

@ -5,8 +5,7 @@
{% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %} {% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %}
{% if 'bulk_edit' in actions and bulk_edit_view %} {% if 'bulk_edit' in actions and bulk_edit_view %}
<button type="submit" name="_edit" <button type="submit" name="_edit"
hx-post="{% url bulk_edit_view %}?device={{ object.pk }}&return_url={{ return_url }}" {% formaction %}="{% url bulk_edit_view %}?device={{ object.pk }}&return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-warning"> class="btn btn-warning">
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit Selected <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit Selected
</button> </button>
@ -15,8 +14,7 @@
{% with bulk_rename_view=child_model|validated_viewname:"bulk_rename" %} {% with bulk_rename_view=child_model|validated_viewname:"bulk_rename" %}
{% if 'bulk_rename' in actions and bulk_rename_view %} {% if 'bulk_rename' in actions and bulk_rename_view %}
<button type="submit" name="_rename" <button type="submit" name="_rename"
hx-post="{% url bulk_rename_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_rename_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-warning"> class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -11,8 +11,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -7,8 +7,7 @@
{% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %} {% with bulk_disconnect_view=child_model|validated_viewname:"bulk_disconnect" %}
{% if 'bulk_disconnect' in actions and bulk_disconnect_view %} {% if 'bulk_disconnect' in actions and bulk_disconnect_view %}
<button type="submit" name="_disconnect" <button type="submit" name="_disconnect"
hx-post="{% url bulk_disconnect_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_disconnect_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-danger"> class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>

View File

@ -11,63 +11,63 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% if perms.dcim.add_consoleport %} {% if perms.dcim.add_consoleport %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_consoleport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Console Ports" %} {% trans "Console Ports" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_consoleserverport %} {% if perms.dcim.add_consoleserverport %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item "> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item ">
{% trans "Console Server Ports" %} {% trans "Console Server Ports" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_powerport %} {% if perms.dcim.add_powerport %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Power Ports" %} {% trans "Power Ports" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_poweroutlet %} {% if perms.dcim.add_poweroutlet %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Power Outlets" %} {% trans "Power Outlets" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_interface %} {% if perms.dcim.add_interface %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Interfaces" %} {% trans "Interfaces" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_rearport %} {% if perms.dcim.add_rearport %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Rear Ports" %} {% trans "Rear Ports" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_devicebay %} {% if perms.dcim.add_devicebay %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Device Bays" %} {% trans "Device Bays" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_modulebay %} {% if perms.dcim.add_modulebay %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_modulebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_modulebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Module Bays" %} {% trans "Module Bays" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_inventoryitem %} {% if perms.dcim.add_inventoryitem %}
<li> <li>
<button type="submit" hx-post="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Inventory Items" %} {% trans "Inventory Items" %}
</button> </button>
</li> </li>
@ -78,7 +78,7 @@
{% if 'bulk_edit' in actions %} {% if 'bulk_edit' in actions %}
<div class="btn-group" role="group"> <div class="btn-group" role="group">
{% bulk_edit_button model query_params=request.GET %} {% bulk_edit_button model query_params=request.GET %}
<button type="submit" name="_rename" hx-post="{% url 'dcim:device_bulk_rename' %}?return_url={% url 'dcim:device_list' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="btn btn-outline-warning"> <button type="submit" name="_rename" {% formaction %}="{% url 'dcim:device_bulk_rename' %}?return_url={% url 'dcim:device_list' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %} <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %}
</button> </button>
</div> </div>

View File

@ -7,8 +7,7 @@
{% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %} {% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %}
{% if 'bulk_edit' in actions and bulk_edit_view %} {% if 'bulk_edit' in actions and bulk_edit_view %}
<button type="submit" name="_edit" <button type="submit" name="_edit"
hx-post="{% url bulk_edit_view %}?device={{ object.pk }}&return_url={{ return_url }}" {% formaction %}="{% url bulk_edit_view %}?device={{ object.pk }}&return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-warning"> class="btn btn-warning">
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit Selected <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit Selected
</button> </button>
@ -17,8 +16,7 @@
{% with bulk_rename_view=child_model|validated_viewname:"bulk_rename" %} {% with bulk_rename_view=child_model|validated_viewname:"bulk_rename" %}
{% if 'bulk_rename' in actions and bulk_rename_view %} {% if 'bulk_rename' in actions and bulk_rename_view %}
<button type="submit" name="_rename" <button type="submit" name="_rename"
hx-post="{% url bulk_rename_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_rename_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-warning"> class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
</button> </button>

View File

@ -13,13 +13,13 @@
</div> </div>
<div class="card-footer d-print-none"> <div class="card-footer d-print-none">
{% if table.rows %} {% if table.rows %}
<button type="submit" name="_edit" hx-post="{% url table.Meta.model|viewname:"bulk_rename" %}?return_url={{ return_url }}" hx-push-url="true"class="btn btn-warning"> <button type="submit" name="_edit" {% formaction %}="{% url table.Meta.model|viewname:"bulk_rename" %}?return_url={{ return_url }}" class="btn btn-warning">
<span class="mdi mdi-pencil-outline" aria-hidden="true"></span> {% trans "Rename" %} <span class="mdi mdi-pencil-outline" aria-hidden="true"></span> {% trans "Rename" %}
</button> </button>
<button type="submit" name="_edit" hx-post="{% url table.Meta.model|viewname:"bulk_edit" %}?return_url={{ return_url }}" hx-push-url="true" class="btn btn-warning"> <button type="submit" name="_edit" {% formaction %}="{% url table.Meta.model|viewname:"bulk_edit" %}?return_url={{ return_url }}" class="btn btn-warning">
<span class="mdi mdi-pencil" aria-hidden="true"></span> {% trans "Edit" %} <span class="mdi mdi-pencil" aria-hidden="true"></span> {% trans "Edit" %}
</button> </button>
<button type="submit" name="_delete" hx-post="{% url table.Meta.model|viewname:"bulk_delete" %}?return_url={{ return_url }}" hx-push-url="true" class="btn btn-danger"> <button type="submit" name="_delete" {% formaction %}="{% url table.Meta.model|viewname:"bulk_delete" %}?return_url={{ return_url }}" class="btn btn-danger">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete" %} <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -52,17 +52,17 @@
{% htmx_table 'dcim:powerfeed_list' power_panel_id=object.pk %} {% htmx_table 'dcim:powerfeed_list' power_panel_id=object.pk %}
<div class="card-footer d-print-none"> <div class="card-footer d-print-none">
{% if perms.dcim.change_powerfeed %} {% if perms.dcim.change_powerfeed %}
<button type="submit" name="_edit" hx-post="{% url 'dcim:powerfeed_bulk_edit' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" hx-push-url="true" class="btn btn-warning"> <button type="submit" name="_edit" {% formaction %}="{% url 'dcim:powerfeed_bulk_edit' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" class="btn btn-warning">
<span class="mdi mdi-pencil" aria-hidden="true"></span> {% trans "Edit" %} <span class="mdi mdi-pencil" aria-hidden="true"></span> {% trans "Edit" %}
</button> </button>
{% endif %} {% endif %}
{% if perms.dcim.delete_cable %} {% if perms.dcim.delete_cable %}
<button type="submit" name="_disconnect" hx-post="{% url 'dcim:powerfeed_bulk_disconnect' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" hx-push-url="true" class="btn btn-outline-danger"> <button type="submit" name="_disconnect" {% formaction %}="{% url 'dcim:powerfeed_bulk_disconnect' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" class="btn btn-outline-danger">
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %} <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> {% trans "Disconnect" %}
</button> </button>
{% endif %} {% endif %}
{% if perms.dcim.delete_powerfeed %} {% if perms.dcim.delete_powerfeed %}
<button type="submit" name="_delete" hx-post="{% url 'dcim:powerfeed_bulk_delete' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" hx-push-url="true" class="btn btn-danger"> <button type="submit" name="_delete" {% formaction %}="{% url 'dcim:powerfeed_bulk_delete' %}?return_url={% url 'dcim:powerpanel' pk=object.pk %}" class="btn btn-danger">
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> {% trans "Delete" %} <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> {% trans "Delete" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -3,7 +3,7 @@
{% block bulk_buttons %} {% block bulk_buttons %}
{% if perms.extras.sync_configcontext %} {% if perms.extras.sync_configcontext %}
<button type="submit" name="_sync" hx-post="{% url 'extras:configcontext_bulk_sync' %}" hx-push-url="true" class="btn btn-primary"> <button type="submit" name="_sync" {% formaction %}="{% url 'extras:configcontext_bulk_sync' %}" class="btn btn-primary">
<i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %} <i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -3,7 +3,7 @@
{% block bulk_buttons %} {% block bulk_buttons %}
{% if perms.extras.sync_configtemplate %} {% if perms.extras.sync_configtemplate %}
<button type="submit" name="_sync" hx-post="{% url 'extras:configtemplate_bulk_sync' %}" hx-push-url="true" class="btn btn-primary"> <button type="submit" name="_sync" {% formaction %}="{% url 'extras:configtemplate_bulk_sync' %}" class="btn btn-primary">
<i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %} <i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -3,7 +3,7 @@
{% block bulk_buttons %} {% block bulk_buttons %}
{% if perms.extras.sync_configcontext %} {% if perms.extras.sync_configcontext %}
<button type="submit" name="_sync" hx-post="{% url 'extras:exporttemplate_bulk_sync' %}" hx-push-url="true" class="btn btn-primary"> <button type="submit" name="_sync" {% formaction %}="{% url 'extras:exporttemplate_bulk_sync' %}" class="btn btn-primary">
<i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %} <i class="mdi mdi-sync" aria-hidden="true"></i> {% trans "Sync Data" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -21,8 +21,7 @@
{% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %} {% with bulk_edit_view=child_model|validated_viewname:"bulk_edit" %}
{% if 'bulk_edit' in actions and bulk_edit_view %} {% if 'bulk_edit' in actions and bulk_edit_view %}
<button type="submit" name="_edit" <button type="submit" name="_edit"
hx-post="{% url bulk_edit_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_edit_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-warning"> class="btn btn-warning">
<i class="mdi mdi-pencil" aria-hidden="true"></i> {% trans "Edit Selected" %} <i class="mdi mdi-pencil" aria-hidden="true"></i> {% trans "Edit Selected" %}
</button> </button>
@ -36,8 +35,7 @@
{% with bulk_delete_view=child_model|validated_viewname:"bulk_delete" %} {% with bulk_delete_view=child_model|validated_viewname:"bulk_delete" %}
{% if 'bulk_delete' in actions and bulk_delete_view %} {% if 'bulk_delete' in actions and bulk_delete_view %}
<button type="submit" <button type="submit"
hx-post="{% url bulk_delete_view %}?return_url={{ return_url }}" {% formaction %}="{% url bulk_delete_view %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-danger"> class="btn btn-danger">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete Selected" %} <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete Selected" %}
</button> </button>

View File

@ -5,8 +5,7 @@
{{ block.super }} {{ block.super }}
{% if 'bulk_remove_devices' in actions %} {% if 'bulk_remove_devices' in actions %}
<button type="submit" name="_remove" <button type="submit" name="_remove"
hx-post="{% url 'virtualization:cluster_remove_devices' pk=object.pk %}?return_url={{ return_url }}" {% formaction %}="{% url 'virtualization:cluster_remove_devices' pk=object.pk %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-danger"> class="btn btn-danger">
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> {% trans "Remove Selected" %} <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> {% trans "Remove Selected" %}
</button> </button>

View File

@ -6,8 +6,7 @@
{{ block.super }} {{ block.super }}
{% if 'bulk_rename' in actions %} {% if 'bulk_rename' in actions %}
<button type="submit" name="_rename" <button type="submit" name="_rename"
hx-post="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={{ return_url }}" {% formaction %}="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-warning"> class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %} <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %}
</button> </button>

View File

@ -6,8 +6,7 @@
{{ block.super }} {{ block.super }}
{% if 'bulk_rename' in actions %} {% if 'bulk_rename' in actions %}
<button type="submit" name="_rename" <button type="submit" name="_rename"
hx-post="{% url 'virtualization:virtualdisk_bulk_rename' %}?return_url={{ return_url }}" {% formaction %}="{% url 'virtualization:virtualdisk_bulk_rename' %}?return_url={{ return_url }}"
hx-push-url="true"
class="btn btn-outline-warning"> class="btn btn-outline-warning">
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %} <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> {% trans "Rename" %}
</button> </button>

View File

@ -10,14 +10,14 @@
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% if perms.virtualization.add_vminterface %} {% if perms.virtualization.add_vminterface %}
<li> <li>
<button type="submit" hx-post="{% url 'virtualization:virtualmachine_bulk_add_vminterface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_vminterface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Interfaces" %} {% trans "Interfaces" %}
</button> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.virtualization.add_virtualdisk %} {% if perms.virtualization.add_virtualdisk %}
<li> <li>
<button type="submit" hx-post="{% url 'virtualization:virtualmachine_bulk_add_virtualdisk' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" hx-push-url="true" class="dropdown-item"> <button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_virtualdisk' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
{% trans "Virtual Disks" %} {% trans "Virtual Disks" %}
</button> </button>
</li> </li>

View File

@ -1,6 +1,6 @@
{% load i18n %} {% load i18n %}
{% if url %} {% if url %}
<button type="submit" name="_delete" hx-post="{{ url }}" hx-push-url="true" class="btn btn-red"> <button type="submit" name="_delete" {% formaction %}="{{ url }}" class="btn btn-red">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete Selected" %} <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> {% trans "Delete Selected" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -1,6 +1,6 @@
{% load i18n %} {% load i18n %}
{% if url %} {% if url %}
<button type="submit" name="_edit" hx-post="{{ url }}" hx-push-url="true" class="btn btn-yellow"> <button type="submit" name="_edit" {% formaction %}="{{ url }}" class="btn btn-yellow">
<i class="mdi mdi-pencil" aria-hidden="true"></i> {% trans "Edit Selected" %} <i class="mdi mdi-pencil" aria-hidden="true"></i> {% trans "Edit Selected" %}
</button> </button>
{% endif %} {% endif %}

View File

@ -1,6 +1,6 @@
{% load helpers %} {% load helpers %}
<ul class="navbar-nav pt-lg-2" hx-boost="true" hx-target="#page-content" hx-select="#page-content" hx-swap="outerHTML show:window:top"> <ul class="navbar-nav pt-lg-2"{% if htmx_navigation %} hx-boost="true" hx-target="#page-content" hx-select="#page-content" hx-swap="outerHTML show:window:top"{% endif %}>
{% for menu, groups in nav_items %} {% for menu, groups in nav_items %}
<li class="nav-item dropdown"> <li class="nav-item dropdown">

View File

@ -9,6 +9,7 @@ __all__ = (
'checkmark', 'checkmark',
'copy_content', 'copy_content',
'customfield_value', 'customfield_value',
'formaction',
'tag', 'tag',
) )
@ -114,3 +115,14 @@ def htmx_table(context, viewname, return_url=None, **kwargs):
'viewname': viewname, 'viewname': viewname,
'url_params': url_params, 'url_params': url_params,
} }
@register.simple_tag(takes_context=True)
def formaction(context):
"""
Replace the 'formaction' attribute on an HTML element with the appropriate HTMX attributes
if HTMX navigation is enabled (per the user's preferences).
"""
if context.get('htmx_navigation', False):
return 'hx-push-url="true" hx-post'
return 'formaction'