diff --git a/Access/group_helper.py b/Access/group_helper.py index 99d9599d..3ea68b25 100644 --- a/Access/group_helper.py +++ b/Access/group_helper.py @@ -447,14 +447,19 @@ def add_user_to_group(request): "msg": NON_OWNER_PERMISSION_DENIED_ERROR["msg"], } return context + selected_users_list = [] + is_select_all = json.loads(data.get("selectAllUsers")) if data.get("selectAllUsers") else False - selected_users_list = json.loads(data.get("selectedUserList")) + if is_select_all: + selected_users_list = list(map(lambda user: user["email"], request.user.user.get_active_users().values('email'))) + if not selected_users_list and data.get("selectedUserList"): + selected_users_list = json.loads(data.get("selectedUserList")) duplicate_request_emails = _check_if_members_in_group( group=group, selected_members=selected_users_list ) - if duplicate_request_emails: + if duplicate_request_emails and not is_select_all: context = {} msg = DUPLICATE_GROUP_MEMBER_ADD_REQUEST.format( user_emails=duplicate_request_emails diff --git a/Access/models.py b/Access/models.py index 335f0309..b646c671 100644 --- a/Access/models.py +++ b/Access/models.py @@ -391,6 +391,10 @@ def get_system_user(): email="system_user@root.root") return django_user.user + def get_active_users(self): + """ method to get active users """ + return User.objects.filter(state='1').exclude(user=self.user) + def __str__(self): return f"{self.user}" diff --git a/static/js/addUserToGroup.js b/static/js/addUserToGroup.js index 86f37b8e..30908846 100644 --- a/static/js/addUserToGroup.js +++ b/static/js/addUserToGroup.js @@ -1,4 +1,6 @@ -const userSelectedList = {}; +var userSelectedList = {}; +var disabled = false; +const USER_SELECTION_LIMIT = 20; const handleUserSelectionCheckbox = (elem) => { $(elem).prop('checked', !$(elem).prop('checked')); @@ -7,6 +9,9 @@ const handleUserSelectionCheckbox = (elem) => { const handleSelectionView = () => { let finalCount = $('#user-selection-table').children('tr').length + if(disabled) { + finalCount = "All"; + } if(finalCount < 1) { $('#user-selection-list').children('nav').hide(); @@ -62,18 +67,32 @@ const removeUserSelection = (elem) => { const removeUserSelectionUI = (elem) => { rightElem = elem.parentElement.parentElement; - $("#selectAllUsers").prop("checked", false); - removeSelectionSpanElem(rightElem, $("#user-table").find(`tr[email="${$(rightElem).attr('email')}"]`)); - updateSelectedUser(); + if($(rightElem).attr("selectAll")) { + $("#selectAllUsers").prop("checked", false); + disabled = false; + handleDisableMode(); + $(rightElem).remove(); + handleSelectionView(); + } else { + removeSelectionSpanElem(rightElem, $("#user-table").find(`tr[email="${$(rightElem).attr('email')}"]`)); + } + $('#max-member-selected-warning').hide(); }; -const removeAllUsers = () => { +const removeAllUsers = (disabledState) => { + disabled = disabledState; const users = $('#user-selection-table').children('tr'); - $("#selectAllUsers").prop("checked", false); for(iter = 0; iter < users.length; iter++) { - removeSelectionSpanElem(users[iter], $("#user-table").find(`tr[email="${$(users[iter]).attr('email')}"]`)); + if ($(users[iter]).attr('selectAll')) { + $("#selectAllUsers").prop("checked", false); + $(users[iter]).remove(); + } else { + removeSelectionSpanElem(users[iter], $("#user-table").find(`tr[email="${$(users[iter]).attr('email')}"]`)); + } } - updateSelectedUser(); + handleDisableMode(); + handleSelectionView(); + $('#max-member-selected-warning').hide(); }; function updateSelectedUser() { @@ -87,40 +106,82 @@ function updateSelectedUser() { } const selectAllUsers = () => { - const users = $('#user-table').children('tr'); - for(iter = 0; iter < users.length; iter++) { - if(!userSelectedList[$(users[iter]).attr('email')]) { - addUserSelection(users[iter]); - } - } - updateSelectedUser(); + removeAllUsers(true); + const selectionList = $('#user-selection-table'); + const newSpan = $("#user-selection-row-template").clone(true, true); + newSpan.appendTo(selectionList); + newSpan.show(); + const tableData = newSpan.children('td'); + tableData[0].textContent = "All User Selected"; + newSpan.attr("selectAll", true); + handleSelectionView(); } const selectAllUserToggle = (elem) => { if(elem.checked) { selectAllUsers(); } else { - removeAllUsers(); + removeAllUsers(false); } } +const findUserSelectedListLength = () => { + let count = 0; + Object.values(userSelectedList).forEach(val => { + if(val) count++; + }) + return count; +} + const handleUserSelection = (elem) => { + if(disabled) return; if(!$(elem).find('input').prop('checked')) { + if(findUserSelectedListLength() === USER_SELECTION_LIMIT) { + $('#max-member-selected-warning').show(); + return; + } addUserSelection(elem); } else { removeUserSelection(elem); } updateSelectedUser(); + if(findUserSelectedListLength() === USER_SELECTION_LIMIT) { + $('#max-member-selected-warning').show(); + } else { + $('#max-member-selected-warning').hide(); + } }; +const handleDisableMode = () => { + selectedList = {}; + const users = $('#user-table').children('tr'); + for (iter = 0; iter < users.length; iter++) { + if (disabled) { + $(users[iter]).find('input').prop('checked', true); + $(users[iter]).removeAttr("onclick"); + $(users[iter]).find('input').attr("disabled", true); + $(users[iter]).removeClass('hover:bg-blue-50 hover:text-blue-700').addClass('bg-gray-50'); + $(users[iter]).children('td#description-td').removeClass('text-gray-900').addClass('text-blue-600'); + } else { + $(users[iter]).attr("onclick", "handleUserSelection(this)"); + $(users[iter]).find('input').attr("disabled", false); + $(users[iter]).find('input').prop('checked', false); + $(users[iter]).children('td#description-td').addClass('text-gray-900').removeClass('text-blue-600'); + $(users[iter]).addClass('hover:bg-blue-50 hover:text-blue-700').removeClass('bg-gray-50'); + } + } +} + function submitRequest(event, elem) { event.preventDefault(); form = $(elem); let actionUrl = form.attr('action'); + const selectAllUsers = $("#selectAllUsers").prop("checked"); + requestData = form.serialize() + "&selectAllUsers=" + selectAllUsers; $.ajax({ type: "POST", url: actionUrl, - data: form.serialize(), + data: requestData, error: (xhr, statusText, data) => { if(xhr.responseJSON) { showNotification("failed", xhr.responseJSON["error"]["msg"], xhr.responseJSON["error"]["error_msg"]); @@ -161,12 +222,12 @@ function update_users(search, page, groupName) { $("#user-table tr").remove(); const rows = users.map((user) => { - return ` + return ` + class="absolute left-4 top-1/2 -mt-2 h-4 w-4 rounded border-gray-300 focus:ring-blue-500 sm:left-6" ${ (userSelectedList[user["email"]] || disabled)? "checked": "" } onclick="handleUserSelectionCheckbox(this)" ${(disabled) ? "disabled" : ""}> - + ${user["first_name"]} ${user["last_name"]} ${user["email"]} `; }) diff --git a/templates/EnigmaOps/addUserToGroupForm.html b/templates/EnigmaOps/addUserToGroupForm.html index 1725e6dd..1334f165 100644 --- a/templates/EnigmaOps/addUserToGroupForm.html +++ b/templates/EnigmaOps/addUserToGroupForm.html @@ -1,5 +1,6 @@ {% extends 'global_layout.html' %} {% load static %} +{% load reusable_components %} {% block head_body %} @@ -75,6 +76,10 @@

+ {% get_error_panel_with_message "Max number of members selected" "Deselect some selections or Submit request to select more members." %} + +

Add members

@@ -90,8 +95,8 @@

Add members

- - + +
@@ -143,7 +148,7 @@

All group members