Skip to content

Commit 4d8694e

Browse files
Merge pull request #2571 from github/robertbrignull/AlertTableHeader
Pull out AlertTableHeader to a separate component/file
2 parents 0a0b9e5 + e5d4545 commit 4d8694e

2 files changed

Lines changed: 61 additions & 55 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import * as React from "react";
2+
import { useCallback } from "react";
3+
import { vscode } from "../vscode-api";
4+
import {
5+
InterpretedResultsSortState,
6+
SortDirection,
7+
} from "../../common/interface-types";
8+
import { nextSortDirection } from "./result-table-utils";
9+
10+
export function AlertTableHeader({
11+
sortState,
12+
}: {
13+
sortState?: InterpretedResultsSortState;
14+
}) {
15+
const sortClass = useCallback((): string => {
16+
if (sortState?.sortBy === "alert-message") {
17+
return sortState.sortDirection === SortDirection.asc
18+
? "sort-asc"
19+
: "sort-desc";
20+
} else {
21+
return "sort-none";
22+
}
23+
}, [sortState]);
24+
25+
const getNextSortState = useCallback(():
26+
| InterpretedResultsSortState
27+
| undefined => {
28+
const prevDirection =
29+
sortState?.sortBy === "alert-message"
30+
? sortState.sortDirection
31+
: undefined;
32+
const nextDirection = nextSortDirection(prevDirection, true);
33+
return nextDirection === undefined
34+
? undefined
35+
: { sortBy: "alert-message", sortDirection: nextDirection };
36+
}, [sortState]);
37+
38+
const toggleSortStateForColumn = useCallback((): void => {
39+
vscode.postMessage({
40+
t: "changeInterpretedSort",
41+
sortState: getNextSortState(),
42+
});
43+
}, [getNextSortState]);
44+
45+
return (
46+
<thead>
47+
<tr>
48+
<th colSpan={2}></th>
49+
<th
50+
className={`${sortClass()} vscode-codeql__alert-message-cell`}
51+
colSpan={3}
52+
onClick={toggleSortStateForColumn}
53+
>
54+
Message
55+
</th>
56+
</tr>
57+
</thead>
58+
);
59+
}

extensions/ql-vscode/src/view/results/alert-table.tsx

Lines changed: 2 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
ResultTableProps,
1010
selectableZebraStripe,
1111
jumpToLocation,
12-
nextSortDirection,
1312
emptyQueryResultsMessage,
1413
} from "./result-table-utils";
1514
import { onNavigation } from "./results";
@@ -18,19 +17,16 @@ import {
1817
NavigateMsg,
1918
NavigationDirection,
2019
SarifInterpretationData,
21-
InterpretedResultsSortColumn,
22-
SortDirection,
23-
InterpretedResultsSortState,
2420
} from "../../common/interface-types";
2521
import {
2622
parseSarifPlainTextMessage,
2723
parseSarifLocation,
2824
isNoLocation,
2925
} from "../../common/sarif-utils";
30-
import { vscode } from "../vscode-api";
3126
import { isWholeFileLoc, isLineColumnLoc } from "../../common/bqrs-utils";
3227
import { ScrollIntoViewHelper } from "./scroll-into-view-helper";
3328
import { sendTelemetry } from "../common/telemetry";
29+
import { AlertTableHeader } from "./alert-table-header";
3430

3531
export type AlertTableProps = ResultTableProps & {
3632
resultSet: InterpretedResultSet<SarifInterpretationData>;
@@ -77,38 +73,6 @@ export class AlertTable extends React.Component<
7773
e.preventDefault();
7874
}
7975

80-
sortClass(column: InterpretedResultsSortColumn): string {
81-
const sortState = this.props.resultSet.interpretation.data.sortState;
82-
if (sortState !== undefined && sortState.sortBy === column) {
83-
return sortState.sortDirection === SortDirection.asc
84-
? "sort-asc"
85-
: "sort-desc";
86-
} else {
87-
return "sort-none";
88-
}
89-
}
90-
91-
getNextSortState(
92-
column: InterpretedResultsSortColumn,
93-
): InterpretedResultsSortState | undefined {
94-
const oldSortState = this.props.resultSet.interpretation.data.sortState;
95-
const prevDirection =
96-
oldSortState && oldSortState.sortBy === column
97-
? oldSortState.sortDirection
98-
: undefined;
99-
const nextDirection = nextSortDirection(prevDirection, true);
100-
return nextDirection === undefined
101-
? undefined
102-
: { sortBy: column, sortDirection: nextDirection };
103-
}
104-
105-
toggleSortStateForColumn(column: InterpretedResultsSortColumn): void {
106-
vscode.postMessage({
107-
t: "changeInterpretedSort",
108-
sortState: this.getNextSortState(column),
109-
});
110-
}
111-
11276
renderNoResults(): JSX.Element {
11377
if (this.props.nonemptyRawResults) {
11478
return (
@@ -132,23 +96,6 @@ export class AlertTable extends React.Component<
13296
render(): JSX.Element {
13397
const { databaseUri, resultSet } = this.props;
13498

135-
const header = (
136-
<thead>
137-
<tr>
138-
<th colSpan={2}></th>
139-
<th
140-
className={`${this.sortClass(
141-
"alert-message",
142-
)} vscode-codeql__alert-message-cell`}
143-
colSpan={3}
144-
onClick={() => this.toggleSortStateForColumn("alert-message")}
145-
>
146-
Message
147-
</th>
148-
</tr>
149-
</thead>
150-
);
151-
15299
const rows: JSX.Element[] = [];
153100
const { numTruncatedResults, sourceLocationPrefix } =
154101
resultSet.interpretation;
@@ -471,7 +418,7 @@ export class AlertTable extends React.Component<
471418

472419
return (
473420
<table className={className}>
474-
{header}
421+
<AlertTableHeader sortState={resultSet.interpretation.data.sortState} />
475422
<tbody>{rows}</tbody>
476423
</table>
477424
);

0 commit comments

Comments
 (0)