Merge pull request #3128 from github/koesie10/feature-flags-1.11.0
Remove feature flags for release v1.11.0
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
## [UNRELEASED]
|
||||
|
||||
- Add a new method modeling panel to classify methods as sources/sinks/summaries while in the context of the source code. [#3128](https://github.com/github/vscode-codeql/pull/3128)
|
||||
- Adds the ability to add multiple classifications per method in the CodeQL Model Editor. [#3128](https://github.com/github/vscode-codeql/pull/3128)
|
||||
- Add a prompt to the "Quick query" command to encourage users in single-folder workspaces to use "Create query" instead. [#3082](https://github.com/github/vscode-codeql/pull/3082)
|
||||
- Remove support for CodeQL CLI versions older than 2.11.6. [#3087](https://github.com/github/vscode-codeql/pull/3087)
|
||||
- Preserve focus on results viewer when showing a location in a file. [#3088](https://github.com/github/vscode-codeql/pull/3088)
|
||||
|
||||
@@ -1840,8 +1840,7 @@
|
||||
{
|
||||
"id": "codeQLMethodModeling",
|
||||
"type": "webview",
|
||||
"name": "CodeQL Method Modeling",
|
||||
"when": "config.codeQL.canary"
|
||||
"name": "CodeQL Method Modeling"
|
||||
}
|
||||
],
|
||||
"codeql-methods-usage": [
|
||||
|
||||
@@ -726,7 +726,6 @@ export interface ModelConfig {
|
||||
flowGeneration: boolean;
|
||||
llmGeneration: boolean;
|
||||
getExtensionsDirectory(languageId: string): string | undefined;
|
||||
showMultipleModels: boolean;
|
||||
enableRuby: boolean;
|
||||
}
|
||||
|
||||
@@ -765,10 +764,6 @@ export class ModelConfigListener extends ConfigListener implements ModelConfig {
|
||||
});
|
||||
}
|
||||
|
||||
public get showMultipleModels(): boolean {
|
||||
return isCanary();
|
||||
}
|
||||
|
||||
public get enableRuby(): boolean {
|
||||
return !!ENABLE_RUBY.getValue<boolean>();
|
||||
}
|
||||
|
||||
@@ -48,7 +48,6 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
|
||||
t: "setMethodModelingPanelViewState",
|
||||
viewState: {
|
||||
language: this.language,
|
||||
showMultipleModels: this.modelConfig.showMultipleModels,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -385,7 +385,6 @@ export class ModelEditorView extends AbstractWebview<
|
||||
language: this.language,
|
||||
showGenerateButton,
|
||||
showLlmButton,
|
||||
showMultipleModels: this.modelConfig.showMultipleModels,
|
||||
mode: this.modelingStore.getMode(this.databaseItem),
|
||||
showModeSwitchButton,
|
||||
sourceArchiveAvailable,
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
import { ModeledMethod } from "../modeled-method";
|
||||
|
||||
/**
|
||||
* Converts a ModeledMethod[] to a single ModeledMethod for legacy usage. This function should always be used instead
|
||||
* of the trivial conversion to track usages of this conversion.
|
||||
*
|
||||
* This method should only be called inside a `postMessage` call. If it's used anywhere else, consider whether the
|
||||
* boundary is correct: the boundary should as close as possible to the extension host -> webview boundary.
|
||||
*
|
||||
* @param modeledMethods The ModeledMethod[]
|
||||
*/
|
||||
export function convertToLegacyModeledMethod(
|
||||
modeledMethods: ModeledMethod[],
|
||||
): ModeledMethod | undefined {
|
||||
return modeledMethods[0];
|
||||
}
|
||||
@@ -7,7 +7,6 @@ export interface ModelEditorViewState {
|
||||
language: QueryLanguage;
|
||||
showGenerateButton: boolean;
|
||||
showLlmButton: boolean;
|
||||
showMultipleModels: boolean;
|
||||
mode: Mode;
|
||||
showModeSwitchButton: boolean;
|
||||
sourceArchiveAvailable: boolean;
|
||||
@@ -15,5 +14,4 @@ export interface ModelEditorViewState {
|
||||
|
||||
export interface MethodModelingPanelViewState {
|
||||
language: QueryLanguage | undefined;
|
||||
showMultipleModels: boolean;
|
||||
}
|
||||
|
||||
@@ -47,26 +47,16 @@ MethodSaved.args = {
|
||||
modelingStatus: "saved",
|
||||
};
|
||||
|
||||
export const MultipleModelingsUnmodeled = Template.bind({});
|
||||
MultipleModelingsUnmodeled.args = {
|
||||
language,
|
||||
method,
|
||||
modeledMethods: [],
|
||||
modelingStatus: "saved",
|
||||
showMultipleModels: true,
|
||||
};
|
||||
|
||||
export const MultipleModelingsModeledSingle = Template.bind({});
|
||||
MultipleModelingsModeledSingle.args = {
|
||||
export const ModeledSingle = Template.bind({});
|
||||
ModeledSingle.args = {
|
||||
language,
|
||||
method,
|
||||
modeledMethods: [createSinkModeledMethod(method)],
|
||||
modelingStatus: "saved",
|
||||
showMultipleModels: true,
|
||||
};
|
||||
|
||||
export const MultipleModelingsModeledMultiple = Template.bind({});
|
||||
MultipleModelingsModeledMultiple.args = {
|
||||
export const ModeledMultiple = Template.bind({});
|
||||
ModeledMultiple.args = {
|
||||
language,
|
||||
method,
|
||||
modeledMethods: [
|
||||
@@ -79,11 +69,10 @@ MultipleModelingsModeledMultiple.args = {
|
||||
}),
|
||||
],
|
||||
modelingStatus: "saved",
|
||||
showMultipleModels: true,
|
||||
};
|
||||
|
||||
export const MultipleModelingsValidationFailedNeutral = Template.bind({});
|
||||
MultipleModelingsValidationFailedNeutral.args = {
|
||||
export const ValidationFailedNeutral = Template.bind({});
|
||||
ValidationFailedNeutral.args = {
|
||||
language,
|
||||
method,
|
||||
modeledMethods: [
|
||||
@@ -91,11 +80,10 @@ MultipleModelingsValidationFailedNeutral.args = {
|
||||
createNeutralModeledMethod(method),
|
||||
],
|
||||
modelingStatus: "unsaved",
|
||||
showMultipleModels: true,
|
||||
};
|
||||
|
||||
export const MultipleModelingsValidationFailedDuplicate = Template.bind({});
|
||||
MultipleModelingsValidationFailedDuplicate.args = {
|
||||
export const ValidationFailedDuplicate = Template.bind({});
|
||||
ValidationFailedDuplicate.args = {
|
||||
language,
|
||||
method,
|
||||
modeledMethods: [
|
||||
@@ -108,5 +96,4 @@ MultipleModelingsValidationFailedDuplicate.args = {
|
||||
createSinkModeledMethod(method),
|
||||
],
|
||||
modelingStatus: "unsaved",
|
||||
showMultipleModels: true,
|
||||
};
|
||||
|
||||
@@ -216,7 +216,6 @@ LibraryRow.args = {
|
||||
viewState: createMockModelEditorViewState({
|
||||
showGenerateButton: true,
|
||||
showLlmButton: true,
|
||||
showMultipleModels: true,
|
||||
}),
|
||||
hideModeledMethods: false,
|
||||
};
|
||||
|
||||
@@ -6,10 +6,7 @@ import { Meta, StoryFn } from "@storybook/react";
|
||||
import { MethodRow as MethodRowComponent } from "../../view/model-editor/MethodRow";
|
||||
import { CallClassification, Method } from "../../model-editor/method";
|
||||
import { ModeledMethod } from "../../model-editor/modeled-method";
|
||||
import {
|
||||
MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS,
|
||||
SINGLE_MODEL_GRID_TEMPLATE_COLUMNS,
|
||||
} from "../../view/model-editor/ModeledMethodDataGrid";
|
||||
import { MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS } from "../../view/model-editor/ModeledMethodDataGrid";
|
||||
import { DataGrid } from "../../view/common/DataGrid";
|
||||
import { createMockModelEditorViewState } from "../../../test/factories/model-editor/view-state";
|
||||
|
||||
@@ -35,12 +32,8 @@ const Template: StoryFn<typeof MethodRowComponent> = (args) => {
|
||||
[args],
|
||||
);
|
||||
|
||||
const gridTemplateColumns = args.viewState?.showMultipleModels
|
||||
? MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS
|
||||
: SINGLE_MODEL_GRID_TEMPLATE_COLUMNS;
|
||||
|
||||
return (
|
||||
<DataGrid gridTemplateColumns={gridTemplateColumns}>
|
||||
<DataGrid gridTemplateColumns={MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS}>
|
||||
<MethodRowComponent
|
||||
{...args}
|
||||
modeledMethods={modeledMethods}
|
||||
@@ -100,7 +93,6 @@ const modeledMethod: ModeledMethod = {
|
||||
const viewState = createMockModelEditorViewState({
|
||||
showGenerateButton: true,
|
||||
showLlmButton: true,
|
||||
showMultipleModels: true,
|
||||
});
|
||||
|
||||
export const Unmodeled = Template.bind({});
|
||||
|
||||
@@ -30,7 +30,6 @@ ModelEditor.args = {
|
||||
},
|
||||
showGenerateButton: true,
|
||||
showLlmButton: true,
|
||||
showMultipleModels: true,
|
||||
}),
|
||||
initialMethods: [
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@ import { MethodName } from "../model-editor/MethodName";
|
||||
import { ModeledMethod } from "../../model-editor/modeled-method";
|
||||
import { VSCodeTag } from "@vscode/webview-ui-toolkit/react";
|
||||
import { ReviewInEditorButton } from "./ReviewInEditorButton";
|
||||
import { ModeledMethodsPanel } from "./ModeledMethodsPanel";
|
||||
import { MultipleModeledMethodsPanel } from "./MultipleModeledMethodsPanel";
|
||||
import { QueryLanguage } from "../../common/query-language";
|
||||
|
||||
const Container = styled.div`
|
||||
@@ -55,7 +55,6 @@ export type MethodModelingProps = {
|
||||
method: Method;
|
||||
modeledMethods: ModeledMethod[];
|
||||
isModelingInProgress: boolean;
|
||||
showMultipleModels?: boolean;
|
||||
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
|
||||
};
|
||||
|
||||
@@ -65,7 +64,6 @@ export const MethodModeling = ({
|
||||
modeledMethods,
|
||||
method,
|
||||
isModelingInProgress,
|
||||
showMultipleModels = false,
|
||||
onChange,
|
||||
}: MethodModelingProps): JSX.Element => {
|
||||
return (
|
||||
@@ -79,11 +77,10 @@ export const MethodModeling = ({
|
||||
<ModelingStatusIndicator status={modelingStatus} />
|
||||
<MethodName {...method} />
|
||||
</DependencyContainer>
|
||||
<ModeledMethodsPanel
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
modeledMethods={modeledMethods}
|
||||
showMultipleModels={showMultipleModels}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
modelingStatus={modelingStatus}
|
||||
onChange={onChange}
|
||||
|
||||
@@ -110,7 +110,6 @@ export function MethodModelingView({ initialViewState }: Props): JSX.Element {
|
||||
method={method}
|
||||
modeledMethods={modeledMethods}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
showMultipleModels={viewState?.showMultipleModels}
|
||||
onChange={onChange}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
import * as React from "react";
|
||||
import { useCallback } from "react";
|
||||
import { ModeledMethod } from "../../model-editor/modeled-method";
|
||||
import { MethodModelingInputs } from "./MethodModelingInputs";
|
||||
import { Method } from "../../model-editor/method";
|
||||
import { styled } from "styled-components";
|
||||
import { MultipleModeledMethodsPanel } from "./MultipleModeledMethodsPanel";
|
||||
import { convertToLegacyModeledMethod } from "../../model-editor/shared/modeled-methods-legacy";
|
||||
import { QueryLanguage } from "../../common/query-language";
|
||||
import { ModelingStatus } from "../../model-editor/shared/modeling-status";
|
||||
|
||||
export type ModeledMethodsPanelProps = {
|
||||
language: QueryLanguage;
|
||||
method: Method;
|
||||
modeledMethods: ModeledMethod[];
|
||||
modelingStatus: ModelingStatus;
|
||||
isModelingInProgress: boolean;
|
||||
showMultipleModels: boolean;
|
||||
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
|
||||
};
|
||||
|
||||
const SingleMethodModelingInputs = styled(MethodModelingInputs)`
|
||||
padding-bottom: 0.5rem;
|
||||
`;
|
||||
|
||||
export const ModeledMethodsPanel = ({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
modelingStatus,
|
||||
isModelingInProgress,
|
||||
showMultipleModels,
|
||||
onChange,
|
||||
}: ModeledMethodsPanelProps) => {
|
||||
const handleSingleChange = useCallback(
|
||||
(modeledMethod: ModeledMethod) => {
|
||||
onChange(modeledMethod.signature, [modeledMethod]);
|
||||
},
|
||||
[onChange],
|
||||
);
|
||||
|
||||
if (!showMultipleModels) {
|
||||
return (
|
||||
<SingleMethodModelingInputs
|
||||
language={language}
|
||||
method={method}
|
||||
modeledMethod={convertToLegacyModeledMethod(modeledMethods)}
|
||||
modelingStatus={modelingStatus}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
onChange={handleSingleChange}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<MultipleModeledMethodsPanel
|
||||
language={language}
|
||||
method={method}
|
||||
modeledMethods={modeledMethods}
|
||||
modelingStatus={modelingStatus}
|
||||
isModelingInProgress={isModelingInProgress}
|
||||
onChange={onChange}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -1,90 +0,0 @@
|
||||
import * as React from "react";
|
||||
import { render as reactRender, screen } from "@testing-library/react";
|
||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||
import { createSinkModeledMethod } from "../../../../test/factories/model-editor/modeled-method-factories";
|
||||
import {
|
||||
ModeledMethodsPanel,
|
||||
ModeledMethodsPanelProps,
|
||||
} from "../ModeledMethodsPanel";
|
||||
import { QueryLanguage } from "../../../common/query-language";
|
||||
|
||||
describe(ModeledMethodsPanel.name, () => {
|
||||
const render = (props: ModeledMethodsPanelProps) =>
|
||||
reactRender(<ModeledMethodsPanel {...props} />);
|
||||
|
||||
const language = QueryLanguage.Java;
|
||||
const method = createMethod();
|
||||
const modeledMethods = [createSinkModeledMethod(), createSinkModeledMethod()];
|
||||
const modelingStatus = "unmodeled";
|
||||
const isModelingInProgress = false;
|
||||
const onChange = jest.fn();
|
||||
|
||||
describe("when show multiple models is disabled", () => {
|
||||
const showMultipleModels = false;
|
||||
|
||||
it("renders the method modeling inputs", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
showMultipleModels,
|
||||
});
|
||||
|
||||
expect(screen.getAllByRole("combobox")).toHaveLength(4);
|
||||
});
|
||||
|
||||
it("does not render the pagination", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
showMultipleModels,
|
||||
});
|
||||
|
||||
expect(
|
||||
screen.queryByLabelText("Previous modeling"),
|
||||
).not.toBeInTheDocument();
|
||||
expect(screen.queryByLabelText("Next modeling")).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
describe("when show multiple models is enabled", () => {
|
||||
const showMultipleModels = true;
|
||||
|
||||
it("renders the method modeling inputs once", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
showMultipleModels,
|
||||
});
|
||||
|
||||
expect(screen.getAllByRole("combobox")).toHaveLength(4);
|
||||
});
|
||||
|
||||
it("renders the pagination", () => {
|
||||
render({
|
||||
language,
|
||||
method,
|
||||
modeledMethods,
|
||||
isModelingInProgress,
|
||||
modelingStatus,
|
||||
onChange,
|
||||
showMultipleModels,
|
||||
});
|
||||
|
||||
expect(screen.getByLabelText("Previous modeling")).toBeInTheDocument();
|
||||
expect(screen.getByLabelText("Next modeling")).toBeInTheDocument();
|
||||
expect(screen.getByText("1/2")).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -2,7 +2,6 @@ import * as React from "react";
|
||||
import { styled } from "styled-components";
|
||||
import { pluralize } from "../../common/word";
|
||||
import { DataGridCell, DataGridRow } from "../common/DataGrid";
|
||||
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
||||
|
||||
const HiddenMethodsCell = styled(DataGridCell)`
|
||||
text-align: center;
|
||||
@@ -11,23 +10,19 @@ const HiddenMethodsCell = styled(DataGridCell)`
|
||||
interface Props {
|
||||
numHiddenMethods: number;
|
||||
someMethodsAreVisible: boolean;
|
||||
viewState: ModelEditorViewState;
|
||||
}
|
||||
|
||||
export function HiddenMethodsRow({
|
||||
numHiddenMethods,
|
||||
someMethodsAreVisible,
|
||||
viewState,
|
||||
}: Props) {
|
||||
if (numHiddenMethods === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const gridColumn = viewState.showMultipleModels ? "span 6" : "span 5";
|
||||
|
||||
return (
|
||||
<DataGridRow>
|
||||
<HiddenMethodsCell gridColumn={gridColumn}>
|
||||
<HiddenMethodsCell gridColumn="span 6">
|
||||
{someMethodsAreVisible && "And "}
|
||||
{pluralize(numHiddenMethods, "method", "methods")} modeled in other
|
||||
CodeQL packs
|
||||
|
||||
@@ -136,8 +136,8 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
}, [focusedIndex]);
|
||||
|
||||
const modeledMethods = useMemo(
|
||||
() => modeledMethodsToDisplay(modeledMethodsProp, method, viewState),
|
||||
[modeledMethodsProp, method, viewState],
|
||||
() => modeledMethodsToDisplay(modeledMethodsProp, method),
|
||||
[modeledMethodsProp, method],
|
||||
);
|
||||
|
||||
const validationErrors = useMemo(
|
||||
@@ -219,13 +219,11 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
<DataGridCell>
|
||||
<InProgressDropdown />
|
||||
</DataGridCell>
|
||||
{viewState.showMultipleModels && (
|
||||
<DataGridCell>
|
||||
<CodiconRow appearance="icon" disabled={true}>
|
||||
<Codicon name="add" label="Add new model" />
|
||||
</CodiconRow>
|
||||
</DataGridCell>
|
||||
)}
|
||||
<DataGridCell>
|
||||
<CodiconRow appearance="icon" disabled={true}>
|
||||
<Codicon name="add" label="Add new model" />
|
||||
</CodiconRow>
|
||||
</DataGridCell>
|
||||
</>
|
||||
)}
|
||||
{!props.modelingInProgress && (
|
||||
@@ -267,28 +265,26 @@ const ModelableMethodRow = forwardRef<HTMLElement | undefined, MethodRowProps>(
|
||||
onChange={modeledMethodChangedHandlers[index]}
|
||||
/>
|
||||
</DataGridCell>
|
||||
{viewState.showMultipleModels && (
|
||||
<DataGridCell>
|
||||
{index === 0 ? (
|
||||
<CodiconRow
|
||||
appearance="icon"
|
||||
aria-label="Add new model"
|
||||
onClick={handleAddModelClick}
|
||||
disabled={addModelButtonDisabled}
|
||||
>
|
||||
<Codicon name="add" />
|
||||
</CodiconRow>
|
||||
) : (
|
||||
<CodiconRow
|
||||
appearance="icon"
|
||||
aria-label="Remove model"
|
||||
onClick={removeModelClickedHandlers[index]}
|
||||
>
|
||||
<Codicon name="trash" />
|
||||
</CodiconRow>
|
||||
)}
|
||||
</DataGridCell>
|
||||
)}
|
||||
<DataGridCell>
|
||||
{index === 0 ? (
|
||||
<CodiconRow
|
||||
appearance="icon"
|
||||
aria-label="Add new model"
|
||||
onClick={handleAddModelClick}
|
||||
disabled={addModelButtonDisabled}
|
||||
>
|
||||
<Codicon name="add" />
|
||||
</CodiconRow>
|
||||
) : (
|
||||
<CodiconRow
|
||||
appearance="icon"
|
||||
aria-label="Remove model"
|
||||
onClick={removeModelClickedHandlers[index]}
|
||||
>
|
||||
<Codicon name="trash" />
|
||||
</CodiconRow>
|
||||
)}
|
||||
</DataGridCell>
|
||||
</DataGridRow>
|
||||
))}
|
||||
{validationErrors.map((error, index) => (
|
||||
@@ -336,9 +332,7 @@ const UnmodelableMethodRow = forwardRef<
|
||||
<ViewLink onClick={jumpToMethod}>View</ViewLink>
|
||||
</ApiOrMethodRow>
|
||||
</DataGridCell>
|
||||
<DataGridCell gridColumn={`span ${viewState.showMultipleModels ? 5 : 4}`}>
|
||||
Method already modeled
|
||||
</DataGridCell>
|
||||
<DataGridCell gridColumn="span 5">Method already modeled</DataGridCell>
|
||||
</DataGridRow>
|
||||
);
|
||||
});
|
||||
@@ -354,15 +348,10 @@ function sendJumpToMethodMessage(method: Method) {
|
||||
function modeledMethodsToDisplay(
|
||||
modeledMethods: ModeledMethod[],
|
||||
method: Method,
|
||||
viewState: ModelEditorViewState,
|
||||
): ModeledMethod[] {
|
||||
if (modeledMethods.length === 0) {
|
||||
return [createEmptyModeledMethod("none", method)];
|
||||
}
|
||||
|
||||
if (viewState.showMultipleModels) {
|
||||
return modeledMethods;
|
||||
} else {
|
||||
return modeledMethods.slice(0, 1);
|
||||
}
|
||||
return modeledMethods;
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
||||
import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
|
||||
import { DataGrid, DataGridCell } from "../common/DataGrid";
|
||||
|
||||
export const SINGLE_MODEL_GRID_TEMPLATE_COLUMNS =
|
||||
"0.5fr 0.125fr 0.125fr 0.125fr 0.125fr";
|
||||
export const MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS =
|
||||
"0.5fr 0.125fr 0.125fr 0.125fr 0.125fr max-content";
|
||||
|
||||
@@ -61,12 +59,8 @@ export const ModeledMethodDataGrid = ({
|
||||
|
||||
const someMethodsAreVisible = methodsWithModelability.length > 0;
|
||||
|
||||
const gridTemplateColumns = viewState.showMultipleModels
|
||||
? MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS
|
||||
: SINGLE_MODEL_GRID_TEMPLATE_COLUMNS;
|
||||
|
||||
return (
|
||||
<DataGrid gridTemplateColumns={gridTemplateColumns}>
|
||||
<DataGrid gridTemplateColumns={MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS}>
|
||||
{someMethodsAreVisible && (
|
||||
<>
|
||||
<DataGridCell rowType="header">API or method</DataGridCell>
|
||||
@@ -74,11 +68,9 @@ export const ModeledMethodDataGrid = ({
|
||||
<DataGridCell rowType="header">Input</DataGridCell>
|
||||
<DataGridCell rowType="header">Output</DataGridCell>
|
||||
<DataGridCell rowType="header">Kind</DataGridCell>
|
||||
{viewState.showMultipleModels && (
|
||||
<DataGridCell rowType="header">
|
||||
<ScreenReaderOnly>Add or remove models</ScreenReaderOnly>
|
||||
</DataGridCell>
|
||||
)}
|
||||
<DataGridCell rowType="header">
|
||||
<ScreenReaderOnly>Add or remove models</ScreenReaderOnly>
|
||||
</DataGridCell>
|
||||
{methodsWithModelability.map(({ method, methodCanBeModeled }) => {
|
||||
const modeledMethods = modeledMethodsMap[method.signature] ?? [];
|
||||
return (
|
||||
@@ -100,7 +92,6 @@ export const ModeledMethodDataGrid = ({
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={numHiddenMethods}
|
||||
someMethodsAreVisible={someMethodsAreVisible}
|
||||
viewState={viewState}
|
||||
/>
|
||||
</DataGrid>
|
||||
);
|
||||
|
||||
@@ -1,18 +1,11 @@
|
||||
import * as React from "react";
|
||||
import { render, screen } from "@testing-library/react";
|
||||
import { HiddenMethodsRow } from "../HiddenMethodsRow";
|
||||
import { createMockModelEditorViewState } from "../../../../test/factories/model-editor/view-state";
|
||||
|
||||
describe(HiddenMethodsRow.name, () => {
|
||||
const viewState = createMockModelEditorViewState();
|
||||
|
||||
it("does not render with 0 hidden methods", () => {
|
||||
const { container } = render(
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={0}
|
||||
someMethodsAreVisible={true}
|
||||
viewState={viewState}
|
||||
/>,
|
||||
<HiddenMethodsRow numHiddenMethods={0} someMethodsAreVisible={true} />,
|
||||
);
|
||||
|
||||
expect(container).toBeEmptyDOMElement();
|
||||
@@ -20,11 +13,7 @@ describe(HiddenMethodsRow.name, () => {
|
||||
|
||||
it("renders with 1 hidden methods and no visible methods", () => {
|
||||
render(
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={1}
|
||||
someMethodsAreVisible={false}
|
||||
viewState={viewState}
|
||||
/>,
|
||||
<HiddenMethodsRow numHiddenMethods={1} someMethodsAreVisible={false} />,
|
||||
);
|
||||
|
||||
expect(
|
||||
@@ -34,11 +23,7 @@ describe(HiddenMethodsRow.name, () => {
|
||||
|
||||
it("renders with 1 hidden methods and visible methods", () => {
|
||||
render(
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={1}
|
||||
someMethodsAreVisible={true}
|
||||
viewState={viewState}
|
||||
/>,
|
||||
<HiddenMethodsRow numHiddenMethods={1} someMethodsAreVisible={true} />,
|
||||
);
|
||||
|
||||
expect(
|
||||
@@ -48,11 +33,7 @@ describe(HiddenMethodsRow.name, () => {
|
||||
|
||||
it("renders with 3 hidden methods and no visible methods", () => {
|
||||
render(
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={3}
|
||||
someMethodsAreVisible={false}
|
||||
viewState={viewState}
|
||||
/>,
|
||||
<HiddenMethodsRow numHiddenMethods={3} someMethodsAreVisible={false} />,
|
||||
);
|
||||
|
||||
expect(
|
||||
@@ -62,11 +43,7 @@ describe(HiddenMethodsRow.name, () => {
|
||||
|
||||
it("renders with 3 hidden methods and visible methods", () => {
|
||||
render(
|
||||
<HiddenMethodsRow
|
||||
numHiddenMethods={3}
|
||||
someMethodsAreVisible={true}
|
||||
viewState={viewState}
|
||||
/>,
|
||||
<HiddenMethodsRow numHiddenMethods={3} someMethodsAreVisible={true} />,
|
||||
);
|
||||
|
||||
expect(
|
||||
|
||||
@@ -195,10 +195,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "sink" },
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const kindInputs = screen.getAllByRole("combobox", { name: "Model type" });
|
||||
@@ -208,24 +204,6 @@ describe(MethodRow.name, () => {
|
||||
expect(kindInputs[2]).toHaveValue("summary");
|
||||
});
|
||||
|
||||
it("renders only first model when showMultipleModels feature flag is disabled", () => {
|
||||
render({
|
||||
modeledMethods: [
|
||||
{ ...modeledMethod, type: "source" },
|
||||
{ ...modeledMethod, type: "sink" },
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: false,
|
||||
},
|
||||
});
|
||||
|
||||
const kindInputs = screen.getAllByRole("combobox", { name: "Model type" });
|
||||
expect(kindInputs.length).toBe(1);
|
||||
expect(kindInputs[0]).toHaveValue("source");
|
||||
});
|
||||
|
||||
it("can update fields when there are multiple models", async () => {
|
||||
render({
|
||||
modeledMethods: [
|
||||
@@ -233,10 +211,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "sink", kind: "code-injection" },
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
onChange.mockReset();
|
||||
@@ -268,26 +242,9 @@ describe(MethodRow.name, () => {
|
||||
expect(screen.getByText("Method already modeled")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("doesn't show add/remove buttons when multiple methods feature flag is disabled", async () => {
|
||||
render({
|
||||
modeledMethods: [modeledMethod],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: false,
|
||||
},
|
||||
});
|
||||
|
||||
expect(screen.queryByLabelText("Add new model")).not.toBeInTheDocument();
|
||||
expect(screen.queryByLabelText("Remove model")).not.toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("shows disabled button add new model when there are no modeled methods", async () => {
|
||||
render({
|
||||
modeledMethods: [],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const addButton = screen.queryByLabelText("Add new model");
|
||||
@@ -300,10 +257,6 @@ describe(MethodRow.name, () => {
|
||||
it("disabled button to add new model when there is one unmodeled method", async () => {
|
||||
render({
|
||||
modeledMethods: [{ ...modeledMethod, type: "none" }],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const addButton = screen.queryByLabelText("Add new model");
|
||||
@@ -316,10 +269,6 @@ describe(MethodRow.name, () => {
|
||||
it("enabled button to add new model when there is one modeled method", async () => {
|
||||
render({
|
||||
modeledMethods: [modeledMethod],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const addButton = screen.queryByLabelText("Add new model");
|
||||
@@ -335,10 +284,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "source" },
|
||||
{ ...modeledMethod, type: "none" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const addButton = screen.queryByLabelText("Add new model");
|
||||
@@ -358,10 +303,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
{ ...modeledMethod, type: "none" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
const addButtons = screen.queryAllByLabelText("Add new model");
|
||||
@@ -378,10 +319,6 @@ describe(MethodRow.name, () => {
|
||||
it("can add a new model", async () => {
|
||||
render({
|
||||
modeledMethods: [modeledMethod],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
onChange.mockReset();
|
||||
@@ -409,10 +346,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "none" },
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
onChange.mockReset();
|
||||
@@ -434,10 +367,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "none" },
|
||||
{ ...modeledMethod, type: "summary" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
onChange.mockReset();
|
||||
@@ -457,10 +386,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "source" },
|
||||
{ ...modeledMethod, type: "sink" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
||||
@@ -472,10 +397,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "source" },
|
||||
{ ...modeledMethod, type: "source" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
expect(screen.getByRole("alert")).toBeInTheDocument();
|
||||
@@ -494,10 +415,6 @@ describe(MethodRow.name, () => {
|
||||
{ ...modeledMethod, type: "source" },
|
||||
{ ...modeledMethod, type: "neutral", kind: "source" },
|
||||
],
|
||||
viewState: {
|
||||
...viewState,
|
||||
showMultipleModels: true,
|
||||
},
|
||||
});
|
||||
|
||||
expect(screen.getAllByRole("alert").length).toBe(2);
|
||||
|
||||
@@ -11,7 +11,6 @@ export function createMockModelEditorViewState(
|
||||
mode: Mode.Application,
|
||||
showGenerateButton: false,
|
||||
showLlmButton: false,
|
||||
showMultipleModels: false,
|
||||
showModeSwitchButton: true,
|
||||
extensionPack: createMockExtensionPack(),
|
||||
sourceArchiveAvailable: true,
|
||||
|
||||
Reference in New Issue
Block a user