Skip to content

Commit d325463

Browse files
committed
Create UI element to pick sort order
1 parent d135507 commit d325463

File tree

6 files changed

+51
-18
lines changed

6 files changed

+51
-18
lines changed

extensions/ql-vscode/src/interface-types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,11 @@ export interface RawResultsSortState {
120120
direction: SortDirection;
121121
}
122122

123+
export type InterpretedResultsSortOrder =
124+
'file-position' | 'alert-message';
125+
123126
export interface InterpretedResultsSortState {
124-
sortBy: 'file-position' | 'alert-message';
127+
sortBy: InterpretedResultsSortOrder;
125128
}
126129

127130
interface ChangeRawResultsSortMsg {

extensions/ql-vscode/src/query-results.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,10 @@ export class CompletedQuery implements QueryWithResults {
116116
this.sortedResultsInfo.set(resultSetName, sortedResultSetInfo);
117117
}
118118

119-
async updateInterpretedSortState(_server: cli.CodeQLCliServer, _sortState: InterpretedResultsSortState | undefined): Promise<void> {
120-
119+
async updateInterpretedSortState(_server: cli.CodeQLCliServer, sortState: InterpretedResultsSortState | undefined): Promise<void> {
120+
if (sortState !== undefined) {
121+
this.interpretedResultsSortState = sortState;
122+
}
121123
}
122124
}
123125

extensions/ql-vscode/src/view/result-table-utils.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface ResultTableProps {
1313

1414
export const className = 'vscode-codeql__result-table';
1515
export const tableSelectionHeaderClassName = 'vscode-codeql__table-selection-header';
16+
export const alertExtrasClassName = `${className}-alert-extras`;
1617
export const toggleDiagnosticsClassName = `${className}-toggle-diagnostics`;
1718
export const evenRowClassName = 'vscode-codeql__result-table-row--even';
1819
export const oddRowClassName = 'vscode-codeql__result-table-row--odd';

extensions/ql-vscode/src/view/result-tables.tsx

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as React from 'react';
2-
import { DatabaseInfo, Interpretation, RawResultsSortState, QueryMetadata, ResultsPaths } from '../interface-types';
2+
import { DatabaseInfo, Interpretation, RawResultsSortState, QueryMetadata, ResultsPaths, InterpretedResultsSortOrder, InterpretedResultsSortState } from '../interface-types';
33
import { PathTable } from './alert-table';
44
import { RawTable } from './raw-results-table';
5-
import { ResultTableProps, tableSelectionHeaderClassName, toggleDiagnosticsClassName } from './result-table-utils';
5+
import { ResultTableProps, tableSelectionHeaderClassName, toggleDiagnosticsClassName, alertExtrasClassName } from './result-table-utils';
66
import { ResultSet, vscode } from './results';
77

88
/**
@@ -16,6 +16,7 @@ export interface ResultTablesProps {
1616
resultsPath: string;
1717
origResultsPaths: ResultsPaths;
1818
sortStates: Map<string, RawResultsSortState>;
19+
interpretedSortState?: InterpretedResultsSortState;
1920
isLoadingNewResults: boolean;
2021
}
2122

@@ -89,17 +90,21 @@ export class ResultTables
8990
return [ALERTS_TABLE_NAME, SELECT_TABLE_NAME, resultSets[0].schema.name].filter(resultSetName => resultSetNames.includes(resultSetName))[0];
9091
}
9192

92-
private onChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
93+
private onTableSelectionChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
9394
this.setState({ selectedTable: event.target.value });
9495
}
9596

96-
render(): React.ReactNode {
97-
const { selectedTable } = this.state;
98-
const resultSets = this.getResultSets();
99-
const { database, resultsPath, metadata, origResultsPaths } = this.props;
97+
private onSortChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
98+
vscode.postMessage({
99+
t: 'changeInterpretedSort',
100+
sortState: { sortBy: event.target.value as InterpretedResultsSortOrder },
101+
});
102+
}
103+
104+
private alertTableExtras(): JSX.Element | undefined {
105+
const { database, resultsPath, metadata, origResultsPaths, interpretedSortState } = this.props;
100106

101-
// Only show the Problems view display checkbox for the alerts table.
102-
const diagnosticsCheckBox = selectedTable === ALERTS_TABLE_NAME ?
107+
const displayProblemsAsAlertsToggle =
103108
<div className={toggleDiagnosticsClassName}>
104109
<input type="checkbox" id="toggle-diagnostics" name="toggle-diagnostics" onChange={(e) => {
105110
if (resultsPath !== undefined) {
@@ -113,14 +118,31 @@ export class ResultTables
113118
}
114119
}} />
115120
<label htmlFor="toggle-diagnostics">Show results in Problems view</label>
116-
</div> : undefined;
121+
</div>;
122+
123+
const interpretedResultsSortSelect = <select value={interpretedSortState?.sortBy || 'file-position'}
124+
onChange={this.onSortChange}>
125+
<option value={'file-position'}>Source File Position</option>
126+
<option value={'alert-message'}>Alert Message</option>
127+
</select>;
128+
129+
return <div className={alertExtrasClassName}>
130+
Sort:
131+
{interpretedResultsSortSelect}
132+
{displayProblemsAsAlertsToggle}
133+
</div>
134+
}
135+
136+
render(): React.ReactNode {
137+
const { selectedTable } = this.state;
138+
const resultSets = this.getResultSets();
117139

118140
const resultSet = resultSets.find(resultSet => resultSet.schema.name == selectedTable);
119141
const numberOfResults = resultSet && renderResultCountString(resultSet);
120142

121143
return <div>
122144
<div className={tableSelectionHeaderClassName}>
123-
<select value={selectedTable} onChange={this.onChange}>
145+
<select value={selectedTable} onChange={this.onTableSelectionChange}>
124146
{
125147
resultSets.map(resultSet =>
126148
<option key={resultSet.schema.name} value={resultSet.schema.name}>
@@ -130,7 +152,7 @@ export class ResultTables
130152
}
131153
</select>
132154
{numberOfResults}
133-
{diagnosticsCheckBox}
155+
{selectedTable === ALERTS_TABLE_NAME ? this.alertTableExtras() : undefined}
134156
{
135157
this.props.isLoadingNewResults ?
136158
<span className={UPDATING_RESULTS_TEXT_CLASS_NAME}>Updating results…</span>
@@ -144,7 +166,7 @@ export class ResultTables
144166
resultsPath={this.props.resultsPath}
145167
sortState={this.props.sortStates.get(resultSet.schema.name)} />
146168
}
147-
</div>;
169+
</div >;
148170
}
149171
}
150172

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ class App extends React.Component<{}, ResultsViewState> {
314314
resultsPath={displayedResults.resultsInfo.resultsPath}
315315
metadata={displayedResults.resultsInfo ? displayedResults.resultsInfo.metadata : undefined}
316316
sortStates={displayedResults.results.sortStates}
317+
interpretedSortState={displayedResults.resultsInfo.interpretation?.sortState}
317318
isLoadingNewResults={this.state.isExpectingResultsUpdate || this.state.nextResultsInfo !== null} />;
318319
}
319320
else {

extensions/ql-vscode/src/view/resultsView.css

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,24 @@
1313
border: 0;
1414
}
1515

16-
.vscode-codeql__result-table-toggle-diagnostics {
16+
.vscode-codeql__result-table-alert-extras {
1717
display: inline-block;
1818
text-align: left;
1919
margin-left: auto;
2020
}
2121

22+
.vscode-codeql__result-table-toggle-diagnostics {
23+
display: inline-block;
24+
}
25+
2226
/* Keep the checkbox and its label in horizontal alignment. */
2327
.vscode-codeql__result-table-toggle-diagnostics label,
2428
.vscode-codeql__result-table-toggle-diagnostics input {
2529
display: inline-block;
2630
vertical-align: middle;
2731
}
2832
.vscode-codeql__result-table-toggle-diagnostics input {
29-
margin: 3px 3px 1px 3px;
33+
margin: 3px 3px 1px 13px;
3034
}
3135

3236

0 commit comments

Comments
 (0)