mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-08-04 00:42:16 +02:00
revise error msg and log errors
This commit is contained in:
parent
1547a107ea
commit
99a60c09e7
9 changed files with 91 additions and 37 deletions
|
@ -1,9 +1,17 @@
|
|||
export function hideElement(element) {
|
||||
element.classList.add('display-none');
|
||||
if (element) {
|
||||
element.classList.add('display-none');
|
||||
} else {
|
||||
throw new Error('hideElement expected a passed DOM element as an argument, but none was provided.');
|
||||
}
|
||||
};
|
||||
|
||||
export function showElement(element) {
|
||||
element.classList.remove('display-none');
|
||||
if (element) {
|
||||
element.classList.remove('display-none');
|
||||
} else {
|
||||
throw new Error('showElement expected a passed DOM element as an argument, but none was provided.');
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -143,7 +143,7 @@ export class BaseTable {
|
|||
this.statusCheckboxes = document.querySelectorAll(`.${this.sectionSelector} input[name="filter-status"]`);
|
||||
this.statusIndicator = document.getElementById(`${this.sectionSelector}__filter-indicator`);
|
||||
this.statusToggle = document.getElementById(`${this.sectionSelector}__usa-button--filter`);
|
||||
this.noTableWrapper = document.getElementById(`${this.sectionSelector}__no-data`);
|
||||
this.noDataTableWrapper = document.getElementById(`${this.sectionSelector}__no-data`);
|
||||
this.noSearchResultsWrapper = document.getElementById(`${this.sectionSelector}__no-search-results`);
|
||||
this.portfolioElement = document.getElementById('portfolio-js-value');
|
||||
this.portfolioValue = this.portfolioElement ? this.portfolioElement.getAttribute('data-portfolio') : null;
|
||||
|
@ -451,7 +451,7 @@ export class BaseTable {
|
|||
}
|
||||
|
||||
// handle the display of proper messaging in the event that no members exist in the list or search returns no results
|
||||
this.updateDisplay(data, this.tableWrapper, this.noTableWrapper, this.noSearchResultsWrapper, this.currentSearchTerm);
|
||||
this.updateDisplay(data, this.tableWrapper, this.noDataTableWrapper, this.noSearchResultsWrapper, this.currentSearchTerm);
|
||||
// identify the DOM element where the list of results will be inserted into the DOM
|
||||
const tbody = this.tableWrapper.querySelector('tbody');
|
||||
tbody.innerHTML = '';
|
||||
|
|
|
@ -22,7 +22,7 @@ export class EditMemberDomainsTable extends BaseTable {
|
|||
this.editModeContainer = document.getElementById('domain-assignments-edit-view');
|
||||
this.readonlyModeContainer = document.getElementById('domain-assignments-readonly-view');
|
||||
this.reviewButton = document.getElementById('review-domain-assignments');
|
||||
this.backButton = document.querySelectorAll('.back-to-edit-domain-assignments');
|
||||
this.backButton = document.getElementById('back-to-edit-domain-assignments');
|
||||
this.saveButton = document.getElementById('save-domain-assignments');
|
||||
this.initializeDomainAssignments();
|
||||
this.initCancelEditDomainAssignmentButton();
|
||||
|
@ -326,17 +326,15 @@ export class EditMemberDomainsTable extends BaseTable {
|
|||
this.showReadonlyMode();
|
||||
});
|
||||
} else {
|
||||
console.warn('Missing DOM element. Expected element with id review-domain-assignments')
|
||||
console.warn('Missing DOM element. Expected element with id review-domain-assignments');
|
||||
}
|
||||
|
||||
if (this.backButton.length == 2) {
|
||||
this.backButton.forEach(backbutton => {
|
||||
backbutton.addEventListener('click', () => {
|
||||
this.showEditMode();
|
||||
});
|
||||
if (this.backButton) {
|
||||
this.backButton.addEventListener('click', () => {
|
||||
this.showEditMode();
|
||||
});
|
||||
} else {
|
||||
console.warn('Missing one or more DOM element. Expected 2 elements with class back-to-edit-domain-assignments')
|
||||
console.warn('Missing DOM element. Expected element with id back-to-edit-domain-assignments');
|
||||
}
|
||||
|
||||
if (this.saveButton) {
|
||||
|
@ -344,7 +342,7 @@ export class EditMemberDomainsTable extends BaseTable {
|
|||
this.submitChanges();
|
||||
});
|
||||
} else {
|
||||
console.warn('Missing DOM element. Expected element with id save-domain-assignments')
|
||||
console.warn('Missing DOM element. Expected element with id save-domain-assignments');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
|
||||
import { showElement, hideElement } from './helpers.js';
|
||||
import { BaseTable } from './table-base.js';
|
||||
|
||||
export class MemberDomainsTable extends BaseTable {
|
||||
|
@ -24,7 +25,28 @@ export class MemberDomainsTable extends BaseTable {
|
|||
`;
|
||||
tbody.appendChild(row);
|
||||
}
|
||||
|
||||
updateDisplay = (data, dataWrapper, noDataWrapper, noSearchResultsWrapper) => {
|
||||
const { unfiltered_total, total } = data;
|
||||
const searchSection = document.getElementById('edit-member-domains__search');
|
||||
if (!searchSection) console.warn('MemberDomainsTable updateDisplay expected an element with id edit-member-domains__search but none was found');
|
||||
if (unfiltered_total) {
|
||||
showElement(searchSection);
|
||||
if (total) {
|
||||
showElement(dataWrapper);
|
||||
hideElement(noSearchResultsWrapper);
|
||||
hideElement(noDataWrapper);
|
||||
} else {
|
||||
hideElement(dataWrapper);
|
||||
showElement(noSearchResultsWrapper);
|
||||
hideElement(noDataWrapper);
|
||||
}
|
||||
} else {
|
||||
hideElement(searchSection);
|
||||
hideElement(dataWrapper);
|
||||
hideElement(noSearchResultsWrapper);
|
||||
showElement(noDataWrapper);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export function initMemberDomainsTable() {
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
{% endif %}
|
||||
</h2>
|
||||
|
||||
<div class="section-outlined__header margin-bottom-3 grid-row">
|
||||
<div class="section-outlined__header margin-bottom-3 grid-row" id="edit-member-domains__search">
|
||||
<!-- ---------- SEARCH ---------- -->
|
||||
<div class="section-outlined__search mobile:grid-col-12 desktop:grid-col-9">
|
||||
<section aria-label="Member domains search component" class="margin-top-2">
|
||||
|
|
|
@ -100,7 +100,8 @@
|
|||
<li class="usa-button-group__item">
|
||||
<button
|
||||
type="button"
|
||||
class="usa-button usa-button--outline back-to-edit-domain-assignments"
|
||||
class="usa-button usa-button--outline"
|
||||
id="back-to-edit-domain-assignments"
|
||||
>
|
||||
Back
|
||||
</button>
|
||||
|
|
|
@ -134,7 +134,6 @@
|
|||
id="invite-member-modal"
|
||||
aria-labelledby="invite-member-heading"
|
||||
aria-describedby="confirm-invite-description"
|
||||
style="display: none;"
|
||||
>
|
||||
<div class="usa-modal__content">
|
||||
<div class="usa-modal__main">
|
||||
|
|
|
@ -121,21 +121,22 @@ class PortfolioMembersJson(PortfolioMembersPermission, View):
|
|||
|
||||
def initial_invitations_search(self, portfolio):
|
||||
"""Perform initial invitations search and get related DomainInvitation data based on the email."""
|
||||
|
||||
# Subquery to get concatenated domain information for each email
|
||||
domain_invitations = DomainInvitation.objects.filter(
|
||||
email=OuterRef("email"),
|
||||
domain__domain_info__portfolio=portfolio
|
||||
).annotate(
|
||||
concatenated_info=Concat(
|
||||
F("domain__id"), Value(":"), F("domain__name"), output_field=CharField()
|
||||
)
|
||||
).values("concatenated_info")
|
||||
|
||||
concatenated_domain_info = domain_invitations.values("email").annotate(
|
||||
domain_info=StringAgg("concatenated_info", delimiter=", ")
|
||||
).values("domain_info")
|
||||
|
||||
# Subquery to get concatenated domain information for each email
|
||||
domain_invitations = (
|
||||
DomainInvitation.objects.filter(email=OuterRef("email"), domain__domain_info__portfolio=portfolio)
|
||||
.annotate(
|
||||
concatenated_info=Concat(F("domain__id"), Value(":"), F("domain__name"), output_field=CharField())
|
||||
)
|
||||
.values("concatenated_info")
|
||||
)
|
||||
|
||||
concatenated_domain_info = (
|
||||
domain_invitations.values("email")
|
||||
.annotate(domain_info=StringAgg("concatenated_info", delimiter=", "))
|
||||
.values("domain_info")
|
||||
)
|
||||
|
||||
# PortfolioInvitation query
|
||||
invitations = PortfolioInvitation.objects.filter(portfolio=portfolio)
|
||||
invitations = invitations.annotate(
|
||||
|
|
|
@ -15,6 +15,7 @@ from registrar.models.user_domain_role import UserDomainRole
|
|||
from registrar.models.user_portfolio_permission import UserPortfolioPermission
|
||||
from registrar.models.utility.portfolio_helper import UserPortfolioPermissionChoices, UserPortfolioRoleChoices
|
||||
from registrar.utility.email import EmailSendingError
|
||||
from registrar.utility.enums import DefaultUserValues
|
||||
from registrar.views.utility.mixins import PortfolioMemberPermission
|
||||
from registrar.views.utility.permission_views import (
|
||||
PortfolioDomainRequestsPermissionView,
|
||||
|
@ -250,10 +251,18 @@ class PortfolioMemberDomainsEditView(PortfolioMemberDomainsEditPermissionView, V
|
|||
messages.success(request, "The domain assignment changes have been saved.")
|
||||
return redirect(reverse("member-domains", kwargs={"pk": pk}))
|
||||
except IntegrityError:
|
||||
messages.error(request, "A database error occurred while saving changes.")
|
||||
messages.error(
|
||||
request,
|
||||
f"A database error occurred while saving changes. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}",
|
||||
)
|
||||
logger.error("A database error occurred while saving changes.")
|
||||
return redirect(reverse("member-domains-edit", kwargs={"pk": pk}))
|
||||
except Exception as e:
|
||||
messages.error(request, f"An unexpected error occurred: {str(e)}")
|
||||
messages.error(
|
||||
request,
|
||||
f"An unexpected error occurred: {str(e)}. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}",
|
||||
)
|
||||
logger.error(f"An unexpected error occurred: {str(e)}")
|
||||
return redirect(reverse("member-domains-edit", kwargs={"pk": pk}))
|
||||
else:
|
||||
messages.info(request, "No changes detected.")
|
||||
|
@ -266,7 +275,11 @@ class PortfolioMemberDomainsEditView(PortfolioMemberDomainsEditPermissionView, V
|
|||
try:
|
||||
return json.loads(domain_data) if domain_data else []
|
||||
except json.JSONDecodeError:
|
||||
messages.error(self.request, f"Invalid data for {domain_type}.")
|
||||
messages.error(
|
||||
self.request,
|
||||
f"Invalid data for {domain_type}. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}",
|
||||
)
|
||||
logger.error(f"Invalid data for {domain_type}")
|
||||
return None
|
||||
|
||||
def _process_added_domains(self, added_domain_ids, member):
|
||||
|
@ -438,10 +451,18 @@ class PortfolioInvitedMemberDomainsEditView(PortfolioMemberDomainsEditPermission
|
|||
messages.success(request, "The domain assignment changes have been saved.")
|
||||
return redirect(reverse("invitedmember-domains", kwargs={"pk": pk}))
|
||||
except IntegrityError:
|
||||
messages.error(request, "A database error occurred while saving changes.")
|
||||
messages.error(
|
||||
request,
|
||||
f"A database error occurred while saving changes. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}.",
|
||||
)
|
||||
logger.error(f"A database error occurred while saving changes.")
|
||||
return redirect(reverse("invitedmember-domains-edit", kwargs={"pk": pk}))
|
||||
except Exception as e:
|
||||
messages.error(request, f"An unexpected error occurred: {str(e)}")
|
||||
messages.error(
|
||||
request,
|
||||
f"An unexpected error occurred: {str(e)}. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}",
|
||||
)
|
||||
logger.error(f"An unexpected error occurred: {str(e)}.")
|
||||
return redirect(reverse("invitedmember-domains-edit", kwargs={"pk": pk}))
|
||||
else:
|
||||
messages.info(request, "No changes detected.")
|
||||
|
@ -454,7 +475,11 @@ class PortfolioInvitedMemberDomainsEditView(PortfolioMemberDomainsEditPermission
|
|||
try:
|
||||
return json.loads(domain_data) if domain_data else []
|
||||
except json.JSONDecodeError:
|
||||
messages.error(self.request, f"Invalid data for {domain_type}.")
|
||||
messages.error(
|
||||
self.request,
|
||||
f"Invalid data for {domain_type}. If the issue persists, please contact {DefaultUserValues.HELP_EMAIL}.",
|
||||
)
|
||||
logger.error(f"Invalid data for {domain_type}.")
|
||||
return None
|
||||
|
||||
def _process_added_domains(self, added_domain_ids, email):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue