diff --git a/src/components/TypeAheadSelect.tsx b/src/components/TypeAheadSelect.tsx index 249bdf3d..63f1f86e 100644 --- a/src/components/TypeAheadSelect.tsx +++ b/src/components/TypeAheadSelect.tsx @@ -40,6 +40,11 @@ const TypeAheadSelect = (props: PropsToTypeAheadSelect) => { setSelectOptions(props.options); }, [props.options]); + // Keep the selected value updated + React.useEffect(() => { + setInputValue(props.selected); + }, [props.selected]); + React.useEffect(() => { let newSelectOptions: SelectOptionProps[] = props.options; diff --git a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx index 9558077f..012576af 100644 --- a/src/pages/AutoMemUserRules/AutoMemUserRules.tsx +++ b/src/pages/AutoMemUserRules/AutoMemUserRules.tsx @@ -1,6 +1,7 @@ import React from "react"; // PatternFly import { + Button, Page, PageSection, PageSectionVariants, @@ -34,7 +35,11 @@ import useApiError from "src/hooks/useApiError"; import GlobalErrors from "src/components/errors/GlobalErrors"; // RPC import { GenericPayload } from "src/services/rpc"; -import { useSearchUserGroupRulesEntriesMutation } from "src/services/rpcAutomember"; +import { + useSearchUserGroupRulesEntriesMutation, + ChangeDefaultPayload, + useChangeDefaultGroupMutation, +} from "src/services/rpcAutomember"; // Hooks import { useAlerts } from "src/hooks/useAlerts"; import useUpdateRoute from "src/hooks/useUpdateRoute"; @@ -51,6 +56,7 @@ import { SerializedError } from "@reduxjs/toolkit"; // Modals import AddRule from "src/components/modals/Automember/AddRule"; import DeleteRule from "src/components/modals/Automember/DeleteRule"; +import ConfirmationModal from "src/components/modals/ConfirmationModal"; // Automembership user group rules const AutoMemUserRules = () => { @@ -76,6 +82,8 @@ const AutoMemUserRules = () => { AutomemberEntry[] >([]); const [defaultGroup, setDefaultGroup] = React.useState(NO_SELECTION); + const [previousDefaultGroup, setPreviousDefaultGroup] = + React.useState(NO_SELECTION); const [errors, setErrors] = React.useState< Array >([]); @@ -103,6 +111,7 @@ const AutoMemUserRules = () => { // API calls via custom hook const userGroupRulesData = useUserGroupsRulesData(); + const [changeDefaultGroup] = useChangeDefaultGroupMutation(); // Show table rows const [showTableRows, setShowTableRows] = React.useState( @@ -137,10 +146,12 @@ const AutoMemUserRules = () => { setUserGroups(userGroupRulesData.userGroups); setAutomemberRules(shownPaginatedRulesList); // If no default group is set, set it as 'No selection' - if (defaultGroup === "") { + if (userGroupRulesData.defaultGroup === "") { setDefaultGroup(NO_SELECTION); + setPreviousDefaultGroup(NO_SELECTION); } else { setDefaultGroup(userGroupRulesData.defaultGroup); + setPreviousDefaultGroup(userGroupRulesData.defaultGroup); } // Set table count @@ -176,6 +187,32 @@ const AutoMemUserRules = () => { } }, [userGroups]); + // On select default group + const onSelectDefaultGroup = (group: string) => { + const payload: ChangeDefaultPayload = { + defaultGroup: group, + type: "group", + }; + changeDefaultGroup(payload).then((result) => { + if ("data" in result) { + setDefaultGroup(group); + setPreviousDefaultGroup(group); + alerts.addAlert( + "default-group-success", + "Default group updated", + "success" + ); + onCloseConfirmationModal(); + } else { + alerts.addAlert( + "default-group-failure", + "Default group not updated", + "danger" + ); + } + }); + }; + // If some entries' status has been updated, unselect selected rows const [isDisableEnableOp, setIsDisableEnableOp] = React.useState(false); @@ -390,6 +427,8 @@ const AutoMemUserRules = () => { // Modals functionality const [showAddModal, setShowAddModal] = React.useState(false); const [showDeleteModal, setShowDeleteModal] = React.useState(false); + const [showChangeConfirmationModal, setShowChangeConfirmationModal] = + React.useState(false); const onOpenAddModal = () => { setShowAddModal(true); @@ -411,6 +450,24 @@ const AutoMemUserRules = () => { setShowDeleteModal(!showDeleteModal); }; + const onCloseConfirmationModal = () => { + setShowChangeConfirmationModal(false); + }; + + const onOpenConfirmationModal = () => { + setShowChangeConfirmationModal(true); + }; + + const onShowDefaultGroupOnModal = (group: string) => { + setDefaultGroup(group); + onOpenConfirmationModal(); + }; + + const onCancelDefaultGroup = () => { + setDefaultGroup(previousDefaultGroup); + onCloseConfirmationModal(); + }; + // 'Delete automember rules data const deleteButtonsData = { updateIsDeleteButtonDisabled, @@ -458,7 +515,7 @@ const AutoMemUserRules = () => { options={userGroupsOptions} selected={defaultGroup} placeholder="Default user group" - onSelectedChange={setDefaultGroup} + onSelectedChange={onShowDefaultGroupOnModal} /> ), }, @@ -584,6 +641,27 @@ const AutoMemUserRules = () => { buttonsData={deleteButtonsData} selectedData={selectedData} /> + { + onSelectDefaultGroup(defaultGroup); + }} + > + OK + , + + Cancel + , + ]} + messageText="Are you sure you want to change default group?" + messageObj={defaultGroup} + /> ); }; diff --git a/src/services/rpcAutomember.ts b/src/services/rpcAutomember.ts index 5ef20c01..b0862d16 100644 --- a/src/services/rpcAutomember.ts +++ b/src/services/rpcAutomember.ts @@ -49,6 +49,10 @@ export interface RemovePayload { type: string; } +export interface ChangeDefaultPayload { + defaultGroup: string; + type: string; +} const extendedApi = api.injectEndpoints({ endpoints: (build) => ({ @@ -227,10 +231,7 @@ const extendedApi = api.injectEndpoints({ * @param AddPayload * @returns FindRPCResponse */ - addToAutomember: build.mutation< - FindRPCResponse, - AddPayload - >({ + addToAutomember: build.mutation({ query: (payload) => { const params = [[payload.group], { type: payload.type }]; return getCommand({ @@ -244,10 +245,7 @@ const extendedApi = api.injectEndpoints({ * @param RemovePayload * @returns BatchRPCResponse */ - deleteFromAutomember: build.mutation< - BatchRPCResponse, - RemovePayload - >({ + deleteFromAutomember: build.mutation({ query: (payload) => { const rulesToDelete = payload.groups; const params = [rulesToDelete, { type: payload.type }]; @@ -260,6 +258,27 @@ const extendedApi = api.injectEndpoints({ return getBatchCommand([batchParams], API_VERSION_BACKUP); }, }), + /** + * Changes default group for automember + * @param ChangeDefaultPayload + * @returns FindRPCResponse + */ + changeDefaultGroup: build.mutation({ + query: (payload) => { + const params = [ + [], + { + type: payload.type, + automemberdefaultgroup: payload.defaultGroup, + version: API_VERSION_BACKUP, + }, + ]; + return getCommand({ + method: "automember_default_group_set", + params: params, + }); + }, + }), }), overrideExisting: false, }); @@ -277,4 +296,5 @@ export const { useAutomemberFindBasicInfoQuery, useAddToAutomemberMutation, useDeleteFromAutomemberMutation, + useChangeDefaultGroupMutation, } = extendedApi;