From 13f376ca14c97d520f3145fb000b092836d10a97 Mon Sep 17 00:00:00 2001 From: "Aditya @ArchLinux" <132184385+adityadeshlahre@users.noreply.github.com> Date: Mon, 27 May 2024 02:35:45 +0530 Subject: [PATCH 01/16] added RestController + react UI --- .../admin/userManagement/UserAddEdit.js | 419 +++++++++ .../admin/userManagement/UserManagement.js | 873 ++++++++++++++++++ frontend/src/languages/en.json | 47 +- frontend/src/languages/fr.json | 46 +- .../UnifiedSystemUserMenuRestController.java | 349 +++++++ .../rest/UnifiedSystemUserRestController.java | 772 ++++++++++++++++ 6 files changed, 2504 insertions(+), 2 deletions(-) create mode 100644 frontend/src/components/admin/userManagement/UserAddEdit.js create mode 100644 frontend/src/components/admin/userManagement/UserManagement.js create mode 100644 src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java create mode 100644 src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java diff --git a/frontend/src/components/admin/userManagement/UserAddEdit.js b/frontend/src/components/admin/userManagement/UserAddEdit.js new file mode 100644 index 0000000000..4d7ae904c3 --- /dev/null +++ b/frontend/src/components/admin/userManagement/UserAddEdit.js @@ -0,0 +1,419 @@ +import React from "react"; +import { + Grid, + Column, + Section, + Heading, + Form, + TextInput, + UnorderedList, + ListItem, + RadioButton, + RadioButtonGroup, + Button, + Select, + SelectItem, +} from "@carbon/react"; +import { FormattedMessage, injectIntl, useIntl } from "react-intl"; +import PageBreadCrumb from "../../common/PageBreadCrumb"; +import CustomCheckBox from "../../common/CustomCheckBox"; + +const breadcrumbs = [ + { label: "home.label", link: "/" }, + // { label: "breadcrums.admin.managment", link: "/MasterListsPage" }, +]; + +function UserAddEdit() { + const intl = useIntl(); + + return ( + <> +
+ + + +
+
+ + + +
+
+
+
+
+ + +
+ + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + +
+ + +
+ +
+
+ +
+ + + + + + + + + + + + + + +
+
+
+
+ + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + + + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + +
+
+ + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + + + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + + + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + + + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + + +
+ + + <> + + * : + + + + + + + + + + + + <> + + * : + + + + + + + + + + + + <> + + * : + + + + + + + + + +
+
+
+
+ + +
+
+ + + +
+
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ + + <> + + * : + + + + {/* {orgInfo && ( */} + handleOrgNameChange(e)} + /> + {/* )} */} + +
+ +
+
+
+ + + +
+ +
+
+ + + + {/* selectables */} + +
+ + + {" "} + + + +
+
+
+
+ + ); +} + +export default injectIntl(UserAddEdit); + +// name as props [ add / edit user ] +// conditonal rendering diff --git a/frontend/src/components/admin/userManagement/UserManagement.js b/frontend/src/components/admin/userManagement/UserManagement.js new file mode 100644 index 0000000000..1be3db96ec --- /dev/null +++ b/frontend/src/components/admin/userManagement/UserManagement.js @@ -0,0 +1,873 @@ +import React, { useContext, useState, useEffect, useRef } from "react"; +import { + Form, + Heading, + Button, + Loading, + Grid, + Column, + Section, + DataTable, + Table, + TableHead, + TableRow, + TableBody, + TableHeader, + TableCell, + TableSelectRow, + TableSelectAll, + TableContainer, + Pagination, + Search, + Select, + SelectItem, + Stack, +} from "@carbon/react"; +import { + getFromOpenElisServer, + postToOpenElisServer, + postToOpenElisServerFormData, + postToOpenElisServerFullResponse, + postToOpenElisServerJsonResponse, +} from "../../utils/Utils.js"; +import { NotificationContext } from "../../layout/Layout.js"; +import { + AlertDialog, + NotificationKinds, +} from "../../common/CustomNotification.js"; +import { FormattedMessage, injectIntl, useIntl } from "react-intl"; +import PageBreadCrumb from "../../common/PageBreadCrumb.js"; +import CustomCheckBox from "../../common/CustomCheckBox.js"; + +let breadcrumbs = [ + { label: "home.label", link: "/" }, + // { label: "breadcrums.admin.managment", link: "/MasterListsPage" }, +]; + +function UserManagement() { + const { notificationVisible, setNotificationVisible, addNotification } = + useContext(NotificationContext); + + const intl = useIntl(); + + const componentMounted = useRef(false); + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(5); + const [deactivateButton, setDeactivateButton] = useState(true); + const [modifyButton, setModifyButton] = useState(true); + const [selectedRowIds, setSelectedRowIds] = useState([]); + const [selectedRowIdsPost, setSelectedRowIdsPost] = useState(); + const [isEveryRowIsChecked, setIsEveryRowIsChecked] = useState(false); + const [rowsIsPartiallyChecked, setRowsIsPartiallyChecked] = useState(false); + const [loading, setLoading] = useState(true); + const [isSearching, setIsSearching] = useState(false); + const [panelSearchTerm, setPanelSearchTerm] = useState(""); + const [roleFilter, setRoleFilter] = useState(null); + const [filter, setFilter] = useState([]); + const [startingRecNo, setStartingRecNo] = useState(21); + const [paging, setPaging] = useState(1); + const [searchedUserManagementList, setSearchedUserManagementList] = + useState(); + const [searchedUserManagementListShow, setSearchedUserManagementListShow] = + useState([]); + const [userManagementList, setUserManagementList] = useState(); + const [userManagementListShow, setUserManagementListShow] = useState([]); + + function deleteDeactivateUserManagement(event) { + event.preventDefault(); + setLoading(true); + postToOpenElisServerJsonResponse( + `/rest/DeleteOrganization?ID=${selectedRowIds.join(",")}&startingRecNo=1`, + JSON.stringify(selectedRowIdsPost), + deleteDeactivateUserManagementCallback(), + ); + } + + useEffect(() => { + const selectedIDsObject = { + selectedIDs: selectedRowIds, + }; + + setSelectedRowIdsPost(selectedIDsObject); + }, [selectedRowIds, userManagementListShow]); + + function deleteDeactivateUserManagementCallback() { + setLoading(false); + setNotificationVisible(true); + addNotification({ + title: intl.formatMessage({ + id: "notification.title", + }), + message: intl.formatMessage({ + id: "notification.organization.post.delete.success", + }), + kind: NotificationKinds.success, + }); + // setTimeout(() => { + // window.location.reload(); + // }, 2000); + } + + const handlePageChange = ({ page, pageSize }) => { + setPage(page); + setPageSize(pageSize); + setSelectedRowIds([]); + }; + + const handleMenuItems = (res) => { + if (!res) { + setLoading(true); + } else { + setUserManagementList(res); + } + }; + + useEffect(() => { + componentMounted.current = true; + setLoading(true); + getFromOpenElisServer(`/rest/UnifiedSystemUserMenu`, handleMenuItems); + return () => { + componentMounted.current = false; + setLoading(false); + }; + }, []); + + const handleSearchedProviderMenuList = (res) => { + if (!res) { + setLoading(true); + } else { + setSearchedUserManagementList(res); + } + }; + + useEffect(() => { + getFromOpenElisServer( + `/rest/SearchUnifiedSystemUserMenu?search=Y&startingRecNo=1&searchString=${panelSearchTerm}&filter=${filter}&roleFilter=${roleFilter}`, + handleSearchedProviderMenuList, + ); + }, [panelSearchTerm]); + + useEffect(() => { + if (userManagementList) { + const newUserManagementList = userManagementList.menuList.map((item) => { + return { + id: item.systemUserId, + firstName: item.firstName || "", + lastName: item.lastName || "", + loginName: item.loginName || "", + expDate: item.expDate || "", + locked: item.locked || "", + disabled: item.disabled || "", + active: item.active || "", + timeout: item.timeout || "", + }; + }); + const newUserManagementListArray = Object.values(newUserManagementList); + setUserManagementListShow(newUserManagementListArray); + } + }, [userManagementList]); + + useEffect(() => { + if (searchedUserManagementList) { + const newUserManagementList = searchedUserManagementList.menuList.map( + (item) => { + return { + id: item.systemUserId, + firstName: item.firstName || "", + lastName: item.lastName || "", + loginName: item.loginName || "", + expDate: item.expDate || "", + locked: item.locked || "", + disabled: item.disabled || "", + active: item.active || "", + timeout: item.timeout || "", + }; + }, + ); + const newUserManagementListArray = Object.values(newUserManagementList); + setSearchedUserManagementListShow(newUserManagementListArray); + } + }, [searchedUserManagementList]); + + useEffect(() => { + if (selectedRowIds.length === 1) { + setModifyButton(false); + } else { + setModifyButton(true); + } + }, [selectedRowIds]); + + // useEffect(() => { + // let currentPageIds; + // if ( + // searchedUserManagementListShow && + // userManagementListShow + // ) { + // currentPageIds = searchedUserManagementListShow + // .slice((page - 1) * pageSize, page * pageSize) + // .filter((row) => !row.disabled) + // .map((row) => row.id); + // } else { + // currentPageIds = userManagementListShow + // .slice((page - 1) * pageSize, page * pageSize) + // .filter((row) => !row.disabled) + // .map((row) => row.id); + // } + + // const currentPageSelectedIds = selectedRowIds.filter((id) => + // currentPageIds.includes(id), + // ); + + // setIsEveryRowIsChecked( + // currentPageSelectedIds.length === currentPageIds.length, + // ); + + // setRowsIsPartiallyChecked( + // currentPageSelectedIds.length > 0 && + // currentPageSelectedIds.length < currentPageIds.length, + // ); + // }, [ + // selectedRowIds, + // page, + // pageSize, + // userManagementListShow, + // searchedUserManagementListShow, + // ]); + + const renderCell = (cell, row) => { + if (cell.info.header === "select") { + return ( + { + setDeactivateButton(false); + if (selectedRowIds.includes(row.id)) { + setSelectedRowIds(selectedRowIds.filter((id) => id !== row.id)); + } else { + setSelectedRowIds([...selectedRowIds, row.id]); + } + }} + /> + ); + } else { + return {cell.value}; + } + }; + + const handlePanelSearchChange = (event) => { + setIsSearching(true); + const query = event.target.value.toLowerCase(); + setPanelSearchTerm(query); + setSelectedRowIds([]); + }; + + if (!loading) { + return ( + <> + + + ); + } + + return ( + <> + {notificationVisible === true ? : ""} +
+ + + +
+ + + +
+
+
+
+
+
+ + + +
+
+
+
+
+
+ + {" "} + {" "} + + +
+
+
+
+ + +
+ + } + placeholder={intl.formatMessage({ + id: "unifiedSystemUser.browser.search.placeholder", + })} + onChange={handlePanelSearchChange} + value={(() => { + if (panelSearchTerm) { + return panelSearchTerm; + } + return ""; + })()} + > +
+
+
+
+ + + + + + + + + + } + onChange={(data) => { + setFilter(...data, "isActive"); + }} + /> +
+ } + onChange={(data) => { + setFilter(...data, "isAdmin"); + }} + /> +
+
+
+ {isSearching ? ( + <> + + +
+ + {({ + rows, + headers, + getHeaderProps, + getTableProps, + getSelectionProps, + }) => ( + + + + + + !row.disabled && + selectedRowIds.includes(row.id), + ).length === pageSize + } + // checked={isEveryRowIsChecked} + indeterminate={ + selectedRowIds.length > 0 && + selectedRowIds.length < + searchedUserManagementListShow + .slice( + (page - 1) * pageSize, + page * pageSize, + ) + .filter((row) => !row.disabled).length + } + // indeterminate={rowsIsPartiallyChecked} + onSelect={() => { + setDeactivateButton(false); + const currentPageIds = + searchedUserManagementListShow + .slice( + (page - 1) * pageSize, + page * pageSize, + ) + .filter((row) => !row.disabled) + .map((row) => row.id); + if ( + selectedRowIds.length === pageSize && + currentPageIds.every((id) => + selectedRowIds.includes(id), + ) + ) { + setSelectedRowIds([]); + } else { + setSelectedRowIds( + currentPageIds.filter( + (id) => !selectedRowIds.includes(id), + ), + ); + } + }} + /> + {headers.map( + (header) => + header.key !== "select" && ( + + {header.header} + + ), + )} + + + + <> + {rows.map((row) => ( + { + const id = row.id; + const isSelected = + selectedRowIds.includes(id); + if (isSelected) { + setSelectedRowIds( + selectedRowIds.filter( + (selectedId) => selectedId !== id, + ), + ); + } else { + setSelectedRowIds([ + ...selectedRowIds, + id, + ]); + } + }} + > + {row.cells.map((cell) => + renderCell(cell, row), + )} + + ))} + + +
+
+ )} +
+ + intl.formatMessage( + { id: "pagination.item-range" }, + { min: min, max: max, total: total }, + ) + } + itemsPerPageText={intl.formatMessage({ + id: "pagination.items-per-page", + })} + itemText={(min, max) => + intl.formatMessage( + { id: "pagination.item" }, + { min: min, max: max }, + ) + } + pageNumberText={intl.formatMessage({ + id: "pagination.page-number", + })} + pageRangeText={(_current, total) => + intl.formatMessage( + { id: "pagination.page-range" }, + { total: total }, + ) + } + pageText={(page, pagesUnknown) => + intl.formatMessage( + { id: "pagination.page" }, + { page: pagesUnknown ? "" : page }, + ) + } + /> +
+
+
+ + ) : ( + <> + + + + {({ + rows, + headers, + getHeaderProps, + getTableProps, + getSelectionProps, + }) => ( + + + + + + !row.disabled && + selectedRowIds.includes(row.id), + ).length === pageSize + } + // checked={isEveryRowIsChecked} + indeterminate={ + selectedRowIds.length > 0 && + selectedRowIds.length < + userManagementListShow + .slice( + (page - 1) * pageSize, + page * pageSize, + ) + .filter((row) => !row.disabled).length + } + // indeterminate={rowsIsPartiallyChecked} + onSelect={() => { + setDeactivateButton(false); + const currentPageIds = userManagementListShow + .slice( + (page - 1) * pageSize, + page * pageSize, + ) + .filter((row) => !row.disabled) + .map((row) => row.id); + if ( + selectedRowIds.length === pageSize && + currentPageIds.every((id) => + selectedRowIds.includes(id), + ) + ) { + setSelectedRowIds([]); + } else { + setSelectedRowIds( + currentPageIds.filter( + (id) => !selectedRowIds.includes(id), + ), + ); + } + }} + /> + {headers.map( + (header) => + header.key !== "select" && ( + + {header.header} + + ), + )} + + + + <> + {rows.map((row) => ( + { + const id = row.id; + const isSelected = + selectedRowIds.includes(id); + if (isSelected) { + setSelectedRowIds( + selectedRowIds.filter( + (selectedId) => selectedId !== id, + ), + ); + } else { + setSelectedRowIds([ + ...selectedRowIds, + id, + ]); + } + }} + > + {row.cells.map((cell) => + renderCell(cell, row), + )} + + ))} + + +
+
+ )} +
+ + intl.formatMessage( + { id: "pagination.item-range" }, + { min: min, max: max, total: total }, + ) + } + itemsPerPageText={intl.formatMessage({ + id: "pagination.items-per-page", + })} + itemText={(min, max) => + intl.formatMessage( + { id: "pagination.item" }, + { min: min, max: max }, + ) + } + pageNumberText={intl.formatMessage({ + id: "pagination.page-number", + })} + pageRangeText={(_current, total) => + intl.formatMessage( + { id: "pagination.page-range" }, + { total: total }, + ) + } + pageText={(page, pagesUnknown) => + intl.formatMessage( + { id: "pagination.page" }, + { page: pagesUnknown ? "" : page }, + ) + } + /> +
+
+ + )} +
+
+
+ + + +
+ + ); +} + +export default injectIntl(UserManagement); + +// combinedUserID need to handle at modify [ new array on select and give him ] +// addUser and Modify page diff --git a/frontend/src/languages/en.json b/frontend/src/languages/en.json index de6b16d823..263095f674 100644 --- a/frontend/src/languages/en.json +++ b/frontend/src/languages/en.json @@ -4,6 +4,7 @@ "label.button.finish": "Finish", "label.button.changepassword": "Change Password", "label.button.save": "Save", + "label.button.exit": "Exit", "label.button.search": "Search", "label.button.range": "Range", "label.button.clear": "Clear", @@ -1104,5 +1105,49 @@ "notification.slideover.button.markallasread": "Mark all as Read", "notification.slideover.button.hideread": "Hide read", "notification.slideover.button.showread": "Show read", - "notification.slideover.button.markasread": "Mark as Read" + "notification.slideover.button.markasread": "Mark as Read", + "unifiedSystemUser.browser.title": "User Management", + "unifiedSystemUser.browser.search.placeholder": "Search By User Names...", + "unifiedSystemUser.browser.search": "Search By User Names", + "menu.label.filter": "Filters : ", + "menu.label.filter.role": "By Lab Unit Roles", + "menu.label.filter.active": "Only Active", + "menu.label.filter.admin": "Only Administrator", + "user.select.instruction": "Select a User to Modify or to Deactivate . You can set a Filter ,Search for users, or Add a User along with the controls at the top.", + "unifiedSystemUser.select": "Select", + "unifiedSystemUser.edit.user": "Modify User", + "unifiedSystemUser.add.user": "Add User", + "unifiedSystemUser.browser.button.add": "Add New user", + "systemuser.firstName": "System User First Name", + "systemuser.lastName": "System User Last Name", + "systemuser.loginName": "System User Login Name", + "systemuser.role": "Roles", + "login.password.expired.date": "Password Expiration Date", + "login.password.expired.date.placeholder": "(dd/mm/yyyy)", + "login.account.disabled": "Account Disabled", + "login.account.locked": "Account Locked", + "systemuser.isActive": "Is Active", + "login.timeout": "User Time Out (minutes)", + "login.timeout.placeholder": "Enter in ms", + "login.complexity.message": "Password must : ", + "login.complexity.message.1": "Must Be at least 7 characters", + "login.complexity.message.2": "May contain upper and lower case letters or numbers", + "login.complexity.message.3": "Must contain at least one of the following characters: *, $, #, !", + "login.complexity.message.4": "Must not contain any other characters", + "login.login.name": "Login Name", + "login.login.password": "Password", + "login.login.repeat.password": "Repeat Password", + "login.login.first": "First Name", + "login.login.last": "Last Name", + "login.login.": "Repeat Password", + "systemuserrole.instruction.1": "There are two types of Roles. Global Roles which are set for the entire application and Lab Unit Roles which can be set for all Lab Units or specific Lab Units.", + "systemuserrole.instruction.2": "The available Global Roles are: GLobal Administrator (Acces to all Admin Functions) ,Audit Trail (Access to all Audit Trail), User Account Administrator (has acces to all the user account administration features ,but not any other admin functions).", + "systemuserrole.instruction.3": "The Lab Unit Roles are: Reception (Access to the Order, Patient, and Non-Conformity Tabs) ,Results (Access to the Work Plan, Non-Conformity, and Results Tabs) ,Validation (Access to the Validation and Non-Conformity Tabs), Reports (Acces to Reports Tab except CSV export only Availbale for Global Administrators).", + "systemuserrole.instruction.4": "To assign Lab Unit Roles ,select all lab units or the specific lab unit from the drop down and select any roles you would like to set.", + "systemuserrole.instruction.5": "You can also use the Copy Permisions Feature to copy the permisions of an existing user.Ensure that you have filled all the information above and enter the user name whose permissions you want to copy into the box and click apply.", + "systemuserrole.copypermisions": "Copy Permisions From User", + "systemuserrole.copypermisions.placeholder": "Copy Users Permisions", + "systemuserrole.apply": "Apply", + "systemuserrole.roles.global": "Global Roles", + "systemuserrole.roles.labunit": "Lab Unit Roles" } diff --git a/frontend/src/languages/fr.json b/frontend/src/languages/fr.json index 10058d8986..776f098202 100644 --- a/frontend/src/languages/fr.json +++ b/frontend/src/languages/fr.json @@ -1011,5 +1011,49 @@ "notification.slideover.button.markallasread": "Marquer tout comme lu", "notification.slideover.button.hideread": "Masquer les lus", "notification.slideover.button.showread": "Afficher les lus", - "notification.slideover.button.markasread": "Marquer comme lu" + "notification.slideover.button.markasread": "Marquer comme lu", + "unifiedSystemUser.browser.title": "Gestion des utilisateurs", + "unifiedSystemUser.browser.search.placeholder": "Recherche par noms d'utilisateurs...", + "unifiedSystemUser.browser.search": "Recherche par noms d'utilisateurs", + "menu.label.filter": "Filtres : ", + "menu.label.filter.role": "Par rôles des unités de laboratoire", + "menu.label.filter.active": "Uniquement actifs", + "menu.label.filter.admin": "Uniquement administrateurs", + "user.select.instruction": "Sélectionnez un utilisateur à modifier ou à désactiver. Vous pouvez définir un filtre, rechercher des utilisateurs ou ajouter un utilisateur à l'aide des contrôles en haut.", + "unifiedSystemUser.select": "Sélectionner", + "unifiedSystemUser.edit.user": "Modifier l'utilisateur", + "unifiedSystemUser.add.user": "Ajouter un utilisateur", + "unifiedSystemUser.browser.button.add": "Ajouter un nouvel utilisateur", + "systemuser.firstName": "Prénom de l'utilisateur", + "systemuser.lastName": "Nom de l'utilisateur", + "systemuser.loginName": "Nom d'utilisateur", + "systemuser.role": "Rôles", + "login.password.expired.date": "Date d'expiration du mot de passe", + "login.password.expired.date.placeholder": "(jj/mm/aaaa)", + "login.account.disabled": "Compte désactivé", + "login.account.locked": "Compte verrouillé", + "systemuser.isActive": "Est actif", + "login.timeout": "Délai d'inactivité de l'utilisateur (minutes)", + "login.timeout.placeholder": "Entrer en ms", + "login.complexity.message": "Le mot de passe doit : ", + "login.complexity.message.1": "Être d'au moins 7 caractères", + "login.complexity.message.2": "Peut contenir des lettres majuscules et minuscules ou des chiffres", + "login.complexity.message.3": "Doit contenir au moins un des caractères suivants : *, $, #, !", + "login.complexity.message.4": "Ne doit contenir aucun autre caractère", + "login.login.name": "Nom d'utilisateur", + "login.login.password": "Mot de passe", + "login.login.repeat.password": "Répéter le mot de passe", + "login.login.first": "Prénom", + "login.login.last": "Nom", + "login.login.": "Répéter le mot de passe", + "systemuserrole.instruction.1": "Il existe deux types de rôles. Les rôles globaux qui sont définis pour l'ensemble de l'application et les rôles des unités de laboratoire qui peuvent être définis pour toutes les unités de laboratoire ou des unités spécifiques.", + "systemuserrole.instruction.2": "Les rôles globaux disponibles sont : Administrateur global (accès à toutes les fonctions d'administration), Audit Trail (accès à tous les audits), Administrateur de comptes utilisateur (accès à toutes les fonctionnalités d'administration des comptes utilisateur, mais pas à d'autres fonctions d'administration).", + "systemuserrole.instruction.3": "Les rôles des unités de laboratoire sont : Réception (accès aux onglets Commande, Patient et Non-conformité), Résultats (accès aux onglets Plan de travail, Non-conformité et Résultats), Validation (accès aux onglets Validation et Non-conformité), Rapports (accès à l'onglet Rapports sauf export CSV uniquement disponible pour les administrateurs globaux).", + "systemuserrole.instruction.4": "Pour attribuer des rôles d'unités de laboratoire, sélectionnez toutes les unités de laboratoire ou l'unité spécifique dans le menu déroulant et sélectionnez les rôles que vous souhaitez définir.", + "systemuserrole.instruction.5": "Vous pouvez également utiliser la fonctionnalité de copie des autorisations pour copier les autorisations d'un utilisateur existant. Assurez-vous d'avoir rempli toutes les informations ci-dessus et entrez le nom d'utilisateur dont vous souhaitez copier les autorisations dans la case et cliquez sur appliquer.", + "systemuserrole.copypermisions": "Copier les autorisations de l'utilisateur", + "systemuserrole.copypermisions.placeholder": "Copier les autorisations des utilisateurs", + "systemuserrole.apply": "Appliquer", + "systemuserrole.roles.global": "Rôles globaux", + "systemuserrole.roles.labunit": "Rôles des unités de laboratoire" } diff --git a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java new file mode 100644 index 0000000000..294798b7fd --- /dev/null +++ b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java @@ -0,0 +1,349 @@ +package org.openelisglobal.systemuser.controller; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.GenericValidator; +import org.openelisglobal.common.action.IActionConstants; +import org.openelisglobal.common.constants.Constants; +import org.openelisglobal.common.controller.BaseMenuController; +import org.openelisglobal.common.exception.LIMSRuntimeException; +import org.openelisglobal.common.form.AdminOptionMenuForm; +import org.openelisglobal.common.services.DisplayListService; +import org.openelisglobal.common.services.DisplayListService.ListType; +import org.openelisglobal.common.util.DateUtil; +import org.openelisglobal.common.util.IdValuePair; +import org.openelisglobal.common.util.SystemConfiguration; +import org.openelisglobal.common.validator.BaseErrors; +import org.openelisglobal.login.service.LoginUserService; +import org.openelisglobal.login.valueholder.LoginUser; +import org.openelisglobal.systemuser.form.UnifiedSystemUserMenuForm; +import org.openelisglobal.systemuser.service.SystemUserService; +import org.openelisglobal.systemuser.service.UnifiedSystemUserService; +import org.openelisglobal.systemuser.service.UserService; +import org.openelisglobal.systemuser.valueholder.SystemUser; +import org.openelisglobal.systemuser.valueholder.UnifiedSystemUser; +import org.openelisglobal.userrole.service.UserRoleService; +import org.openelisglobal.userrole.valueholder.LabUnitRoleMap; +import org.openelisglobal.userrole.valueholder.UserLabUnitRoles; +import org.openelisglobal.userrole.valueholder.UserRole; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.Errors; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +// import org.springframework.web.servlet.ModelAndView; +// import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@RestController +@RequestMapping("/rest") +public class UnifiedSystemUserMenuRestController extends BaseMenuController { + + // private static final String FWD_SUCCESS = "success"; + private static final String FWD_FAIL = "fail"; + private static final String FWD_SUCCESS_DELETE = "User Delete Success"; + private static final String FWD_FAIL_DELETE = "User Delete Fail"; + + private static final String[] ALLOWED_FIELDS = new String[] { "selectedIDs*" }; + + @Autowired + SystemUserService systemUserService; + @Autowired + LoginUserService loginService; + @Autowired + UserRoleService userRoleService; + @Autowired + UnifiedSystemUserService unifiedSystemUserService; + @Autowired + private UserService userService; + + @InitBinder + public void initBinder(WebDataBinder binder) { + binder.setAllowedFields(ALLOWED_FIELDS); + } + + @GetMapping(value = { "/UnifiedSystemUserMenu", "/SearchUnifiedSystemUserMenu" }) + public UnifiedSystemUserMenuForm showUnifiedSystemUserMenu(HttpServletRequest request) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + UnifiedSystemUserMenuForm form = new UnifiedSystemUserMenuForm(); + + form.setFormAction("UnifiedSystemUserMenu"); + List testSections = DisplayListService.getInstance().getList(ListType.TEST_SECTION_ACTIVE); + form.setTestSections(testSections); + String forward = performMenuAction(form, request); + // request.setAttribute(IActionConstants.FORM_NAME, "unifiedSystemUserMenu"); + // request.setAttribute(IActionConstants.MENU_PAGE_INSTRUCTION, "user.select.instruction"); + // request.setAttribute(IActionConstants.MENU_OBJECT_TO_ADD, "label.button.new.user"); + // request.setAttribute(IActionConstants.APPLY_FILTER, "true"); + if (FWD_FAIL.equals(forward)) { + Errors errors = new BaseErrors(); + errors.reject("error.generic"); + // redirectAttributes.addFlashAttribute(Constants.REQUEST_ERRORS, errors); + // return findForward(FWD_FAIL, form); + // result.addError(errors); + return form; + } + // else { + // return findForward(forward, form); + // } + + return form; + } + + @Override + protected List createMenuList(AdminOptionMenuForm form, + HttpServletRequest request) { + List systemUsers = new ArrayList<>(); + + int startingRecNo = this.getCurrentStartingRecNo(request); + + systemUsers = systemUserService.getPage(startingRecNo); + + if (YES.equals(request.getParameter("search"))) { + systemUsers = systemUserService.getPagesOfSearchedUsers(startingRecNo, + request.getParameter("searchString")); + request.setAttribute(MENU_TOTAL_RECORDS, + String.valueOf(systemUserService.getTotalSearchedUserCount(request.getParameter("searchString")))); + request.setAttribute(SEARCHED_STRING, request.getParameter("searchString")); + } else { + systemUsers = systemUserService.getOrderedPage("loginName", false, startingRecNo); + request.setAttribute(MENU_TOTAL_RECORDS, String.valueOf(systemUserService.getCount())); + } + List unifiedUsers = getUnifiedUsers(systemUsers); + + if (request.getParameter("filter") != null) { + request.setAttribute(PAGE_SIZE, getPageSize()); + if (request.getParameter("filter").contains("isActive")) { + request.setAttribute(IActionConstants.FILTER_CHECK_ACTIVE, "true"); + unifiedUsers = unifiedUsers.stream().filter(user -> user.getActive().equals("Y")) + .collect(Collectors.toList()); + } + if (request.getParameter("filter").contains("isAdmin")) { + request.setAttribute(IActionConstants.FILTER_CHECK_ADMIN, "true"); + unifiedUsers = filterUnifiedUsersByAdmin(unifiedUsers); + } + } + if (StringUtils.isNotEmpty(request.getParameter("roleFilter"))) { + request.setAttribute(IActionConstants.FILTER_ROLE, request.getParameter("roleFilter").toString()); + unifiedUsers = filterUnifiedUsersByLabUnitRole(unifiedUsers, request.getParameter("roleFilter")); + } + + request.setAttribute("menuDefinition", "UnifiedSystemUserMenuDefinition"); + + request.setAttribute(MENU_FROM_RECORD, String.valueOf(startingRecNo)); + + int numOfRecs = 0; + if (unifiedUsers != null) { + numOfRecs = Math.min(unifiedUsers.size(), getPageSize()); + numOfRecs--; + } + int endingRecNo = startingRecNo + numOfRecs; + request.setAttribute(MENU_TO_RECORD, String.valueOf(endingRecNo)); + + request.setAttribute(MENU_SEARCH_BY_TABLE_COLUMN, "user.userSearch"); + + if (YES.equals(request.getParameter("search"))) { + request.setAttribute(IN_MENU_SELECT_LIST_HEADER_SEARCH, "true"); + } + + return unifiedUsers; + } + + private List filterUnifiedUsersByAdmin(List users) { + List unifiedUsers = new ArrayList<>(); + List loginUsers = loginService.getAll(); + HashMap loginMap = createLoginMap(loginUsers, true); + + for (UnifiedSystemUser user : users) { + if (loginMap.containsKey(user.getLoginName())) { + unifiedUsers.add(user); + } + } + return unifiedUsers; + } + + private List filterUnifiedUsersByLabUnitRole(List users, String labUnit) { + List unifiedUsers = new ArrayList<>(); + List allLabUnitRoles = userService.getAllUserLabUnitRoles(); + List systemUserIds = new ArrayList<>(); + if (allLabUnitRoles != null && allLabUnitRoles.size() > 0) { + for (UserLabUnitRoles userRoles : allLabUnitRoles) { + for (LabUnitRoleMap roleMap : userRoles.getLabUnitRoleMap()) { + if (roleMap.getLabUnit().trim().equals(labUnit.trim())) { + systemUserIds.add(userRoles.getId()); + break; + } + } + } + for (UnifiedSystemUser user : users) { + if (systemUserIds.contains(Integer.valueOf(user.getSystemUserId()))) { + unifiedUsers.add(user); + } + } + } + return unifiedUsers; + } + + private List getUnifiedUsers(List systemUsers) { + + List unifiedUsers = new ArrayList<>(); + + List loginUsers = loginService.getAll(); + + HashMap loginMap = createLoginMap(loginUsers, false); + + for (SystemUser user : systemUsers) { + UnifiedSystemUser unifiedUser = createUnifiedSystemUser(loginMap, user); + unifiedUsers.add(unifiedUser); + } + + return unifiedUsers; + } + + private UnifiedSystemUser createUnifiedSystemUser(HashMap loginMap, SystemUser user) { + + UnifiedSystemUser unifiedUser = new UnifiedSystemUser(); + unifiedUser.setFirstName(user.getFirstName()); + unifiedUser.setLastName(user.getLastName()); + unifiedUser.setLoginName(user.getLoginName()); + unifiedUser.setSystemUserId(user.getId()); + unifiedUser.setActive(user.getIsActive()); + + LoginUser login = loginMap.get(user.getLoginName()); + + if (login != null) { + unifiedUser.setExpDate(DateUtil.formatDateAsText(login.getPasswordExpiredDate())); + unifiedUser.setDisabled(login.getAccountDisabled()); + unifiedUser.setLocked(login.getAccountLocked()); + unifiedUser.setTimeout(login.getUserTimeOut()); + unifiedUser.setLoginUserId(Integer.toString(login.getId())); + } + return unifiedUser; + } + + private HashMap createLoginMap(List loginUsers, Boolean filter) { + HashMap loginMap = new HashMap<>(); + + for (LoginUser login : loginUsers) { + if (filter) { + if (login.getIsAdmin().equals("Y")) { + loginMap.put(login.getLoginName(), login); + } + } else { + loginMap.put(login.getLoginName(), login); + } + } + return loginMap; + } + + @Override + protected String getDeactivateDisabled() { + return "false"; + } + + @Override + protected int getPageSize() { + return SystemConfiguration.getInstance().getDefaultPageSize(); + } + + @PostMapping(value = "/DeleteUnifiedSystemUser") + public String showDeleteUnifiedSystemUser(HttpServletRequest request, UnifiedSystemUserMenuForm form, BindingResult result) { + if (result.hasErrors()) { + saveErrors(result); + return findForward(FWD_FAIL_DELETE); + } + List selectedIDs = form.getSelectedIDs(); + List loginUsers = new ArrayList<>(); + List systemUsers = new ArrayList<>(); + List userRoles = new ArrayList<>(); + + String sysUserId = getSysUserId(request); + + for (int i = 0; i < selectedIDs.size(); i++) { + String systemUserId = UnifiedSystemUser.getSystemUserIDFromCombinedID(selectedIDs.get(i)); + + if (!GenericValidator.isBlankOrNull(systemUserId)) { + SystemUser systemUser = new SystemUser(); + systemUser.setId(systemUserId); + systemUser.setSysUserId(sysUserId); + systemUsers.add(systemUser); + } + + Integer loginUserId = UnifiedSystemUser.getLoginUserIDFromCombinedID(selectedIDs.get(i)); + + if (null != loginUserId) { + LoginUser loginUser = new LoginUser(); + loginUser.setId(loginUserId); + loginUser.setSysUserId(sysUserId); + loginUsers.add(loginUser); + } + } + + for (SystemUser systemUser : systemUsers) { + List roleIds = userRoleService.getRoleIdsForUser(systemUser.getId()); + + for (String roleId : roleIds) { + UserRole userRole = new UserRole(); + userRole.setSystemUserId(systemUser.getId()); + userRole.setRoleId(roleId); + userRole.setSysUserId(sysUserId); + userRoles.add(userRole); + } + } + + try { + unifiedSystemUserService.deleteData(userRoles, systemUsers, loginUsers, getSysUserId(request)); + } catch (LIMSRuntimeException e) { + + if (e.getCause() instanceof org.hibernate.StaleObjectStateException) { + result.reject("errors.OptimisticLockException", "errors.OptimisticLockException"); + } else { + result.reject("errors.DeleteException", "errors.DeleteException"); + } + // saveErrors(result); + return findLocalForward(FWD_FAIL_DELETE); + + } + + // return findForward(FWD_SUCCESS_DELETE, form); + return findLocalForward(FWD_SUCCESS_DELETE); + } + + @Override + protected String findLocalForward(String forward) { + if (FWD_SUCCESS.equals(forward)) { + return "userMasterListsPageDefinition"; + } else if (FWD_FAIL.equals(forward)) { + return "redirect:/MasterListsPage"; + } else if (FWD_SUCCESS_DELETE.equals(forward)) { + return "redirect:/UnifiedSystemUserMenu"; + } else if (FWD_FAIL_DELETE.equals(forward)) { + return "redirect:/UnifiedSystemUserMenu"; + } else { + return "PageNotFound"; + } + } + + @Override + protected String getPageTitleKey() { + return "unifiedSystemUser.browser.title"; + } + + @Override + protected String getPageSubtitleKey() { + return "unifiedSystemUser.browser.title"; + } +} diff --git a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java new file mode 100644 index 0000000000..8766e8af04 --- /dev/null +++ b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java @@ -0,0 +1,772 @@ +package org.openelisglobal.systemuser.controller; + +import java.lang.reflect.InvocationTargetException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.GenericValidator; +import org.json.JSONArray; +import org.json.JSONObject; +import org.openelisglobal.common.constants.Constants; +import org.openelisglobal.common.controller.BaseController; +import org.openelisglobal.common.exception.LIMSDuplicateRecordException; +import org.openelisglobal.common.exception.LIMSRuntimeException; +import org.openelisglobal.common.provider.validation.PasswordValidationFactory; +import org.openelisglobal.common.services.DisplayListService; +import org.openelisglobal.common.services.DisplayListService.ListType; +import org.openelisglobal.common.util.DateUtil; +import org.openelisglobal.common.util.IdValuePair; +import org.openelisglobal.common.util.StringUtil; +import org.openelisglobal.common.validator.BaseErrors; +import org.openelisglobal.login.dao.UserModuleService; +import org.openelisglobal.login.service.LoginUserService; +import org.openelisglobal.login.valueholder.LoginUser; +import org.openelisglobal.role.action.bean.DisplayRole; +import org.openelisglobal.role.service.RoleService; +import org.openelisglobal.role.valueholder.Role; +import org.openelisglobal.systemuser.form.UnifiedSystemUserForm; +import org.openelisglobal.systemuser.service.SystemUserService; +import org.openelisglobal.systemuser.service.UserService; +import org.openelisglobal.systemuser.validator.UnifiedSystemUserFormValidator; +import org.openelisglobal.systemuser.valueholder.SystemUser; +import org.openelisglobal.systemuser.valueholder.UnifiedSystemUser; +import org.openelisglobal.userrole.service.UserRoleService; +import org.openelisglobal.userrole.valueholder.LabUnitRoleMap; +import org.openelisglobal.userrole.valueholder.UserLabUnitRoles; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.Errors; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +@RestController +@RequestMapping("/rest") +public class UnifiedSystemUserRestController extends BaseController { + + private static final String YES = "Y"; + private static final String NO = "N"; + private static final String ALL_LAB_UNITS = "AllLabUnits"; + private static final String RESERVED_ADMIN_NAME = "admin"; + // private static final String GLOBAL_ADMIN_ID = "globalAdminId"; + // private static final String ID = "id"; + private static final char DEFAULT_OBFUSCATED_CHARACTER = '@'; + + private static final String[] ALLOWED_FIELDS = new String[] { "systemUserId", "loginUserId", "userLoginName", + "userPassword", "confirmPassword", "userFirstName", "userLastName", "expirationDate", "timeout", + "accountLocked", "accountDisabled", "accountActive", "selectedRoles*", "selectedLabUnitRoles", + "testSectionId", "systemUsers", "systemUserIdToCopy", "allowCopyUserRoles" }; + + @Autowired + private UnifiedSystemUserFormValidator formValidator; + + @Autowired + private LoginUserService loginService; + @Autowired + private RoleService roleService; + @Autowired + private UserRoleService userRoleService; + @Autowired + private SystemUserService systemUserService; + @Autowired + private UserModuleService userModuleService; + @Autowired + private UserService userService; + // private static final String RESERVED_ADMIN_NAME = "admin"; + + private static String GLOBAL_ADMIN_ID; + private static String ID; + // public static final char DEFAULT_OBFUSCATED_CHARACTER = '@'; + // public static final String ALL_LAB_UNITS = "AllLabUnits"; + + @PostConstruct + private void initialize() { + GLOBAL_ADMIN_ID = roleService.getRoleByName(Constants.ROLE_GLOBAL_ADMIN).getId(); + } + + @InitBinder + public void initBinder(WebDataBinder binder) { + binder.setAllowedFields(ALLOWED_FIELDS); + } + + @GetMapping(value = "/rest/users/{roleName}") + @ResponseBody + public List getUsersWithRole(@PathVariable String roleName) { + List users = systemUserService.getAll(); + return users.stream().filter(e -> userRoleService.userInRole(e.getId(), roleName)) + .map(e -> new IdValuePair(e.getId(), e.getDisplayName())).collect(Collectors.toList()); + } + + @GetMapping(value = "/rest/users") + @ResponseBody + public List getUsersWithRole() { + List users = systemUserService.getAll(); + List idValues = users.stream().map(e -> new IdValuePair(e.getId(), e.getDisplayName())) + .collect(Collectors.toList()); + return idValues; + } + + @GetMapping(value = "/UnifiedSystemUser") + public String showUnifiedSystemUser(HttpServletRequest request, + @RequestParam(name = "ID", defaultValue = "") String id) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + UnifiedSystemUserForm form = new UnifiedSystemUserForm(); + form.setFormAction("UnifiedSystemUser"); + form.setCancelAction("UnifiedSystemUserMenu"); + + boolean doFiltering = true; + request.setAttribute(ALLOW_EDITS_KEY, "true"); + request.setAttribute(PREVIOUS_DISABLED, "true"); + request.setAttribute(NEXT_DISABLED, "true"); + request.setAttribute(DISPLAY_PREV_NEXT, false); + + boolean isNew = GenericValidator.isBlankOrNull(id) || "0".equals(id); + + setDefaultProperties(form); + if (!isNew) { + setPropertiesForExistingUser(form, id, doFiltering); + } + setupRoles(form, request, doFiltering); + + // load testSections for drop down + List testSections = DisplayListService.getInstance().getList(ListType.TEST_SECTION_ACTIVE); + form.setTestSections(testSections); + form.setSystemUsers(getDisplaySystemUsersJsonArray()); + addFlashMsgsToRequest(request); + // return findForward(FWD_SUCCESS, form); + return FWD_SUCCESS; + } + + private void setupRoles(UnifiedSystemUserForm form, HttpServletRequest request, boolean doFiltering) { + List roles = getAllRoles(); + doFiltering &= !userModuleService.isUserAdmin(request); + + if (doFiltering) { + roles = doRoleFiltering(roles, getSysUserId(request)); + } + + List displayRoles = convertToDisplayRoles(roles); + displayRoles = sortAndGroupRoles(displayRoles); + String globalParentRoleId = roleService.getRoleByName(Constants.GLOBAL_ROLES_GROUP).getId(); + String labUnitRoleId = roleService.getRoleByName(Constants.LAB_ROLES_GROUP).getId(); + + List globalRoles = displayRoles.stream().filter(role -> role.getParentRole() != null) + .filter(role -> role.getParentRole().equals(globalParentRoleId)).collect(Collectors.toList()); + List labUnitRoles = displayRoles.stream().filter(role -> role.getParentRole() != null) + .filter(role -> role.getParentRole().equals(labUnitRoleId)).collect(Collectors.toList()); + form.setGlobalRoles(globalRoles); + form.setLabUnitRoles(labUnitRoles); + } + + private List convertToDisplayRoles(List roles) { + int elementCount = 0; + + List displayRoles = new ArrayList<>(); + + for (Role role : roles) { + elementCount++; + displayRoles.add(convertToDisplayRole(role, elementCount)); + } + + return displayRoles; + } + + private DisplayRole convertToDisplayRole(Role role, int count) { + DisplayRole displayRole = new DisplayRole(); + + displayRole.setRoleName(role.getLocalizedName()); + displayRole.setElementID(String.valueOf(count)); + displayRole.setRoleId(role.getId()); + displayRole.setGroupingRole(role.getGroupingRole()); + displayRole.setParentRole(role.getGroupingParent()); + + return displayRole; + } + + private List sortAndGroupRoles(List roles) { + /* + * The sorting we want to end up with is first alphabetical and then by groups + * What makes things a little more difficult is that we may have roles which + * have parents which don't exist, we shouldn't but we might. So... First sweep + * is to find all the orphaned roles and set their parents to null Then move all + * the first generation groups to a new list. Then scan for all for all groups + * and move their members, repeat until the first list is empty, which is why we + * didn't want orphans. Lastly we will add the role ID as a child to all of it's + * parents + */ + + Collections.sort(roles, new Comparator() { + @Override + public int compare(Object obj1, Object obj2) { + DisplayRole role1 = (DisplayRole) obj1; + DisplayRole role2 = (DisplayRole) obj2; + return role1.getRoleName().toUpperCase().compareTo(role2.getRoleName().toUpperCase()); + } + }); + + /* + * The reason we're not making a map is that we want to preserve the order + * during this whole process + */ + List groupIds = new ArrayList<>(); + + for (DisplayRole role : roles) { + if (role.isGroupingRole()) { + groupIds.add(role.getRoleId()); + } + } + + for (DisplayRole role : roles) { + if (!GenericValidator.isBlankOrNull(role.getParentRole()) && !groupIds.contains(role.getParentRole())) { + role.setParentRole(null); + } + } + + List mergeList = new ArrayList<>(); + List currentWorkingList = new ArrayList<>(); + List unplacedList = new ArrayList<>(); + + for (DisplayRole role : roles) { + if (GenericValidator.isBlankOrNull(role.getParentRole())) { + role.setNestingLevel(0); + currentWorkingList.add(role); + } else { + unplacedList.add(role); + } + } + + int indentCount = 0; + while (unplacedList.size() > 0) { + indentCount++; + for (DisplayRole placedRole : currentWorkingList) { + mergeList.add(placedRole); + + if (placedRole.isGroupingRole()) { + List removeList = new ArrayList<>(); + for (DisplayRole unplacedRole : unplacedList) { + if (unplacedRole.getParentRole().equals(placedRole.getRoleId())) { + unplacedRole.setNestingLevel(indentCount); + mergeList.add(unplacedRole); + removeList.add(unplacedRole); + placedRole.addChildID(unplacedRole.getRoleId()); + } + } + unplacedList.removeAll(removeList); + } + } + + currentWorkingList = mergeList; + mergeList = new ArrayList<>(); + } + + /* + * For finding all parents we are going to iterate backwards since all parents + * are in front of children role + */ + for (int i = currentWorkingList.size() - 1; i > 0; i--) { + DisplayRole role = currentWorkingList.get(i); + + if (!GenericValidator.isBlankOrNull(role.getParentRole())) { + String roleID = role.getRoleId(); + String currentParentID = role.getParentRole(); + + for (int parent = i - 1; parent >= 0; parent--) { + if (currentWorkingList.get(parent).getRoleId().equals(currentParentID)) { + DisplayRole parentRole = currentWorkingList.get(parent); + + parentRole.addChildID(roleID); + + if (GenericValidator.isBlankOrNull(parentRole.getParentRole())) { + break; + } else { + currentParentID = parentRole.getParentRole(); + } + } + } + } + } + + return currentWorkingList; + } + + private List doRoleFiltering(List roles, String loggedInUserId) { + + List rolesForLoggedInUser = userRoleService.getRoleIdsForUser(loggedInUserId); + + if (!rolesForLoggedInUser.contains(GLOBAL_ADMIN_ID)) { + List tmpRoles = new ArrayList<>(); + + for (Role role : roles) { + if (!GLOBAL_ADMIN_ID.equals(role.getId())) { + tmpRoles.add(role); + } + } + + roles = tmpRoles; + } + + return roles; + } + + private void setDefaultProperties(UnifiedSystemUserForm form) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + String expireDate = getYearsFromNow(10); + form.setExpirationDate(expireDate); + form.setTimeout("480"); + form.setSystemUserLastupdated(new Timestamp(System.currentTimeMillis())); + } + + private void setPropertiesForExistingUser(UnifiedSystemUserForm form, String id, boolean doFiltering) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + LoginUser login = getLoginFromCombinedId(id); + SystemUser systemUser = getSystemUserFromCombinedId(id); + + if (login != null) { + String proxyPassword = getProxyPassword(login); + form.setLoginUserId(Integer.toString(login.getId())); + form.setAccountDisabled(login.getAccountDisabled()); + form.setAccountLocked(login.getAccountLocked()); + form.setUserLoginName(login.getLoginName()); + form.setUserPassword(proxyPassword); + form.setConfirmPassword(proxyPassword); + form.setExpirationDate(login.getPasswordExpiredDateForDisplay()); + form.setTimeout(login.getUserTimeOut()); + } + + if (systemUser != null) { + form.setSystemUserId(systemUser.getId()); + form.setUserFirstName(systemUser.getFirstName()); + form.setUserLastName(systemUser.getLastName()); + form.setAccountActive(systemUser.getIsActive()); + form.setSystemUserLastupdated(systemUser.getLastupdated()); + + List roleIds = userRoleService.getRoleIdsForUser(systemUser.getId()); + form.setSelectedRoles(roleIds); + setLabunitRolesForExistingUser(form); + + // is this meant to be returned? +// doFiltering = !roleIds.contains(MAINTENANCE_ADMIN_ID); + } + + } + + private String getProxyPassword(LoginUser login) { + char[] chars = new char[9]; + Arrays.fill(chars, DEFAULT_OBFUSCATED_CHARACTER); + return new String(chars); + // return StringUtil.replaceAllChars(login.getPassword(), + // DEFAULT_PASSWORD_FILLER); + } + + private LoginUser getLoginFromCombinedId(String id) { + LoginUser login = null; + Integer loginId = UnifiedSystemUser.getLoginUserIDFromCombinedID(id); + + if (null != loginId) { + login = loginService.get(loginId); + } + + return login; + } + + private SystemUser getSystemUserFromCombinedId(String id) { + SystemUser systemUser = null; + String systemUserId = UnifiedSystemUser.getSystemUserIDFromCombinedID(id); + + if (!GenericValidator.isBlankOrNull(systemUserId)) { + systemUser = systemUserService.get(systemUserId); + } + + return systemUser; + } + + private String getYearsFromNow(int years) { + Calendar today = Calendar.getInstance(); + + today.add(Calendar.YEAR, years); + + return DateUtil.formatDateAsText(today.getTime()); + } + + private List getAllRoles() { + return roleService.getAllActiveRoles(); + } + + @PostMapping(value = "/UnifiedSystemUser") + public Map showUpdateUnifiedSystemUser(HttpServletRequest request, @Valid UnifiedSystemUserForm form, BindingResult result) { + boolean doFiltering = true; + formValidator.validate(form, result); + Map response = new HashMap<>(); + + if (result.hasErrors()) { + saveErrors(result); + setupRoles(form, request, doFiltering); + // return findForward(FWD_FAIL_INSERT, form); + response.put("forward", findForward(FWD_FAIL_INSERT)); + // return response; + // return findForward(FWD_FAIL_INSERT); + } + + request.setAttribute(ALLOW_EDITS_KEY, "true"); + request.setAttribute(PREVIOUS_DISABLED, "false"); + request.setAttribute(NEXT_DISABLED, "false"); + + if (form.getUserLoginName() != null) { + form.setUserLoginName(form.getUserLoginName().trim()); + } else { + form.setUserLoginName(""); + } + + String forward = validateAndUpdateSystemUser(request, form); + + if (forward.equals(FWD_SUCCESS_INSERT)) { + // redirectAttributes.addFlashAttribute(FWD_SUCCESS, true); + Map params = new HashMap<>(); + params.put("forward", FWD_SUCCESS); + params.put("ID", ID); + // return getForwardWithParameters(findForward(forward, form), params); + // redirectAttributes.addFlashAttribute("ID", ID); + // return "redirect:/UnifiedSystemUser"; + response.put("forward", "redirect:/UnifiedSystemUser"); + } else { + setupRoles(form, request, doFiltering); + // return findForward(forward); + response.put("forward", findForward(forward)); + } + + return response; + } + + private String validateAndUpdateSystemUser(HttpServletRequest request, UnifiedSystemUserForm form) { + String loginUserId = form.getLoginUserId(); + String systemUserId = form.getSystemUserId(); + + Errors errors = new BaseErrors(); + + boolean loginUserNew = GenericValidator.isBlankOrNull(loginUserId); + boolean systemUserNew = GenericValidator.isBlankOrNull(systemUserId); + boolean passwordUpdated = false; + + passwordUpdated = passwordHasBeenUpdated(loginUserNew, form); + validateUser(form, errors, loginUserNew, passwordUpdated, loginUserId); + + if (errors.hasErrors()) { + saveErrors(errors); + return FWD_FAIL_INSERT; + } + + String loggedOnUserId = getSysUserId(request); + + LoginUser loginUser = createLoginUser(form, loginUserId, loginUserNew, passwordUpdated, loggedOnUserId); + SystemUser systemUser = createSystemUser(form, systemUserId, systemUserNew, loggedOnUserId); + try { + if (form.getAllowCopyUserRoles().equals(NO)) { + userService.updateLoginUser(loginUser, loginUserNew, systemUser, systemUserNew, form.getSelectedRoles(), + loggedOnUserId); + saveUserLabUnitRoles(systemUser, form, loggedOnUserId); + } else if (form.getAllowCopyUserRoles().equals(YES)) { + if (StringUtils.isNotBlank(form.getSystemUserIdToCopy().trim())) { + String globalParentRoleId = roleService.getRoleByName(Constants.GLOBAL_ROLES_GROUP).getId(); + List globaRolesIds = getAllRoles().stream().filter(role -> role.getGroupingParent() != null) + .filter(role -> role.getGroupingParent().equals(globalParentRoleId)) + .map(role -> role.getId()).collect(Collectors.toList()); + List copiedRoleIds = userRoleService.getRoleIdsForUser(form.getSystemUserIdToCopy().trim()); + List globalCopiedRoleIds = copiedRoleIds.stream() + .filter(role -> globaRolesIds.contains(role)).collect(Collectors.toList()); + + userService.updateLoginUser(loginUser, loginUserNew, systemUser, systemUserNew, globalCopiedRoleIds, + loggedOnUserId); + + UserLabUnitRoles labRoles = userService.getUserLabUnitRoles(form.getSystemUserIdToCopy().trim()); + Map> copiedLabUnitRolesMap = new HashMap<>(); + labRoles.getLabUnitRoleMap().forEach(roleMap -> copiedLabUnitRolesMap + .put(new String(roleMap.getLabUnit()), new HashSet<>(roleMap.getRoles()))); + userService.saveUserLabUnitRoles(systemUser, copiedLabUnitRolesMap, loggedOnUserId); + } + } + ID = systemUser.getId() + "-" + loginUser.getId(); + } catch (LIMSRuntimeException e) { + if (e.getCause() instanceof org.hibernate.StaleObjectStateException) { + errors.reject("errors.OptimisticLockException", "errors.OptimisticLockException"); + } else if (e.getCause() instanceof LIMSDuplicateRecordException) { + errors.reject("errors.DuplicateRecordException", "errors.DuplicateRecordException"); + } else { + errors.reject("errors.UpdateException", "errors.UpdateException"); + } + + saveErrors(errors); + disableNavigationButtons(request); + return FWD_FAIL_INSERT; + } + + return FWD_SUCCESS_INSERT; + } + + private boolean passwordHasBeenUpdated(boolean loginUserNew, UnifiedSystemUserForm form) { + if (loginUserNew) { + return true; + } + + String password = form.getUserPassword(); + + return !StringUtil.containsOnly(password, DEFAULT_OBFUSCATED_CHARACTER); + } + + private void validateUser(UnifiedSystemUserForm form, Errors errors, boolean loginUserIsNew, + boolean passwordUpdated, String loginUserId) { + boolean checkForDuplicateName = loginUserIsNew || userNameChanged(loginUserId, form.getUserLoginName()); + // check login name + + if (GenericValidator.isBlankOrNull(form.getUserLoginName())) { + errors.reject("errors.loginName.required", "errors.loginName.required"); + } else if (checkForDuplicateName) { + LoginUser login = loginService.getMatch("loginName", form.getUserLoginName()).orElse(null); + if (login != null) { + errors.reject("errors.loginName.duplicated"); + } + } + + // check first and last name + if (GenericValidator.isBlankOrNull(form.getUserFirstName()) + || GenericValidator.isBlankOrNull(form.getUserLastName())) { + errors.reject("errors.userName.required", "errors.userName.required"); + } + + if (passwordUpdated) { + // check passwords match + if (GenericValidator.isBlankOrNull(form.getUserPassword()) + || !form.getUserPassword().equals(form.getConfirmPassword())) { + errors.reject("errors.password.match", "errors.password.match"); + } else if (!passwordValid(form.getUserPassword())) { // validity + errors.reject("login.error.password.requirement"); + } + } + + // check timeout + if (!timeoutValidAndInRange(form.getTimeout())) { + errors.reject("errors.timeout.range", "errors.timeout.range"); + } + } + + private boolean userNameChanged(String loginUserId, String newName) { + if (GenericValidator.isBlankOrNull(loginUserId)) { + return false; + } + + LoginUser login = loginService.get(Integer.parseInt(loginUserId)); + + return !newName.equals(login.getLoginName()); + } + + private boolean timeoutValidAndInRange(String timeout) { + try { + int timeInMin = Integer.parseInt(timeout); + return timeInMin > 0 && timeInMin < 601; + } catch (NumberFormatException e) { + return false; + } + } + + private boolean passwordValid(String password) { + return PasswordValidationFactory.getPasswordValidator().passwordValid(password); + } + + private LoginUser createLoginUser(UnifiedSystemUserForm form, String loginUserId, boolean loginUserNew, + boolean passwordUpdated, String loggedOnUserId) { + + LoginUser login = new LoginUser(); + + if (!loginUserNew) { + login = loginService.get(Integer.parseInt(form.getLoginUserId())); + } + login.setAccountDisabled(form.getAccountDisabled()); + login.setAccountLocked(form.getAccountLocked()); + login.setLoginName(form.getUserLoginName()); + if (passwordUpdated) { + login.setPassword(form.getUserPassword()); + loginService.hashPassword(login, login.getPassword()); + } + login.setPasswordExpiredDateForDisplay(form.getExpirationDate()); + if (RESERVED_ADMIN_NAME.equals(form.getUserLoginName())) { + login.setIsAdmin("Y"); + } else { + login.setIsAdmin("N"); + } + login.setUserTimeOut(form.getTimeout()); + login.setSysUserId(loggedOnUserId); + + return login; + } + + private SystemUser createSystemUser(UnifiedSystemUserForm form, String systemUserId, boolean systemUserNew, + String loggedOnUserId) { + + SystemUser systemUser = new SystemUser(); + + if (!systemUserNew) { + systemUser = systemUserService.get(systemUserId); + } + + systemUser.setFirstName(form.getUserFirstName()); + systemUser.setLastName(form.getUserLastName()); + systemUser.setLoginName(form.getUserLoginName()); + systemUser.setIsActive(form.getAccountActive()); + systemUser.setIsEmployee("Y"); + systemUser.setExternalId("1"); + String initial = systemUser.getFirstName().substring(0, 1) + systemUser.getLastName().substring(0, 1); + systemUser.setInitials(initial); + systemUser.setSysUserId(loggedOnUserId); + + return systemUser; + } + + private void disableNavigationButtons(HttpServletRequest request) { + request.setAttribute(PREVIOUS_DISABLED, TRUE); + request.setAttribute(NEXT_DISABLED, TRUE); + } + + private void saveUserLabUnitRoles(SystemUser user, UnifiedSystemUserForm form, String loggedOnUserId) { + Map> selectedLabUnitRolesMap = new HashMap<>(); + parseUserLabRolesData(form, selectedLabUnitRolesMap); + userService.saveUserLabUnitRoles(user, selectedLabUnitRolesMap, loggedOnUserId); + } + + private void setLabunitRolesForExistingUser(UnifiedSystemUserForm form) { + UserLabUnitRoles roles = userService.getUserLabUnitRoles(form.getSystemUserId()); + if (roles != null) { + Set roleMaps = roles.getLabUnitRoleMap(); + List userLabUnits = new ArrayList<>(); + roleMaps.forEach(map -> userLabUnits.add(map.getLabUnit())); + JSONObject userLabData = new JSONObject(); + if (userLabUnits.contains(ALL_LAB_UNITS)) { + roleMaps.stream().filter(map -> map.getLabUnit().equals(ALL_LAB_UNITS)).forEach( + map -> userLabData.put(map.getLabUnit(), map.getRoles().stream().collect(Collectors.toList()))); + } else { + for (LabUnitRoleMap map : roleMaps) { + userLabData.put(map.getLabUnit(), map.getRoles().stream().collect(Collectors.toList())); + } + } + + form.setUserLabRoleData(userLabData); + } + } + + private void parseUserLabRolesData(UnifiedSystemUserForm form, Map> selectedLabUnitRolesMap) { + /** + * The ui-form can dynamically render more fields that are mapped to the same + * field (ie for testSectionId ,selectedLabUnitRoles )of the form-backing + * object, so we append a common pre-fix to the values in every New lab Unit + * Roles Set to identify the distinct values for each set . This method parses + * the data from the form ,and builds a Map ie > for each Lab Unit Role Set based on the suffix appended + * ie testSectionId = "1=2,2=5,2=6" ,selectedLabUnitRoles = [1=56, 2=36 ,3=44] + */ + + String labUnitEntryMapString = form.getTestSectionId(); + List labUnitsRolesEntryMaps = form.getSelectedLabUnitRoles(); + + List entries = new ArrayList<>(); + List labUnitsEntryMap = new ArrayList<>(); + String labUnitEntries[] = labUnitEntryMapString.split(","); + for (String part : labUnitEntries) { + if (part.contains("=")) { + if (!part.contains("none")) { + entries.add(part.split("=")[0]); + labUnitsEntryMap.add(part); + } + } + } + for (String entry : entries) { + for (String labUnit : labUnitsEntryMap) { + if (labUnit.startsWith(entry)) { + Set labRolesId = new HashSet<>(); + String labUnitId = labUnit.split("=")[1]; + for (String labUnitsRolesEntryMap : labUnitsRolesEntryMaps) { + if (labUnitsRolesEntryMap.startsWith(entry)) { + labRolesId.add(labUnitsRolesEntryMap.split("=")[1]); + } + } + if (labRolesId.size() > 0) { + selectedLabUnitRolesMap.put(labUnitId, labRolesId); + } + } + } + } + + if (selectedLabUnitRolesMap.containsKey(ALL_LAB_UNITS)) { + Set labRolesId = selectedLabUnitRolesMap.get(ALL_LAB_UNITS); + selectedLabUnitRolesMap.clear(); + selectedLabUnitRolesMap.put(ALL_LAB_UNITS, labRolesId); + List allTestSectionIds = new ArrayList<>(); + DisplayListService.getInstance().getList(ListType.TEST_SECTION_ACTIVE) + .forEach(testScetion -> allTestSectionIds.add(testScetion.getId())); + allTestSectionIds.forEach(testScetionId -> selectedLabUnitRolesMap.put(testScetionId, labRolesId)); + } + } + + private JSONArray getDisplaySystemUsersJsonArray() { + JSONArray displayUsers = new JSONArray(); + systemUserService.getAll().stream().filter(user -> user.getIsActive().equals(YES)) + .map(user -> new JSONObject() + .put("label", user.getLoginName() + " | " + user.getFirstName() + " " + user.getLastName()) + .put("value", user.getId())) + .forEach(userJson -> displayUsers.put(userJson)); + return displayUsers; + } + + @Override + protected String findLocalForward(String forward) { + if (FWD_SUCCESS.equals(forward)) { + return "unifiedSystemUserDefinition"; + } else if (FWD_FAIL.equals(forward)) { + return "redirect:/MasterListsPage"; + } else if (FWD_SUCCESS_INSERT.equals(forward)) { + return "redirect:/UnifiedSystemUser"; + } else if (FWD_FAIL_INSERT.equals(forward)) { + return "unifiedSystemUserDefinition"; + } else { + return "PageNotFound"; + } + } + + @Override + protected String getPageTitleKey() { + String id = request.getParameter(ID); + boolean isNew = GenericValidator.isBlankOrNull(id) || "0".equals(id); + return isNew ? "unifiedSystemUser.add.title" : "unifiedSystemUser.edit.title"; + } + + @Override + protected String getPageSubtitleKey() { + String id = request.getParameter(ID); + boolean isNew = GenericValidator.isBlankOrNull(id) || "0".equals(id); + return isNew ? "unifiedSystemUser.add.title" : "unifiedSystemUser.edit.title"; + } +} From d76d157bfaf2bb5d643ed1d1fb9f9c9cc4084095 Mon Sep 17 00:00:00 2001 From: "Aditya @ArchLinux" <132184385+adityadeshlahre@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:17:59 +0530 Subject: [PATCH 02/16] UI renders,function & small fixes --- frontend/src/components/admin/Admin.js | 9 + .../admin/userManagement/UserAddEdit.js | 739 ++++++++++++++---- .../admin/userManagement/UserManagement.js | 49 +- frontend/src/languages/en.json | 4 +- frontend/src/languages/fr.json | 4 +- .../rest/UnifiedSystemUserRestController.java | 6 +- 6 files changed, 665 insertions(+), 146 deletions(-) diff --git a/frontend/src/components/admin/Admin.js b/frontend/src/components/admin/Admin.js index a1940b5876..fea82bf071 100644 --- a/frontend/src/components/admin/Admin.js +++ b/frontend/src/components/admin/Admin.js @@ -27,6 +27,7 @@ import { BootVolumeAlt, Report, Bullhorn, + User, } from "@carbon/icons-react"; import PathRoute from "../utils/PathRoute"; import CalculatedValue from "./calculatedValue/CalculatedValueForm"; @@ -47,6 +48,8 @@ import AnalyzerTestName from "./analyzerTestName/AnalyzerTestName.js"; import PluginList from "./pluginFile/PluginFile.js"; import ResultReportingConfiguration from "./ResultReportingConfiguration/ResultReportingConfiguration.js"; import PushNotificationPage from "../notifications/PushNotificationPage.jsx"; +import UserManagement from "./userManagement/UserManagement"; + function Admin() { const intl = useIntl(); const [isSmallScreen, setIsSmallScreen] = useState(false); @@ -108,6 +111,9 @@ function Admin() { + + + + + + diff --git a/frontend/src/components/admin/userManagement/UserAddEdit.js b/frontend/src/components/admin/userManagement/UserAddEdit.js index 4d7ae904c3..33d1d9b404 100644 --- a/frontend/src/components/admin/userManagement/UserAddEdit.js +++ b/frontend/src/components/admin/userManagement/UserAddEdit.js @@ -1,4 +1,5 @@ -import React from "react"; +import React, { useContext, useState, useEffect, useRef } from "react"; +import { useLocation } from "react-router-dom"; import { Grid, Column, @@ -11,12 +12,17 @@ import { RadioButton, RadioButtonGroup, Button, + Loading, Select, SelectItem, + PasswordInput, } from "@carbon/react"; import { FormattedMessage, injectIntl, useIntl } from "react-intl"; import PageBreadCrumb from "../../common/PageBreadCrumb"; import CustomCheckBox from "../../common/CustomCheckBox"; +import { AlertDialog } from "../../common/CustomNotification"; +import { NotificationContext } from "../../layout/Layout.js"; +import { getFromOpenElisServer } from "../../utils/Utils"; const breadcrumbs = [ { label: "home.label", link: "/" }, @@ -24,10 +30,334 @@ const breadcrumbs = [ ]; function UserAddEdit() { + const { notificationVisible, setNotificationVisible, addNotification } = + useContext(NotificationContext); + + const componentMounted = useRef(false); const intl = useIntl(); + const [saveButton, setSaveButton] = useState(true); + const [isLoading, setIsLoading] = useState(true); + const [isLocked, setIsLocked] = useState("radio-2"); + const [isDisabled, setIsDisabled] = useState("radio-4"); + const [isActive, setIsActive] = useState("radio-6"); + const [copyUserPermission, setCopyUserPermission] = useState("0"); + const [copyUserPermissionList, setCopyUserPermissionList] = useState(null); + const [testSectionsSelect, setTestSectionsSelect] = useState("option-1"); + const [userData, setUserData] = useState(null); + const [userDataShow, setUserDataShow] = useState({}); + const [userDataPost, setUserDataPost] = useState(null); + + // const id = new URLSearchParams(useLocation().search).get("ID"); + + // if (!id) { + // setTimeout(() => { + // window.location.assign("/MasterListsPage"); + // }, 1000); + + // return ( + // <> + // + // + // ); + // } + + const handleUserData = (res) => { + if (!res) { + setIsLoading(true); + } else { + setUserData(res); + } + }; + + const handleCopyUserPermissionsList = (res) => { + if (!res) { + setIsLoading(true); + } else { + setCopyUserPermissionList(res); + } + }; + + useEffect(() => { + componentMounted.current = true; + setIsLoading(true); + getFromOpenElisServer( + `/rest/UnifiedSystemUser?ID=1-2&startingRecNo=1&roleFilter=`, + handleUserData, + ); + getFromOpenElisServer(`/rest/rest/users`, handleCopyUserPermissionsList); + return () => { + componentMounted.current = false; + setIsLoading(false); + }; + }, []); + + useEffect(() => { + if (userData) { + const userManagementInfoToShow = { + accountActive: userData.accountActive, + accountDisabled: userData.accountDisabled, + accountLocked: userData.accountLocked, + allowCopyUserRoles: userData.allowCopyUserRoles, + // cancelAction: userData.cancelAction, + // cancelMethod: userData.cancelMethod, + confirmPassword: userData.confirmPassword, + expirationDate: userData.expirationDate, + // formAction: userData.formAction, + // formMethod: userData.formMethod, + // formName: userData.formName, + loginUserId: userData.loginUserId, + selectedRoles: userData.selectedRoles, + systemUserId: userData.systemUserId, + systemUserIdToCopy: userData.systemUserIdToCopy, + systemUserLastupdated: userData.systemUserLastupdated, + timeout: userData.timeout, + userFirstName: userData.userFirstName, + userLastName: userData.userLastName, + userLoginName: userData.userLoginName, + userPassword: userData.userPassword, + }; + + const userManagementInfoToPost = { + accountActive: userData.accountActive, + accountDisabled: userData.accountDisabled, + accountLocked: userData.accountLocked, + allowCopyUserRoles: userData.allowCopyUserRoles, + // cancelAction: userData.cancelAction, + // cancelMethod: userData.cancelMethod, + // confirmPassword: userData.confirmPassword, + expirationDate: userData.expirationDate, + // formAction: userData.formAction, + // formMethod: userData.formMethod, + // formName: userData.formName, + // globalRoles: userData.globalRoles, + // labUnitRoles: userData.labUnitRoles, + loginUserId: userData.loginUserId, + selectedRoles: userData.selectedRoles, + systemUserId: userData.systemUserId, + systemUserIdToCopy: copyUserPermission, + systemUserLastupdated: userData.systemUserLastupdated, + systemUsers: userData.systemUsers, + testSections: userData.testSections, + timeout: userData.timeout, + userFirstName: userData.userFirstName, + userLastName: userData.userLastName, + userLoginName: userData.userLoginName, + userPassword: userData.userPassword, + }; + setUserDataShow(userManagementInfoToShow); + setUserDataPost(userManagementInfoToPost); + + const globalRoles = userData.globalRoles.map((item) => { + return { + childrenID: item.childrenID, + elementID: item.elementID, + groupingRole: item.groupingRole, + nestingLevel: item.nestingLevel, + parentRole: item.parentRole, + roleId: item.roleId, + roleName: item.roleName, + }; + }); + + const labUnitRoles = userData.labUnitRoles.map((item) => { + return { + childrenID: item.childrenID, + elementID: item.elementID, + groupingRole: item.groupingRole, + nestingLevel: item.nestingLevel, + parentRole: item.parentRole, + roleId: item.roleId, + roleName: item.roleName, + }; + }); + + const testSections = userData.testSections.map((item) => { + return { + id: item.id, + value: item.value, + }; + }); + + setUserDataShow((userDataShow) => ({ + ...userDataShow, + globalRoles, + labUnitRoles, + testSections, + })); + + // const organizationSelectedTypeOfActivity = userData.selectedTypes.map( + // (item) => { + // return { + // id: item, + // }; + // }, + // ); + // const organizationSelectedTypeOfActivityListArray = Object.values( + // organizationSelectedTypeOfActivity, + // ); + // setOrgSelectedTypeOfActivity(organizationSelectedTypeOfActivityListArray); + } + }, [userData]); + + useEffect(() => { + if (userDataShow && userDataShow.accountLocked === "Y") { + setIsLocked("radio-1"); + } else { + setIsLocked("radio-2"); + } + }, [userDataShow]); + + useEffect(() => { + if (userDataShow && userDataShow.accountDisabled === "Y") { + setIsDisabled("radio-3"); + } else { + setIsDisabled("radio-4"); + } + }, [userDataShow]); + + useEffect(() => { + if (userDataShow && userDataShow.accountActive === "Y") { + setIsActive("radio-5"); + } else { + setIsActive("radio-6"); + } + }, [userDataShow]); + + function userSavePostCall(event) { + event.preventDefault(); + setIsLoading(true); + postToOpenElisServerJsonResponse( + `/rest/UnifiedSystemUser?ID=0&startingRecNo=1&roleFilter=`, + JSON.stringify(userDataPost), + userSavePostCallback(), + ); + } + + function userSavePostCallback() { + setIsLoading(false); + setNotificationVisible(true); + addNotification({ + title: intl.formatMessage({ + id: "notification.title", + }), + message: intl.formatMessage({ + id: "notification.organization.post.save.success", + }), + kind: NotificationKinds.success, + }); + // setTimeout(() => { + // window.location.reload(); + // }, 2000); + } + + function handleUserLoginNameChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + userLoginName: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + userLoginName: e.target.value, + })); + } + + function handleUserPasswordChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + userPassword: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + userPassword: e.target.value, + })); + } + + function handleConfirmPasswordChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + confirmPassword: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + confirmPassword: e.target.value, + })); + } + + function handleUserFirstNameChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + userFirstName: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + userFirstName: e.target.value, + })); + } + + function handleUserLastNameChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + userLastName: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + userLastName: e.target.value, + })); + } + + function handleExpirationDateChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + expirationDate: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + expirationDate: e.target.value, + })); + } + + function handleTimeoutChange(e) { + setSaveButton(false); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + timeout: e.target.value, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + timeout: e.target.value, + })); + } + + function handleCopyUserPermissionsChange(e) { + setSaveButton(false); + setCopyUserPermission(e.target.value); + } + + // need to make seperate copyUserPerChg function to manuplated data as expected + + function handleTestSectionsSelectChange(e) { + setTestSectionsSelect(e.target.value); + setSaveButton(false); + } + + if (!isLoading) { + return ( + <> + + + ); + } + return ( <> + {notificationVisible === true ? : ""}
@@ -57,7 +387,6 @@ function UserAddEdit() { - {/* {orgInfo && ( */} handleOrgNameChange(e)} + required={true} + value={ + userData && userData.userLoginName + ? userData.userLoginName + : "" + } + onChange={(e) => handleUserLoginNameChange(e)} /> - {/* )} */}
@@ -110,22 +440,24 @@ function UserAddEdit() { - {/* {orgInfo && ( */} - handleOrgNameChange(e)} + value={ + userData && userData.userPassword + ? userData.userPassword + : "" + } + onChange={(e) => handleUserPasswordChange(e)} /> - {/* )} */} @@ -136,22 +468,24 @@ function UserAddEdit() { - {/* {orgInfo && ( */} - handleOrgNameChange(e)} + value={ + userData && userData.confirmPassword + ? userData.confirmPassword + : "" + } + onChange={(e) => handleConfirmPasswordChange(e)} /> - {/* )} */}
@@ -164,7 +498,6 @@ function UserAddEdit() { - {/* {orgInfo && ( */} handleOrgNameChange(e)} + value={ + userData && userData.userFirstName + ? userData.userFirstName + : "" + } + onChange={(e) => handleUserFirstNameChange(e)} /> - {/* )} */} @@ -190,7 +526,6 @@ function UserAddEdit() { - {/* {orgInfo && ( */} handleOrgNameChange(e)} + value={ + userData && userData.userLastName + ? userData.userLastName + : "" + } + onChange={(e) => handleUserLastNameChange(e)} /> - {/* )} */} @@ -216,7 +554,6 @@ function UserAddEdit() { - {/* {orgInfo && ( */} handleOrgNameChange(e)} + value={ + userData && userData.expirationDate + ? userData.expirationDate + : "" + } + onChange={(e) => handleExpirationDateChange(e)} /> - {/* )} */} @@ -242,7 +582,6 @@ function UserAddEdit() { - {/* {orgInfo && ( */} handleOrgNameChange(e)} + value={ + userData && userData.timeout ? userData.timeout : "" + } + onChange={(e) => handleTimeoutChange(e)} /> - {/* )} */}
@@ -269,7 +609,10 @@ function UserAddEdit() { - + @@ -283,7 +626,10 @@ function UserAddEdit() { - + @@ -297,118 +643,226 @@ function UserAddEdit() { - + - -
-
-
- - -
+
+
+
+ +
- - - +
+ + + +
-
-
- -
- -
-
- -
-
- -
-
- -
-
- -
-
-
-
-
-
-
- - - <> - - * : - - - - {/* {orgInfo && ( */} - handleOrgNameChange(e)} - /> - {/* )} */} - + + +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+

- - -
-
- - - -
- +
+
+ + + <> + + * : + + + + {/* {userData && ( */} + + {/* )} */} +
-
- - - - {/* selectables */} - -
- - - {" "} - - - + +
+
+ + + +
+ +
+ +
+ + + + + +
+
+ + +
+
+ +
+ +
+ +
+ + + + +
+
+
+ + + {" "} + + + +
+ + + + + + ); } @@ -417,3 +871,6 @@ export default injectIntl(UserAddEdit); // name as props [ add / edit user ] // conditonal rendering +// expiration date fix +// radio button fixes +// copy permission fix diff --git a/frontend/src/components/admin/userManagement/UserManagement.js b/frontend/src/components/admin/userManagement/UserManagement.js index 1be3db96ec..1bfe07eb73 100644 --- a/frontend/src/components/admin/userManagement/UserManagement.js +++ b/frontend/src/components/admin/userManagement/UserManagement.js @@ -56,6 +56,9 @@ function UserManagement() { const [deactivateButton, setDeactivateButton] = useState(true); const [modifyButton, setModifyButton] = useState(true); const [selectedRowIds, setSelectedRowIds] = useState([]); + const [selectedRowCombinedUserID, setSelectedRowCombinedUserID] = useState( + [], + ); const [selectedRowIdsPost, setSelectedRowIdsPost] = useState(); const [isEveryRowIsChecked, setIsEveryRowIsChecked] = useState(false); const [rowsIsPartiallyChecked, setRowsIsPartiallyChecked] = useState(false); @@ -112,6 +115,7 @@ function UserManagement() { setPage(page); setPageSize(pageSize); setSelectedRowIds([]); + setSelectedRowCombinedUserID([]); }; const handleMenuItems = (res) => { @@ -152,6 +156,7 @@ function UserManagement() { const newUserManagementList = userManagementList.menuList.map((item) => { return { id: item.systemUserId, + combinedUserID: item.combinedUserID, firstName: item.firstName || "", lastName: item.lastName || "", loginName: item.loginName || "", @@ -173,6 +178,7 @@ function UserManagement() { (item) => { return { id: item.systemUserId, + combinedUserID: item.combinedUserID, firstName: item.firstName || "", lastName: item.lastName || "", loginName: item.loginName || "", @@ -247,8 +253,17 @@ function UserManagement() { setDeactivateButton(false); if (selectedRowIds.includes(row.id)) { setSelectedRowIds(selectedRowIds.filter((id) => id !== row.id)); + setSelectedRowCombinedUserID((prevIds) => + prevIds.filter( + (selectedId) => selectedId !== row.combinedUserID, + ), + ); } else { setSelectedRowIds([...selectedRowIds, row.id]); + setSelectedRowCombinedUserID((prevIds) => [ + ...prevIds, + row.combinedUserID, + ]); } }} /> @@ -322,7 +337,7 @@ function UserManagement() { + +
+
+

