Merge remote-tracking branch 'origin/main' into koesie10/hide-generated-type-models
This commit is contained in:
@@ -724,6 +724,7 @@ export async function setAutogenerateQlPacks(choice: AutogenerateQLPacks) {
|
||||
const MODEL_SETTING = new Setting("model", ROOT_SETTING);
|
||||
const FLOW_GENERATION = new Setting("flowGeneration", MODEL_SETTING);
|
||||
const LLM_GENERATION = new Setting("llmGeneration", MODEL_SETTING);
|
||||
const SHOW_TYPE_MODELS = new Setting("showTypeModels", MODEL_SETTING);
|
||||
const LLM_GENERATION_BATCH_SIZE = new Setting(
|
||||
"llmGenerationBatchSize",
|
||||
MODEL_SETTING,
|
||||
@@ -743,6 +744,7 @@ const ENABLE_ACCESS_PATH_SUGGESTIONS = new Setting(
|
||||
export interface ModelConfig {
|
||||
flowGeneration: boolean;
|
||||
llmGeneration: boolean;
|
||||
showTypeModels: boolean;
|
||||
getExtensionsDirectory(languageId: string): string | undefined;
|
||||
enablePython: boolean;
|
||||
enableAccessPathSuggestions: boolean;
|
||||
@@ -761,6 +763,10 @@ export class ModelConfigListener extends ConfigListener implements ModelConfig {
|
||||
return !!LLM_GENERATION.getValue<boolean>();
|
||||
}
|
||||
|
||||
public get showTypeModels(): boolean {
|
||||
return !!SHOW_TYPE_MODELS.getValue<boolean>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Limits the number of candidates we send to the model in each request to avoid long requests.
|
||||
* Note that the model may return fewer than this number of candidates.
|
||||
|
||||
@@ -17,9 +17,37 @@ import type {
|
||||
import type { BaseLogger } from "../../common/logging";
|
||||
import type { AccessPathSuggestionRow } from "../suggestions";
|
||||
|
||||
// This is a subset of the model config that doesn't import the vscode module.
|
||||
// It only includes settings that are actually used.
|
||||
export type ModelConfig = {
|
||||
showTypeModels: boolean;
|
||||
};
|
||||
|
||||
/**
|
||||
* This function creates a new model config object from the given model config object.
|
||||
* The new model config object is a deep copy of the given model config object.
|
||||
*
|
||||
* @param modelConfig The model config object to create a new model config object from.
|
||||
* In most cases, this is a `ModelConfigListener`.
|
||||
*/
|
||||
export function createModelConfig(modelConfig: ModelConfig): ModelConfig {
|
||||
return {
|
||||
showTypeModels: modelConfig.showTypeModels,
|
||||
};
|
||||
}
|
||||
|
||||
export const defaultModelConfig: ModelConfig = {
|
||||
showTypeModels: false,
|
||||
};
|
||||
|
||||
type GenerateMethodDefinition<T> = (method: T) => DataTuple[];
|
||||
type ReadModeledMethod = (row: DataTuple[]) => ModeledMethod;
|
||||
|
||||
type IsHiddenContext = {
|
||||
method: MethodDefinition;
|
||||
config: ModelConfig;
|
||||
};
|
||||
|
||||
export type ModelsAsDataLanguagePredicate<T> = {
|
||||
extensiblePredicate: string;
|
||||
supportedKinds?: string[];
|
||||
@@ -30,6 +58,14 @@ export type ModelsAsDataLanguagePredicate<T> = {
|
||||
supportedEndpointTypes?: EndpointType[];
|
||||
generateMethodDefinition: GenerateMethodDefinition<T>;
|
||||
readModeledMethod: ReadModeledMethod;
|
||||
|
||||
/**
|
||||
* Controls whether this predicate is hidden for a certain method. This only applies to the UI.
|
||||
* If not specified, the predicate is visible for all methods.
|
||||
*
|
||||
* @param method The method to check if the predicate is hidden for.
|
||||
*/
|
||||
isHidden?: (context: IsHiddenContext) => boolean;
|
||||
};
|
||||
|
||||
export type GenerationContext = {
|
||||
|
||||
@@ -169,6 +169,7 @@ export const ruby: ModelsAsDataLanguage = {
|
||||
methodParameters: "",
|
||||
};
|
||||
},
|
||||
isHidden: ({ config }) => !config.showTypeModels,
|
||||
},
|
||||
},
|
||||
modelGeneration: {
|
||||
|
||||
@@ -15,6 +15,7 @@ import type { DatabaseItem } from "../../databases/local-databases";
|
||||
import type { ModelingEvents } from "../modeling-events";
|
||||
import type { QueryLanguage } from "../../common/query-language";
|
||||
import { tryGetQueryLanguage } from "../../common/query-language";
|
||||
import { createModelConfig } from "../languages";
|
||||
|
||||
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
|
||||
ToMethodModelingMessage,
|
||||
@@ -46,6 +47,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
|
||||
t: "setMethodModelingPanelViewState",
|
||||
viewState: {
|
||||
language: this.language,
|
||||
modelConfig: createModelConfig(this.modelConfig),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ import { telemetryListener } from "../common/vscode/telemetry";
|
||||
import type { ModelingStore } from "./modeling-store";
|
||||
import type { ModelingEvents } from "./modeling-events";
|
||||
import type { ModelsAsDataLanguage } from "./languages";
|
||||
import { getModelsAsDataLanguage } from "./languages";
|
||||
import { createModelConfig, getModelsAsDataLanguage } from "./languages";
|
||||
import { runGenerateQueries } from "./generate";
|
||||
import { ResponseError } from "vscode-jsonrpc";
|
||||
import { LSPErrorCodes } from "vscode-languageclient";
|
||||
@@ -465,6 +465,7 @@ export class ModelEditorView extends AbstractWebview<
|
||||
mode: this.modelingStore.getMode(this.databaseItem),
|
||||
showModeSwitchButton,
|
||||
sourceArchiveAvailable,
|
||||
modelConfig: createModelConfig(this.modelConfig),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { ExtensionPack } from "./extension-pack";
|
||||
import type { Mode } from "./mode";
|
||||
import type { QueryLanguage } from "../../common/query-language";
|
||||
import type { ModelConfig } from "../languages";
|
||||
|
||||
export interface ModelEditorViewState {
|
||||
extensionPack: ExtensionPack;
|
||||
@@ -11,8 +12,10 @@ export interface ModelEditorViewState {
|
||||
mode: Mode;
|
||||
showModeSwitchButton: boolean;
|
||||
sourceArchiveAvailable: boolean;
|
||||
modelConfig: ModelConfig;
|
||||
}
|
||||
|
||||
export interface MethodModelingPanelViewState {
|
||||
language: QueryLanguage | undefined;
|
||||
modelConfig: ModelConfig;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import { createSinkModeledMethod } from "../../../test/factories/model-editor/mo
|
||||
import { useState } from "react";
|
||||
import type { ModeledMethod } from "../../model-editor/modeled-method";
|
||||
import { QueryLanguage } from "../../common/query-language";
|
||||
import { defaultModelConfig } from "../../model-editor/languages";
|
||||
|
||||
export default {
|
||||
title: "Method Modeling/Method Modeling Inputs",
|
||||
@@ -34,6 +35,7 @@ const Template: StoryFn<typeof MethodModelingInputsComponent> = (args) => {
|
||||
language={QueryLanguage.Java}
|
||||
modeledMethod={m}
|
||||
onChange={onChange}
|
||||
modelConfig={defaultModelConfig}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@ import { VSCodeTag } from "@vscode/webview-ui-toolkit/react";
|
||||
import { ReviewInEditorButton } from "./ReviewInEditorButton";
|
||||
import { MultipleModeledMethodsPanel } from "./MultipleModeledMethodsPanel";
|
||||
import type { QueryLanguage } from "../../common/query-language";
|
||||
import type { ModelConfig } from "../../model-editor/languages";
|
||||
|
||||
const Container = styled.div`
|
||||
padding-top: 0.5rem;
|
||||
@@ -50,6 +51,7 @@ const UnsavedTag = ({ modelingStatus }: { modelingStatus: ModelingStatus }) => (
|
||||
|
||||
export type MethodModelingProps = {
|
||||
language: QueryLanguage;
|
||||
modelConfig: ModelConfig;
|
||||
modelingStatus: ModelingStatus;
|
||||
method: Method;
|
||||
modeledMethods: ModeledMethod[];
|
||||
@@ -60,6 +62,7 @@ export type MethodModelingProps = {
|
||||
|
||||
export const MethodModeling = ({
|
||||
language,
|
||||
modelConfig,
|
||||
modelingStatus,
|
||||
modeledMethods,
|
||||
method,
|
||||
@@ -80,6 +83,7 @@ export const MethodModeling = ({
|
||||
</DependencyContainer>
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
modelConfig={modelConfig}
|
||||
method={method}
|
||||
modeledMethods={modeledMethods}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
|
||||
@@ -7,6 +7,7 @@ import { ModelOutputDropdown } from "../model-editor/ModelOutputDropdown";
|
||||
import { ModelKindDropdown } from "../model-editor/ModelKindDropdown";
|
||||
import { InProgressDropdown } from "../model-editor/InProgressDropdown";
|
||||
import type { QueryLanguage } from "../../common/query-language";
|
||||
import type { ModelConfig } from "../../model-editor/languages";
|
||||
|
||||
const Container = styled.div`
|
||||
padding-top: 0.5rem;
|
||||
@@ -24,6 +25,7 @@ const Name = styled.span`
|
||||
|
||||
export type MethodModelingInputsProps = {
|
||||
language: QueryLanguage;
|
||||
modelConfig: ModelConfig;
|
||||
method: Method;
|
||||
modeledMethod: ModeledMethod | undefined;
|
||||
modelPending: boolean;
|
||||
@@ -33,6 +35,7 @@ export type MethodModelingInputsProps = {
|
||||
|
||||
export const MethodModelingInputs = ({
|
||||
language,
|
||||
modelConfig,
|
||||
method,
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
@@ -55,7 +58,7 @@ export const MethodModelingInputs = ({
|
||||
{isModelingInProgress ? (
|
||||
<InProgressDropdown />
|
||||
) : (
|
||||
<ModelTypeDropdown {...inputProps} />
|
||||
<ModelTypeDropdown modelConfig={modelConfig} {...inputProps} />
|
||||
)}
|
||||
</Input>
|
||||
</Container>
|
||||
|
||||
@@ -11,6 +11,7 @@ import { NotInModelingMode } from "./NotInModelingMode";
|
||||
import { NoMethodSelected } from "./NoMethodSelected";
|
||||
import type { MethodModelingPanelViewState } from "../../model-editor/shared/view-state";
|
||||
import { MethodAlreadyModeled } from "./MethodAlreadyModeled";
|
||||
import { defaultModelConfig } from "../../model-editor/languages";
|
||||
|
||||
type Props = {
|
||||
initialViewState?: MethodModelingPanelViewState;
|
||||
@@ -116,6 +117,7 @@ export function MethodModelingView({
|
||||
return (
|
||||
<MethodModeling
|
||||
language={viewState?.language}
|
||||
modelConfig={viewState?.modelConfig ?? defaultModelConfig}
|
||||
modelingStatus={modelingStatus}
|
||||
method={method}
|
||||
modeledMethods={modeledMethods}
|
||||
|
||||
@@ -16,9 +16,11 @@ import type { QueryLanguage } from "../../common/query-language";
|
||||
import { createEmptyModeledMethod } from "../../model-editor/modeled-method-empty";
|
||||
import { sendTelemetry } from "../common/telemetry";
|
||||
import type { ModelingStatus } from "../../model-editor/shared/modeling-status";
|
||||
import type { ModelConfig } from "../../model-editor/languages";
|
||||
|
||||
export type MultipleModeledMethodsPanelProps = {
|
||||
language: QueryLanguage;
|
||||
modelConfig: ModelConfig;
|
||||
method: Method;
|
||||
modeledMethods: ModeledMethod[];
|
||||
modelingStatus: ModelingStatus;
|
||||
@@ -61,6 +63,7 @@ const ModificationActions = styled.div`
|
||||
|
||||
export const MultipleModeledMethodsPanel = ({
|
||||
language,
|
||||
modelConfig,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
@@ -157,6 +160,7 @@ export const MultipleModeledMethodsPanel = ({
|
||||
{modeledMethods.length > 0 ? (
|
||||
<MethodModelingInputs
|
||||
language={language}
|
||||
modelConfig={modelConfig}
|
||||
method={method}
|
||||
modeledMethod={modeledMethods[selectedIndex]}
|
||||
modelPending={isModelPending(
|
||||
@@ -170,6 +174,7 @@ export const MultipleModeledMethodsPanel = ({
|
||||
) : (
|
||||
<MethodModelingInputs
|
||||
language={language}
|
||||
modelConfig={modelConfig}
|
||||
method={method}
|
||||
modeledMethod={undefined}
|
||||
modelPending={isModelPending(
|
||||
|
||||
@@ -4,6 +4,7 @@ import { MethodModeling } from "../MethodModeling";
|
||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||
import { createSinkModeledMethod } from "../../../../test/factories/model-editor/modeled-method-factories";
|
||||
import { QueryLanguage } from "../../../common/query-language";
|
||||
import { defaultModelConfig } from "../../../model-editor/languages";
|
||||
|
||||
describe(MethodModeling.name, () => {
|
||||
const render = (props: MethodModelingProps) =>
|
||||
@@ -18,6 +19,7 @@ describe(MethodModeling.name, () => {
|
||||
|
||||
render({
|
||||
language: QueryLanguage.Java,
|
||||
modelConfig: defaultModelConfig,
|
||||
modelingStatus: "saved",
|
||||
method,
|
||||
modeledMethods: [modeledMethod],
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
} from "../../../../test/factories/model-editor/modeled-method-factories";
|
||||
import { QueryLanguage } from "../../../common/query-language";
|
||||
import { createEmptyModeledMethod } from "../../../model-editor/modeled-method-empty";
|
||||
import { defaultModelConfig } from "../../../model-editor/languages";
|
||||
|
||||
describe(MethodModelingInputs.name, () => {
|
||||
const render = (props: MethodModelingInputsProps) =>
|
||||
@@ -19,6 +20,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
const modeledMethod = createSinkModeledMethod();
|
||||
const modelPending = false;
|
||||
const isModelingInProgress = false;
|
||||
const modelConfig = defaultModelConfig;
|
||||
const onChange = jest.fn();
|
||||
|
||||
it("renders the method modeling inputs", () => {
|
||||
@@ -28,6 +30,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
isModelingInProgress,
|
||||
modelConfig,
|
||||
onChange,
|
||||
});
|
||||
|
||||
@@ -55,6 +58,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
isModelingInProgress,
|
||||
modelConfig,
|
||||
onChange,
|
||||
});
|
||||
|
||||
@@ -78,6 +82,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
isModelingInProgress,
|
||||
modelConfig,
|
||||
onChange,
|
||||
});
|
||||
|
||||
@@ -93,6 +98,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
modeledMethod={updatedModeledMethod}
|
||||
modelPending={modelPending}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
modelConfig={modelConfig}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
@@ -123,6 +129,7 @@ describe(MethodModelingInputs.name, () => {
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
isModelingInProgress: true,
|
||||
modelConfig,
|
||||
onChange,
|
||||
});
|
||||
|
||||
|
||||
@@ -10,31 +10,46 @@ import { MultipleModeledMethodsPanel } from "../MultipleModeledMethodsPanel";
|
||||
import { userEvent } from "@testing-library/user-event";
|
||||
import type { ModeledMethod } from "../../../model-editor/modeled-method";
|
||||
import { QueryLanguage } from "../../../common/query-language";
|
||||
import type { ModelingStatus } from "../../../model-editor/shared/modeling-status";
|
||||
import { defaultModelConfig } from "../../../model-editor/languages";
|
||||
|
||||
describe(MultipleModeledMethodsPanel.name, () => {
|
||||
const render = (props: MultipleModeledMethodsPanelProps) =>
|
||||
reactRender(<MultipleModeledMethodsPanel {...props} />);
|
||||
|
||||
const language = QueryLanguage.Java;
|
||||
const method = createMethod();
|
||||
const isModelingInProgress = false;
|
||||
const isProcessedByAutoModel = false;
|
||||
const modelingStatus = "unmodeled";
|
||||
const modelingStatus: ModelingStatus = "unmodeled";
|
||||
const onChange = jest.fn<void, [string, ModeledMethod[]]>();
|
||||
const modelConfig = defaultModelConfig;
|
||||
|
||||
const baseProps = {
|
||||
language,
|
||||
method,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
modelConfig,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
};
|
||||
|
||||
const createRender =
|
||||
(modeledMethods: ModeledMethod[]) =>
|
||||
(props: Partial<MultipleModeledMethodsPanelProps> = {}) =>
|
||||
reactRender(
|
||||
<MultipleModeledMethodsPanel
|
||||
{...baseProps}
|
||||
modeledMethods={modeledMethods}
|
||||
{...props}
|
||||
/>,
|
||||
);
|
||||
|
||||
describe("with no modeled methods", () => {
|
||||
const modeledMethods: ModeledMethod[] = [];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("renders the method modeling inputs once", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.getAllByRole("combobox")).toHaveLength(4);
|
||||
expect(
|
||||
@@ -45,15 +60,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("disables all pagination", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -68,15 +75,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("cannot add or delete modeling", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -99,16 +98,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
}),
|
||||
];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("renders the method modeling inputs once", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.getAllByRole("combobox")).toHaveLength(4);
|
||||
expect(
|
||||
@@ -119,15 +112,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("disables all pagination", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -141,15 +126,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("cannot delete modeling", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -159,15 +136,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can add modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Add modeling"));
|
||||
|
||||
@@ -186,29 +155,16 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("changes selection to the newly added modeling", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Add modeling"));
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={
|
||||
onChange.mock.calls[onChange.mock.calls.length - 1][1]
|
||||
}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -226,16 +182,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
}),
|
||||
];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("renders the method modeling inputs once", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.getAllByRole("combobox")).toHaveLength(4);
|
||||
expect(
|
||||
@@ -246,15 +196,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("renders the pagination", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.getByLabelText("Previous modeling")).toBeInTheDocument();
|
||||
expect(screen.getByLabelText("Next modeling")).toBeInTheDocument();
|
||||
@@ -262,15 +204,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("disables the correct pagination", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -283,15 +217,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can use the pagination", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
|
||||
@@ -321,27 +247,14 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("correctly updates selected pagination index when the number of models decreases", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={[modeledMethods[1]]}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -354,29 +267,13 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("does not show errors", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("can update the first modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
const modelTypeDropdown = screen.getByRole("combobox", {
|
||||
name: "Model type",
|
||||
@@ -402,15 +299,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can update the second modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
|
||||
@@ -438,15 +327,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can delete modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Delete modeling"));
|
||||
|
||||
@@ -457,15 +338,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can add modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Add modeling"));
|
||||
|
||||
@@ -484,29 +357,16 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("shows an error when adding a neutral modeling", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Add modeling"));
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={
|
||||
onChange.mock.calls[onChange.mock.calls.length - 1][1]
|
||||
}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -520,15 +380,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={
|
||||
onChange.mock.calls[onChange.mock.calls.length - 1][1]
|
||||
}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -540,15 +395,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={
|
||||
onChange.mock.calls[onChange.mock.calls.length - 1][1]
|
||||
}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -559,15 +409,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("changes selection to the newly added modeling", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
expect(screen.getByText("1/2")).toBeInTheDocument();
|
||||
|
||||
@@ -575,15 +417,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={
|
||||
onChange.mock.calls[onChange.mock.calls.length - 1][1]
|
||||
}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -610,16 +447,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
}),
|
||||
];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("can use the pagination", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen
|
||||
@@ -703,27 +534,14 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("preserves selection when a modeling other than the selected modeling is removed", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
expect(screen.getByText("1/3")).toBeInTheDocument();
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={modeledMethods.slice(0, 2)}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -731,15 +549,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("reduces selection when the selected modeling is removed", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
@@ -747,13 +557,8 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={modeledMethods.slice(0, 2)}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -774,16 +579,10 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
}),
|
||||
];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("can add modeling", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen.getByLabelText("Add modeling").getElementsByTagName("input")[0],
|
||||
@@ -791,15 +590,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can delete first modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Delete modeling"));
|
||||
|
||||
@@ -810,15 +601,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can delete second modeling", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
await userEvent.click(screen.getByLabelText("Delete modeling"));
|
||||
@@ -830,15 +613,7 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
});
|
||||
|
||||
it("can add modeling after deleting second modeling", async () => {
|
||||
const { rerender } = render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
const { rerender } = render();
|
||||
|
||||
await userEvent.click(screen.getByLabelText("Next modeling"));
|
||||
await userEvent.click(screen.getByLabelText("Delete modeling"));
|
||||
@@ -850,13 +625,8 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
|
||||
rerender(
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
{...baseProps}
|
||||
modeledMethods={modeledMethods.slice(0, 1)}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
isProcessedByAutoModel={isProcessedByAutoModel}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -888,30 +658,16 @@ describe(MultipleModeledMethodsPanel.name, () => {
|
||||
}),
|
||||
];
|
||||
|
||||
const render = createRender(modeledMethods);
|
||||
|
||||
it("shows errors", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(screen.getByRole("alert")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("shows the correct error message", async () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
isProcessedByAutoModel,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
});
|
||||
render();
|
||||
|
||||
expect(
|
||||
screen.getByText("Error: Duplicated classification"),
|
||||
|
||||
@@ -37,6 +37,7 @@ import { createEmptyModeledMethod } from "../../model-editor/modeled-method-empt
|
||||
import type { AccessPathOption } from "../../model-editor/suggestions";
|
||||
import { ModelInputSuggestBox } from "./ModelInputSuggestBox";
|
||||
import { ModelOutputSuggestBox } from "./ModelOutputSuggestBox";
|
||||
import { getModelsAsDataLanguage } from "../../model-editor/languages";
|
||||
|
||||
const ApiOrMethodRow = styled.div`
|
||||
min-height: calc(var(--input-height) * 1px);
|
||||
@@ -192,9 +193,37 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
[method],
|
||||
);
|
||||
|
||||
const modelingStatus = getModelingStatus(modeledMethods, methodIsUnsaved);
|
||||
// Only show modeled methods that are non-hidden. These are also the ones that are
|
||||
// used for determining the modeling status.
|
||||
const shownModeledMethods = useMemo(() => {
|
||||
const modelsAsDataLanguage = getModelsAsDataLanguage(viewState.language);
|
||||
|
||||
const addModelButtonDisabled = !canAddNewModeledMethod(modeledMethods);
|
||||
return modeledMethodsToDisplay(
|
||||
modeledMethods.filter((modeledMethod) => {
|
||||
if (modeledMethod.type === "none") {
|
||||
return true;
|
||||
}
|
||||
|
||||
const predicate = modelsAsDataLanguage.predicates[modeledMethod.type];
|
||||
if (!predicate) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return !predicate.isHidden?.({
|
||||
method,
|
||||
config: viewState.modelConfig,
|
||||
});
|
||||
}),
|
||||
method,
|
||||
);
|
||||
}, [method, modeledMethods, viewState]);
|
||||
|
||||
const modelingStatus = getModelingStatus(
|
||||
shownModeledMethods,
|
||||
methodIsUnsaved,
|
||||
);
|
||||
|
||||
const addModelButtonDisabled = !canAddNewModeledMethod(shownModeledMethods);
|
||||
|
||||
return (
|
||||
<DataGridRow
|
||||
@@ -206,7 +235,7 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
}}
|
||||
>
|
||||
<DataGridCell
|
||||
gridRow={`span ${modeledMethods.length + validationErrors.length}`}
|
||||
gridRow={`span ${shownModeledMethods.length + validationErrors.length}`}
|
||||
ref={ref}
|
||||
>
|
||||
<ApiOrMethodRow>
|
||||
@@ -257,7 +286,7 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
)}
|
||||
{!props.modelingInProgress && (
|
||||
<>
|
||||
{modeledMethods.map((modeledMethod, index) => {
|
||||
{shownModeledMethods.map((modeledMethod, index) => {
|
||||
const modelPending = isModelPending(
|
||||
modeledMethod,
|
||||
modelingStatus,
|
||||
@@ -269,6 +298,7 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
<DataGridCell>
|
||||
<ModelTypeDropdown
|
||||
language={viewState.language}
|
||||
modelConfig={viewState.modelConfig}
|
||||
method={method}
|
||||
modeledMethod={modeledMethod}
|
||||
modelPending={modelPending}
|
||||
|
||||
@@ -10,12 +10,16 @@ import { createEmptyModeledMethod } from "../../model-editor/modeled-method-empt
|
||||
import type { Mutable } from "../../common/mutable";
|
||||
import { ReadonlyDropdown } from "../common/ReadonlyDropdown";
|
||||
import type { QueryLanguage } from "../../common/query-language";
|
||||
import type { ModelsAsDataLanguagePredicates } from "../../model-editor/languages";
|
||||
import type {
|
||||
ModelConfig,
|
||||
ModelsAsDataLanguagePredicates,
|
||||
} from "../../model-editor/languages";
|
||||
import { getModelsAsDataLanguage } from "../../model-editor/languages";
|
||||
import { InputDropdown } from "./InputDropdown";
|
||||
|
||||
type Props = {
|
||||
language: QueryLanguage;
|
||||
modelConfig: ModelConfig;
|
||||
method: Method;
|
||||
modeledMethod: ModeledMethod | undefined;
|
||||
modelPending: boolean;
|
||||
@@ -34,6 +38,7 @@ type Option = { value: ModeledMethodType; label: string };
|
||||
|
||||
export const ModelTypeDropdown = ({
|
||||
language,
|
||||
modelConfig,
|
||||
method,
|
||||
modeledMethod,
|
||||
modelPending,
|
||||
@@ -55,6 +60,13 @@ export const ModelTypeDropdown = ({
|
||||
return null;
|
||||
}
|
||||
|
||||
if (
|
||||
predicate.isHidden &&
|
||||
predicate.isHidden({ method, config: modelConfig })
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
value: type,
|
||||
label: typeLabels[type],
|
||||
@@ -64,7 +76,7 @@ export const ModelTypeDropdown = ({
|
||||
];
|
||||
|
||||
return baseOptions;
|
||||
}, [language, method.endpointType]);
|
||||
}, [language, modelConfig, method]);
|
||||
|
||||
const handleChange = useCallback(
|
||||
(e: ChangeEvent<HTMLSelectElement>) => {
|
||||
|
||||
@@ -4,6 +4,7 @@ import { createNoneModeledMethod } from "../../../../test/factories/model-editor
|
||||
import { QueryLanguage } from "../../../common/query-language";
|
||||
import { ModelTypeDropdown } from "../ModelTypeDropdown";
|
||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||
import { defaultModelConfig } from "../../../model-editor/languages";
|
||||
|
||||
describe(ModelTypeDropdown.name, () => {
|
||||
const onChange = jest.fn();
|
||||
@@ -23,6 +24,7 @@ describe(ModelTypeDropdown.name, () => {
|
||||
modelPending={false}
|
||||
onChange={onChange}
|
||||
method={method}
|
||||
modelConfig={defaultModelConfig}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -34,7 +36,7 @@ describe(ModelTypeDropdown.name, () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("allows changing the type to 'Type' for Ruby", async () => {
|
||||
it("allows changing the type to 'Type' for Ruby when type models are shown", async () => {
|
||||
const method = createMethod();
|
||||
const modeledMethod = createNoneModeledMethod();
|
||||
|
||||
@@ -45,6 +47,10 @@ describe(ModelTypeDropdown.name, () => {
|
||||
modelPending={false}
|
||||
onChange={onChange}
|
||||
method={method}
|
||||
modelConfig={{
|
||||
...defaultModelConfig,
|
||||
showTypeModels: true,
|
||||
}}
|
||||
/>,
|
||||
);
|
||||
|
||||
@@ -56,6 +62,26 @@ describe(ModelTypeDropdown.name, () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("does not allow changing the type to 'Type' for Ruby when type models are not shown", async () => {
|
||||
const method = createMethod();
|
||||
const modeledMethod = createNoneModeledMethod();
|
||||
|
||||
render(
|
||||
<ModelTypeDropdown
|
||||
language={QueryLanguage.Ruby}
|
||||
modeledMethod={modeledMethod}
|
||||
modelPending={false}
|
||||
onChange={onChange}
|
||||
method={method}
|
||||
modelConfig={defaultModelConfig}
|
||||
/>,
|
||||
);
|
||||
|
||||
expect(
|
||||
screen.queryByRole("option", { name: "Type" }),
|
||||
).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("does not allow changing the type to 'Type' for Java", async () => {
|
||||
const method = createMethod();
|
||||
const modeledMethod = createNoneModeledMethod();
|
||||
@@ -67,6 +93,7 @@ describe(ModelTypeDropdown.name, () => {
|
||||
modelPending={false}
|
||||
onChange={onChange}
|
||||
method={method}
|
||||
modelConfig={defaultModelConfig}
|
||||
/>,
|
||||
);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import type { ModelEditorViewState } from "../../../src/model-editor/shared/view
|
||||
import { Mode } from "../../../src/model-editor/shared/mode";
|
||||
import { createMockExtensionPack } from "./extension-pack";
|
||||
import { QueryLanguage } from "../../../src/common/query-language";
|
||||
import { defaultModelConfig } from "../../../src/model-editor/languages";
|
||||
|
||||
export function createMockModelEditorViewState(
|
||||
data: Partial<ModelEditorViewState> = {},
|
||||
@@ -15,6 +16,7 @@ export function createMockModelEditorViewState(
|
||||
showModeSwitchButton: true,
|
||||
extensionPack: createMockExtensionPack(),
|
||||
sourceArchiveAvailable: true,
|
||||
modelConfig: defaultModelConfig,
|
||||
...data,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user