Skip to content

Commit 3e82c18

Browse files
authored
Merge pull request #98 from pneumaticapp/frontend/workflows/42381__when_cleaning_and_changing_filters_the_results_does_not_match_the_filter
42381 frontend [ workflows ] When cleaning and changing filters, the results does not match the filter
2 parents 6bf9f2e + 8c9a0fa commit 3e82c18

16 files changed

Lines changed: 243 additions & 69 deletions

frontend/src/public/api/commonRequest.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { mergePaths } from '../utils/urls';
88
import { identifyAppPartOnClient } from '../utils/identifyAppPart/identifyAppPartOnClient';
99
import { getCurrentToken } from '../utils/auth';
1010
import { envBackendURL } from '../constants/enviroment';
11+
import { isRequestCanceled } from '../utils/isRequestCanceled';
1112

1213
export type TRequestType = 'public' | 'local';
1314
export type TResponseType = 'json' | 'text' | 'empty';
@@ -72,7 +73,12 @@ axiosInstance.interceptors.response.use(
7273
}
7374
return response;
7475
},
76+
7577
(error) => {
78+
if (isRequestCanceled(error)) {
79+
return Promise.reject(error);
80+
}
81+
7682
if (error.response) {
7783
logger.error('Response Error:', error.response.data);
7884
} else if (error.request) {

frontend/src/public/api/getTemplateFields.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ export type TGetTemplateFieldsResponse = {
77
kickoff: Pick<IKickoff, 'fields'>;
88
};
99

10-
export function getTemplateFields(id: string) {
10+
export function getTemplateFields(id: string, signal?: AbortSignal) {
1111
const {
1212
api: { urls },
1313
} = getBrowserConfigEnv();
1414

1515
const url = urls.templateFields.replace(':id', String(id));
1616

17-
return commonRequest<TGetTemplateFieldsResponse>(url);
17+
return commonRequest<TGetTemplateFieldsResponse>(url, { signal }, { shouldThrow: true });
1818
}

frontend/src/public/api/getTemplatePresets.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import { TTemplatePreset } from '../types/template';
44

55
export type TGetTemplatePresetsResponse = TTemplatePreset[];
66

7-
export function getTemplatePresets(id: string) {
7+
export function getTemplatePresets(id: string, signal?: AbortSignal) {
88
const {
99
api: { urls },
1010
} = getBrowserConfigEnv();
1111

1212
const url = urls.templatePresets.replace(':id', String(id));
1313

14-
return commonRequest<TGetTemplatePresetsResponse>(url);
14+
return commonRequest<TGetTemplatePresetsResponse>(url, { signal }, { shouldThrow: true });
1515
}

frontend/src/public/api/getTemplateSteps.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,19 @@ export interface IGetTemplateStepsRequest {
66
id: number;
77
withTasksInProgress?: boolean;
88
isRunningWorkflows?: boolean;
9+
signal?: AbortSignal;
910
}
1011

11-
export function getTemplateSteps({ id, ...config }: IGetTemplateStepsRequest) {
12-
const { api: { urls } } = getBrowserConfigEnv();
12+
export function getTemplateSteps({ id, signal, ...config }: IGetTemplateStepsRequest) {
13+
const {
14+
api: { urls },
15+
} = getBrowserConfigEnv();
1316

1417
const baseUrl = urls.templateSteps.replace(':id', String(id));
1518
const query = getQueryString(config);
1619
const url = `${baseUrl}${query}`;
1720

18-
return commonRequest<ITemplateStep[]>(
19-
url,
20-
{},
21-
{ shouldThrow: true },
22-
);
21+
return commonRequest<ITemplateStep[]>(url, { signal }, { shouldThrow: true });
2322
}
2423

2524
function getQueryString({
@@ -29,7 +28,9 @@ function getQueryString({
2928
const params = [
3029
typeof withTasksInProgress === 'boolean' && `with_tasks_in_progress=${withTasksInProgress}`,
3130
isRunningWorkflows && 'is_running_workflows=true',
32-
].filter(Boolean).join('&');
31+
]
32+
.filter(Boolean)
33+
.join('&');
3334

3435
return params ? `?${params}` : '';
3536
}

frontend/src/public/api/getWorkflowsCurrentPerformerCounters.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ export interface IGetWorkflowsCurrentPerformerCountersConfig {
77
templatesIdsFilter: number[];
88
tasksApiNamesFilter: string[];
99
workflowStartersIdsFilter: number[];
10+
signal?: AbortSignal;
1011
}
1112

1213
export function getWorkflowsCurrentPerformerCounters({
1314
templatesIdsFilter,
1415
tasksApiNamesFilter,
1516
workflowStartersIdsFilter,
17+
signal,
1618
}: IGetWorkflowsCurrentPerformerCountersConfig) {
1719
const {
1820
api: { urls },
@@ -24,6 +26,12 @@ export function getWorkflowsCurrentPerformerCounters({
2426
tasksApiNamesFilter,
2527
workflowStartersIdsFilter,
2628
})}`,
29+
{
30+
signal,
31+
},
32+
{
33+
shouldThrow: true,
34+
},
2735
);
2836
}
2937

frontend/src/public/api/getWorkflowsTemplateStepsCounters.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface IGetWorkflowsTemplateStepsCountersConfig {
99
performersIdsFilter: number[];
1010
performersGroupIdsFilter: number[];
1111
workflowStartersIdsFilter: number[];
12+
signal?: AbortSignal;
1213
}
1314

1415
export function getWorkflowsTemplateStepsCounters({
@@ -17,8 +18,11 @@ export function getWorkflowsTemplateStepsCounters({
1718
performersIdsFilter,
1819
performersGroupIdsFilter,
1920
workflowStartersIdsFilter,
21+
signal,
2022
}: IGetWorkflowsTemplateStepsCountersConfig) {
21-
const { api: { urls } } = getBrowserConfigEnv();
23+
const {
24+
api: { urls },
25+
} = getBrowserConfigEnv();
2226

2327
return commonRequest<TTemplateStepCounter[]>(
2428
`${urls.workflowsTemplateStepCounters}?${getQueryString({
@@ -28,6 +32,12 @@ export function getWorkflowsTemplateStepsCounters({
2832
performersGroupIdsFilter,
2933
workflowStartersIdsFilter,
3034
})}`,
35+
{
36+
signal,
37+
},
38+
{
39+
shouldThrow: true,
40+
},
3141
);
3242
}
3343

@@ -38,15 +48,17 @@ export function getQueryString({
3848
performersGroupIdsFilter,
3949
workflowStartersIdsFilter,
4050
}: IGetWorkflowsTemplateStepsCountersConfig) {
41-
const isExternal = workflowStartersIdsFilter?.some(userId => userId === EXTERNAL_USER_ID);
42-
const workflowStarters = workflowStartersIdsFilter?.filter(userId => userId !== EXTERNAL_USER_ID);
51+
const isExternal = workflowStartersIdsFilter?.some((userId) => userId === EXTERNAL_USER_ID);
52+
const workflowStarters = workflowStartersIdsFilter?.filter((userId) => userId !== EXTERNAL_USER_ID);
4353

4454
return [
45-
statusFilter !== EWorkflowsStatus.All && `status=${statusFilter}`,
55+
statusFilter !== EWorkflowsStatus.All && `status=${statusFilter}`,
4656
`template_ids=${templatesIdsFilter.join(',')}`,
4757
statusFilter === EWorkflowsStatus.Running && `current_performer_ids=${performersIdsFilter.join(',')}`,
4858
statusFilter === EWorkflowsStatus.Running && `current_performer_group_ids=${performersGroupIdsFilter.join(',')}`,
4959
`workflow_starter_ids=${workflowStarters.join(',')}`,
5060
isExternal && 'is_external=true',
51-
].filter(Boolean).join('&');
61+
]
62+
.filter(Boolean)
63+
.join('&');
5264
}

frontend/src/public/components/UI/Select/FilterSelect.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ export function FilterSelect<
139139
const mapSelectedOption = allOptions.filter((item) => newSelectedOptions.includes(item[optionIdKey]));
140140

141141
onChange(newSelectedOptions, mapSelectedOption);
142+
143+
if (newSelectedOptions.length === allOptions.length) {
144+
setIsSelectAll(true);
145+
} else {
146+
setIsSelectAll(false);
147+
}
142148
};
143149

144150
const renderSearchInput = () => {
@@ -256,20 +262,14 @@ export function FilterSelect<
256262
}
257263
};
258264

259-
const areAllSelected =
260-
isMultiple &&
261-
Array.isArray(selectedOptions) &&
262-
allOptions.length > 0 &&
263-
selectedOptions.length === allOptions.length;
264-
265265
return (
266266
<DropdownItem
267267
className={classnames('dropdown-item-sm', styles['value-item'], styles['value-item__select-all'])}
268268
onClick={handleSelectAll}
269269
toggle={false}
270270
>
271271
<Checkbox
272-
checked={isSelectAll || areAllSelected}
272+
checked={isSelectAll}
273273
title={<span>{selectAllLabel}</span>}
274274
onClick={(e) => e.stopPropagation()}
275275
onChange={() => {}}

frontend/src/public/layout/WorkflowsLayout/PerformerFilterSelect.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { useIntl } from 'react-intl';
33

44
import { useDispatch, useSelector } from 'react-redux';
55
import {
6+
cancelTemplateTasksCounters,
67
setFilterPerformers as setWorkflowsFilterPerfomers,
78
setFilterPerformersGroup as setWorkflowsFilterPerfomersGroup,
89
} from '../../redux/workflows/slice';
@@ -25,6 +26,7 @@ import { getActiveUsers, getUserFullName } from '../../utils/users';
2526
import { Avatar, FilterSelect } from '../../components/UI';
2627
import { PerformerFilterIcon } from '../../components/icons';
2728
import { ERenderPlaceholderType, getRenderPlaceholder } from './utils';
29+
import { canFilterByTemplateStep } from '../../utils/workflows/filters';
2830
import { useCheckDevice } from '../../hooks/useCheckDevice';
2931

3032
import styles from './WorkflowsLayout.css';
@@ -119,6 +121,9 @@ export function PerformerFilterSelect() {
119121
resetFilter={() => {
120122
dispatch(setWorkflowsFilterPerfomers([]));
121123
dispatch(setWorkflowsFilterPerfomersGroup([]));
124+
if (!canFilterByTemplateStep(statusFilter)) {
125+
dispatch(cancelTemplateTasksCounters());
126+
}
122127
}}
123128
Icon={PerformerFilterIcon}
124129
renderPlaceholder={() =>

frontend/src/public/layout/WorkflowsLayout/StarterFilterSelect.tsx

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@ import React, { useMemo } from 'react';
22
import { useIntl } from 'react-intl';
33
import { useDispatch, useSelector } from 'react-redux';
44
import { Avatar, FilterSelect } from '../../components/UI';
5-
import { setFilterWorkflowStarters as setWorkflowsFilterWorkflowStarters } from '../../redux/workflows/slice';
5+
import {
6+
cancelCurrentPerformersCounters,
7+
cancelTemplateTasksCounters,
8+
setFilterWorkflowStarters as setWorkflowsFilterWorkflowStarters,
9+
} from '../../redux/workflows/slice';
610
import { EXTERNAL_USER, getActiveUsers, getUserFullName } from '../../utils/users';
711
import { StarterFilterIcon } from '../../components/icons';
812
import styles from './WorkflowsLayout.css';
913
import { ERenderPlaceholderType, getRenderPlaceholder } from './utils';
10-
import { getWorkflowStartersCounters, getWorkflowStartersIdsFilter } from '../../redux/selectors/workflows';
14+
import {
15+
getWorkflowsStatus,
16+
getWorkflowStartersCounters,
17+
getWorkflowStartersIdsFilter,
18+
} from '../../redux/selectors/workflows';
1119
import { getAccountsUsers } from '../../redux/selectors/accounts';
20+
import { canFilterByTemplateStep } from '../../utils/workflows/filters';
1221
import { useCheckDevice } from '../../hooks/useCheckDevice';
1322

1423
export function StarterFilterSelect() {
@@ -19,6 +28,7 @@ export function StarterFilterSelect() {
1928
const workflowStartersIdsFilter = useSelector(getWorkflowStartersIdsFilter);
2029
const workflowStartersCounters = useSelector(getWorkflowStartersCounters);
2130
const users = useSelector(getAccountsUsers);
31+
const statusFilter = useSelector(getWorkflowsStatus);
2232

2333
const activeUsers = getActiveUsers(users);
2434

@@ -56,7 +66,13 @@ export function StarterFilterSelect() {
5666
optionIdKey="id"
5767
optionLabelKey="displayName"
5868
onChange={(workflowStarters: number[]) => dispatch(setWorkflowsFilterWorkflowStarters(workflowStarters))}
59-
resetFilter={() => dispatch(setWorkflowsFilterWorkflowStarters([]))}
69+
resetFilter={() => {
70+
dispatch(setWorkflowsFilterWorkflowStarters([]));
71+
if (!canFilterByTemplateStep(statusFilter)) {
72+
dispatch(cancelCurrentPerformersCounters());
73+
dispatch(cancelTemplateTasksCounters());
74+
}
75+
}}
6076
Icon={StarterFilterIcon}
6177
renderPlaceholder={() =>
6278
getRenderPlaceholder({

frontend/src/public/layout/WorkflowsLayout/TaskFilterSelect.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import { useIntl } from 'react-intl';
33
import { useDispatch, useSelector } from 'react-redux';
44

55
import styles from './WorkflowsLayout.css';
6-
import { setFilterTemplateTasks as setWorkflowsFilterTasks } from '../../redux/workflows/slice';
6+
import {
7+
cancelCurrentPerformersCounters,
8+
cancelTemplateTasksCounters,
9+
setFilterTemplateTasks as setWorkflowsFilterTasks,
10+
} from '../../redux/workflows/slice';
711
import { FilterSelect, TOptionBase } from '../../components/UI';
812
import { StepName } from '../../components/StepName';
913
import { TaskFilterIcon } from '../../components/icons';
@@ -79,6 +83,10 @@ export function TaskFilterSelect({ selectedTemplates }: { selectedTemplates: ITe
7983
}}
8084
resetFilter={() => {
8185
dispatch(setWorkflowsFilterTasks([]));
86+
if (!canFilterByTemplateStep(statusFilter)) {
87+
dispatch(cancelCurrentPerformersCounters());
88+
dispatch(cancelTemplateTasksCounters());
89+
}
8290
}}
8391
Icon={TaskFilterIcon}
8492
renderPlaceholder={() =>

0 commit comments

Comments
 (0)