Skip to content

Commit

Permalink
'Default group' selector's functionality
Browse files Browse the repository at this point in the history
The Selector located in the toolbar should show
the default group in the automembers page. This
functionality should also allow to modify the
default group via API command and show the new
one.

Signed-off-by: Carla Martinez <[email protected]>
  • Loading branch information
carma12 committed Jan 31, 2025
1 parent 9d81088 commit b48e0c1
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 11 deletions.
5 changes: 5 additions & 0 deletions src/components/TypeAheadSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
84 changes: 81 additions & 3 deletions src/pages/AutoMemUserRules/AutoMemUserRules.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React from "react";
// PatternFly
import {
Button,
Page,
PageSection,
PageSectionVariants,
Expand Down Expand Up @@ -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";
Expand All @@ -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 = () => {
Expand All @@ -76,6 +82,8 @@ const AutoMemUserRules = () => {
AutomemberEntry[]
>([]);
const [defaultGroup, setDefaultGroup] = React.useState<string>(NO_SELECTION);
const [previousDefaultGroup, setPreviousDefaultGroup] =
React.useState<string>(NO_SELECTION);
const [errors, setErrors] = React.useState<
Array<FetchBaseQueryError | SerializedError>
>([]);
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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,
Expand Down Expand Up @@ -458,7 +515,7 @@ const AutoMemUserRules = () => {
options={userGroupsOptions}
selected={defaultGroup}
placeholder="Default user group"
onSelectedChange={setDefaultGroup}
onSelectedChange={onShowDefaultGroupOnModal}
/>
),
},
Expand Down Expand Up @@ -584,6 +641,27 @@ const AutoMemUserRules = () => {
buttonsData={deleteButtonsData}
selectedData={selectedData}
/>
<ConfirmationModal
title="Default user group"
isOpen={showChangeConfirmationModal}
onClose={onCloseConfirmationModal}
actions={[
<Button
variant="primary"
key="change-default"
onClick={() => {
onSelectDefaultGroup(defaultGroup);
}}
>
OK
</Button>,
<SecondaryButton key="cancel" onClickHandler={onCancelDefaultGroup}>
Cancel
</SecondaryButton>,
]}
messageText="Are you sure you want to change default group?"
messageObj={defaultGroup}
/>
</Page>
);
};
Expand Down
36 changes: 28 additions & 8 deletions src/services/rpcAutomember.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ export interface RemovePayload {
type: string;
}

export interface ChangeDefaultPayload {
defaultGroup: string;
type: string;
}

const extendedApi = api.injectEndpoints({
endpoints: (build) => ({
Expand Down Expand Up @@ -227,10 +231,7 @@ const extendedApi = api.injectEndpoints({
* @param AddPayload
* @returns FindRPCResponse
*/
addToAutomember: build.mutation<
FindRPCResponse,
AddPayload
>({
addToAutomember: build.mutation<FindRPCResponse, AddPayload>({
query: (payload) => {
const params = [[payload.group], { type: payload.type }];
return getCommand({
Expand All @@ -244,10 +245,7 @@ const extendedApi = api.injectEndpoints({
* @param RemovePayload
* @returns BatchRPCResponse
*/
deleteFromAutomember: build.mutation<
BatchRPCResponse,
RemovePayload
>({
deleteFromAutomember: build.mutation<BatchRPCResponse, RemovePayload>({
query: (payload) => {
const rulesToDelete = payload.groups;
const params = [rulesToDelete, { type: payload.type }];
Expand All @@ -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<FindRPCResponse, ChangeDefaultPayload>({
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,
});
Expand All @@ -277,4 +296,5 @@ export const {
useAutomemberFindBasicInfoQuery,
useAddToAutomemberMutation,
useDeleteFromAutomemberMutation,
useChangeDefaultGroupMutation,
} = extendedApi;

0 comments on commit b48e0c1

Please sign in to comment.