diff --git a/src/registrar/admin.py b/src/registrar/admin.py index 144d1fcab..44b8d7345 100644 --- a/src/registrar/admin.py +++ b/src/registrar/admin.py @@ -3791,7 +3791,7 @@ class WaffleFlagAdmin(FlagAdmin): if extra_context is None: extra_context = {} extra_context["dns_prototype_flag"] = flag_is_active_for_user(request.user, "dns_prototype_flag") - extra_context["organization_member"] = flag_is_active_for_user(request.user, "organization_member") + extra_context["organization_members"] = flag_is_active_for_user(request.user, "organization_members") return super().changelist_view(request, extra_context=extra_context) diff --git a/src/registrar/assets/src/js/getgov/main.js b/src/registrar/assets/src/js/getgov/main.js index 5de02f35a..c379215f1 100644 --- a/src/registrar/assets/src/js/getgov/main.js +++ b/src/registrar/assets/src/js/getgov/main.js @@ -9,7 +9,7 @@ import { initDomainsTable } from './table-domains.js'; import { initDomainRequestsTable } from './table-domain-requests.js'; import { initMembersTable } from './table-members.js'; import { initMemberDomainsTable } from './table-member-domains.js'; -import { initPortfolioMemberPageToggle } from './portfolio-member-page.js'; +import { initPortfolioNewMemberPageToggle } from './portfolio-member-page.js'; import { initAddNewMemberPageListeners } from './portfolio-member-page.js'; initDomainValidators(); @@ -20,13 +20,6 @@ nameserversFormListener(); hookupYesNoListener("other_contacts-has_other_contacts",'other-employees', 'no-other-employees'); hookupYesNoListener("additional_details-has_anything_else_text",'anything-else', null); -hookupRadioTogglerListener( - 'member_access_level', - { - 'admin': 'new-member-admin-permissions', - 'basic': 'new-member-basic-permissions' - } -); hookupYesNoListener("additional_details-has_cisa_representative",'cisa-representative', null); initializeUrbanizationToggle(); @@ -42,5 +35,9 @@ initDomainRequestsTable(); initMembersTable(); initMemberDomainsTable(); -initPortfolioMemberPageToggle(); +// Init the portfolio new member page +initPortfolioNewMemberPageToggle(); initAddNewMemberPageListeners(); + +// Init all other portfolio member pages +initPortfolioMemberPage(); \ No newline at end of file diff --git a/src/registrar/assets/src/js/getgov/portfolio-member-page.js b/src/registrar/assets/src/js/getgov/portfolio-member-page.js index 98bcf7d03..8d1b8e065 100644 --- a/src/registrar/assets/src/js/getgov/portfolio-member-page.js +++ b/src/registrar/assets/src/js/getgov/portfolio-member-page.js @@ -2,9 +2,10 @@ import { uswdsInitializeModals } from './helpers-uswds.js'; import { getCsrfToken } from './helpers.js'; import { generateKebabHTML } from './table-base.js'; import { MembersTable } from './table-members.js'; +import { hookupRadioTogglerListener } from './radios.js'; // This is specifically for the Member Profile (Manage Member) Page member/invitation removal -export function initPortfolioMemberPageToggle() { +export function initPortfolioNewMemberPageToggle() { document.addEventListener("DOMContentLoaded", () => { const wrapperDeleteAction = document.getElementById("wrapper-delete-action") if (wrapperDeleteAction) { @@ -53,6 +54,16 @@ export function initAddNewMemberPageListeners() { if (!add_member_form){ return; } + // Hookup the radio elements + hookupRadioTogglerListener( + 'member_access_level', + { + 'admin': 'new-member-admin-permissions', + 'basic': 'new-member-basic-permissions' + } + ); + + // Hookup the submission buttons document.getElementById("confirm_new_member_submit").addEventListener("click", function() { // Upon confirmation, submit the form document.getElementById("add_member_form").submit(); @@ -168,5 +179,50 @@ export function initAddNewMemberPageListeners() { modalTrigger.click(); } } +} +// Export for the rest of the portfolio pages (not add) +export function initPortfolioMemberPage() { + document.addEventListener("DOMContentLoaded", () => { + hookupRadioTogglerListener( + 'role', + { + 'organization_admin': 'new-member-admin-permissions', + 'organization_member': 'new-member-basic-permissions' + } + ); + // let memberForm = document.getElementById("member_form"); + // if (!memberForm) { + // return; + // } + + // let memberAdminContainer = document.getElementById("member-admin-permissions"); + // let memberBasicContainer = document.getElementById("member-basic-permissions"); + // let roleRadios = document.querySelectorAll('input[name="role"]'); + + // function toggleContainers() { + // let selectedRole = document.querySelector('input[name="role"]:checked'); + // if (!selectedRole) { + // hideElement(memberAdminContainer); + // hideElement(memberBasicContainer); + // return; + // } + + // if (selectedRole.value === "organization_admin") { + // showElement(memberAdminContainer); + // hideElement(memberBasicContainer); + // } else if (selectedRole.value === "organization_member") { + // hideElement(memberAdminContainer); + // showElement(memberBasicContainer); + // } + // } + + // // Initial state + // toggleContainers(); + + // // Add change listener to all radio buttons + // roleRadios.forEach(radio => { + // radio.addEventListener("change", toggleContainers); + // }); + }); } \ No newline at end of file diff --git a/src/registrar/assets/src/js/getgov/radios.js b/src/registrar/assets/src/js/getgov/radios.js index 248865e8b..207021dff 100644 --- a/src/registrar/assets/src/js/getgov/radios.js +++ b/src/registrar/assets/src/js/getgov/radios.js @@ -64,8 +64,8 @@ export function hookupRadioTogglerListener(radioButtonName, valueToElementMap) { } } } - - if (radioButtons.length) { + + if (radioButtons && radioButtons.length) { // Add event listener to each radio button radioButtons.forEach(function (radioButton) { radioButton.addEventListener('change', handleRadioButtonChange); diff --git a/src/registrar/forms/portfolio.py b/src/registrar/forms/portfolio.py index 3c45f5df1..520c097b6 100644 --- a/src/registrar/forms/portfolio.py +++ b/src/registrar/forms/portfolio.py @@ -109,12 +109,13 @@ class PortfolioSeniorOfficialForm(forms.ModelForm): cleaned_data.pop("full_name", None) return cleaned_data + class BasePortfolioMemberForm(forms.Form): required_star = '*' role = forms.ChoiceField( choices=[ (UserPortfolioRoleChoices.ORGANIZATION_ADMIN.value, "Admin access"), - (UserPortfolioRoleChoices.ORGANIZATION_MEMBER.value, "Basic access") + (UserPortfolioRoleChoices.ORGANIZATION_MEMBER.value, "Basic access"), ], widget=forms.RadioSelect, required=True, @@ -175,12 +176,18 @@ class BasePortfolioMemberForm(forms.Form): } def __init__(self, *args, instance=None, **kwargs): - self.instance = instance - # If we have an instance, set initial - if instance: - kwargs['initial'] = self._map_instance_to_form(instance) - super().__init__(*args, **kwargs) + self.instance = instance + self.initial = self._map_instance_to_form(self.instance) + # Adds a

