Merge pull request 'Support single (non-array) FQDN values' (#295) from 288-single-fqdn into main
Some checks failed
Build and Deploy Staging / deploy (push) Blocked by required conditions
Build and Deploy Staging / build (push) Successful in 41s
Tests / test (push) Has been cancelled

Reviewed-on: #295
This commit is contained in:
Tobias Brunner 2025-11-17 08:42:36 +00:00
commit dd2097a281
3 changed files with 44 additions and 10 deletions

View file

@ -961,5 +961,21 @@ class ServiceInstance(ServalaModelMixin, models.Model):
except Exception as e: except Exception as e:
return {"error": str(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) auditlog.register(ServiceInstance, exclude_fields=["updated_at"], serialize_data=True)

View file

@ -7,8 +7,8 @@
{% endblock html_title %} {% endblock html_title %}
{% block page_title_extra %} {% block page_title_extra %}
<div> <div>
{% if instance.spec.parameters.service.fqdn %} {% if instance.fqdn_url %}
<a href="https://{{ instance.spec.parameters.service.fqdn.0 }}" <a href="https://{{ instance.fqdn_url }}"
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
class="btn btn-success me-1 mb-1"> class="btn btn-success me-1 mb-1">

View file

@ -1,9 +1,21 @@
const initializeFqdnGeneration = (prefix) => { const initializeFqdnGeneration = (prefix) => {
const nameField = document.querySelector(`input#id_${prefix}-name`); 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`) const fqdnFieldContainer = document.getElementById(`${prefix}-spec.parameters.service.fqdn_container`)
if (!nameField || !fqdnFieldContainer) return let fqdnField = null;
const fqdnField = fqdnFieldContainer.querySelector('input.array-item-input'); 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) { if (nameField && fqdnField) {
const generateFqdn = (instanceName) => { const generateFqdn = (instanceName) => {
@ -14,9 +26,12 @@ const initializeFqdnGeneration = (prefix) => {
nameField.addEventListener('input', function() { nameField.addEventListener('input', function() {
if (!fqdnField.dataset.manuallyEdited) { if (!fqdnField.dataset.manuallyEdited) {
fqdnField.value = generateFqdn(this.value); fqdnField.value = generateFqdn(this.value);
const container = fqdnField.closest('.dynamic-array-widget'); if (isArrayField) {
if (container && window.updateHiddenInput) { // Update hidden input for array fields
window.updateHiddenInput(container); 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) { if (nameField.value && !fqdnField.value) {
fqdnField.value = generateFqdn(nameField.value); fqdnField.value = generateFqdn(nameField.value);
const container = fqdnField.closest('.dynamic-array-widget'); if (isArrayField) {
if (container && window.updateHiddenInput) { // Update hidden input for array fields
window.updateHiddenInput(container); const container = fqdnField.closest('.dynamic-array-widget');
if (container && window.updateHiddenInput) {
window.updateHiddenInput(container);
}
} }
} }
} }