Merge pull request #2841 from GSA/2795-bug-when-a-new-template-folder-is-added-existing-users-are-automatically-given-permission-to-it

fix and update to template manage
This commit is contained in:
ccostino
2025-08-20 10:42:25 -04:00
committed by GitHub
8 changed files with 64 additions and 12 deletions

View File

@@ -138,6 +138,7 @@
}; };
CollapsibleCheckboxes.prototype.toggleAll = function(e) { CollapsibleCheckboxes.prototype.toggleAll = function(e) {
e.preventDefault(); e.preventDefault();
e.stopPropagation();
const allChecked = this.$checkboxes.filter(':checked').length === this.$checkboxes.length; const allChecked = this.$checkboxes.filter(':checked').length === this.$checkboxes.length;
if (allChecked) { if (allChecked) {

View File

@@ -1726,10 +1726,14 @@ class TemplateFolderForm(StripWhitespaceForm):
def __init__(self, all_service_users=None, *args, **kwargs): def __init__(self, all_service_users=None, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if all_service_users is not None: if all_service_users is not None:
self.users_with_permission.all_service_users = all_service_users regular_users = [user for user in all_service_users if not user.platform_admin]
platform_admins = [user for user in all_service_users if user.platform_admin]
self.users_with_permission.all_service_users = regular_users
self.users_with_permission.choices = [ self.users_with_permission.choices = [
(item.id, item.name) for item in all_service_users (item.id, item.name) for item in regular_users
] ]
self.platform_admins = platform_admins
users_with_permission = USWDSCollapsibleCheckboxesField( users_with_permission = USWDSCollapsibleCheckboxesField(
"Team members who can see this folder", field_label="team member" "Team members who can see this folder", field_label="team member"

View File

@@ -180,7 +180,10 @@ def process_folder_management_form(form, current_folder_id):
if form.is_add_folder_op: if form.is_add_folder_op:
new_folder_id = template_folder_api_client.create_template_folder( new_folder_id = template_folder_api_client.create_template_folder(
current_service.id, name=form.get_folder_name(), parent_id=current_folder_id current_service.id,
name=form.get_folder_name(),
parent_id=current_folder_id,
created_by_id=str(current_user.id)
) )
if form.is_move_op: if form.is_move_op:

View File

@@ -4,8 +4,10 @@ from app.notify_client import NotifyAdminAPIClient, cache
class TemplateFolderAPIClient(NotifyAdminAPIClient): class TemplateFolderAPIClient(NotifyAdminAPIClient):
@cache.delete("service-{service_id}-template-folders") @cache.delete("service-{service_id}-template-folders")
def create_template_folder(self, service_id, name, parent_id=None): def create_template_folder(self, service_id, name, parent_id=None, created_by_id=None):
data = {"name": name, "parent_id": parent_id} data = {"name": name, "parent_id": parent_id}
if created_by_id:
data["created_by_id"] = created_by_id
return self.post("/service/{}/template-folder".format(service_id), data)[ return self.post("/service/{}/template-folder".format(service_id), data)[
"data" "data"
]["id"] ]["id"]

View File

@@ -86,13 +86,17 @@
</ul> </ul>
{% if current_service.all_template_folders %} {% if current_service.all_template_folders %}
<p class="usa-body tick-cross-list-hint"> <p class="usa-body tick-cross-list-hint">
{% set folder_count = user.template_folders_for_service(current_service) | length %} {% if user.platform_admin %}
{% if folder_count == 0 %} Platform admin can see all folders
Cannot see any folders
{% elif folder_count != current_service.all_template_folders | length %}
Can see {{ folder_count }} folder{% if folder_count > 1 %}s{% endif %}
{% else %} {% else %}
Can see all folders {% set folder_count = user.template_folders_for_service(current_service) | length %}
{% if folder_count == 0 %}
Cannot see any folders
{% elif folder_count != current_service.all_template_folders | length %}
Can see {{ folder_count }} folder{% if folder_count > 1 %}s{% endif %}
{% else %}
Can see all folders
{% endif %}
{% endif %} {% endif %}
</p> </p>
{% endif %} {% endif %}

View File

@@ -27,6 +27,14 @@
}) }} }) }}
{% if current_user.has_permissions(ServicePermission.MANAGE_SERVICE) and form.users_with_permission.all_service_users %} {% if current_user.has_permissions(ServicePermission.MANAGE_SERVICE) and form.users_with_permission.all_service_users %}
{{ form.users_with_permission }} {{ form.users_with_permission }}
{% if form.platform_admins is defined and form.platform_admins %}
<p class="usa-hint">Platform admin can see all folders:</p>
<ul class="usa-hint usa-list">
{% for admin in form.platform_admins %}
<li>{{ admin.name }}</li>
{% endfor %}
</ul>
{% endif %}
{% endif %} {% endif %}
{{ page_footer( {{ page_footer(

View File

@@ -1500,7 +1500,7 @@ def test_new_folder_is_created_if_only_new_folder_is_filled_out(
assert mock_move_to_template_folder.called is False assert mock_move_to_template_folder.called is False
mock_create_template_folder.assert_called_once_with( mock_create_template_folder.assert_called_once_with(
SERVICE_ONE_ID, name="new folder", parent_id=None SERVICE_ONE_ID, name="new folder", parent_id=None, created_by_id="6ce466d0-fd6a-11e5-82f5-e0accb9d11a6"
) )
@@ -1538,7 +1538,7 @@ def test_should_be_able_to_move_to_new_folder(
) )
mock_create_template_folder.assert_called_once_with( mock_create_template_folder.assert_called_once_with(
SERVICE_ONE_ID, name="new folder", parent_id=None SERVICE_ONE_ID, name="new folder", parent_id=None, created_by_id="6ce466d0-fd6a-11e5-82f5-e0accb9d11a6"
) )
mock_move_to_template_folder.assert_called_once_with( mock_move_to_template_folder.assert_called_once_with(
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,

View File

@@ -429,6 +429,36 @@ describe('Collapsible fieldset', () => {
expect(toggleButton.parentElement.style.display).toEqual('none'); expect(toggleButton.parentElement.style.display).toEqual('none');
}); });
test("clicking 'Select all' does not collapse the fieldset", () => {
const toggleButton = document.querySelector('.usa-button--small');
const doneButton = formGroup.querySelector('.selection-footer__button');
expect(helpers.element(fieldset).is('hidden')).toBe(false);
expect(doneButton.getAttribute('aria-expanded')).toEqual('true');
helpers.triggerEvent(toggleButton, 'click');
expect(helpers.element(fieldset).is('hidden')).toBe(false);
expect(doneButton.getAttribute('aria-expanded')).toEqual('true');
expect(doneButton.textContent.trim()).toEqual("Done choosing folders");
});
test("clicking 'Deselect all' does not collapse the fieldset", () => {
const toggleButton = document.querySelector('.usa-button--small');
const doneButton = formGroup.querySelector('.selection-footer__button');
helpers.triggerEvent(toggleButton, 'click');
expect(helpers.element(fieldset).is('hidden')).toBe(false);
expect(doneButton.getAttribute('aria-expanded')).toEqual('true');
helpers.triggerEvent(toggleButton, 'click');
expect(helpers.element(fieldset).is('hidden')).toBe(false);
expect(doneButton.getAttribute('aria-expanded')).toEqual('true');
expect(doneButton.textContent.trim()).toEqual("Done choosing folders");
});
}); });
describe("toggle button visibility on re-expansion", () => { describe("toggle button visibility on re-expansion", () => {