Remove Advanced Fields feature
we don't need it, as the new expert mode will be just the full current form
This commit is contained in:
parent
575a4c7f8f
commit
880d10c5e5
5 changed files with 4 additions and 171 deletions
|
|
@ -327,18 +327,6 @@ class CrdModelFormMixin:
|
|||
field.widget = forms.HiddenInput()
|
||||
field.required = False
|
||||
|
||||
# Mark advanced fields with a CSS class and data attribute
|
||||
for name, field in self.fields.items():
|
||||
if self.is_field_advanced(name):
|
||||
field.widget.attrs.update(
|
||||
{
|
||||
"class": (
|
||||
field.widget.attrs.get("class", "") + " advanced-field"
|
||||
).strip(),
|
||||
"data-advanced": "true",
|
||||
}
|
||||
)
|
||||
|
||||
if self.instance and self.instance.pk:
|
||||
self.fields["name"].disabled = True
|
||||
self.fields["name"].help_text = _("Name cannot be changed after creation.")
|
||||
|
|
@ -355,17 +343,6 @@ class CrdModelFormMixin:
|
|||
return True
|
||||
return False
|
||||
|
||||
def is_field_advanced(self, field_name):
|
||||
advanced_fields = getattr(self, "ADVANCED_FIELDS", [])
|
||||
return field_name in advanced_fields or any(
|
||||
field_name.startswith(f"{af}.") for af in advanced_fields
|
||||
)
|
||||
|
||||
def are_all_fields_advanced(self, field_list):
|
||||
if not field_list:
|
||||
return False
|
||||
return all(self.is_field_advanced(field_name) for field_name in field_list)
|
||||
|
||||
def get_fieldsets(self):
|
||||
fieldsets = []
|
||||
|
||||
|
|
@ -381,7 +358,6 @@ class CrdModelFormMixin:
|
|||
"fields": general_fields,
|
||||
"fieldsets": [],
|
||||
"has_mandatory": self.has_mandatory_fields(general_fields),
|
||||
"is_advanced": self.are_all_fields_advanced(general_fields),
|
||||
}
|
||||
if all(
|
||||
[
|
||||
|
|
@ -448,9 +424,6 @@ class CrdModelFormMixin:
|
|||
title = f"{fieldset['title']}: {sub_fieldset['title']}: "
|
||||
for field in sub_fieldset["fields"]:
|
||||
self.strip_title(field, title)
|
||||
sub_fieldset["is_advanced"] = self.are_all_fields_advanced(
|
||||
sub_fieldset["fields"]
|
||||
)
|
||||
nested_fieldsets_list.append(sub_fieldset)
|
||||
|
||||
fieldset["fieldsets"] = nested_fieldsets_list
|
||||
|
|
@ -467,8 +440,6 @@ class CrdModelFormMixin:
|
|||
all_fields.extend(sub_fieldset["fields"])
|
||||
fieldset["has_mandatory"] = self.has_mandatory_fields(all_fields)
|
||||
|
||||
fieldset["is_advanced"] = self.are_all_fields_advanced(all_fields)
|
||||
|
||||
fieldsets.append(fieldset)
|
||||
|
||||
# Add 'others' tab if there are any fields
|
||||
|
|
@ -479,7 +450,6 @@ class CrdModelFormMixin:
|
|||
"fields": others,
|
||||
"fieldsets": [],
|
||||
"has_mandatory": self.has_mandatory_fields(others),
|
||||
"is_advanced": self.are_all_fields_advanced(others),
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -543,7 +513,7 @@ class CrdModelFormMixin:
|
|||
pass
|
||||
|
||||
|
||||
def generate_model_form_class(model, advanced_fields=None):
|
||||
def generate_model_form_class(model):
|
||||
meta_attrs = {
|
||||
"model": model,
|
||||
"fields": "__all__",
|
||||
|
|
@ -551,7 +521,6 @@ def generate_model_form_class(model, advanced_fields=None):
|
|||
fields = {
|
||||
"Meta": type("Meta", (object,), meta_attrs),
|
||||
"__module__": "crd_models",
|
||||
"ADVANCED_FIELDS": advanced_fields or [],
|
||||
}
|
||||
class_name = f"{model.__name__}ModelForm"
|
||||
return ModelFormMetaclass(class_name, (CrdModelFormMixin, ModelForm), fields)
|
||||
|
|
|
|||
|
|
@ -360,16 +360,6 @@ class ServiceDefinition(ServalaModelMixin, models.Model):
|
|||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
advanced_fields = models.JSONField(
|
||||
verbose_name=_("Advanced fields"),
|
||||
help_text=_(
|
||||
"Array of field names that should be hidden behind an 'Advanced' toggle. "
|
||||
"Use dot notation (e.g., ['spec.parameters.monitoring.enabled', 'spec.parameters.backup.schedule'])"
|
||||
),
|
||||
null=True,
|
||||
blank=True,
|
||||
default=list,
|
||||
)
|
||||
service = models.ForeignKey(
|
||||
to="Service",
|
||||
on_delete=models.CASCADE,
|
||||
|
|
@ -510,10 +500,7 @@ class ControlPlaneCRD(ServalaModelMixin, models.Model):
|
|||
|
||||
if not self.django_model:
|
||||
return
|
||||
advanced_fields = self.service_definition.advanced_fields or []
|
||||
return generate_model_form_class(
|
||||
self.django_model, advanced_fields=advanced_fields
|
||||
)
|
||||
return generate_model_form_class(self.django_model)
|
||||
|
||||
|
||||
class ServiceOffering(ServalaModelMixin, models.Model):
|
||||
|
|
|
|||
|
|
@ -6,22 +6,10 @@
|
|||
{% if form_action %}action="{{ form_action }}"{% endif %}>
|
||||
{% csrf_token %}
|
||||
{% include "frontend/forms/errors.html" %}
|
||||
{% if form.ADVANCED_FIELDS %}
|
||||
<div class="mb-3">
|
||||
<button type="button"
|
||||
class="btn btn-sm btn-outline-secondary ml-auto d-block"
|
||||
id="advanced-toggle"
|
||||
data-bs-toggle="collapse"
|
||||
data-bs-target=".advanced-field-group"
|
||||
aria-expanded="false">
|
||||
<i class="bi bi-gear"></i> {% translate "Show Advanced Options" %}
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
<ul class="nav nav-tabs" id="myTab" role="tablist">
|
||||
{% for fieldset in form.get_fieldsets %}
|
||||
{% if not fieldset.hidden %}
|
||||
<li class="nav-item{% if fieldset.is_advanced %} advanced-field-group collapse{% endif %}"
|
||||
<li class="nav-item"
|
||||
role="presentation">
|
||||
<button class="nav-link {% if forloop.first %}active{% endif %}{% if fieldset.has_mandatory %} has-mandatory{% endif %}"
|
||||
id="{{ fieldset.title|slugify }}-tab"
|
||||
|
|
@ -49,7 +37,7 @@
|
|||
{% endfor %}
|
||||
{% for subfieldset in fieldset.fieldsets %}
|
||||
{% if subfieldset.fields %}
|
||||
<div {% if subfieldset.is_advanced %}class="advanced-field-group collapse"{% endif %}>
|
||||
<div>
|
||||
<h4 class="mt-3">{{ subfieldset.title }}</h4>
|
||||
{% for field in subfieldset.fields %}
|
||||
{% with field=form|get_field:field %}{{ field.as_field_group }}{% endwith %}
|
||||
|
|
@ -70,4 +58,3 @@
|
|||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<script defer src="{% static 'js/advanced-fields.js' %}"></script>
|
||||
|
|
|
|||
|
|
@ -306,33 +306,6 @@ html[data-bs-theme="dark"] .crd-form .nav-tabs .nav-link .mandatory-indicator {
|
|||
margin-left: auto !important
|
||||
}
|
||||
|
||||
/* Advanced fields tab flash animation */
|
||||
@keyframes tab-pulse {
|
||||
0%, 100% {
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
50% {
|
||||
background-color: var(--brand-light);
|
||||
box-shadow: 0 0 10px rgba(154, 99, 236, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
html[data-bs-theme="dark"] @keyframes tab-pulse {
|
||||
0%, 100% {
|
||||
background-color: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
50% {
|
||||
background-color: rgba(154, 99, 236, 0.2);
|
||||
box-shadow: 0 0 10px rgba(154, 99, 236, 0.4);
|
||||
}
|
||||
}
|
||||
|
||||
.nav-tabs .nav-link.tab-flash {
|
||||
animation: tab-pulse 1s ease-in-out 2;
|
||||
}
|
||||
|
||||
.beta-banner {
|
||||
background: linear-gradient(135deg, var(--bs-primary) 0%, var(--brand-mid) 100%);
|
||||
color: white;
|
||||
|
|
|
|||
|
|
@ -1,83 +0,0 @@
|
|||
/**
|
||||
* Advanced Fields Toggle
|
||||
* Handles showing/hiding advanced fields in CRD forms
|
||||
*/
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
function flashTabsWithAdvancedFields() {
|
||||
const advancedGroups = document.querySelectorAll('.advanced-field-group');
|
||||
const tabsToFlash = new Set();
|
||||
advancedGroups.forEach(function(group) {
|
||||
const tabPane = group.closest('.tab-pane');
|
||||
if (tabPane) {
|
||||
const tabId = tabPane.getAttribute('id');
|
||||
if (tabId) {
|
||||
const tabButton = document.querySelector(`[data-bs-target="#${tabId}"]`);
|
||||
if (tabButton && !tabButton.classList.contains('active')) {
|
||||
tabsToFlash.add(tabButton);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
tabsToFlash.forEach(function(tab) {
|
||||
tab.classList.add('tab-flash');
|
||||
setTimeout(function() {
|
||||
tab.classList.remove('tab-flash');
|
||||
}, 2000);
|
||||
});
|
||||
}
|
||||
|
||||
function initializeAdvancedFields() {
|
||||
const advancedInputs = document.querySelectorAll('[data-advanced="true"]');
|
||||
|
||||
if (advancedInputs.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
advancedInputs.forEach(function(input) {
|
||||
const formGroup = input.closest('.form-group, .mb-3, .col-12, .col-md-6');
|
||||
if (formGroup) {
|
||||
formGroup.classList.add('advanced-field-group', 'collapse');
|
||||
}
|
||||
});
|
||||
|
||||
const toggleButton = document.getElementById('advanced-toggle');
|
||||
if (toggleButton) {
|
||||
let isExpanded = false;
|
||||
|
||||
document.querySelectorAll('.advanced-field-group').forEach(function(group) {
|
||||
group.addEventListener('shown.bs.collapse', function() {
|
||||
toggleButton.innerHTML = '<i class="bi bi-gear-fill"></i> Hide Advanced Options';
|
||||
if (!isExpanded) {
|
||||
isExpanded = true;
|
||||
setTimeout(flashTabsWithAdvancedFields, 100);
|
||||
}
|
||||
});
|
||||
|
||||
group.addEventListener('hidden.bs.collapse', function() {
|
||||
const anyVisible = Array.from(document.querySelectorAll('.advanced-field-group')).some(
|
||||
g => g.classList.contains('show')
|
||||
);
|
||||
if (!anyVisible) {
|
||||
toggleButton.innerHTML = '<i class="bi bi-gear"></i> Show Advanced Options';
|
||||
isExpanded = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initializeAdvancedFields);
|
||||
} else {
|
||||
initializeAdvancedFields();
|
||||
}
|
||||
|
||||
document.body.addEventListener('htmx:afterSwap', function(event) {
|
||||
if (event.detail.target.id === 'service-form' || event.detail.target.closest('.crd-form')) {
|
||||
setTimeout(initializeAdvancedFields, 100);
|
||||
}
|
||||
});
|
||||
})();
|
||||
Loading…
Add table
Add a link
Reference in a new issue