further fixes to formset validation, and display updates

This commit is contained in:
David Kennedy 2025-03-04 13:29:41 -05:00
parent d8c98c08da
commit dabac5935f
No known key found for this signature in database
GPG key ID: 6528A5386E66B96B
3 changed files with 13 additions and 12 deletions

View file

@ -35,6 +35,8 @@ export class NameserverForm {
const domainName = document.getElementById('id_form-0-domain');
if (domainName) {
this.domain = domainName.value;
} else {
console.warn("Form expects a dom element, id_form-0-domain");
}
// Check if exactly two nameserver forms exist: id_form-1-server is present but id_form-2-server is not
@ -56,7 +58,7 @@ export class NameserverForm {
// handle display of table view errors
// if error exists in an edit-row, make that row show, and readonly row hide
const formTable = document.querySelector('.usa-table')
const formTable = document.getElementById('nameserver-table')
if (formTable) {
const editRows = formTable.querySelectorAll('.edit-row');
editRows.forEach(editRow => {

View file

@ -184,8 +184,8 @@ class BaseNameserverFormset(forms.BaseFormSet):
"""Check for duplicate entries in the formset and ensure at least two valid nameservers."""
error_message = "At least two name servers are required."
valid_forms, empty_forms = self._categorize_forms(error_message)
self._enforce_minimum_nameservers(valid_forms, empty_forms, error_message)
valid_forms, invalid_forms, empty_forms = self._categorize_forms(error_message)
self._enforce_minimum_nameservers(valid_forms, invalid_forms, empty_forms, error_message)
if any(self.errors): # Skip further validation if individual forms already have errors
return
@ -193,31 +193,30 @@ class BaseNameserverFormset(forms.BaseFormSet):
self._check_for_duplicates()
def _categorize_forms(self, error_message):
"""Sort forms into valid or empty based on the 'server' field."""
"""Sort forms into valid, invalid or empty based on the 'server' field."""
valid_forms = []
invalid_forms = []
empty_forms = []
for form in self.forms:
if not self._is_server_validation_needed(form, error_message):
invalid_forms.append(form)
continue
server = form.cleaned_data.get("server", "").strip()
if server:
valid_forms.append(form)
else:
empty_forms.append(form)
return valid_forms, empty_forms
return valid_forms, invalid_forms, empty_forms
def _is_server_validation_needed(self, form, error_message):
"""Determine if server validation should be performed on a given form."""
return form.is_valid() or list(form.errors.get("server", [])) == [error_message]
def _enforce_minimum_nameservers(self, valid_forms, empty_forms, error_message):
"""Ensure at least two nameservers are provided, adjusting error messages as needed. This accounts
for three forms, where the last form is empty and one of the first two forms has an error. In that case
will want to remove the 'at least two valid servers' error."""
if len(valid_forms) < 2 and len(self.forms) < 3:
def _enforce_minimum_nameservers(self, valid_forms, invalid_forms, empty_forms, error_message):
"""Ensure at least two nameservers are provided, adjusting error messages as needed."""
if len(valid_forms) + len(invalid_forms) < 2:
self._add_required_error(empty_forms, error_message)
else:
self._remove_required_error_from_forms(error_message)

View file

@ -109,7 +109,7 @@
{% endfor %}
<table class="usa-table usa-table--borderless usa-table--stacked dotgov-table dotgov-table--stacked">
<table class="usa-table usa-table--borderless usa-table--stacked dotgov-table dotgov-table--stacked" id="nameserver-table">
<caption class="sr-only">Your registered domains</caption>
<thead>
<tr>