From 196ab6323b7c8a3d63821b35a971b567c18cde43 Mon Sep 17 00:00:00 2001 From: zandercymatics <141044360+zandercymatics@users.noreply.github.com> Date: Thu, 14 Mar 2024 15:06:15 -0600 Subject: [PATCH] Add copy button --- src/registrar/admin.py | 19 ++++++- src/registrar/assets/sass/_theme/_admin.scss | 19 +++++++ src/registrar/templates/admin/fieldset.html | 49 +++++++++++++++++++ .../admin/includes/contact_fieldset.html | 48 ++++++++++++++++++ .../admin/public_contact_change_form.html | 8 +++ 5 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 src/registrar/templates/admin/fieldset.html create mode 100644 src/registrar/templates/django/admin/includes/contact_fieldset.html create mode 100644 src/registrar/templates/django/admin/public_contact_change_form.html diff --git a/src/registrar/admin.py b/src/registrar/admin.py index ff8046da9..01ad5e960 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -640,6 +640,17 @@ class ContactAdmin(ListHeaderAdmin): # in autocomplete_fields for user ordering = ["first_name", "last_name", "email"] + fieldsets = [ + ( + None, + { + "fields": ["user", "first_name", "middle_name", "last_name", "title", "email", "phone"] + }, + ) + ] + + change_form_template = "django/admin/public_contact_change_form.html" + # We name the custom prop 'contact' because linter # is not allowing a short_description attr on it # This gets around the linter limitation, for now. @@ -1805,6 +1816,12 @@ class DraftDomainAdmin(ListHeaderAdmin): ordering = ["name"] +class PublicContactAdmin(ListHeaderAdmin): + """Custom PublicContact admin class.""" + + change_form_template = "django/admin/public_contact_change_form.html" + + class VerifiedByStaffAdmin(ListHeaderAdmin): list_display = ("email", "requestor", "truncated_notes", "created_at") search_fields = ["email"] @@ -1845,7 +1862,7 @@ admin.site.register(models.DraftDomain, DraftDomainAdmin) # do not propagate to registry and logic not applied admin.site.register(models.Host, MyHostAdmin) admin.site.register(models.Website, WebsiteAdmin) -admin.site.register(models.PublicContact, AuditedAdmin) +admin.site.register(models.PublicContact, PublicContactAdmin) admin.site.register(models.DomainRequest, DomainRequestAdmin) admin.site.register(models.TransitionDomain, TransitionDomainAdmin) admin.site.register(models.VerifiedByStaff, VerifiedByStaffAdmin) diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index dc67bc8b6..6909f77c2 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -299,3 +299,22 @@ input.admin-confirm-button { display: contents !important; } } + +.admin-icon-group { + position: relative; + display: flex; + align-items: center; + + .usa-button__icon { + position: absolute; + right: 0; + top: 0; + height: 100%; + border: none; + background: transparent; + padding: 0 1rem; + margin: 0; + } +} + + diff --git a/src/registrar/templates/admin/fieldset.html b/src/registrar/templates/admin/fieldset.html new file mode 100644 index 000000000..dadae5811 --- /dev/null +++ b/src/registrar/templates/admin/fieldset.html @@ -0,0 +1,49 @@ +{% load i18n static %} + +{% comment %} +This is copied from Djangos implementation of this template, with added "blocks" +It is not inherently customizable on its own, so we can modify this instead. +https://github.com/django/django/blob/main/django/contrib/admin/templates/admin/includes/fieldset.html +{% endcomment %} +
+ {% block fieldset_title %} + {% if fieldset.name %}

{{ fieldset.name }}

{% endif %} + {% endblock fieldset_title %} + + {% block fieldset_description %} + {% if fieldset.description %} +
{{ fieldset.description|safe }}
+ {% endif %} + {% endblock fieldset_description %} + + {% block fieldset_lines %} + {% for line in fieldset %} +
+ {% if line.fields|length == 1 %}{{ line.errors }}{% else %}
{% endif %} + {% for field in line %} +
+ {% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %} +
+ {% if field.is_checkbox %} + {{ field.field }}{{ field.label_tag }} + {% else %} + {{ field.label_tag }} + {% if field.is_readonly %} +
{{ field.contents }}
+ {% else %} + {{ field.field }} + {% endif %} + {% endif %} +
+ {% if field.field.help_text %} +
+
{{ field.field.help_text|safe }}
+
+ {% endif %} +
+ {% endfor %} + {% if not line.fields|length == 1 %}
{% endif %} +
+ {% endfor %} + {% endblock fieldset_lines %} +
\ No newline at end of file diff --git a/src/registrar/templates/django/admin/includes/contact_fieldset.html b/src/registrar/templates/django/admin/includes/contact_fieldset.html new file mode 100644 index 000000000..c2a10f4fd --- /dev/null +++ b/src/registrar/templates/django/admin/includes/contact_fieldset.html @@ -0,0 +1,48 @@ +{% extends "admin/fieldset.html" %} +{% load i18n static %} + +{% comment %} +This is using a custom implementation fieldset.html (see admin/fieldset.html) +{% endcomment %} +{% block fieldset_lines %} +{% for line in fieldset %} +
+ {% if line.fields|length == 1 %}{{ line.errors }}{% else %}
{% endif %} + {% for field in line %} +
+ {% if not line.fields|length == 1 and not field.is_readonly %}{{ field.errors }}{% endif %} +
+ {% if field.is_checkbox %} + {{ field.field }}{{ field.label_tag }} + {% else %} + {{ field.label_tag }} + {% if field.is_readonly %} +
{{ field.contents }}
+ {% elif field.field.name == "email" %} +
+ {{ field.field }} + +
+ {% else %} + {{ field.field }} + {% endif %} + {% endif %} +
+ {% if field.field.help_text %} +
+
{{ field.field.help_text|safe }}
+
+ {% endif %} +
+ {% endfor %} + {% if not line.fields|length == 1 %}
{% endif %} +
+{% endfor %} + +{% endblock fieldset_lines %} diff --git a/src/registrar/templates/django/admin/public_contact_change_form.html b/src/registrar/templates/django/admin/public_contact_change_form.html new file mode 100644 index 000000000..181201d0b --- /dev/null +++ b/src/registrar/templates/django/admin/public_contact_change_form.html @@ -0,0 +1,8 @@ +{% extends 'admin/change_form.html' %} +{% load i18n static %} + +{% block field_sets %} + {% for fieldset in adminform %} + {% include "django/admin/includes/contact_fieldset.html" %} + {% endfor %} +{% endblock %}