description beneath each role option + self.fields["role"].descriptions = { + "organization_admin": UserPortfolioRoleChoices.get_role_description( + UserPortfolioRoleChoices.ORGANIZATION_ADMIN + ), + "organization_member": UserPortfolioRoleChoices.get_role_description( + UserPortfolioRoleChoices.ORGANIZATION_MEMBER + ), + } def _map_instance_to_form(self, instance): """Maps model instance data to form fields""" @@ -235,10 +242,7 @@ class BasePortfolioMemberForm(forms.Form): raise ValueError(f"ROLE_REQUIRED_FIELDS referenced a non-existent field: {field_name}.") if not cleaned_data.get(field_name): - self.add_error( - field_name, - self.fields.get(field_name).error_messages.get("required") - ) + self.add_error(field_name, self.fields.get(field_name).error_messages.get("required")) return cleaned_data @@ -259,7 +263,7 @@ class BasePortfolioMemberForm(forms.Form): if role == UserPortfolioRoleChoices.ORGANIZATION_ADMIN: if domain_request_permission_admin: additional_permissions.add(domain_request_permission_admin) - + if member_permission_admin: additional_permissions.add(member_permission_admin) else: @@ -285,21 +289,6 @@ class PortfolioMemberForm(BasePortfolioMemberForm): """ Form for updating a portfolio member. """ - class Meta: - model = UserPortfolioPermission - fields = [ - "roles", - "additional_permissions", - ] - - def __init__(self, *args, instance=None, **kwargs): - super().__init__(*args, **kwargs) - self.fields['role'].descriptions = { - "organization_admin": UserPortfolioRoleChoices.get_role_description(UserPortfolioRoleChoices.ORGANIZATION_ADMIN), - "organization_member": UserPortfolioRoleChoices.get_role_description(UserPortfolioRoleChoices.ORGANIZATION_MEMBER) - } - self.instance = instance - self.initial = self._map_instance_to_form(self.instance) class PortfolioInvitedMemberForm(BasePortfolioMemberForm): @@ -307,13 +296,6 @@ class PortfolioInvitedMemberForm(BasePortfolioMemberForm): Form for updating a portfolio invited member. """ - class Meta: - model = PortfolioInvitation - fields = [ - "roles", - "additional_permissions", - ] - class NewMemberForm(forms.ModelForm): member_access_level = forms.ChoiceField( diff --git a/src/registrar/templates/portfolio_member_permissions.html b/src/registrar/templates/portfolio_member_permissions.html index 8a012964d..0744e8570 100644 --- a/src/registrar/templates/portfolio_member_permissions.html +++ b/src/registrar/templates/portfolio_member_permissions.html @@ -18,7 +18,12 @@ Members

  • - Manage member + {% if member %} + {% url 'member' pk=member.pk as back_url %} + {% elif invitation %} + {% url 'invitedmember' pk=invitation.pk as back_url %} + {% endif %} + Manage member
  • {% comment %} Manage members {% endcomment %}
  • @@ -36,13 +41,29 @@ {% csrf_token %}
    -

    Member email

    + {% if member and member.email or invitation and invitation.email %} +

    Member email

    + {% else %} +

    Member

    + {% endif %}

    + {% comment %} + Show member email if possible, then invitation email. + If neither of these are true, show the name or as a last resort just "None". + {% endcomment %} {% if member %} - {{ member.email }} + {% if member.email %} + {{ member.email }} + {% else %} + {{ member.get_formatted_name }} + {% endif %} {% elif invitation %} - {{ invitation.email }} + {% if invitation.email %} + {{ invitation.email }} + {% else %} + None + {% endif %} {% endif %}

    diff --git a/src/registrar/views/portfolios.py b/src/registrar/views/portfolios.py index e2a5530be..5089609ca 100644 --- a/src/registrar/views/portfolios.py +++ b/src/registrar/views/portfolios.py @@ -165,7 +165,6 @@ class PortfolioMemberEditView(PortfolioMemberEditPermissionView, View): user = portfolio_permission.user form = self.form_class(request.POST, instance=portfolio_permission) - print(f"form valid: {form.is_valid()}") if form.is_valid(): form.save() return redirect("member", pk=pk)