Working JS "additional form" form

This commit is contained in:
Neil Martinsen-Burrell 2023-05-05 10:40:13 -05:00
parent 57ea83ec1c
commit b344e71190
No known key found for this signature in database
GPG key ID: 6A3C818CC10D0184
8 changed files with 65 additions and 14 deletions

View file

@ -230,4 +230,31 @@ function handleValidationClick(e) {
})(); })();
(function prepareForms() {
let serverForm = document.querySelectorAll(".server-form")
let container = document.querySelector("#form-container")
let addButton = document.querySelector("#add-form")
let totalForms = document.querySelector("#id_form-TOTAL_FORMS")
let formNum = serverForm.length-1
addButton.addEventListener('click', addForm)
function addForm(e){
e.preventDefault()
let newForm = serverForm[0].cloneNode(true)
let formNumberRegex = RegExp(`form-(\\d){1}-`,'g')
let formLabelRegex = RegExp(`Name server (\\d){1}`, 'g')
let formExampleRegex = RegExp(`ns(\\d){1}`, 'g')
formNum++
newForm.innerHTML = newForm.innerHTML.replace(formNumberRegex, `form-${formNum}-`)
newForm.innerHTML = newForm.innerHTML.replace(formLabelRegex, `Name server ${formNum+1}`)
newForm.innerHTML = newForm.innerHTML.replace(formExampleRegex, `ns${formNum+1}`)
container.insertBefore(newForm, addButton)
newForm.querySelector("input").value = ""
totalForms.setAttribute('value', `${formNum+1}`)
}
})();

View file

@ -1,2 +1,2 @@
from .application_wizard import * from .application_wizard import *
from .domain import DomainAddUserForm, DomainNameserverForm from .domain import DomainAddUserForm, DomainNameserverForm, NameserverFormset

View file

@ -1,7 +1,7 @@
"""Forms for domain management.""" """Forms for domain management."""
from django import forms from django import forms
from django.forms import formset_factory
class DomainAddUserForm(forms.Form): class DomainAddUserForm(forms.Form):
@ -15,3 +15,8 @@ class DomainNameserverForm(forms.Form):
"""Form for changing nameservers.""" """Form for changing nameservers."""
server = forms.CharField(label="Name server") server = forms.CharField(label="Name server")
NameserverFormset = formset_factory(
DomainNameserverForm,
extra=1,
)

View file

@ -234,7 +234,7 @@ class Domain(TimeStampedModel):
"""Set the nameservers for this domain.""" """Set the nameservers for this domain."""
# TODO: call EPP to set these values in the registry instead of doing # TODO: call EPP to set these values in the registry instead of doing
# nothing. # nothing.
pass logger.warn("TODO: Fake setting nameservers to %s", new_nameservers)
@property @property
def roid(self): def roid(self):

View file

@ -13,11 +13,12 @@
{% include "includes/required_fields.html" %} {% include "includes/required_fields.html" %}
<form class="usa-form usa-form--large" method="post" novalidate> <form class="usa-form usa-form--large" method="post" novalidate id="form-container">
{% csrf_token %} {% csrf_token %}
{{ formset.management_form }} {{ formset.management_form }}
{% for form in formset %} {% for form in formset %}
<div class="server-form">
{% with sublabel_text="Example: ns"|concat:forloop.counter|concat:".nameserver.com" %} {% with sublabel_text="Example: ns"|concat:forloop.counter|concat:".nameserver.com" %}
{% if forloop.counter <= 2 %} {% if forloop.counter <= 2 %}
{% with attr_required=True %} {% with attr_required=True %}
@ -27,9 +28,10 @@
{% input_with_errors form.server %} {% input_with_errors form.server %}
{% endif %} {% endif %}
{% endwith %} {% endwith %}
</div>
{% endfor %} {% endfor %}
<button type="submit" name="submit_button" value="save" class="usa-button usa-button--unstyled display-block"> <button type="submit" name="submit_button" value="add_another" class="usa-button usa-button--unstyled display-block" id="add-form">
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24" height="24"> <svg class="usa-icon" aria-hidden="true" focusable="false" role="img" width="24" height="24">
<use xlink:href="{%static 'img/sprite.svg'%}#add_circle"></use> <use xlink:href="{%static 'img/sprite.svg'%}#add_circle"></use>
</svg><span class="margin-left-05">Add another name server</span> </svg><span class="margin-left-05">Add another name server</span>

