diff --git a/netbox_librenms_plugin/static/netbox_librenms_plugin/js/librenms_import.js b/netbox_librenms_plugin/static/netbox_librenms_plugin/js/librenms_import.js
index a2facc706f..edfda206a8 100644
--- a/netbox_librenms_plugin/static/netbox_librenms_plugin/js/librenms_import.js
+++ b/netbox_librenms_plugin/static/netbox_librenms_plugin/js/librenms_import.js
@@ -349,8 +349,8 @@
* Persists toggle state to user preferences on change.
*/
function initializeTogglePrefs() {
- const sysname = document.getElementById('use-sysname-toggle');
- const strip = document.getElementById('strip-domain-toggle');
+ const sysname = document.getElementById('use-sysname-toggle-cb');
+ const strip = document.getElementById('strip-domain-toggle-cb');
if (sysname) sysname.addEventListener('change', function () { savePref('use_sysname', this.checked); });
if (strip) strip.addEventListener('change', function () { savePref('strip_domain', this.checked); });
}
@@ -1199,10 +1199,14 @@
const dismissTrigger = event.target.closest('[data-bs-dismiss="modal"]');
if (dismissTrigger) {
- event.preventDefault();
-
- // Check if it's in the HTMX modal
- if (modalElement.contains(dismissTrigger)) {
+ // Only handle dismiss triggers whose nearest .modal ancestor IS
+ // the outer HTMX modal. Buttons inside nested modals (e.g. the
+ // Promote-to-host modal rendered inside #htmx-modal-content)
+ // must be left for Bootstrap's own dismiss handler so they
+ // close the inner modal, not the outer one.
+ const nearestModal = dismissTrigger.closest('.modal');
+ if (nearestModal === modalElement) {
+ event.preventDefault();
hideModal(modalElement, fallbackBackdropRef);
}
}
diff --git a/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_dt_mapping_form.html b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_dt_mapping_form.html
new file mode 100644
index 0000000000..f761a0fba9
--- /dev/null
+++ b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_dt_mapping_form.html
@@ -0,0 +1,113 @@
+{% comment %}
+Reusable "Add Device Type Mapping" form for the import validation modal.
+
+Required context:
+ - libre_device (dict-like with device_id, hardware)
+Optional context:
+ - preselect_device_type: a DeviceType instance to pre-fill the typeahead
+ (used in the existing-device + mismatch branch so a single click maps
+ `libre_device.hardware` → `existing_device.device_type`).
+ - submit_label (defaults to "Add Mapping")
+{% endcomment %}
+
+
diff --git a/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_manage_icon.html b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_manage_icon.html
new file mode 100644
index 0000000000..65fb5b07e9
--- /dev/null
+++ b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_manage_icon.html
@@ -0,0 +1,15 @@
+{% comment %}
+Compact pencil icon that opens the combined "manage platform" modal (map
+LibreNMS OS to an existing platform, or create a new one). Keeps the platform
+cell uncluttered. Requires: libre_device, server_key.
+{% endcomment %}
+{% if libre_device.os and libre_device.os != "-" %}
+
+{% endif %}
diff --git a/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_mapping_form.html b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_mapping_form.html
new file mode 100644
index 0000000000..9378045627
--- /dev/null
+++ b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/_platform_mapping_form.html
@@ -0,0 +1,111 @@
+{% comment %}
+Reusable "Add Platform Mapping" form for the import validation modal.
+
+Required context:
+ - libre_device (dict-like with device_id, os)
+Optional:
+ - preselect_platform: a Platform instance to pre-fill the typeahead.
+ - submit_label
+{% endcomment %}
+
+
diff --git a/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/create_platform_modal.html b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/create_platform_modal.html
index f2b557e0de..27db062c86 100644
--- a/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/create_platform_modal.html
+++ b/netbox_librenms_plugin/templates/netbox_librenms_plugin/htmx/create_platform_modal.html
@@ -13,10 +13,19 @@
{# server_key - (optional) LibreNMS server key, forwarded as hidden field #}
- Create New Platform
+ {% if libre_device %} Manage platform — {{ librenms_os }}{% else %} Create New Platform{% endif %}
+{% if libre_device %}
+{# Map the LibreNMS OS to an EXISTING platform (separate form -> add_platform_mapping). #}
+
+
Map {{ librenms_os }} to an existing platform
+ {% include "netbox_librenms_plugin/htmx/_platform_mapping_form.html" with preselect_platform=current_platform submit_label="Map to this platform" %}
+