Create UI element to pick sort order

This commit is contained in:
Jason Reed
2020-02-11 17:20:46 -05:00
parent d135507a77
commit d325463efd
6 changed files with 51 additions and 18 deletions

View File

@@ -120,8 +120,11 @@ export interface RawResultsSortState {
direction: SortDirection;
}
export type InterpretedResultsSortOrder =
'file-position' | 'alert-message';
export interface InterpretedResultsSortState {
sortBy: 'file-position' | 'alert-message';
sortBy: InterpretedResultsSortOrder;
}
interface ChangeRawResultsSortMsg {

View File

@@ -116,8 +116,10 @@ export class CompletedQuery implements QueryWithResults {
this.sortedResultsInfo.set(resultSetName, sortedResultSetInfo);
}
async updateInterpretedSortState(_server: cli.CodeQLCliServer, _sortState: InterpretedResultsSortState | undefined): Promise<void> {
async updateInterpretedSortState(_server: cli.CodeQLCliServer, sortState: InterpretedResultsSortState | undefined): Promise<void> {
if (sortState !== undefined) {
this.interpretedResultsSortState = sortState;
}
}
}

View File

@@ -13,6 +13,7 @@ export interface ResultTableProps {
export const className = 'vscode-codeql__result-table';
export const tableSelectionHeaderClassName = 'vscode-codeql__table-selection-header';
export const alertExtrasClassName = `${className}-alert-extras`;
export const toggleDiagnosticsClassName = `${className}-toggle-diagnostics`;
export const evenRowClassName = 'vscode-codeql__result-table-row--even';
export const oddRowClassName = 'vscode-codeql__result-table-row--odd';

View File

@@ -1,8 +1,8 @@
import * as React from 'react';
import { DatabaseInfo, Interpretation, RawResultsSortState, QueryMetadata, ResultsPaths } from '../interface-types';
import { DatabaseInfo, Interpretation, RawResultsSortState, QueryMetadata, ResultsPaths, InterpretedResultsSortOrder, InterpretedResultsSortState } from '../interface-types';
import { PathTable } from './alert-table';
import { RawTable } from './raw-results-table';
import { ResultTableProps, tableSelectionHeaderClassName, toggleDiagnosticsClassName } from './result-table-utils';
import { ResultTableProps, tableSelectionHeaderClassName, toggleDiagnosticsClassName, alertExtrasClassName } from './result-table-utils';
import { ResultSet, vscode } from './results';
/**
@@ -16,6 +16,7 @@ export interface ResultTablesProps {
resultsPath: string;
origResultsPaths: ResultsPaths;
sortStates: Map<string, RawResultsSortState>;
interpretedSortState?: InterpretedResultsSortState;
isLoadingNewResults: boolean;
}
@@ -89,17 +90,21 @@ export class ResultTables
return [ALERTS_TABLE_NAME, SELECT_TABLE_NAME, resultSets[0].schema.name].filter(resultSetName => resultSetNames.includes(resultSetName))[0];
}
private onChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
private onTableSelectionChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
this.setState({ selectedTable: event.target.value });
}
render(): React.ReactNode {
const { selectedTable } = this.state;
const resultSets = this.getResultSets();
const { database, resultsPath, metadata, origResultsPaths } = this.props;
private onSortChange = (event: React.ChangeEvent<HTMLSelectElement>): void => {
vscode.postMessage({
t: 'changeInterpretedSort',
sortState: { sortBy: event.target.value as InterpretedResultsSortOrder },
});
}
// Only show the Problems view display checkbox for the alerts table.
const diagnosticsCheckBox = selectedTable === ALERTS_TABLE_NAME ?
private alertTableExtras(): JSX.Element | undefined {
const { database, resultsPath, metadata, origResultsPaths, interpretedSortState } = this.props;
const displayProblemsAsAlertsToggle =
<div className={toggleDiagnosticsClassName}>
<input type="checkbox" id="toggle-diagnostics" name="toggle-diagnostics" onChange={(e) => {
if (resultsPath !== undefined) {
@@ -113,14 +118,31 @@ export class ResultTables
}
}} />
<label htmlFor="toggle-diagnostics">Show results in Problems view</label>
</div> : undefined;
</div>;
const interpretedResultsSortSelect = <select value={interpretedSortState?.sortBy || 'file-position'}
onChange={this.onSortChange}>
<option value={'file-position'}>Source File Position</option>
<option value={'alert-message'}>Alert Message</option>
</select>;
return <div className={alertExtrasClassName}>
Sort:
{interpretedResultsSortSelect}
{displayProblemsAsAlertsToggle}
</div>
}
render(): React.ReactNode {
const { selectedTable } = this.state;
const resultSets = this.getResultSets();
const resultSet = resultSets.find(resultSet => resultSet.schema.name == selectedTable);
const numberOfResults = resultSet && renderResultCountString(resultSet);
return <div>
<div className={tableSelectionHeaderClassName}>
<select value={selectedTable} onChange={this.onChange}>
<select value={selectedTable} onChange={this.onTableSelectionChange}>
{
resultSets.map(resultSet =>
<option key={resultSet.schema.name} value={resultSet.schema.name}>
@@ -130,7 +152,7 @@ export class ResultTables
}
</select>
{numberOfResults}
{diagnosticsCheckBox}
{selectedTable === ALERTS_TABLE_NAME ? this.alertTableExtras() : undefined}
{
this.props.isLoadingNewResults ?
<span className={UPDATING_RESULTS_TEXT_CLASS_NAME}>Updating results</span>
@@ -144,7 +166,7 @@ export class ResultTables
resultsPath={this.props.resultsPath}
sortState={this.props.sortStates.get(resultSet.schema.name)} />
}
</div>;
</div >;
}
}

View File

@@ -314,6 +314,7 @@ class App extends React.Component<{}, ResultsViewState> {
resultsPath={displayedResults.resultsInfo.resultsPath}
metadata={displayedResults.resultsInfo ? displayedResults.resultsInfo.metadata : undefined}
sortStates={displayedResults.results.sortStates}
interpretedSortState={displayedResults.resultsInfo.interpretation?.sortState}
isLoadingNewResults={this.state.isExpectingResultsUpdate || this.state.nextResultsInfo !== null} />;
}
else {

View File

@@ -13,12 +13,16 @@
border: 0;
}
.vscode-codeql__result-table-toggle-diagnostics {
.vscode-codeql__result-table-alert-extras {
display: inline-block;
text-align: left;
margin-left: auto;
}
.vscode-codeql__result-table-toggle-diagnostics {
display: inline-block;
}
/* Keep the checkbox and its label in horizontal alignment. */
.vscode-codeql__result-table-toggle-diagnostics label,
.vscode-codeql__result-table-toggle-diagnostics input {
@@ -26,7 +30,7 @@
vertical-align: middle;
}
.vscode-codeql__result-table-toggle-diagnostics input {
margin: 3px 3px 1px 3px;
margin: 3px 3px 1px 13px;
}