Skip to content

Commit a1ecb3d

Browse files
authored
Merge pull request #2339 from github/koesie10/model-filename
Show model filename in data extensions editor
2 parents 94aee8a + fe2f37f commit a1ecb3d

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)