Skip to content

Commit 155a235

Browse files
committed
Simplify selected results table handling
We don't need to render all tables and use css to hide the ones we don't currently want to see. Instead have `render` return the dom that should be visible given the current state.
1 parent 1dffeb9 commit 155a235

File tree

5 files changed

+37
-57
lines changed

5 files changed

+37
-57
lines changed

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import cx from 'classnames';
21
import * as path from 'path';
32
import * as React from 'react';
43
import * as Sarif from 'sarif';
54
import { LocationStyle, ResolvableLocationValue } from 'semmle-bqrs';
65
import * as octicons from './octicons';
7-
import { className, renderLocation, ResultTableProps, selectedClassName, zebraStripe } from './result-table-utils';
6+
import { className, renderLocation, ResultTableProps, zebraStripe } from './result-table-utils';
87
import { PathTableResultSet } from './results';
98

109
export type PathTableProps = ResultTableProps & { resultSet: PathTableResultSet };
@@ -99,11 +98,7 @@ export class PathTable extends React.Component<PathTableProps, PathTableState> {
9998
}
10099

101100
render(): JSX.Element {
102-
const { selected, databaseUri, resultSet } = this.props;
103-
104-
const tableClassName = cx(className, {
105-
[selectedClassName]: selected
106-
});
101+
const { databaseUri, resultSet } = this.props;
107102

108103
const rows: JSX.Element[] = [];
109104
const { numTruncatedResults, sourceLocationPrefix } = resultSet;
@@ -342,7 +337,7 @@ export class PathTable extends React.Component<PathTableProps, PathTableState> {
342337
</td></tr>);
343338
}
344339

345-
return <table className={tableClassName}>
340+
return <table className={className}>
346341
<tbody>{rows}</tbody>
347342
</table>;
348343
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import cx from 'classnames';
21
import * as React from "react";
3-
import { className, renderLocation, ResultTableProps, selectedClassName, zebraStripe } from "./result-table-utils";
2+
import { renderLocation, ResultTableProps, zebraStripe, className } from "./result-table-utils";
43
import { RawTableResultSet, ResultValue, vscode } from "./results";
54
import { assertNever } from "../helpers-pure";
65
import { SortDirection, SortState, RAW_RESULTS_LIMIT } from "../interface-types";
@@ -16,11 +15,7 @@ export class RawTable extends React.Component<RawTableProps, {}> {
1615
}
1716

1817
render(): React.ReactNode {
19-
const { resultSet, selected, databaseUri } = this.props;
20-
21-
const tableClassName = cx(className, {
22-
[selectedClassName]: selected
23-
});
18+
const { resultSet, databaseUri } = this.props;
2419

2520
let dataRows = this.props.resultSet.rows;
2621
let numTruncatedResults = 0;
@@ -52,7 +47,7 @@ export class RawTable extends React.Component<RawTableProps, {}> {
5247
</td></tr>);
5348
}
5449

