diff --git a/src/registrar/assets/src/js/getgov/main.js b/src/registrar/assets/src/js/getgov/main.js index 4eb1534a5..2e789e965 100644 --- a/src/registrar/assets/src/js/getgov/main.js +++ b/src/registrar/assets/src/js/getgov/main.js @@ -39,4 +39,4 @@ initPortfolioNewMemberPageToggle(); initAddNewMemberPageListeners(); // Init all other portfolio member pages -initPortfolioMemberPage(); \ No newline at end of file +initPortfolioMemberPage(); 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 3d5cc3609..aeca5d1f6 100644 --- a/src/registrar/assets/src/js/getgov/portfolio-member-page.js +++ b/src/registrar/assets/src/js/getgov/portfolio-member-page.js @@ -57,10 +57,10 @@ export function initAddNewMemberPageListeners() { } // Hookup the radio elements hookupRadioTogglerListener( - 'member_access_level', + 'role', { - 'admin': 'new-member-admin-permissions', - 'basic': 'new-member-basic-permissions' + 'organization_admin': 'new-member-admin-permissions', + 'organization_basic': 'new-member-basic-permissions' } ); @@ -115,6 +115,8 @@ export function initAddNewMemberPageListeners() { // Get all permission sections (divs with h3 and radio inputs) const permissionSections = document.querySelectorAll(`#${permission_details_div_id} > h3`); + console.log(`what is the id? ${permission_details_div_id}`) + console.log(`what is the permissionSections? ${permissionSections}`) permissionSections.forEach(section => { // Find the

element text @@ -122,17 +124,18 @@ export function initAddNewMemberPageListeners() { // Find the associated radio buttons container (next fieldset) const fieldset = section.nextElementSibling; - + console.log(`what is the fieldset? ${fieldset}`) if (fieldset && fieldset.tagName.toLowerCase() === 'fieldset') { // Get the selected radio button within this fieldset const selectedRadio = fieldset.querySelector('input[type="radio"]:checked'); - + console.log(`what is the selectedRadio? ${selectedRadio}`) // If a radio button is selected, get its label text let selectedPermission = "No permission selected"; if (selectedRadio) { const label = fieldset.querySelector(`label[for="${selectedRadio.id}"]`); selectedPermission = label ? label.textContent : "No permission selected"; } + console.log(`what is the selectedPermission? ${selectedPermission}`) // Create new elements for the modal content const titleElement = document.createElement("h4"); @@ -198,4 +201,4 @@ export function initPortfolioMemberPage() { } ) }); -} \ No newline at end of file +} diff --git a/src/registrar/forms/portfolio.py b/src/registrar/forms/portfolio.py index f159e962f..135ddd838 100644 --- a/src/registrar/forms/portfolio.py +++ b/src/registrar/forms/portfolio.py @@ -364,16 +364,14 @@ class NewMemberForm(BasePortfolioMemberForm): cleaned_data["email"] = email_value.lower() if email_value: - # Check if user exists - requested_user = User.objects.filter(email=email_value, email__isnull=False).first() - if not requested_user: - raise forms.ValidationError("User does not exist.") - # Check if user is already a member - if UserPortfolioPermission.objects.filter(user=requested_user, portfolio=self.portfolio).exists(): - raise forms.ValidationError("User is already a member of this portfolio.") + if UserPortfolioPermission.objects.filter(user__email=email_value, portfolio=self.portfolio).exists(): + self.add_error("email", "User is already a member of this portfolio.") + + if PortfolioInvitation.objects.filter(email=email_value, portfolio=self.portfolio).exists(): + self.add_error("email", "An invitation already exists for this user.") ########################################## - # TODO: future ticket + # TODO: #3019 # (invite new member) ########################################## # Check for an existing user (if there isn't any, send an invite) diff --git a/src/registrar/templates/portfolio_member_permissions.html b/src/registrar/templates/portfolio_member_permissions.html index 454738460..7e3eb3189 100644 --- a/src/registrar/templates/portfolio_member_permissions.html +++ b/src/registrar/templates/portfolio_member_permissions.html @@ -89,7 +89,7 @@ -
+

Admin access permissions

Member permissions available for admin-level acccess.

@@ -110,7 +110,7 @@
-
+

Basic member permissions

Member permissions available for basic-level acccess.

diff --git a/src/registrar/views/portfolios.py b/src/registrar/views/portfolios.py index 0c4b1ff4a..a03ef2b4a 100644 --- a/src/registrar/views/portfolios.py +++ b/src/registrar/views/portfolios.py @@ -493,10 +493,11 @@ class NewMemberView(PortfolioInvitationCreatePermissionView): """Create portfolio invitation from form data.""" if self.is_ajax(): return JsonResponse({"is_valid": True}) - - requested_email = form.cleaned_data.get("email") - messages.success(self.request, f"{requested_email} has been invited.") - + + # TODO: #3019 + # requested_email = form.cleaned_data.get("email") + # self.send_portfolio_invitation_email(requested_email) + # Create instance using form's mapping method self.object = form.map_cleaned_data_to_instance( form.cleaned_data, @@ -506,10 +507,13 @@ class NewMemberView(PortfolioInvitationCreatePermissionView): ) ) self.object.save() - messages.success(self.request, f"{self.object.email} has been invited.") return redirect(self.get_success_url()) + # TODO: #3019 + # def send_portfolio_invitation_email(self, email): + # pass + def form_invalid(self, form): if self.is_ajax(): return JsonResponse({"is_valid": False})