diff --git a/src/servala/core/crd.py b/src/servala/core/crd.py index 6499a59..d287b42 100644 --- a/src/servala/core/crd.py +++ b/src/servala/core/crd.py @@ -240,11 +240,11 @@ class CrdModelFormMixin: continue parts = field_name.split(".") - if len(parts) == 2: # Top-level spec field + if len(parts) == 2: + # Top-level spec field others.append(field_name) - elif ( - len(parts) == 3 - ): # Second-level field - promote to top-level fieldset + elif len(parts) == 3: + # Second-level field - promote to top-level fieldset fieldset_key = f"{parts[1]}.{parts[2]}" if not top_level_fieldsets.get(fieldset_key): top_level_fieldsets[fieldset_key] = { @@ -253,19 +253,42 @@ class CrdModelFormMixin: "title": f"{deslugify(parts[2])}", } top_level_fieldsets[fieldset_key]["fields"].append(field_name) - else: # Third-level and deeper - group by first two levels + else: + # Third-level and deeper - create nested fieldsets fieldset_key = f"{parts[1]}.{parts[2]}" if not top_level_fieldsets.get(fieldset_key): top_level_fieldsets[fieldset_key] = { "fields": [], - "fieldsets": [], + "fieldsets": {}, "title": f"{deslugify(parts[2])}", } - top_level_fieldsets[fieldset_key]["fields"].append(field_name) - # Add promoted fieldsets to fieldsets + sub_key = parts[3] + if not top_level_fieldsets[fieldset_key]["fieldsets"].get(sub_key): + top_level_fieldsets[fieldset_key]["fieldsets"][sub_key] = { + "title": deslugify(sub_key), + "fields": [], + } + top_level_fieldsets[fieldset_key]["fieldsets"][sub_key][ + "fields" + ].append(field_name) + for fieldset in top_level_fieldsets.values(): - if len(fieldset["fields"]) == 1: + nested_fieldsets_list = [] + for sub_fieldset in fieldset["fieldsets"].values(): + if len(sub_fieldset["fields"]) == 1: + # If nested fieldset has only one field, move it to parent + fieldset["fields"].append(sub_fieldset["fields"][0]) + else: + # Keep as nested fieldset with proper title stripping + title = f"{fieldset['title']}: {sub_fieldset['title']}: " + for field in sub_fieldset["fields"]: + self.strip_title(field, title) + nested_fieldsets_list.append(sub_fieldset) + + fieldset["fieldsets"] = nested_fieldsets_list + total_fields = len(fieldset["fields"]) + len(nested_fieldsets_list) + if total_fields == 1 and len(fieldset["fields"]) == 1: others.append(fieldset["fields"][0]) else: title = f"{fieldset['title']}: " @@ -287,6 +310,8 @@ class CrdModelFormMixin: } ) + fieldsets.sort(key=lambda f: f.get("hidden", False)) + return fieldsets def get_nested_data(self): diff --git a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html index c9abe55..e304c33 100644 --- a/src/servala/frontend/templates/includes/tabbed_fieldset_form.html +++ b/src/servala/frontend/templates/includes/tabbed_fieldset_form.html @@ -31,9 +31,9 @@ {% for field in fieldset.fields %} {% with field=form|get_field:field %}{{ field.as_field_group }}{% endwith %} {% endfor %} - {% for subfieldset in fieldset.fieldsets.values %} + {% for subfieldset in fieldset.fieldsets %} {% if subfieldset.fields %} -