diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 607313f2d..6bc6f2061 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -2947,29 +2947,26 @@ class PortfolioAdmin(ListHeaderAdmin): portfolio_type.short_description = "Portfolio type" # type: ignore def suborganizations(self, obj: models.Portfolio): - """Returns a comma seperated list of links for each related suborg""" + """Returns a list of links for each related suborg""" queryset = obj.get_suborganizations() - sep = '
' - return self.get_field_links_as_csv(queryset, "suborganization", seperator=sep) + return self.get_field_links_as_list(queryset, "suborganization") suborganizations.short_description = "Suborganizations" # type: ignore def domains(self, obj: models.Portfolio): - """Returns a comma seperated list of links for each related domain""" + """Returns a list of links for each related domain""" queryset = obj.get_domains() - sep = '
' - return self.get_field_links_as_csv( - queryset, "domaininformation", link_info_attribute="get_state_display_of_domain", seperator=sep + return self.get_field_links_as_list( + queryset, "domaininformation", link_info_attribute="get_state_display_of_domain" ) domains.short_description = "Domains" # type: ignore def domain_requests(self, obj: models.Portfolio): - """Returns a comma seperated list of links for each related domain request""" + """Returns a list of links for each related domain request""" queryset = obj.get_domain_requests() - sep = '
' - return self.get_field_links_as_csv( - queryset, "domainrequest", link_info_attribute="get_status_display", seperator=sep + return self.get_field_links_as_list( + queryset, "domainrequest", link_info_attribute="get_status_display" ) domain_requests.short_description = "Domain requests" # type: ignore @@ -2981,9 +2978,8 @@ class PortfolioAdmin(ListHeaderAdmin): "senior_official", ] - # Q for reviewers: What should this be called? - def get_field_links_as_csv( - self, queryset, model_name, attribute_name=None, link_info_attribute=None, seperator=", " + def get_field_links_as_list( + self, queryset, model_name, attribute_name=None, link_info_attribute=None, seperator=None ): """ Generate HTML links for items in a queryset, using a specified attribute for link text. @@ -2994,6 +2990,7 @@ class PortfolioAdmin(ListHeaderAdmin): attribute_name: The attribute or method name to use for link text. If None, the item itself is used. link_info_attribute: Appends f"({value_of_attribute})" to the end of the link. separator: The separator to use between links in the resulting HTML. + If none, an unordered list is returned. Returns: A formatted HTML string with links to the admin change pages for each item. @@ -3014,8 +3011,17 @@ class PortfolioAdmin(ListHeaderAdmin): if link_info_attribute: link += f" ({self.value_of_attribute(item, link_info_attribute)})" - links.append(link) - return format_html(seperator.join(links)) if links else "-" + if seperator: + links.append(link) + else: + links.append(f'
  • {link}
  • ') + + # If no seperator is specified, just return an unordered list. + if seperator: + return format_html(seperator.join(links)) if links else "-" + else: + links = "".join(links) + return format_html(f'') if links else "-" def value_of_attribute(self, obj, attribute_name: str): """Returns the value of getattr if the attribute isn't callable. diff --git a/src/registrar/assets/js/get-gov-admin.js b/src/registrar/assets/js/get-gov-admin.js index 93b8359bf..f376af40b 100644 --- a/src/registrar/assets/js/get-gov-admin.js +++ b/src/registrar/assets/js/get-gov-admin.js @@ -776,9 +776,6 @@ function initializeWidgetOnList(list, parentId) { let $federalAgency = django.jQuery("#id_federal_agency"); let organizationType = document.getElementById("id_organization_type"); if ($federalAgency && organizationType) { - // Execute this function once on load - handleFederalAgencyChange($federalAgency, organizationType); - // Attach the change event listener $federalAgency.on("change", function() { handleFederalAgencyChange($federalAgency, organizationType); diff --git a/src/registrar/assets/sass/_theme/_admin.scss b/src/registrar/assets/sass/_theme/_admin.scss index 711bfe960..d6f03f427 100644 --- a/src/registrar/assets/sass/_theme/_admin.scss +++ b/src/registrar/assets/sass/_theme/_admin.scss @@ -847,3 +847,9 @@ div.dja__model-description{ } } } + +ul.unstyled-list-elements { + padding: 0; + margin: 0; + list-style: none; +} diff --git a/src/registrar/models/portfolio.py b/src/registrar/models/portfolio.py index bd1c091f8..6dcd660e7 100644 --- a/src/registrar/models/portfolio.py +++ b/src/registrar/models/portfolio.py @@ -31,7 +31,6 @@ class Portfolio(TimeStampedModel): unique=False, ) - # Q for reviewers: shouldn't this be a required field? organization_name = models.CharField( null=True, blank=True,