View file

@ -29,7 +29,7 @@ error messages, if necessary.
{% endif %} {% endif %}
{% if sublabel_text %} {% if sublabel_text %}
<p id="{{ widget.attrs.id }}__sublabel" class="text-base">{{ sublabel_text }}</p> <p id="{{ widget.attrs.id }}__sublabel" class="text-base margin-top-2px margin-bottom-1">{{ sublabel_text }}</p>
{% endif %} {% endif %}
{% if field.errors %} {% if field.errors %}

View file

@ -1240,6 +1240,28 @@ class TestDomainDetail(TestWithDomainPermissions, WebTest):
) )
self.assertContains(page, "Domain name servers") self.assertContains(page, "Domain name servers")
def test_domain_nameservers_form(self):
"""Can change domain's namerservers.
Uses self.app WebTest because we need to interact with forms.
"""
nameservers_page = self.app.get(
reverse("domain-nameservers", kwargs={"pk": self.domain.id})
)
session_id = self.app.cookies[settings.SESSION_COOKIE_NAME]
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
with less_console_noise(): # swallow log warning message
result = nameservers_page.form.submit()
# form submission was a post, response should be a redirect
self.assertEqual(result.status_code, 302)
self.assertEqual(
result["Location"],
reverse("domain-nameservers", kwargs={"pk": self.domain.id}),
)
self.app.set_cookie(settings.SESSION_COOKIE_NAME, session_id)
page = result.follow()
self.assertContains(page, "The name servers for this domain have been updated")
class TestApplicationStatus(TestWithUser, WebTest): class TestApplicationStatus(TestWithUser, WebTest):
def setUp(self): def setUp(self):

View file

@ -5,7 +5,6 @@ import logging
from django.contrib import messages from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.db import IntegrityError from django.db import IntegrityError
from django.forms import formset_factory
from django.shortcuts import redirect from django.shortcuts import redirect
from django.urls import reverse from django.urls import reverse
from django.views.generic import DetailView from django.views.generic import DetailView
@ -13,15 +12,13 @@ from django.views.generic.edit import DeleteView, FormMixin
from registrar.models import Domain, DomainInvitation, User, UserDomainRole from registrar.models import Domain, DomainInvitation, User, UserDomainRole
from ..forms import DomainAddUserForm, DomainNameserverForm from ..forms import DomainAddUserForm, DomainNameserverForm, NameserverFormset
from ..utility.email import send_templated_email, EmailSendingError from ..utility.email import send_templated_email, EmailSendingError
from .utility import DomainPermission from .utility import DomainPermission
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
NameserverFormset = formset_factory(DomainNameserverForm)
class DomainView(DomainPermission, DetailView): class DomainView(DomainPermission, DetailView):
@ -72,7 +69,7 @@ class DomainNameserversView(DomainPermission, FormMixin, DetailView):
"""Formset submission posts to this view.""" """Formset submission posts to this view."""
self.object = self.get_object() self.object = self.get_object()
formset = self.get_form() formset = self.get_form()
print([form.fields["server"].required for form in formset])
if formset.is_valid(): if formset.is_valid():
return self.form_valid(formset) return self.form_valid(formset)
else: else:
@ -84,13 +81,11 @@ class DomainNameserversView(DomainPermission, FormMixin, DetailView):
# Set the nameservers from the formset # Set the nameservers from the formset
nameservers = [] nameservers = []
for form in formset: for form in formset:
print(form.cleaned_data)
try: try:
nameservers.append(form.cleaned_data["server"]) nameservers.append(form.cleaned_data["server"])
except KeyError: except KeyError:
# no server information in this field, skip it # no server information in this field, skip it
pass pass
print("Valid form, got nameservers:", nameservers)
domain = self.get_object() domain = self.get_object()
domain.set_nameservers(nameservers) domain.set_nameservers(nameservers)