+ {fromRecordCount} -{" "} + {toRecordCount} {totalRecordCount}{" "} +

+
diff --git a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java index 294798b7fd..4be1ced38c 100644 --- a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java +++ b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java @@ -1,4 +1,4 @@ -package org.openelisglobal.systemuser.controller; +package org.openelisglobal.systemuser.controller.rest; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.validator.GenericValidator; import org.openelisglobal.common.action.IActionConstants; -import org.openelisglobal.common.constants.Constants; import org.openelisglobal.common.controller.BaseMenuController; import org.openelisglobal.common.exception.LIMSRuntimeException; import org.openelisglobal.common.form.AdminOptionMenuForm; @@ -34,19 +33,14 @@ import org.openelisglobal.userrole.valueholder.UserLabUnitRoles; import org.openelisglobal.userrole.valueholder.UserRole; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -// import org.springframework.web.servlet.ModelAndView; -// import org.springframework.web.servlet.mvc.support.RedirectAttributes; @RestController @RequestMapping("/rest") @@ -159,6 +153,10 @@ protected List createMenuList(AdminOptionMenuForm Date: Thu, 13 Jun 2024 18:27:33 +0530 Subject: [PATCH 04/16] BE fetching fixes + UI edge case fixes --- frontend/src/App.js | 8 + .../admin/userManagement/UserAddEdit.js | 311 ++++++++++++------ .../admin/userManagement/UserManagement.js | 220 +++++++------ frontend/src/languages/en.json | 4 +- frontend/src/languages/fr.json | 4 +- .../rest/UnifiedSystemUserRestController.java | 12 +- .../UnifiedSystemUserFormValidator.java | 5 +- 7 files changed, 359 insertions(+), 205 deletions(-) diff --git a/frontend/src/App.js b/frontend/src/App.js index eff531cd88..432bc77ef1 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -41,6 +41,8 @@ import NonConformIndex from "./components/nonconform/index"; import SampleBatchEntrySetup from "./components/batchOrderEntry/SampleBatchEntrySetup.js"; import AuditTrailReportIndex from "./components/reports/auditTrailReport/Index.js"; import ReferredOutTests from "./components/resultPage/resultsReferredOut/ReferredOutTests.js"; +import UserManagement from "./components/admin/userManagement/UserManagement.js"; +import UserAddEdit from "./components/admin/userManagement/UserAddEdit.js"; export default function App() { let i18nConfig = { @@ -221,6 +223,12 @@ export default function App() { component={() => } role="Global Administrator" /> + } + role="Global Administrator" + /> { - // window.location.assign("/MasterListsPage"); - // }, 1000); + if (!id) { + setTimeout(() => { + window.location.assign("/MasterListsPage"); + }, 1000); - // return ( - // <> - // - // - // ); - // } + return ( + <> + + + ); + } const handleUserData = (res) => { if (!res) { @@ -82,7 +94,7 @@ function UserAddEdit() { componentMounted.current = true; setIsLoading(true); getFromOpenElisServer( - `/rest/UnifiedSystemUser?ID=1-2&startingRecNo=1&roleFilter=`, + `/rest/UnifiedSystemUser?ID=${id}&startingRecNo=1&roleFilter=`, handleUserData, ); getFromOpenElisServer(`/rest/rest/users`, handleCopyUserPermissionsList); @@ -99,13 +111,13 @@ function UserAddEdit() { accountDisabled: userData.accountDisabled, accountLocked: userData.accountLocked, allowCopyUserRoles: userData.allowCopyUserRoles, - // cancelAction: userData.cancelAction, - // cancelMethod: userData.cancelMethod, + cancelAction: userData.cancelAction, + cancelMethod: userData.cancelMethod, confirmPassword: userData.confirmPassword, expirationDate: userData.expirationDate, - // formAction: userData.formAction, - // formMethod: userData.formMethod, - // formName: userData.formName, + formAction: userData.formAction, + formMethod: userData.formMethod, + formName: userData.formName, loginUserId: userData.loginUserId, selectedRoles: userData.selectedRoles, systemUserId: userData.systemUserId, @@ -179,48 +191,41 @@ function UserAddEdit() { }; }); + if (id !== "0") { + const selectedGlobalLabUniRoles = userData.selectedRoles.map( + (item) => item, + ); + setSelectedGlobalLabUnitRoles(selectedGlobalLabUniRoles); + } else { + setSelectedGlobalLabUnitRoles([]); + } + setUserDataShow((userDataShow) => ({ ...userDataShow, globalRoles, labUnitRoles, testSections, })); - - // const organizationSelectedTypeOfActivity = userData.selectedTypes.map( - // (item) => { - // return { - // id: item, - // }; - // }, - // ); - // const organizationSelectedTypeOfActivityListArray = Object.values( - // organizationSelectedTypeOfActivity, - // ); - // setOrgSelectedTypeOfActivity(organizationSelectedTypeOfActivityListArray); } }, [userData]); useEffect(() => { - if (userDataShow && userDataShow.accountLocked === "Y") { - setIsLocked("radio-1"); - } else { - setIsLocked("radio-2"); + if (userDataShow) { + setIsLocked(userDataShow.accountLocked === "Y" ? "radio-1" : "radio-2"); } }, [userDataShow]); useEffect(() => { - if (userDataShow && userDataShow.accountDisabled === "Y") { - setIsDisabled("radio-3"); - } else { - setIsDisabled("radio-4"); + if (userDataShow) { + setIsDisabled( + userDataShow.accountDisabled === "Y" ? "radio-3" : "radio-4", + ); } }, [userDataShow]); useEffect(() => { - if (userDataShow && userDataShow.accountActive === "Y") { - setIsActive("radio-5"); - } else { - setIsActive("radio-6"); + if (userDataShow) { + setIsActive(userDataShow.accountActive === "Y" ? "radio-5" : "radio-6"); } }, [userDataShow]); @@ -228,8 +233,8 @@ function UserAddEdit() { event.preventDefault(); setIsLoading(true); postToOpenElisServerJsonResponse( - `/rest/UnifiedSystemUser?ID=0&startingRecNo=1&roleFilter=`, - JSON.stringify(userDataPost), + `/rest/UnifiedSystemUser`, + JSON.stringify(userData), userSavePostCallback(), ); } @@ -347,6 +352,25 @@ function UserAddEdit() { setSaveButton(false); } + function handleCheckboxChange(roleId) { + let updatedRoles; + if (selectedGlobalLabUnitRoles.includes(roleId)) { + updatedRoles = selectedGlobalLabUnitRoles.filter((id) => id !== roleId); + } else { + updatedRoles = [...selectedGlobalLabUnitRoles, roleId]; + } + + setSelectedGlobalLabUnitRoles(updatedRoles); + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + selectedRoles: updatedRoles, + })); + setUserData((prevUserData) => ({ + ...prevUserData, + selectedRoles: updatedRoles, + })); + } + if (!isLoading) { return ( <> @@ -613,8 +637,18 @@ function UserAddEdit() { defaultSelected={isLocked} name="account-locked" > - - + + @@ -630,8 +664,18 @@ function UserAddEdit() { defaultSelected={isDisabled} name="account-disabled" > - - + + @@ -647,8 +691,18 @@ function UserAddEdit() { defaultSelected={isActive} name="account-isActive" > - - + + @@ -707,14 +761,22 @@ function UserAddEdit() { } onChange={(e) => handleCopyUserPermissionsChange(e)} > - + {copyUserPermissionList && copyUserPermissionList.length > 0 ? ( copyUserPermissionList.map((section) => ( - + )) ) : ( - + )} {/* )} */} @@ -733,27 +795,32 @@ function UserAddEdit() {
- -
- -
- - - - - + + {userDataShow && + userDataShow.globalRoles && + userDataShow.globalRoles.length > 0 ? ( + userDataShow.globalRoles.map((section) => ( + { + handleCheckboxChange(section.roleId); + }} + /> + )) + ) : ( + + )} +
@@ -772,29 +839,82 @@ function UserAddEdit() { } onChange={handleTestSectionsSelectChange} > - + {userDataShow && userDataShow.testSections && userDataShow.testSections.length > 0 ? ( userDataShow.testSections.map((section) => ( - + )) ) : ( - + )}
- + selectedGlobalLabUnitRoles.includes(num), + )} + onChange={() => { + const numbersToAdd = ["4", "5", "7", "10"]; + const updatedRoles = [...selectedGlobalLabUnitRoles]; + const numbersToRemove = numbersToAdd.filter((num) => + updatedRoles.includes(num), + ); + if (numbersToRemove.length > 0) { + numbersToRemove.forEach((num) => { + const index = updatedRoles.indexOf(num); + if (index !== -1) { + updatedRoles.splice(index, 1); + } + }); + } else { + updatedRoles.push(...numbersToAdd); + } + setSelectedGlobalLabUnitRoles(updatedRoles); + }} />
- -
- - - - + + {userDataShow && + userDataShow.labUnitRoles && + userDataShow.labUnitRoles.length > 0 ? ( + userDataShow.labUnitRoles.map((section) => ( + { + handleCheckboxChange(section.roleId); + }} + /> + )) + ) : ( + + )} +
@@ -837,10 +957,17 @@ function UserAddEdit() { + {" "} + + {" "} @@ -830,6 +965,8 @@ function UserAddEdit() {
+ +
@@ -838,23 +975,28 @@ function UserAddEdit() { id="select-3" noLabel={true} defaultValue={ - userDataShow && - userDataShow.testSections && - userDataShow.testSections.length > 0 - ? userDataShow.testSections[0].id + userData && + userData.testSections && + userData.testSections.length > 0 + ? userData.testSections[0].id : "" } - onChange={handleTestSectionsSelectChange} + onChange={(e) => { + handleTestSectionsSelectChange(e); + }} > { + handleTestSectionsSelectChange(e); + }} /> - {userDataShow && - userDataShow.testSections && - userDataShow.testSections.length > 0 ? ( - userDataShow.testSections.map((section) => ( + {userData && + userData.testSections && + userData.testSections.length > 0 ? ( + userData.testSections.map((section) => (
@@ -925,6 +1068,124 @@ function UserAddEdit() {
+ + + {!additionalGridAdded && ( + + + +
+ + selectedGlobalLabUnitRoles.includes(num), + )} + onChange={() => { + const numbersToAdd = ["4", "5", "7", "10"]; + const updatedRoles = [ + ...selectedGlobalLabUnitRoles, + ]; + const numbersToRemove = numbersToAdd.filter( + (num) => updatedRoles.includes(num), + ); + if (numbersToRemove.length > 0) { + numbersToRemove.forEach((num) => { + const index = updatedRoles.indexOf(num); + if (index !== -1) { + updatedRoles.splice(index, 1); + } + }); + } else { + updatedRoles.push(...numbersToAdd); + } + setSelectedGlobalLabUnitRoles(updatedRoles); + setSaveButton(false); + }} + /> +
+ + {userDataShow && + userDataShow.labUnitRoles && + userDataShow.labUnitRoles.length > 0 ? ( + userDataShow.labUnitRoles.map((section) => ( + { + handleCheckboxChange(section.roleId); + }} + /> + )) + ) : ( + + )} + +
+
+
+ )} +
+
+ {!additionalGridAdded && ( + + + + + + )} +
+ {" "} - {" "} - -
-
-

- {fromRecordCount} -{" "} - {toRecordCount} {totalRecordCount}{" "} -

-
@@ -937,7 +879,7 @@ function UserManagement() { onChange={handlePageChange} page={page} pageSize={pageSize} - pageSizes={[5, 10, 15, 20]} + pageSizes={[10, 20]} totalItems={userManagementListShow.length} forwardText={intl.formatMessage({ id: "pagination.forward", From ae3963d0c125fc81001bb8027346956631f8a867 Mon Sep 17 00:00:00 2001 From: "Aditya @ArchLinux" <132184385+adityadeshlahre@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:52:22 +0530 Subject: [PATCH 09/16] CI build fix 01 --- .../UnifiedSystemUserMenuRestController.java | 21 ++++++++++--------- .../rest/UnifiedSystemUserRestController.java | 11 +++++----- .../form/UnifiedSystemUserForm.java | 2 +- .../UnifiedSystemUserFormValidator.java | 1 - 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java index 02830036d2..ee4b867fef 100644 --- a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java +++ b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserMenuRestController.java @@ -5,9 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; - import javax.servlet.http.HttpServletRequest; - import org.apache.commons.lang3.StringUtils; import org.apache.commons.validator.GenericValidator; import org.openelisglobal.common.action.IActionConstants; @@ -36,11 +34,11 @@ import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @@ -80,8 +78,10 @@ public UnifiedSystemUserMenuForm showUnifiedSystemUserMenu(HttpServletRequest re form.setTestSections(testSections); String forward = performMenuAction(form, request); // request.setAttribute(IActionConstants.FORM_NAME, "unifiedSystemUserMenu"); - // request.setAttribute(IActionConstants.MENU_PAGE_INSTRUCTION, "user.select.instruction"); - // request.setAttribute(IActionConstants.MENU_OBJECT_TO_ADD, "label.button.new.user"); + // request.setAttribute(IActionConstants.MENU_PAGE_INSTRUCTION, + // "user.select.instruction"); + // request.setAttribute(IActionConstants.MENU_OBJECT_TO_ADD, + // "label.button.new.user"); // request.setAttribute(IActionConstants.APPLY_FILTER, "true"); if (FWD_FAIL.equals(forward)) { Errors errors = new BaseErrors(); @@ -90,9 +90,9 @@ public UnifiedSystemUserMenuForm showUnifiedSystemUserMenu(HttpServletRequest re // return findForward(FWD_FAIL, form); // result.addError(errors); return form; - } + } // else { - // return findForward(forward, form); + // return findForward(forward, form); // } return form; @@ -157,7 +157,7 @@ protected List createMenuList(AdminOptionMenuForm getAllRoles() { } @PostMapping(value = "/UnifiedSystemUser") - public Map showUpdateUnifiedSystemUser(HttpServletRequest request, @RequestBody @Valid UnifiedSystemUserForm form, BindingResult result) { + public Map showUpdateUnifiedSystemUser(HttpServletRequest request, + @RequestBody @Valid UnifiedSystemUserForm form, BindingResult result) { boolean doFiltering = true; formValidator.validate(form, result); Map response = new HashMap<>(); diff --git a/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java b/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java index 9c8d8e25af..d17c1239a2 100644 --- a/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java +++ b/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java @@ -1,5 +1,6 @@ package org.openelisglobal.systemuser.form; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.sql.Timestamp; import java.util.List; import javax.validation.constraints.NotBlank; @@ -14,7 +15,6 @@ import org.openelisglobal.validation.annotations.ValidDate; import org.openelisglobal.validation.annotations.ValidName; import org.openelisglobal.validation.constraintvalidator.NameValidator.NameType; -import com.fasterxml.jackson.annotation.JsonIgnore; public class UnifiedSystemUserForm extends BaseForm { @Pattern(regexp = ValidationHelper.ID_REGEX) diff --git a/src/main/java/org/openelisglobal/systemuser/validator/UnifiedSystemUserFormValidator.java b/src/main/java/org/openelisglobal/systemuser/validator/UnifiedSystemUserFormValidator.java index a50d6c3785..f205b06ae9 100644 --- a/src/main/java/org/openelisglobal/systemuser/validator/UnifiedSystemUserFormValidator.java +++ b/src/main/java/org/openelisglobal/systemuser/validator/UnifiedSystemUserFormValidator.java @@ -2,7 +2,6 @@ import org.openelisglobal.common.provider.validation.ILoginPasswordValidation; import org.openelisglobal.common.provider.validation.PasswordValidationFactory; -import org.openelisglobal.systemuser.controller.UnifiedSystemUserController; import org.openelisglobal.systemuser.controller.rest.UnifiedSystemUserRestController; import org.openelisglobal.systemuser.form.UnifiedSystemUserForm; import org.springframework.stereotype.Component; From 0f2d80cbdce62fbaeb8b9d0fe67b0dc550bd2588 Mon Sep 17 00:00:00 2001 From: "Aditya @ArchLinux" <132184385+adityadeshlahre@users.noreply.github.com> Date: Sat, 29 Jun 2024 05:12:06 +0530 Subject: [PATCH 10/16] selction + checkbox working --- .../admin/userManagement/UserAddModify.js | 517 +++++++++++------- .../rest/UnifiedSystemUserRestController.java | 44 +- .../form/UnifiedSystemUserForm.java | 12 + 3 files changed, 388 insertions(+), 185 deletions(-) diff --git a/frontend/src/components/admin/userManagement/UserAddModify.js b/frontend/src/components/admin/userManagement/UserAddModify.js index 4fc755a0f2..89ee41e11e 100644 --- a/frontend/src/components/admin/userManagement/UserAddModify.js +++ b/frontend/src/components/admin/userManagement/UserAddModify.js @@ -61,7 +61,9 @@ function UserAddModify() { const [selectedGlobalLabUnitRoles, setSelectedGlobalLabUnitRoles] = useState( [], ); - const [additionalGridAdded, setAdditionalGridAdded] = useState(false); + const [selectedTestSectionLabUnits, setSelectedTestSectionLabUnits] = + useState({}); + // const [additionalGridAdded, setAdditionalGridAdded] = useState(false); const ID = (() => { const hash = window.location.hash; @@ -134,6 +136,7 @@ function UserAddModify() { formName: userData.formName, loginUserId: userData.loginUserId, selectedRoles: userData.selectedRoles, + selectedTestSectionLabUnits: userData.selectedTestSectionLabUnits, systemUserId: userData.systemUserId, systemUserIdToCopy: userData.systemUserIdToCopy, systemUserLastupdated: userData.systemUserLastupdated, @@ -160,6 +163,7 @@ function UserAddModify() { labUnitRoles: userData.labUnitRoles, loginUserId: userData.loginUserId, selectedRoles: userData.selectedRoles, + selectedTestSectionLabUnits: userData.selectedTestSectionLabUnits, systemUserId: userData.systemUserId, systemUserIdToCopy: userData.systemUserIdToCopy, systemUserLastupdated: userData.systemUserLastupdated, @@ -216,9 +220,13 @@ function UserAddModify() { value: item.value, }; }); + const updatedTestSections = [ + { id: "AllLabUnits", value: "All Lab Units" }, + ...testSections, + ]; setUserDataShow((prevUserDataShow) => ({ ...prevUserDataShow, - testSections: testSections, + testSections: updatedTestSections, })); } @@ -232,6 +240,14 @@ function UserAddModify() { setSelectedGlobalLabUnitRoles([]); } } + + if (userData.selectedTestSectionLabUnits) { + if (ID !== "0") { + setSelectedTestSectionLabUnits(userData.selectedTestSectionLabUnits); + } else { + setSelectedTestSectionLabUnits({}); + } + } } }, [userData]); @@ -250,7 +266,7 @@ function UserAddModify() { setIsLoading(true); postToOpenElisServerJsonResponse( `/rest/UnifiedSystemUser`, - JSON.stringify(userData), + JSON.stringify(userDataPost), userSavePostCallback(), ); } @@ -414,6 +430,7 @@ function UserAddModify() { allowCopyUserRoles: "Y", })); setSaveButton(false); + userSavePostCall(); } function handleTestSectionsSelectChange(e) { @@ -472,24 +489,111 @@ function UserAddModify() { setSaveButton(false); } - useEffect(() => { - if (userDataShow && userDataShow.testSections) { - if ( - userDataShow.testSections.length > 0 && - testSectionsSelectArray.length > 0 - ) { - setAdditionalGridAdded(false); - } else { - setAdditionalGridAdded(true); - } + function handleTestSectionsSelectChange2(e) { + const selectedValue = e.target.value; + let updatedTestSectionLabUnits = { ...selectedTestSectionLabUnits }; + + if (!Object.keys(updatedTestSectionLabUnits).includes(selectedValue)) { + updatedTestSectionLabUnits[selectedValue] = []; + } else { + delete updatedTestSectionLabUnits[selectedValue]; + } + + setSelectedTestSectionLabUnits(updatedTestSectionLabUnits); + + const index = userDataShow.testSections.findIndex( + (item) => item.id === selectedValue, + ); + if (index !== -1) { + const updatedArray = [...userDataShow.testSections]; + updatedArray.splice(index, 1); + setUserDataShow({ ...userDataShow, testSections: updatedArray }); } - }, [additionalGridAdded, userDataShow, userData]); - const toggleAdditionalGrid = () => { - if (userDataShow.testSections.length === 0) { - setAdditionalGridAdded(false); + + setTestSectionsSelect(selectedValue); + setSaveButton(false); + } + + function handleCheckboxChange2(sectionKey, roleId) { + console.error(sectionKey); + let updatedTestSectionLabUnits = { ...selectedTestSectionLabUnits }; + + if (!updatedTestSectionLabUnits[sectionKey]) { + updatedTestSectionLabUnits[sectionKey] = []; + } + + if (updatedTestSectionLabUnits[sectionKey].includes(roleId)) { + updatedTestSectionLabUnits[sectionKey] = updatedTestSectionLabUnits[ + sectionKey + ].filter((id) => id !== roleId); } else { - setAdditionalGridAdded(true); + updatedTestSectionLabUnits[sectionKey].push(roleId); } + + setSelectedTestSectionLabUnits(updatedTestSectionLabUnits); + + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + selectedTestSectionLabUnits: updatedTestSectionLabUnits, + })); + + setUserDataShow((prevUserData) => ({ + ...prevUserData, + selectedTestSectionLabUnits: updatedTestSectionLabUnits, + })); + + setUserData((prevUserData) => ({ + ...prevUserData, + selectedTestSectionLabUnits: updatedTestSectionLabUnits, + })); + + setSaveButton(false); + } + + // useEffect(() => { + // if (userDataShow && userDataShow.testSections) { + // if ( + // userDataShow.testSections.length > 0 && + // testSectionsSelectArray.length > 0 + // ) { + // setAdditionalGridAdded(false); + // } else { + // setAdditionalGridAdded(true); + // } + // } + // }, [additionalGridAdded, userDataShow, userData]); + + // const toggleAdditionalGrid = () => { + // if (userDataShow.testSections.length === 0) { + // setAdditionalGridAdded(false); + // } else { + // setAdditionalGridAdded(true); + // } + // }; + + const addRoleToSelectedUnits = (key, roleIdToAdd) => { + setSelectedTestSectionLabUnits((prevUnits) => { + const updatedUnits = { ...prevUnits }; + const currentRoles = updatedUnits[key] || []; + if (!currentRoles.includes(roleIdToAdd)) { + updatedUnits[key] = [...currentRoles, roleIdToAdd]; + setSaveButton(false); + } + return updatedUnits; + }); + }; + + const removeRoleFromSelectedUnits = (key, roleIdToRemove) => { + setSelectedTestSectionLabUnits((prevUnits) => { + const updatedUnits = { ...prevUnits }; + if (updatedUnits[key]) { + updatedUnits[key] = updatedUnits[key].filter( + (roleId) => roleId !== roleIdToRemove, + ); + setSaveButton(false); + } + return updatedUnits; + }); }; if (!isLoading) { @@ -965,7 +1069,8 @@ function UserAddModify() {
- +
+ {/*
@@ -1066,125 +1171,160 @@ function UserAddModify() {
-
+
*/} +
- {!additionalGridAdded && ( - - - 0 + // ? userDataShow.testSections[0].id + // : "" + // } + defaultValue={ + userDataShow && userDataShow.testSections && - userDataShow.testSections.length > 0 ? ( - userDataShow.testSections.map((section) => ( - - )) - ) : ( + userDataShow.testSections.length > 0 + ? userDataShow.testSections.find( + (section) => section.id === key, + )?.id || userDataShow.testSections[0].id + : "" + } + // onChange={handleTestSectionsSelectChange2} + onChange={(e) => handleTestSectionsSelectChange2(e)} + > + {userDataShow && + userDataShow.testSections && + userDataShow.testSections.length > 0 ? ( + userDataShow.testSections.map((section) => ( - )} - -
- - selectedGlobalLabUnitRoles.includes(num), - )} - onChange={() => { - const numbersToAdd = ["4", "5", "7", "10"]; - const updatedRoles = [ - ...selectedGlobalLabUnitRoles, - ]; - const numbersToRemove = numbersToAdd.filter( - (num) => updatedRoles.includes(num), - ); - if (numbersToRemove.length > 0) { - numbersToRemove.forEach((num) => { - const index = updatedRoles.indexOf(num); - if (index !== -1) { - updatedRoles.splice(index, 1); - } - }); - } else { - updatedRoles.push(...numbersToAdd); - } - setSelectedGlobalLabUnitRoles(updatedRoles); - setSaveButton(false); - }} - /> -
- - {userDataShow && - userDataShow.labUnitRoles && - userDataShow.labUnitRoles.length > 0 ? ( - userDataShow.labUnitRoles.map((section) => ( - { - handleCheckboxChange(section.roleId); - }} - /> - )) - ) : ( + )) + ) : ( + + )} + +
+ + selectedTestSectionLabUnits[key] && + selectedTestSectionLabUnits[key].includes(num), + )} + onChange={() => { + const numbersToAdd = ["4", "5", "7", "10"]; + const updatedRoles = selectedTestSectionLabUnits[ + key + ] + ? [...selectedTestSectionLabUnits[key]] + : []; + const numbersToRemove = numbersToAdd.filter((num) => + updatedRoles.includes(num), + ); + if (numbersToRemove.length > 0) { + numbersToRemove.forEach((num) => { + const index = updatedRoles.indexOf(num); + if (index !== -1) { + updatedRoles.splice(index, 1); + } + }); + } else { + updatedRoles.push(...numbersToAdd); + } + setSelectedTestSectionLabUnits((prev) => ({ + ...prev, + [key]: updatedRoles, + })); + setSaveButton(false); + }} + /> + + {userDataShow && + userDataShow.labUnitRoles && + userDataShow.labUnitRoles.length > 0 ? ( + userDataShow.labUnitRoles.map((section) => ( { + if ( + selectedTestSectionLabUnits[key]?.includes( + section.roleId, + ) + ) { + removeRoleFromSelectedUnits( + key, + section.roleId, + ); + } else { + addRoleToSelectedUnits(key, section.roleId); + } + }} /> - )} - -
-
-
- )} + )) + ) : ( + + )} + +
+
+ ))} + +
+ + + - {!additionalGridAdded && ( - - - - - - )} +

