Skip to content

Commit ad5b280

Browse files
Fix sorting for basic visibility (#849)
Change basic visibility workflow sorting to show all open workflows on top by default
1 parent cdf8844 commit ad5b280

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { type DomainWorkflow } from '@/views/domain-page/domain-page.types';
2+
3+
import compareBasicVisibilityWorkflows from '../compare-basic-visibility-workflows';
4+
5+
function createMockWorkflow(
6+
startTime: number,
7+
closeTime?: number
8+
): DomainWorkflow {
9+
return {
10+
workflowID: 'mock-id',
11+
runID: 'mock-run-id',
12+
workflowName: 'mock-name',
13+
status: closeTime
14+
? 'WORKFLOW_EXECUTION_CLOSE_STATUS_COMPLETED'
15+
: 'WORKFLOW_EXECUTION_CLOSE_STATUS_INVALID',
16+
startTime,
17+
closeTime,
18+
};
19+
}
20+
21+
describe('compareBasicVisibilityWorkflows', () => {
22+
it('should pick workflow with later start time for running workflows', () => {
23+
const firstWorkflow = createMockWorkflow(1741500000000);
24+
const secondWorkflow = createMockWorkflow(1741600000000);
25+
26+
expect(compareBasicVisibilityWorkflows(firstWorkflow, secondWorkflow)).toBe(
27+
1
28+
);
29+
expect(compareBasicVisibilityWorkflows(secondWorkflow, firstWorkflow)).toBe(
30+
-1
31+
);
32+
});
33+
34+
it('should pick workflow with later close time for closed workflows', () => {
35+
const firstWorkflow = createMockWorkflow(1741400000000, 1741600000000);
36+
const secondWorkflow = createMockWorkflow(1741500000000, 1741700000000);
37+
38+
expect(compareBasicVisibilityWorkflows(firstWorkflow, secondWorkflow)).toBe(
39+
1
40+
);
41+
expect(compareBasicVisibilityWorkflows(secondWorkflow, firstWorkflow)).toBe(
42+
-1
43+
);
44+
});
45+
46+
it('should pick running workflows over closed workflows', () => {
47+
const runningWorkflow = createMockWorkflow(1741500000000);
48+
const closedWorkflow = createMockWorkflow(1741500000000, 1741600000000);
49+
50+
expect(
51+
compareBasicVisibilityWorkflows(runningWorkflow, closedWorkflow)
52+
).toBe(-1);
53+
expect(
54+
compareBasicVisibilityWorkflows(closedWorkflow, runningWorkflow)
55+
).toBe(1);
56+
});
57+
58+
it('should handle edge cases with same timestamps', () => {
59+
const firstWorkflow = createMockWorkflow(1741500000000, 1741600000000);
60+
const secondWorkflow = createMockWorkflow(1741500000000, 1741600000000);
61+
62+
expect(compareBasicVisibilityWorkflows(firstWorkflow, secondWorkflow)).toBe(
63+
-1
64+
);
65+
});
66+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { type DomainWorkflow } from '@/views/domain-page/domain-page.types';
2+
3+
/**
4+
* Since ListOpenWorkflows returns workflows sorted by their start time, and ListClosedWorkflows sorts them by their
5+
* close time, we cannot merge them. Therefore, the sorting logic prioritizes open workflows over closed workflows.
6+
*/
7+
export default function compareBasicVisibilityWorkflows(
8+
first: DomainWorkflow,
9+
second: DomainWorkflow
10+
): number {
11+
if (!first.closeTime && !second.closeTime) {
12+
return second.startTime > first.startTime ? 1 : -1;
13+
}
14+
15+
if (!first.closeTime || !second.closeTime) {
16+
return !second.closeTime ? 1 : -1;
17+
}
18+
19+
return second.closeTime > first.closeTime ? 1 : -1;
20+
}

src/views/domain-workflows-basic/hooks/use-list-workflows-basic.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import domainPageQueryParamsConfig from '@/views/domain-page/config/domain-page-
1010
import DOMAIN_WORKFLOWS_BASIC_PAGE_SIZE from '../config/domain-workflows-basic-page-size.config';
1111
import { type UseListWorkflowsBasicParams } from '../domain-workflows-basic.types';
1212

13+
import compareBasicVisibilityWorkflows from './helpers/compare-basic-visibility-workflows';
1314
import getListWorkflowsBasicQueryOptions from './helpers/get-list-workflows-basic-query-options';
1415

1516
export default function useListWorkflowsBasic({
@@ -85,6 +86,6 @@ export default function useListWorkflowsBasic({
8586
queries: queryConfigs,
8687
pageSize: DOMAIN_WORKFLOWS_BASIC_PAGE_SIZE,
8788
flattenResponse: (result) => result.workflows,
88-
compare: (a, b) => (a.startTime > b.startTime ? -1 : 1),
89+
compare: compareBasicVisibilityWorkflows,
8990
});
9091
}

0 commit comments

Comments
 (0)