Fix wrong number of pages shown on initial display.
This commit is contained in:
@@ -129,6 +129,7 @@ export interface ExtensionParsedResultSets {
|
|||||||
t: 'ExtensionParsed';
|
t: 'ExtensionParsed';
|
||||||
pageNumber: number;
|
pageNumber: number;
|
||||||
numPages: number;
|
numPages: number;
|
||||||
|
numInterpretedPages: number;
|
||||||
selectedTable?: string; // when undefined, means 'show default table'
|
selectedTable?: string; // when undefined, means 'show default table'
|
||||||
resultSetNames: string[];
|
resultSetNames: string[];
|
||||||
resultSet: ResultSet;
|
resultSet: ResultSet;
|
||||||
|
|||||||
@@ -97,6 +97,10 @@ function numPagesOfResultSet(resultSet: RawResultSet): number {
|
|||||||
return Math.ceil(resultSet.schema.tupleCount / RAW_RESULTS_PAGE_SIZE);
|
return Math.ceil(resultSet.schema.tupleCount / RAW_RESULTS_PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function numInterpretedPages(interpretation: Interpretation | undefined): number {
|
||||||
|
return Math.ceil((interpretation?.sarif.runs[0].results?.length || 0) / INTERPRETED_RESULTS_PAGE_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
export class InterfaceManager extends DisposableObject {
|
export class InterfaceManager extends DisposableObject {
|
||||||
private _displayedQuery?: CompletedQuery;
|
private _displayedQuery?: CompletedQuery;
|
||||||
private _interpretation?: Interpretation;
|
private _interpretation?: Interpretation;
|
||||||
@@ -352,11 +356,11 @@ export class InterfaceManager extends DisposableObject {
|
|||||||
);
|
);
|
||||||
const adaptedSchema = adaptSchema(schema);
|
const adaptedSchema = adaptSchema(schema);
|
||||||
const resultSet = adaptBqrs(adaptedSchema, chunk);
|
const resultSet = adaptBqrs(adaptedSchema, chunk);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
t: 'ExtensionParsed',
|
t: 'ExtensionParsed',
|
||||||
pageNumber: 0,
|
pageNumber: 0,
|
||||||
numPages: numPagesOfResultSet(resultSet),
|
numPages: numPagesOfResultSet(resultSet),
|
||||||
|
numInterpretedPages: numInterpretedPages(this._interpretation),
|
||||||
resultSet: { t: 'RawResultSet', ...resultSet },
|
resultSet: { t: 'RawResultSet', ...resultSet },
|
||||||
selectedTable: undefined,
|
selectedTable: undefined,
|
||||||
resultSetNames,
|
resultSetNames,
|
||||||
@@ -407,7 +411,7 @@ export class InterfaceManager extends DisposableObject {
|
|||||||
metadata: this._displayedQuery.query.metadata,
|
metadata: this._displayedQuery.query.metadata,
|
||||||
pageNumber,
|
pageNumber,
|
||||||
resultSetNames,
|
resultSetNames,
|
||||||
numPages: Math.ceil(this._interpretation.sarif.runs[0].results.length / INTERPRETED_RESULTS_PAGE_SIZE),
|
numPages: numInterpretedPages(this._interpretation),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -460,6 +464,7 @@ export class InterfaceManager extends DisposableObject {
|
|||||||
pageNumber,
|
pageNumber,
|
||||||
resultSet: { t: 'RawResultSet', ...resultSet },
|
resultSet: { t: 'RawResultSet', ...resultSet },
|
||||||
numPages: numPagesOfResultSet(resultSet),
|
numPages: numPagesOfResultSet(resultSet),
|
||||||
|
numInterpretedPages: numInterpretedPages(this._interpretation),
|
||||||
selectedTable: selectedTable,
|
selectedTable: selectedTable,
|
||||||
resultSetNames,
|
resultSetNames,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -174,13 +174,22 @@ export class ResultTables
|
|||||||
|
|
||||||
renderPageButtons(resultSets: ExtensionParsedResultSets): JSX.Element {
|
renderPageButtons(resultSets: ExtensionParsedResultSets): JSX.Element {
|
||||||
const selectedTable = this.state.selectedTable;
|
const selectedTable = this.state.selectedTable;
|
||||||
|
|
||||||
|
// FIXME: The extension, not the view, should be in charge of deciding whether to initially show
|
||||||
|
// a raw or alerts page. We have to conditionally recompute the number of pages here, because
|
||||||
|
// on initial load of query results, resultSets.numPages will have the number of *raw* pages available,
|
||||||
|
// not interpreted pages, because the extension doesn't know the view will default to showing alerts
|
||||||
|
// instead.
|
||||||
|
const numPages = selectedTable == ALERTS_TABLE_NAME ?
|
||||||
|
resultSets.numInterpretedPages : resultSets.numPages;
|
||||||
|
|
||||||
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
this.setState({ selectedPage: e.target.value });
|
this.setState({ selectedPage: e.target.value });
|
||||||
};
|
};
|
||||||
const choosePage = (input: string) => {
|
const choosePage = (input: string) => {
|
||||||
const pageNumber = parseInt(input);
|
const pageNumber = parseInt(input);
|
||||||
if (pageNumber !== undefined && !isNaN(pageNumber)) {
|
if (pageNumber !== undefined && !isNaN(pageNumber)) {
|
||||||
const actualPageNumber = Math.max(0, Math.min(pageNumber - 1, resultSets.numPages - 1));
|
const actualPageNumber = Math.max(0, Math.min(pageNumber - 1, numPages - 1));
|
||||||
vscode.postMessage({
|
vscode.postMessage({
|
||||||
t: 'changePage',
|
t: 'changePage',
|
||||||
pageNumber: actualPageNumber,
|
pageNumber: actualPageNumber,
|
||||||
@@ -199,17 +208,18 @@ export class ResultTables
|
|||||||
const nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
const nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
||||||
vscode.postMessage({
|
vscode.postMessage({
|
||||||
t: 'changePage',
|
t: 'changePage',
|
||||||
pageNumber: Math.min(resultSets.pageNumber + 1, resultSets.numPages - 1),
|
pageNumber: Math.min(resultSets.pageNumber + 1, numPages - 1),
|
||||||
selectedTable,
|
selectedTable,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return <span>
|
return <span>
|
||||||
<button onClick={prevPage} ><</button>
|
<button onClick={prevPage} ><</button>
|
||||||
<input size={3} value={this.state.selectedPage} onChange={onChange}
|
<input size={3} value={this.state.selectedPage} onChange={onChange}
|
||||||
onBlur={e => choosePage(e.target.value)}
|
onBlur={e => choosePage(e.target.value)}
|
||||||
onKeyDown={e => { if (e.keyCode === 13) choosePage((e.target as HTMLInputElement).value); }}
|
onKeyDown={e => { if (e.keyCode === 13) choosePage((e.target as HTMLInputElement).value); }}
|
||||||
/>
|
/>
|
||||||
/ {resultSets.numPages}
|
/ {numPages}
|
||||||
<button value=">" onClick={nextPage} >></button>
|
<button value=">" onClick={nextPage} >></button>
|
||||||
</span>;
|
</span>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ class App extends React.Component<{}, ResultsViewState> {
|
|||||||
parsedResultSets: {
|
parsedResultSets: {
|
||||||
t: 'ExtensionParsed',
|
t: 'ExtensionParsed',
|
||||||
numPages: msg.numPages,
|
numPages: msg.numPages,
|
||||||
|
numInterpretedPages: msg.numPages,
|
||||||
resultSetNames: msg.resultSetNames,
|
resultSetNames: msg.resultSetNames,
|
||||||
pageNumber: msg.pageNumber,
|
pageNumber: msg.pageNumber,
|
||||||
resultSet: {
|
resultSet: {
|
||||||
|
|||||||
Reference in New Issue
Block a user