diff --git a/src/servala/core/crd.py b/src/servala/core/crd.py index 42ca351..48df661 100644 --- a/src/servala/core/crd.py +++ b/src/servala/core/crd.py @@ -147,6 +147,67 @@ class CrdModelFormMixin: for field in ("organization", "context"): self.fields[field].widget = forms.HiddenInput() + def get_fieldsets(self): + fieldsets = [] + + # General fieldset for non-spec fields + general_fields = [ + field for field in self.fields if not field.startswith("spec.") + ] + if general_fields: + fieldsets.append( + {"title": "General", "fields": general_fields, "fieldsets": []} + ) + + # Process spec fields + others = [] + nested_fieldsets = {} + + for field_name in self.fields: + if field_name.startswith("spec."): + parts = field_name.split(".") + if len(parts) == 2: # Top-level spec field + others.append(field_name) + else: + parent_key = parts[1] + if not nested_fieldsets.get(parent_key): + nested_fieldsets[parent_key] = { + "fields": [], + "fieldsets": {}, + "title": parent_key.title(), + } + parent = nested_fieldsets[parent_key] + if len(parts) == 3: # Top-level within fieldset + parent["fields"].append(field_name) + else: + sub_key = parts[2] + if not parent["fieldsets"].get(sub_key): + parent["fieldsets"][sub_key] = { + "title": sub_key.title(), + "fields": [], + } + parent["fieldsets"][sub_key]["fields"].append(field_name) + + # Add nested fieldsets to fieldsets + for group in nested_fieldsets.values(): + total_fields = 0 + for fieldset in group["fieldsets"].values(): + if (field_count := len(fieldset["fields"])) == 1: + group["fields"].append(fieldset["fields"][0]) + else: + total_fields += field_count + total_fields += len(group["fields"]) + if total_fields == 1: + others.append(group["fields"][0]) + else: + fieldsets.append(group) + + # Add 'others' tab if there are any fields + if others: + fieldsets.append({"title": "Others", "fields": others, "fieldsets": []}) + + return fieldsets + def get_nested_data(self): """ Builds the original nested JSON structure from flat form data. diff --git a/src/servala/frontend/templates/frontend/forms/field.html b/src/servala/frontend/templates/frontend/forms/field.html index 744732e..3e0a30b 100644 --- a/src/servala/frontend/templates/frontend/forms/field.html +++ b/src/servala/frontend/templates/frontend/forms/field.html @@ -1,6 +1,6 @@ {% load i18n %}