+ {/* test block end */}
+ + + + + + + + +
- - - - - - - - ); } @@ -1277,3 +1424,5 @@ export default injectIntl(UserAddModify); // on change of checkbox need a fix // adding another permission if ( all permission is not selected ) // checkBox function destructuer +// dynamic addition of add permission is needed +// need to handle AllLabUnits case diff --git a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java index 3716c730fe..4f0eeab934 100644 --- a/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java +++ b/src/main/java/org/openelisglobal/systemuser/controller/rest/UnifiedSystemUserRestController.java @@ -43,6 +43,7 @@ import org.openelisglobal.systemuser.validator.UnifiedSystemUserFormValidator; import org.openelisglobal.systemuser.valueholder.SystemUser; import org.openelisglobal.systemuser.valueholder.UnifiedSystemUser; +import org.openelisglobal.test.service.TestSectionService; import org.openelisglobal.userrole.service.UserRoleService; import org.openelisglobal.userrole.valueholder.LabUnitRoleMap; import org.openelisglobal.userrole.valueholder.UserLabUnitRoles; @@ -93,6 +94,8 @@ public class UnifiedSystemUserRestController extends BaseController { private UserModuleService userModuleService; @Autowired private UserService userService; + @Autowired + private TestSectionService testSectionService; // private static final String RESERVED_ADMIN_NAME = "admin"; private static String GLOBAL_ADMIN_ID; @@ -654,6 +657,30 @@ private void saveUserLabUnitRoles(SystemUser user, UnifiedSystemUserForm form, S userService.saveUserLabUnitRoles(user, selectedLabUnitRolesMap, loggedOnUserId); } + // private void setLabunitRolesForExistingUser(UnifiedSystemUserForm form) { + // UserLabUnitRoles roles = + // userService.getUserLabUnitRoles(form.getSystemUserId()); + // if (roles != null) { + // Set roleMaps = roles.getLabUnitRoleMap(); + // List userLabUnits = new ArrayList<>(); + // roleMaps.forEach(map -> userLabUnits.add(map.getLabUnit())); + // JSONObject userLabData = new JSONObject(); + // if (userLabUnits.contains(ALL_LAB_UNITS)) { + // roleMaps.stream().filter(map -> + // map.getLabUnit().equals(ALL_LAB_UNITS)).forEach( + // map -> userLabData.put(map.getLabUnit(), + // map.getRoles().stream().collect(Collectors.toList()))); + // } else { + // for (LabUnitRoleMap map : roleMaps) { + // userLabData.put(map.getLabUnit(), + // map.getRoles().stream().collect(Collectors.toList())); + // } + // } + + // form.setUserLabRoleData(userLabData); + // } + // } + private void setLabunitRolesForExistingUser(UnifiedSystemUserForm form) { UserLabUnitRoles roles = userService.getUserLabUnitRoles(form.getSystemUserId()); if (roles != null) { @@ -669,8 +696,23 @@ private void setLabunitRolesForExistingUser(UnifiedSystemUserForm form) { userLabData.put(map.getLabUnit(), map.getRoles().stream().collect(Collectors.toList())); } } - form.setUserLabRoleData(userLabData); + + Map> userTestSectionLabUnits = new HashMap<>(); + if (userLabUnits.contains(ALL_LAB_UNITS)) { + roleMaps.stream().filter(map -> map.getLabUnit().equals(ALL_LAB_UNITS)) + .forEach(map -> userTestSectionLabUnits.put(map.getLabUnit(), map.getRoles().stream() + .map(r -> roleService.getRoleById(r).getId().trim()).collect(Collectors.toList()))); + } else { + for (LabUnitRoleMap map : roleMaps) { + userTestSectionLabUnits.put(testSectionService.get(map.getLabUnit()).getId(), map.getRoles() + .stream().map(r -> roleService.getRoleById(r).getId().trim()).collect(Collectors.toList())); + } + } + + System.out.println(userTestSectionLabUnits); + + form.setSelectedTestSectionLabUnits(userTestSectionLabUnits); } } diff --git a/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java b/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java index d17c1239a2..f5d1e32bd2 100644 --- a/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java +++ b/src/main/java/org/openelisglobal/systemuser/form/UnifiedSystemUserForm.java @@ -2,7 +2,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import java.sql.Timestamp; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.json.JSONArray; @@ -297,4 +299,14 @@ public String getAllowCopyUserRoles() { public void setAllowCopyUserRoles(String allowCopyUserRoles) { this.allowCopyUserRoles = allowCopyUserRoles; } + + private Map> selectedTestSectionLabUnits = new HashMap<>(); + + public Map> getSelectedTestSectionLabUnits() { + return selectedTestSectionLabUnits; + } + + public void setSelectedTestSectionLabUnits(Map> selectedTestSectionLabUnits) { + this.selectedTestSectionLabUnits = selectedTestSectionLabUnits; + } } From 8b00e71e49d3cef40b57f3db6d749b609de72bac Mon Sep 17 00:00:00 2001 From: "Aditya @ArchLinux" <132184385+adityadeshlahre@users.noreply.github.com> Date: Sun, 30 Jun 2024 05:03:13 +0530 Subject: [PATCH 11/16] most complex edge case fixed --- .../admin/userManagement/UserAddModify.js | 362 ++++++------------ frontend/src/languages/en.json | 1 + frontend/src/languages/fr.json | 1 + 3 files changed, 117 insertions(+), 247 deletions(-) diff --git a/frontend/src/components/admin/userManagement/UserAddModify.js b/frontend/src/components/admin/userManagement/UserAddModify.js index 89ee41e11e..ea09da86a9 100644 --- a/frontend/src/components/admin/userManagement/UserAddModify.js +++ b/frontend/src/components/admin/userManagement/UserAddModify.js @@ -54,7 +54,6 @@ function UserAddModify() { const [copyUserPermission, setCopyUserPermission] = useState("0"); const [copyUserPermissionList, setCopyUserPermissionList] = useState(null); const [testSectionsSelect, setTestSectionsSelect] = useState("AllLabUnits"); - const [testSectionsSelectArray, setTestSectionsSelectArray] = useState([]); const [userData, setUserData] = useState(null); const [userDataShow, setUserDataShow] = useState({}); const [userDataPost, setUserDataPost] = useState(null); @@ -63,7 +62,6 @@ function UserAddModify() { ); const [selectedTestSectionLabUnits, setSelectedTestSectionLabUnits] = useState({}); - // const [additionalGridAdded, setAdditionalGridAdded] = useState(false); const ID = (() => { const hash = window.location.hash; @@ -261,31 +259,44 @@ function UserAddModify() { } }, [userDataShow]); - function userSavePostCall(event) { - event.preventDefault(); + function userSavePostCall() { setIsLoading(true); postToOpenElisServerJsonResponse( `/rest/UnifiedSystemUser`, JSON.stringify(userDataPost), - userSavePostCallback(), + (res) => { + userSavePostCallback(res); + }, ); } - function userSavePostCallback() { - setIsLoading(false); - setNotificationVisible(true); - addNotification({ - title: intl.formatMessage({ - id: "notification.title", - }), - message: intl.formatMessage({ - id: "notification.organization.post.save.success", - }), - kind: NotificationKinds.success, - }); - setTimeout(() => { - window.location.reload(); - }, 2000); + function userSavePostCallback(res) { + if (res) { + setIsLoading(false); + addNotification({ + title: intl.formatMessage({ + id: "notification.title", + }), + message: intl.formatMessage({ + id: "notification.organization.post.save.success", + }), + kind: NotificationKinds.success, + }); + setNotificationVisible(true); + // setTimeout(() => { + // window.location.reload(); + // }, 2000); + } else { + addNotification({ + kind: NotificationKinds.error, + title: intl.formatMessage({ id: "notification.title" }), + message: intl.formatMessage({ id: "server.error.msg" }), + }); + setNotificationVisible(true); + // setTimeout(() => { + // window.location.reload(); + // }, 2000); + } } function handleUserLoginNameChange(e) { @@ -433,30 +444,6 @@ function UserAddModify() { userSavePostCall(); } - function handleTestSectionsSelectChange(e) { - const selectedValue = e.target.value; - if (!testSectionsSelectArray.includes(selectedValue)) { - setTestSectionsSelectArray([...testSectionsSelectArray, selectedValue]); - } else { - const updatedArray = testSectionsSelectArray.filter( - (value) => value !== selectedValue, - ); - setTestSectionsSelectArray(updatedArray); - } - - const index = userDataShow.testSections.findIndex( - (item) => item.id === selectedValue, - ); - if (index !== -1) { - const updatedArray = [...userDataShow.testSections]; - updatedArray.splice(index, 1); - setUserDataShow({ ...userDataShow, testSections: updatedArray }); - } - - setTestSectionsSelect(selectedValue); - setSaveButton(false); - } - function handleCheckboxChange(roleId) { const numberToUpdate = ["71", "72", "73", "11", "2"]; let updatedRoles = [...selectedGlobalLabUnitRoles]; @@ -489,8 +476,17 @@ function UserAddModify() { setSaveButton(false); } - function handleTestSectionsSelectChange2(e) { + function handleTestSectionsSelectChange(e, key) { const selectedValue = e.target.value; + + if (Object.keys(selectedTestSectionLabUnits).includes(selectedValue)) { + alert(`Section ${selectedValue} is already selected.`); + const updatedSelections = { ...selectedTestSectionLabUnits }; + delete updatedSelections[selectedValue]; + setSelectedTestSectionLabUnits(updatedSelections); + return; + } + let updatedTestSectionLabUnits = { ...selectedTestSectionLabUnits }; if (!Object.keys(updatedTestSectionLabUnits).includes(selectedValue)) { @@ -499,78 +495,16 @@ function UserAddModify() { delete updatedTestSectionLabUnits[selectedValue]; } - setSelectedTestSectionLabUnits(updatedTestSectionLabUnits); - - const index = userDataShow.testSections.findIndex( - (item) => item.id === selectedValue, - ); - if (index !== -1) { - const updatedArray = [...userDataShow.testSections]; - updatedArray.splice(index, 1); - setUserDataShow({ ...userDataShow, testSections: updatedArray }); - } - - setTestSectionsSelect(selectedValue); - setSaveButton(false); - } - - function handleCheckboxChange2(sectionKey, roleId) { - console.error(sectionKey); - let updatedTestSectionLabUnits = { ...selectedTestSectionLabUnits }; - - if (!updatedTestSectionLabUnits[sectionKey]) { - updatedTestSectionLabUnits[sectionKey] = []; - } - - if (updatedTestSectionLabUnits[sectionKey].includes(roleId)) { - updatedTestSectionLabUnits[sectionKey] = updatedTestSectionLabUnits[ - sectionKey - ].filter((id) => id !== roleId); - } else { - updatedTestSectionLabUnits[sectionKey].push(roleId); + if (key !== selectedValue) { + delete updatedTestSectionLabUnits[key]; } setSelectedTestSectionLabUnits(updatedTestSectionLabUnits); - setUserDataPost((prevUserDataPost) => ({ - ...prevUserDataPost, - selectedTestSectionLabUnits: updatedTestSectionLabUnits, - })); - - setUserDataShow((prevUserData) => ({ - ...prevUserData, - selectedTestSectionLabUnits: updatedTestSectionLabUnits, - })); - - setUserData((prevUserData) => ({ - ...prevUserData, - selectedTestSectionLabUnits: updatedTestSectionLabUnits, - })); - + setTestSectionsSelect(selectedValue); setSaveButton(false); } - // useEffect(() => { - // if (userDataShow && userDataShow.testSections) { - // if ( - // userDataShow.testSections.length > 0 && - // testSectionsSelectArray.length > 0 - // ) { - // setAdditionalGridAdded(false); - // } else { - // setAdditionalGridAdded(true); - // } - // } - // }, [additionalGridAdded, userDataShow, userData]); - - // const toggleAdditionalGrid = () => { - // if (userDataShow.testSections.length === 0) { - // setAdditionalGridAdded(false); - // } else { - // setAdditionalGridAdded(true); - // } - // }; - const addRoleToSelectedUnits = (key, roleIdToAdd) => { setSelectedTestSectionLabUnits((prevUnits) => { const updatedUnits = { ...prevUnits }; @@ -596,6 +530,47 @@ function UserAddModify() { }); }; + const addNewSection = () => { + const newIds = userDataShow.testSections + .filter( + (section) => + !Object.keys(selectedTestSectionLabUnits).includes(section.id), + ) + .map((section) => section.id); + + if (newIds.length > 0) { + setSelectedTestSectionLabUnits((prev) => ({ + ...prev, + [newIds[0]]: [], + })); + } + }; + + const removeSection = (keyToRemove) => { + const updatedSections = { ...selectedTestSectionLabUnits }; + delete updatedSections[keyToRemove]; + setSelectedTestSectionLabUnits(updatedSections); + }; + + useEffect(() => { + if (selectedTestSectionLabUnits) { + setUserDataPost((prevUserDataPost) => ({ + ...prevUserDataPost, + selectedTestSectionLabUnits: selectedTestSectionLabUnits, + })); + + setUserDataShow((prevUserData) => ({ + ...prevUserData, + selectedTestSectionLabUnits: selectedTestSectionLabUnits, + })); + + setUserData((prevUserData) => ({ + ...prevUserData, + selectedTestSectionLabUnits: selectedTestSectionLabUnits, + })); + } + }, [selectedTestSectionLabUnits]); + if (!isLoading) { return ( <> @@ -1069,133 +1044,23 @@ function UserAddModify() {
-
- {/* - - -
-
- -
- - selectedGlobalLabUnitRoles.includes(num), - )} - onChange={() => { - const numbersToAdd = ["4", "5", "7", "10"]; - const updatedRoles = [...selectedGlobalLabUnitRoles]; - const numbersToRemove = numbersToAdd.filter((num) => - updatedRoles.includes(num), - ); - if (numbersToRemove.length > 0) { - numbersToRemove.forEach((num) => { - const index = updatedRoles.indexOf(num); - if (index !== -1) { - updatedRoles.splice(index, 1); - } - }); - } else { - updatedRoles.push(...numbersToAdd); - } - setSelectedGlobalLabUnitRoles(updatedRoles); - setSaveButton(false); - }} - /> -
- - {userDataShow && - userDataShow.labUnitRoles && - userDataShow.labUnitRoles.length > 0 ? ( - userDataShow.labUnitRoles.map((section) => ( - { - handleCheckboxChange(section.roleId); - }} - /> - )) - ) : ( - - )} - -
-
-
*/} -
- {/* test block start */} -

<> {Object.keys(selectedTestSectionLabUnits).map((key) => ( - + - {/* { key === userDataShow.testSections[0].id ? :} */}