[Security Solution][Detections] fixes auto refresh issue when applying some of bulk actin to rules (#135208)

## Summary

Addresses: https://github.com/elastic/kibana/issues/126160

When users start to apply bulk action, rules table auto refresh will be paused and renewed after action finishes

### Before

https://user-images.githubusercontent.com/92328789/175935334-6f6dc42e-ecd5-4993-b2ce-7b0582283aa6.mov



### After

https://user-images.githubusercontent.com/92328789/175935341-e735dc18-6df1-4ac3-9ec2-3cf0de63a9dd.mov


### Release Note
- fixes issue when on applying some of bulk actions to selected rules, rules table auto refresh continues to work
This commit is contained in:
Vitalii Dmyterko 2022-06-29 09:14:33 +01:00 committed by GitHub
parent 8b078c3ad2
commit cd026c2565
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 4 deletions

View file

@ -84,7 +84,7 @@ export const useBulkActions = ({
);
const {
state: { isAllSelected, rules, loadingRuleIds, selectedRuleIds },
state: { isAllSelected, rules, loadingRuleIds, selectedRuleIds, isRefreshOn },
actions: { setLoadingRules, setIsRefreshOn },
} = rulesTableContext;
@ -103,7 +103,9 @@ export const useBulkActions = ({
const handleEnableAction = async () => {
startTransaction({ name: BULK_RULE_ACTIONS.ENABLE });
setIsRefreshOn(false);
closePopover();
const disabledRules = selectedRules.filter(({ enabled }) => !enabled);
const disabledRulesNoML = disabledRules.filter(({ type }) => !isMlRule(type));
@ -124,11 +126,14 @@ export const useBulkActions = ({
search: isAllSelected ? { query: filterQuery } : { ids: ruleIds },
});
invalidateRules();
setIsRefreshOn(isRefreshOn);
};
const handleDisableActions = async () => {
startTransaction({ name: BULK_RULE_ACTIONS.DISABLE });
setIsRefreshOn(false);
closePopover();
const enabledIds = selectedRules.filter(({ enabled }) => enabled).map(({ id }) => id);
await executeRulesBulkAction({
visibleRuleIds: enabledIds,
@ -138,11 +143,14 @@ export const useBulkActions = ({
search: isAllSelected ? { query: filterQuery } : { ids: enabledIds },
});
invalidateRules();
setIsRefreshOn(isRefreshOn);
};
const handleDuplicateAction = async () => {
startTransaction({ name: BULK_RULE_ACTIONS.DUPLICATE });
setIsRefreshOn(false);
closePopover();
await executeRulesBulkAction({
visibleRuleIds: selectedRuleIds,
action: BulkAction.duplicate,
@ -151,13 +159,17 @@ export const useBulkActions = ({
search: isAllSelected ? { query: filterQuery } : { ids: selectedRuleIds },
});
invalidateRules();
setIsRefreshOn(isRefreshOn);
};
const handleDeleteAction = async () => {
setIsRefreshOn(false);
closePopover();
if (isAllSelected) {
// User has cancelled deletion
if ((await confirmDeletion()) === false) {
// User has cancelled deletion
setIsRefreshOn(isRefreshOn);
return;
}
}
@ -171,9 +183,11 @@ export const useBulkActions = ({
search: isAllSelected ? { query: filterQuery } : { ids: selectedRuleIds },
});
invalidateRules();
setIsRefreshOn(isRefreshOn);
};
const handleExportAction = async () => {
setIsRefreshOn(false);
closePopover();
startTransaction({ name: BULK_RULE_ACTIONS.EXPORT });
@ -184,6 +198,7 @@ export const useBulkActions = ({
toasts,
search: isAllSelected ? { query: filterQuery } : { ids: selectedRuleIds },
});
setIsRefreshOn(isRefreshOn);
};
const handleBulkEdit = (bulkEditActionType: BulkActionEditType) => async () => {
@ -200,13 +215,13 @@ export const useBulkActions = ({
// User has cancelled edit action or there are no custom rules to proceed
if ((await confirmBulkEdit()) === false) {
setIsRefreshOn(true);
setIsRefreshOn(isRefreshOn);
return;
}
const editPayload = await completeBulkEditForm(bulkEditActionType);
if (editPayload == null) {
setIsRefreshOn(true);
setIsRefreshOn(isRefreshOn);
return;
}
@ -268,6 +283,7 @@ export const useBulkActions = ({
isBulkEditFinished = true;
invalidateRules();
setIsRefreshOn(isRefreshOn);
if (getIsMounted()) {
await resolveTagsRefetch(bulkEditActionType);
}
@ -439,6 +455,7 @@ export const useBulkActions = ({
filterOptions,
getIsMounted,
resolveTagsRefetch,
isRefreshOn,
]
);
};

View file

@ -117,6 +117,14 @@ export interface RulesTableActions {
setFilterOptions: (newFilter: Partial<FilterOptions>) => void;
setIsAllSelected: React.Dispatch<React.SetStateAction<boolean>>;
setIsInMemorySorting: (value: boolean) => void;
/**
* enable/disable rules table auto refresh
*
* @example
*
* setIsRefreshOn(true) // enables auto refresh
* setIsRefreshOn(false) // disables auto refresh
*/
setIsRefreshOn: React.Dispatch<React.SetStateAction<boolean>>;
setLoadingRules: React.Dispatch<React.SetStateAction<LoadingRules>>;
setPage: React.Dispatch<React.SetStateAction<number>>;