55-
return <table className={tableClassName}>
50+
return <table className={className}>
5651
<thead>
5752
<tr>
5853
{

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { SortState } from '../interface-types';
44
import { ResultSet, vscode } from './results';
55

66
export interface ResultTableProps {
7-
selected: boolean;
87
resultSet: ResultSet;
98
databaseUri: string;
109
resultsPath: string | undefined;
@@ -14,8 +13,6 @@ export interface ResultTableProps {
1413
export const className = 'vscode-codeql__result-table';
1514
export const tableSelectionHeaderClassName = 'vscode-codeql__table-selection-header';
1615
export const toggleDiagnosticsClassName = `${className}-toggle-diagnostics`;
17-
export const selectedClassName = `${className}--selected`;
18-
export const toggleDiagnosticsSelectedClassName = `${toggleDiagnosticsClassName}--selected`;
1916
export const evenRowClassName = 'vscode-codeql__result-table-row--even';
2017
export const oddRowClassName = 'vscode-codeql__result-table-row--odd';
2118
export const pathRowClassName = 'vscode-codeql__result-table-row--path';

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

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import cx from 'classnames';
21
import * as React from 'react';
32
import { DatabaseInfo, Interpretation, SortState } from '../interface-types';
43
import { PathTable } from './alert-table';
54
import { RawTable } from './raw-results-table';
6-
import { ResultTableProps, toggleDiagnosticsClassName, toggleDiagnosticsSelectedClassName, tableSelectionHeaderClassName } from './result-table-utils';
5+
import { ResultTableProps, tableSelectionHeaderClassName, toggleDiagnosticsClassName } from './result-table-utils';
76
import { ResultSet, vscode } from './results';
87

98
/**
@@ -76,14 +75,26 @@ export class ResultTables
7675
}
7776

7877
render(): React.ReactNode {
79-
const selectedTable = this.state.selectedTable;
78+
const { selectedTable } = this.state;
8079
const resultSets = this.getResultSets();
8180
const { database, resultsPath, kind } = this.props;
8281

8382
// Only show the Problems view display checkbox for the alerts table.
84-
const toggleDiagnosticsClass = cx(toggleDiagnosticsClassName, {
85-
[toggleDiagnosticsSelectedClassName]: selectedTable === ALERTS_TABLE_NAME
86-
});
83+
const diagnosticsCheckBox = selectedTable === ALERTS_TABLE_NAME ?
84+
<div className={toggleDiagnosticsClassName}>
85+
<input type="checkbox" id="toggle-diagnostics" name="toggle-diagnostics" onChange={(e) => {
86+
if (resultsPath !== undefined) {
87+
vscode.postMessage({
88+
t: 'toggleDiagnostics',
89+
resultsPath: resultsPath,
90+
databaseUri: database.databaseUri,
91+
visible: e.target.checked,
92+
kind: kind
93+
});
94+
}
95+
}} />
96+
<label htmlFor="toggle-diagnostics">Show results in Problems view</label>
97+
</div> : undefined;
8798

8899
return <div>
89100
<div className={tableSelectionHeaderClassName}>
@@ -96,20 +107,7 @@ export class ResultTables
96107
)
97108
}
98109
</select>
99-
<div className={toggleDiagnosticsClass}>
100-
<input type="checkbox" id="toggle-diagnostics" name="toggle-diagnostics" onChange={(e) => {
101-
if (resultsPath !== undefined) {
102-
vscode.postMessage({
103-
t: 'toggleDiagnostics',
104-
resultsPath: resultsPath,
105-
databaseUri: database.databaseUri,
106-
visible: e.target.checked,
107-
kind: kind
108-
});
109-
}
110-
}} />
111-
<label htmlFor="toggle-diagnostics">Show results in Problems view</label>
112-
</div>
110+
{diagnosticsCheckBox}
113111
{
114112
this.props.isLoadingNewResults ?
115113
<span className={UPDATING_RESULTS_TEXT_CLASS_NAME}>Updating results…</span>
@@ -118,9 +116,12 @@ export class ResultTables
118116
</div>
119117
{
120118
resultSets.map(resultSet =>
121-
<ResultTable key={resultSet.schema.name} resultSet={resultSet}
122-
databaseUri={this.props.database.databaseUri} selected={resultSet.schema.name === selectedTable}
123-
resultsPath={this.props.resultsPath} sortState={this.props.sortStates.get(resultSet.schema.name)} />
119+
resultSet.schema.name === selectedTable ?
120+
<ResultTable key={resultSet.schema.name} resultSet={resultSet}
121+
databaseUri={this.props.database.databaseUri}
122+
resultsPath={this.props.resultsPath}
123+
sortState={this.props.sortStates.get(resultSet.schema.name)} /> :
124+
undefined
124125
)
125126
}
126127
</div>;
@@ -137,10 +138,10 @@ class ResultTable extends React.Component<ResultTableProps, {}> {
137138
const { resultSet } = this.props;
138139
switch (resultSet.t) {
139140
case 'RawResultSet': return <RawTable
140-
selected={this.props.selected} resultSet={resultSet} databaseUri={this.props.databaseUri}
141+
resultSet={resultSet} databaseUri={this.props.databaseUri}
141142
resultsPath={this.props.resultsPath} sortState={this.props.sortState} />;
142143
case 'SarifResultSet': return <PathTable
143-
selected={this.props.selected} resultSet={resultSet} databaseUri={this.props.databaseUri}
144+
resultSet={resultSet} databaseUri={this.props.databaseUri}
144145
resultsPath={this.props.resultsPath} />;
145146
}
146147
}

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
.vscode-codeql__result-table {
2-
display: none;
2+
display: table;
33
border-collapse: collapse;
44
width: 100%;
55
}
66

7-
.vscode-codeql__result-table--selected {
8-
display: table;
9-
}
10-
117
.vscode-codeql__table-selection-header {
128
display: flex;
139
padding: 0.5em 0;
@@ -18,22 +14,18 @@
1814
}
1915

2016
.vscode-codeql__result-table-toggle-diagnostics {
21-
display: none;
17+
display: inline-block;
2218
text-align: left;
2319
margin-left: auto;
2420
}
2521

26-
.vscode-codeql__result-table-toggle-diagnostics--selected {
27-
display: inline-block;
28-
}
29-
3022
/* Keep the checkbox and its label in horizontal alignment. */
31-
.vscode-codeql__result-table-toggle-diagnostics--selected label,
32-
.vscode-codeql__result-table-toggle-diagnostics--selected input {
23+
.vscode-codeql__result-table-toggle-diagnostics label,
24+
.vscode-codeql__result-table-toggle-diagnostics input {
3325
display: inline-block;
3426
vertical-align: middle;
3527
}
36-
.vscode-codeql__result-table-toggle-diagnostics--selected input {
28+
.vscode-codeql__result-table-toggle-diagnostics input {
3729
margin: 3px 3px 1px 3px;
3830
}
3931

0 commit comments

Comments
 (0)