From 4097261efea3aa3fd9182757a727f1f3df1fff6f Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 14 Nov 2025 16:41:44 +0100 Subject: [PATCH 1/2] Support single-value FQDN in "open" button --- src/servala/core/models/service.py | 16 ++++++++++++++++ .../organizations/service_instance_detail.html | 4 ++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/servala/core/models/service.py b/src/servala/core/models/service.py index 1535703..29bae9f 100644 --- a/src/servala/core/models/service.py +++ b/src/servala/core/models/service.py @@ -961,5 +961,21 @@ class ServiceInstance(ServalaModelMixin, models.Model): except Exception as e: return {"error": str(e)} + @property + def fqdn_url(self): + try: + fqdn = self.spec.get("parameters", {}).get("service", {}).get("fqdn") + if not fqdn: + return None + + if isinstance(fqdn, list): + return fqdn[0] + elif isinstance(fqdn, str): + return fqdn + else: + return None + except (AttributeError, KeyError, IndexError): + return None + auditlog.register(ServiceInstance, exclude_fields=["updated_at"], serialize_data=True) diff --git a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html index 7333838..948a2df 100644 --- a/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html +++ b/src/servala/frontend/templates/frontend/organizations/service_instance_detail.html @@ -7,8 +7,8 @@ {% endblock html_title %} {% block page_title_extra %}
- {% if instance.spec.parameters.service.fqdn %} - -- 2.49.1 From 3f9fdd0e48fc6183be43a6cbc1eee455c20276fd Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Fri, 14 Nov 2025 16:52:14 +0100 Subject: [PATCH 2/2] Make sure fqdn generation works with single values --- src/servala/static/js/fqdn.js | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/servala/static/js/fqdn.js b/src/servala/static/js/fqdn.js index ec70dad..0996bda 100644 --- a/src/servala/static/js/fqdn.js +++ b/src/servala/static/js/fqdn.js @@ -1,9 +1,21 @@ const initializeFqdnGeneration = (prefix) => { const nameField = document.querySelector(`input#id_${prefix}-name`); + if (!nameField) return + + // Try to find array input first (DynamicArrayWidget), then fallback to regular text input const fqdnFieldContainer = document.getElementById(`${prefix}-spec.parameters.service.fqdn_container`) - if (!nameField || !fqdnFieldContainer) return - const fqdnField = fqdnFieldContainer.querySelector('input.array-item-input'); + let fqdnField = null; + let isArrayField = true; + + if (fqdnFieldContainer) { + let fqdnField = fqdnFieldContainer.querySelector('input.array-item-input'); + } else { + fqdnField = document.getElementById(`id_${prefix}-spec.parameters.service.fqdn`); + isArrayField = false; + } + + if (!fqdnField) return if (nameField && fqdnField) { const generateFqdn = (instanceName) => { @@ -14,9 +26,12 @@ const initializeFqdnGeneration = (prefix) => { nameField.addEventListener('input', function() { if (!fqdnField.dataset.manuallyEdited) { fqdnField.value = generateFqdn(this.value); - const container = fqdnField.closest('.dynamic-array-widget'); - if (container && window.updateHiddenInput) { - window.updateHiddenInput(container); + if (isArrayField) { + // Update hidden input for array fields + const container = fqdnField.closest('.dynamic-array-widget'); + if (container && window.updateHiddenInput) { + window.updateHiddenInput(container); + } } } }); @@ -27,9 +42,12 @@ const initializeFqdnGeneration = (prefix) => { if (nameField.value && !fqdnField.value) { fqdnField.value = generateFqdn(nameField.value); - const container = fqdnField.closest('.dynamic-array-widget'); - if (container && window.updateHiddenInput) { - window.updateHiddenInput(container); + if (isArrayField) { + // Update hidden input for array fields + const container = fqdnField.closest('.dynamic-array-widget'); + if (container && window.updateHiddenInput) { + window.updateHiddenInput(container); + } } } } -- 2.49.1