Merge pull request #2339 from github/koesie10/model-filename
Show model filename in data extensions editor
This commit is contained in:
@@ -93,6 +93,12 @@ export class DataExtensionsEditorView extends AbstractWebview<
|
|||||||
case "viewLoaded":
|
case "viewLoaded":
|
||||||
await this.onWebViewLoaded();
|
await this.onWebViewLoaded();
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "openModelFile":
|
||||||
|
await window.showTextDocument(
|
||||||
|
await workspace.openTextDocument(this.modelFilename),
|
||||||
|
);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case "jumpToUsage":
|
case "jumpToUsage":
|
||||||
await this.jumpToUsage(msg.location);
|
await this.jumpToUsage(msg.location);
|
||||||
@@ -119,6 +125,10 @@ export class DataExtensionsEditorView extends AbstractWebview<
|
|||||||
super.onWebViewLoaded();
|
super.onWebViewLoaded();
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
|
this.postMessage({
|
||||||
|
t: "setDataExtensionEditorInitialData",
|
||||||
|
modelFilename: this.modelFilename,
|
||||||
|
}),
|
||||||
this.loadExternalApiUsages(),
|
this.loadExternalApiUsages(),
|
||||||
this.loadExistingModeledMethods(),
|
this.loadExistingModeledMethods(),
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -481,6 +481,11 @@ export type ToDataFlowPathsMessage = SetDataFlowPathsMessage;
|
|||||||
|
|
||||||
export type FromDataFlowPathsMessage = CommonFromViewMessages;
|
export type FromDataFlowPathsMessage = CommonFromViewMessages;
|
||||||
|
|
||||||
|
export interface SetDataExtensionEditorInitialDataMessage {
|
||||||
|
t: "setDataExtensionEditorInitialData";
|
||||||
|
modelFilename: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface SetExternalApiUsagesMessage {
|
export interface SetExternalApiUsagesMessage {
|
||||||
t: "setExternalApiUsages";
|
t: "setExternalApiUsages";
|
||||||
externalApiUsages: ExternalApiUsage[];
|
externalApiUsages: ExternalApiUsage[];
|
||||||
@@ -511,9 +516,8 @@ export interface JumpToUsageMessage {
|
|||||||
location: ResolvableLocationValue;
|
location: ResolvableLocationValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SetExistingModeledMethods {
|
export interface OpenModelFileMessage {
|
||||||
t: "setExistingModeledMethods";
|
t: "openModelFile";
|
||||||
existingModeledMethods: Record<string, ModeledMethod>;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SaveModeledMethods {
|
export interface SaveModeledMethods {
|
||||||
@@ -527,12 +531,14 @@ export interface GenerateExternalApiMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type ToDataExtensionsEditorMessage =
|
export type ToDataExtensionsEditorMessage =
|
||||||
|
| SetDataExtensionEditorInitialDataMessage
|
||||||
| SetExternalApiUsagesMessage
|
| SetExternalApiUsagesMessage
|
||||||
| ShowProgressMessage
|
| ShowProgressMessage
|
||||||
| AddModeledMethodsMessage;
|
| AddModeledMethodsMessage;
|
||||||
|
|
||||||
export type FromDataExtensionsEditorMessage =
|
export type FromDataExtensionsEditorMessage =
|
||||||
| ViewLoadedMsg
|
| ViewLoadedMsg
|
||||||
|
| OpenModelFileMessage
|
||||||
| JumpToUsageMessage
|
| JumpToUsageMessage
|
||||||
| SaveModeledMethods
|
| SaveModeledMethods
|
||||||
| GenerateExternalApiMessage;
|
| GenerateExternalApiMessage;
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ const Template: ComponentStory<typeof DataExtensionsEditorComponent> = (
|
|||||||
|
|
||||||
export const DataExtensionsEditor = Template.bind({});
|
export const DataExtensionsEditor = Template.bind({});
|
||||||
DataExtensionsEditor.args = {
|
DataExtensionsEditor.args = {
|
||||||
|
initialModelFilename:
|
||||||
|
"/home/user/vscode-codeql-starter/codeql-custom-queries-java/sql2o/models/sql2o.yml",
|
||||||
initialExternalApiUsages: [
|
initialExternalApiUsages: [
|
||||||
{
|
{
|
||||||
signature: "org.sql2o.Connection#createQuery(String)",
|
signature: "org.sql2o.Connection#createQuery(String)",
|
||||||
|
|||||||
@@ -17,8 +17,21 @@ import { MethodRow } from "./MethodRow";
|
|||||||
import { assertNever } from "../../pure/helpers-pure";
|
import { assertNever } from "../../pure/helpers-pure";
|
||||||
import { vscode } from "../vscode-api";
|
import { vscode } from "../vscode-api";
|
||||||
import { calculateModeledPercentage } from "./modeled";
|
import { calculateModeledPercentage } from "./modeled";
|
||||||
|
import { LinkIconButton } from "../variant-analysis/LinkIconButton";
|
||||||
|
import { basename } from "../common/path";
|
||||||
|
import { ViewTitle } from "../common";
|
||||||
|
|
||||||
export const DataExtensionsEditorContainer = styled.div`
|
const DataExtensionsEditorContainer = styled.div`
|
||||||
|
margin-top: 1rem;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const DetailsContainer = styled.div`
|
||||||
|
display: flex;
|
||||||
|
gap: 1em;
|
||||||
|
align-items: center;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const EditorContainer = styled.div`
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
@@ -34,14 +47,20 @@ const ProgressBar = styled.div<ProgressBarProps>`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
initialModelFilename?: string;
|
||||||
initialExternalApiUsages?: ExternalApiUsage[];
|
initialExternalApiUsages?: ExternalApiUsage[];
|
||||||
initialModeledMethods?: Record<string, ModeledMethod>;
|
initialModeledMethods?: Record<string, ModeledMethod>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export function DataExtensionsEditor({
|
export function DataExtensionsEditor({
|
||||||
|
initialModelFilename,
|
||||||
initialExternalApiUsages = [],
|
initialExternalApiUsages = [],
|
||||||
initialModeledMethods = {},
|
initialModeledMethods = {},
|
||||||
}: Props): JSX.Element {
|
}: Props): JSX.Element {
|
||||||
|
const [modelFilename, setModelFilename] = useState<string | undefined>(
|
||||||
|
initialModelFilename,
|
||||||
|
);
|
||||||
|
|
||||||
const [externalApiUsages, setExternalApiUsages] = useState<
|
const [externalApiUsages, setExternalApiUsages] = useState<
|
||||||
ExternalApiUsage[]
|
ExternalApiUsage[]
|
||||||
>(initialExternalApiUsages);
|
>(initialExternalApiUsages);
|
||||||
@@ -59,6 +78,9 @@ export function DataExtensionsEditor({
|
|||||||
if (evt.origin === window.origin) {
|
if (evt.origin === window.origin) {
|
||||||
const msg: ToDataExtensionsEditorMessage = evt.data;
|
const msg: ToDataExtensionsEditorMessage = evt.data;
|
||||||
switch (msg.t) {
|
switch (msg.t) {
|
||||||
|
case "setDataExtensionEditorInitialData":
|
||||||
|
setModelFilename(msg.modelFilename);
|
||||||
|
break;
|
||||||
case "setExternalApiUsages":
|
case "setExternalApiUsages":
|
||||||
setExternalApiUsages(msg.externalApiUsages);
|
setExternalApiUsages(msg.externalApiUsages);
|
||||||
break;
|
break;
|
||||||
@@ -128,6 +150,12 @@ export function DataExtensionsEditor({
|
|||||||
});
|
});
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const onOpenModelFileClick = useCallback(() => {
|
||||||
|
vscode.postMessage({
|
||||||
|
t: "openModelFile",
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DataExtensionsEditorContainer>
|
<DataExtensionsEditorContainer>
|
||||||
{progress.maxStep > 0 && (
|
{progress.maxStep > 0 && (
|
||||||
@@ -139,15 +167,19 @@ export function DataExtensionsEditor({
|
|||||||
|
|
||||||
{externalApiUsages.length > 0 && (
|
{externalApiUsages.length > 0 && (
|
||||||
<>
|
<>
|
||||||
<div>
|
<ViewTitle>Data extensions editor</ViewTitle>
|
||||||
<h3>External API model stats</h3>
|
<DetailsContainer>
|
||||||
<ul>
|
{modelFilename && (
|
||||||
<li>Modeled: {modeledPercentage.toFixed(2)}%</li>
|
<LinkIconButton onClick={onOpenModelFileClick}>
|
||||||
<li>Unmodeled: {unModeledPercentage.toFixed(2)}%</li>
|
<span slot="start" className="codicon codicon-file-code"></span>
|
||||||
</ul>
|
{basename(modelFilename)}
|
||||||
</div>
|
</LinkIconButton>
|
||||||
<div>
|
)}
|
||||||
<h3>External API modelling</h3>
|
<div>{modeledPercentage.toFixed(2)}% modeled</div>
|
||||||
|
<div>{unModeledPercentage.toFixed(2)}% unmodeled</div>
|
||||||
|
</DetailsContainer>
|
||||||
|
|
||||||
|
<EditorContainer>
|
||||||
<VSCodeButton onClick={onApplyClick}>Apply</VSCodeButton>
|
<VSCodeButton onClick={onApplyClick}>Apply</VSCodeButton>
|
||||||
|
|
||||||
<VSCodeButton onClick={onGenerateClick}>
|
<VSCodeButton onClick={onGenerateClick}>
|
||||||
@@ -188,7 +220,7 @@ export function DataExtensionsEditor({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</VSCodeDataGrid>
|
</VSCodeDataGrid>
|
||||||
</div>
|
</EditorContainer>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</DataExtensionsEditorContainer>
|
</DataExtensionsEditorContainer>
|
||||||
|
|||||||
Reference in New Issue
Block a user