Skip to content

Commit fe2f37f

Browse files
committed
Show model filename in data extensions editor
This adds the model filename to the data extensions editor and will also allow the user to go to the model file by clicking on the filename. This also updates the general UI to be somewhat more compact by moving the modeled percentages to be below the header in 1 line.
1 parent 0ee090b commit fe2f37f

File tree

4 files changed

+64
-14
lines changed

4 files changed

+64
-14
lines changed

extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,12 @@ export class DataExtensionsEditorView extends AbstractWebview<
9393
case "viewLoaded":
9494
await this.onWebViewLoaded();
9595

96+
break;
97+
case "openModelFile":
98+
await window.showTextDocument(
99+
await workspace.openTextDocument(this.modelFilename),
100+
);
101+
96102
break;
97103
case "jumpToUsage":
98104
await this.jumpToUsage(msg.location);
@@ -119,6 +125,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
119125
super.onWebViewLoaded();
120126

121127
await Promise.all([
128+
this.postMessage({
129+
t: "setDataExtensionEditorInitialData",
130+
modelFilename: this.modelFilename,
131+
}),
122132
this.loadExternalApiUsages(),
123133
this.loadExistingModeledMethods(),
124134
]);

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,11 @@ export type ToDataFlowPathsMessage = SetDataFlowPathsMessage;
481481

482482
export type FromDataFlowPathsMessage = CommonFromViewMessages;
483483

484+
export interface SetDataExtensionEditorInitialDataMessage {
485+
t: "setDataExtensionEditorInitialData";
486+
modelFilename: string;
487+
}
488+
484489
export interface SetExternalApiUsagesMessage {
485490
t: "setExternalApiUsages";
486491
externalApiUsages: ExternalApiUsage[];
@@ -511,9 +516,8 @@ export interface JumpToUsageMessage {
511516
location: ResolvableLocationValue;
512517
}
513518

514-
export interface SetExistingModeledMethods {
515-
t: "setExistingModeledMethods";
516-
existingModeledMethods: Record<string, ModeledMethod>;
519+
export interface OpenModelFileMessage {
520+
t: "openModelFile";
517521
}
518522

519523
export interface SaveModeledMethods {
@@ -527,12 +531,14 @@ export interface GenerateExternalApiMessage {
527531
}
528532

529533
export type ToDataExtensionsEditorMessage =
534+
| SetDataExtensionEditorInitialDataMessage
530535
| SetExternalApiUsagesMessage
531536
| ShowProgressMessage
532537
| AddModeledMethodsMessage;
533538

534539
export type FromDataExtensionsEditorMessage =
535540
| ViewLoadedMsg
541+
| OpenModelFileMessage
536542
| JumpToUsageMessage
537543
| SaveModeledMethods
538544
| GenerateExternalApiMessage;

extensions/ql-vscode/src/stories/data-extensions-editor/DataExtensionsEditor.stories.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ const Template: ComponentStory<typeof DataExtensionsEditorComponent> = (
1515

1616
export const DataExtensionsEditor = Template.bind({});
1717
DataExtensionsEditor.args = {
18+
initialModelFilename:
19+
"/home/user/vscode-codeql-starter/codeql-custom-queries-java/sql2o/models/sql2o.yml",
1820
initialExternalApiUsages: [
1921
{
2022
signature: "org.sql2o.Connection#createQuery(String)",

extensions/ql-vscode/src/view/data-extensions-editor/DataExtensionsEditor.tsx

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,21 @@ import { MethodRow } from "./MethodRow";
1717
import { assertNever } from "../../pure/helpers-pure";
1818
import { vscode } from "../vscode-api";
1919
import { calculateModeledPercentage } from "./modeled";
20+
import { LinkIconButton } from "../variant-analysis/LinkIconButton";
21+
import { basename } from "../common/path";
22+
import { ViewTitle } from "../common";
2023

21-
export const DataExtensionsEditorContainer = styled.div`
24+
const DataExtensionsEditorContainer = styled.div`
25+
margin-top: 1rem;
26+
`;
27+
28+
const DetailsContainer = styled.div`
29+
display: flex;
30+
gap: 1em;
31+
align-items: center;
32+
`;
33+
34+
const EditorContainer = styled.div`
2235
margin-top: 1rem;
2336
`;
2437

@@ -34,14 +47,20 @@ const ProgressBar = styled.div<ProgressBarProps>`
3447
`;
3548

3649
type Props = {
50+
initialModelFilename?: string;
3751
initialExternalApiUsages?: ExternalApiUsage[];
3852
initialModeledMethods?: Record<string, ModeledMethod>;
3953
};
4054

4155
export function DataExtensionsEditor({
56+
initialModelFilename,
4257
initialExternalApiUsages = [],
4358
initialModeledMethods = {},
4459
}: Props): JSX.Element {
60+
const [modelFilename, setModelFilename] = useState<string | undefined>(
61+
initialModelFilename,
62+
);
63+
4564
const [externalApiUsages, setExternalApiUsages] = useState<
4665
ExternalApiUsage[]
4766
>(initialExternalApiUsages);
@@ -59,6 +78,9 @@ export function DataExtensionsEditor({
5978
if (evt.origin === window.origin) {
6079
const msg: ToDataExtensionsEditorMessage = evt.data;
6180
switch (msg.t) {
81+
case "setDataExtensionEditorInitialData":
82+
setModelFilename(msg.modelFilename);
83+
break;
6284
case "setExternalApiUsages":
6385
setExternalApiUsages(msg.externalApiUsages);
6486
break;
@@ -128,6 +150,12 @@ export function DataExtensionsEditor({
128150
});
129151
}, []);
130152

153+
const onOpenModelFileClick = useCallback(() => {
154+
vscode.postMessage({
155+
t: "openModelFile",
156+
});
157+
}, []);
158+
131159
return (
132160
<DataExtensionsEditorContainer>
133161
{progress.maxStep > 0 && (
@@ -139,15 +167,19 @@ export function DataExtensionsEditor({
139167

140168
{externalApiUsages.length > 0 && (
141169
<>
142-
<div>
143-
<h3>External API model stats</h3>
144-
<ul>
145-
<li>Modeled: {modeledPercentage.toFixed(2)}%</li>
146-
<li>Unmodeled: {unModeledPercentage.toFixed(2)}%</li>
147-
</ul>
148-
</div>
149-
<div>
150-
<h3>External API modelling</h3>
170+
<ViewTitle>Data extensions editor</ViewTitle>
171+
<DetailsContainer>
172+
{modelFilename && (
173+
<LinkIconButton onClick={onOpenModelFileClick}>
174+
<span slot="start" className="codicon codicon-file-code"></span>
175+
{basename(modelFilename)}
176+
</LinkIconButton>
177+
)}
178+
<div>{modeledPercentage.toFixed(2)}% modeled</div>
179+
<div>{unModeledPercentage.toFixed(2)}% unmodeled</div>
180+
</DetailsContainer>
181+
182+
<EditorContainer>
151183
<VSCodeButton onClick={onApplyClick}>Apply</VSCodeButton>
152184
&nbsp;
153185
<VSCodeButton onClick={onGenerateClick}>
@@ -188,7 +220,7 @@ export function DataExtensionsEditor({
188220
/>
189221
))}
190222
</VSCodeDataGrid>
191-
</div>
223+
</EditorContainer>
192224
</>
193225
)}
194226
</DataExtensionsEditorContainer>

0 commit comments

Comments
 (0)