Convert InProgressMethods to an interface (#2970)
This commit is contained in:
@@ -1,34 +1,28 @@
|
|||||||
/**
|
/**
|
||||||
* A class that keeps track of which methods are in progress for each package.
|
* An interface to help keep track of which methods are in progress for each package.
|
||||||
*
|
|
||||||
* This class is immutable and therefore is safe to be used in a React useState hook.
|
|
||||||
*/
|
*/
|
||||||
export class InProgressMethods {
|
export type InProgressMethods = Record<string, string[]>;
|
||||||
// A map of in-progress method signatures for each package.
|
|
||||||
private readonly methodMap: ReadonlyMap<string, Set<string>>;
|
|
||||||
|
|
||||||
constructor(methodMap?: ReadonlyMap<string, Set<string>>) {
|
export function setPackageInProgressMethods(
|
||||||
this.methodMap = methodMap ?? new Map<string, Set<string>>();
|
inProgressMethods: InProgressMethods,
|
||||||
}
|
packageName: string,
|
||||||
|
methods: string[],
|
||||||
/**
|
): InProgressMethods {
|
||||||
* Sets the in-progress methods for the given package.
|
return {
|
||||||
* Returns a new InProgressMethods instance.
|
...inProgressMethods,
|
||||||
*/
|
[packageName]: methods,
|
||||||
public setPackageMethods(
|
};
|
||||||
packageName: string,
|
}
|
||||||
methods: Set<string>,
|
|
||||||
): InProgressMethods {
|
export function hasInProgressMethod(
|
||||||
const newMethodMap = new Map<string, Set<string>>(this.methodMap);
|
inProgressMethods: InProgressMethods,
|
||||||
newMethodMap.set(packageName, methods);
|
packageName: string,
|
||||||
return new InProgressMethods(newMethodMap);
|
method: string,
|
||||||
}
|
): boolean {
|
||||||
|
const methods = inProgressMethods[packageName];
|
||||||
public hasMethod(packageName: string, method: string): boolean {
|
if (methods) {
|
||||||
const methods = this.methodMap.get(packageName);
|
return methods.includes(method);
|
||||||
if (methods) {
|
}
|
||||||
return methods.has(method);
|
|
||||||
}
|
return false;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { Meta, StoryFn } from "@storybook/react";
|
|||||||
import { Mode } from "../../model-editor/shared/mode";
|
import { Mode } from "../../model-editor/shared/mode";
|
||||||
import { LibraryRow as LibraryRowComponent } from "../../view/model-editor/LibraryRow";
|
import { LibraryRow as LibraryRowComponent } from "../../view/model-editor/LibraryRow";
|
||||||
import { CallClassification } from "../../model-editor/method";
|
import { CallClassification } from "../../model-editor/method";
|
||||||
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
|
|
||||||
import { createMockExtensionPack } from "../../../test/factories/model-editor/extension-pack";
|
import { createMockExtensionPack } from "../../../test/factories/model-editor/extension-pack";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -219,7 +218,7 @@ LibraryRow.args = {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]),
|
modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]),
|
||||||
inProgressMethods: new InProgressMethods(),
|
inProgressMethods: {},
|
||||||
viewState: {
|
viewState: {
|
||||||
extensionPack: createMockExtensionPack(),
|
extensionPack: createMockExtensionPack(),
|
||||||
showFlowGeneration: true,
|
showFlowGeneration: true,
|
||||||
|
|||||||
@@ -14,7 +14,10 @@ import {
|
|||||||
VSCodeTag,
|
VSCodeTag,
|
||||||
} from "@vscode/webview-ui-toolkit/react";
|
} from "@vscode/webview-ui-toolkit/react";
|
||||||
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
||||||
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
|
import {
|
||||||
|
InProgressMethods,
|
||||||
|
hasInProgressMethod,
|
||||||
|
} from "../../model-editor/shared/in-progress-methods";
|
||||||
|
|
||||||
const LibraryContainer = styled.div`
|
const LibraryContainer = styled.div`
|
||||||
background-color: var(--vscode-peekViewResult-background);
|
background-color: var(--vscode-peekViewResult-background);
|
||||||
@@ -177,7 +180,7 @@ export const LibraryRow = ({
|
|||||||
|
|
||||||
const canStopAutoModeling = useMemo(() => {
|
const canStopAutoModeling = useMemo(() => {
|
||||||
return methods.some((method) =>
|
return methods.some((method) =>
|
||||||
inProgressMethods.hasMethod(title, method.signature),
|
hasInProgressMethod(inProgressMethods, title, method.signature),
|
||||||
);
|
);
|
||||||
}, [methods, title, inProgressMethods]);
|
}, [methods, title, inProgressMethods]);
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,10 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
|||||||
import { ModeledMethodsList } from "./ModeledMethodsList";
|
import { ModeledMethodsList } from "./ModeledMethodsList";
|
||||||
import { percentFormatter } from "./formatters";
|
import { percentFormatter } from "./formatters";
|
||||||
import { Mode } from "../../model-editor/shared/mode";
|
import { Mode } from "../../model-editor/shared/mode";
|
||||||
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
|
import {
|
||||||
|
InProgressMethods,
|
||||||
|
setPackageInProgressMethods,
|
||||||
|
} from "../../model-editor/shared/in-progress-methods";
|
||||||
import { getLanguageDisplayName } from "../../common/query-language";
|
import { getLanguageDisplayName } from "../../common/query-language";
|
||||||
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods";
|
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods";
|
||||||
|
|
||||||
@@ -94,7 +97,7 @@ export function ModelEditor({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>(
|
const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>(
|
||||||
new InProgressMethods(),
|
{},
|
||||||
);
|
);
|
||||||
|
|
||||||
const [hideModeledMethods, setHideModeledMethods] = useState(
|
const [hideModeledMethods, setHideModeledMethods] = useState(
|
||||||
@@ -135,9 +138,10 @@ export function ModelEditor({
|
|||||||
break;
|
break;
|
||||||
case "setInProgressMethods":
|
case "setInProgressMethods":
|
||||||
setInProgressMethods((oldInProgressMethods) =>
|
setInProgressMethods((oldInProgressMethods) =>
|
||||||
oldInProgressMethods.setPackageMethods(
|
setPackageInProgressMethods(
|
||||||
|
oldInProgressMethods,
|
||||||
msg.packageName,
|
msg.packageName,
|
||||||
new Set(msg.inProgressMethods),
|
msg.inProgressMethods,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -9,7 +9,10 @@ import { Method, canMethodBeModeled } from "../../model-editor/method";
|
|||||||
import { ModeledMethod } from "../../model-editor/modeled-method";
|
import { ModeledMethod } from "../../model-editor/modeled-method";
|
||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
import { sortMethods } from "../../model-editor/shared/sorting";
|
import { sortMethods } from "../../model-editor/shared/sorting";
|
||||||
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
|
import {
|
||||||
|
InProgressMethods,
|
||||||
|
hasInProgressMethod,
|
||||||
|
} from "../../model-editor/shared/in-progress-methods";
|
||||||
import { HiddenMethodsRow } from "./HiddenMethodsRow";
|
import { HiddenMethodsRow } from "./HiddenMethodsRow";
|
||||||
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
import { ModelEditorViewState } from "../../model-editor/shared/view-state";
|
||||||
import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
|
import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
|
||||||
@@ -107,7 +110,8 @@ export const ModeledMethodDataGrid = ({
|
|||||||
methodCanBeModeled={methodCanBeModeled}
|
methodCanBeModeled={methodCanBeModeled}
|
||||||
modeledMethods={modeledMethods}
|
modeledMethods={modeledMethods}
|
||||||
methodIsUnsaved={modifiedSignatures.has(method.signature)}
|
methodIsUnsaved={modifiedSignatures.has(method.signature)}
|
||||||
modelingInProgress={inProgressMethods.hasMethod(
|
modelingInProgress={hasInProgressMethod(
|
||||||
|
inProgressMethods,
|
||||||
packageName,
|
packageName,
|
||||||
method.signature,
|
method.signature,
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import * as React from "react";
|
|||||||
import { render as reactRender, screen } from "@testing-library/react";
|
import { render as reactRender, screen } from "@testing-library/react";
|
||||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||||
import { LibraryRow, LibraryRowProps } from "../LibraryRow";
|
import { LibraryRow, LibraryRowProps } from "../LibraryRow";
|
||||||
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
|
|
||||||
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
|
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
|
||||||
import { Mode } from "../../../model-editor/shared/mode";
|
import { Mode } from "../../../model-editor/shared/mode";
|
||||||
import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
|
import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
|
||||||
@@ -44,7 +43,7 @@ describe(LibraryRow.name, () => {
|
|||||||
],
|
],
|
||||||
}}
|
}}
|
||||||
modifiedSignatures={new Set([method.signature])}
|
modifiedSignatures={new Set([method.signature])}
|
||||||
inProgressMethods={new InProgressMethods()}
|
inProgressMethods={{}}
|
||||||
viewState={viewState}
|
viewState={viewState}
|
||||||
hideModeledMethods={false}
|
hideModeledMethods={false}
|
||||||
revealedMethodSignature={null}
|
revealedMethodSignature={null}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { render as reactRender, screen } from "@testing-library/react";
|
import { render as reactRender, screen } from "@testing-library/react";
|
||||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||||
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
|
|
||||||
import { Mode } from "../../../model-editor/shared/mode";
|
import { Mode } from "../../../model-editor/shared/mode";
|
||||||
import {
|
import {
|
||||||
ModeledMethodDataGrid,
|
ModeledMethodDataGrid,
|
||||||
@@ -70,7 +69,7 @@ describe(ModeledMethodDataGrid.name, () => {
|
|||||||
],
|
],
|
||||||
}}
|
}}
|
||||||
modifiedSignatures={new Set([method1.signature])}
|
modifiedSignatures={new Set([method1.signature])}
|
||||||
inProgressMethods={new InProgressMethods()}
|
inProgressMethods={{}}
|
||||||
viewState={viewState}
|
viewState={viewState}
|
||||||
hideModeledMethods={false}
|
hideModeledMethods={false}
|
||||||
revealedMethodSignature={null}
|
revealedMethodSignature={null}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { render as reactRender, screen } from "@testing-library/react";
|
import { render as reactRender, screen } from "@testing-library/react";
|
||||||
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
import { createMethod } from "../../../../test/factories/model-editor/method-factories";
|
||||||
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
|
|
||||||
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
|
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
|
||||||
import { Mode } from "../../../model-editor/shared/mode";
|
import { Mode } from "../../../model-editor/shared/mode";
|
||||||
import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
|
import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
|
||||||
@@ -70,7 +69,7 @@ describe(ModeledMethodsList.name, () => {
|
|||||||
],
|
],
|
||||||
}}
|
}}
|
||||||
modifiedSignatures={new Set([method1.signature])}
|
modifiedSignatures={new Set([method1.signature])}
|
||||||
inProgressMethods={new InProgressMethods()}
|
inProgressMethods={{}}
|
||||||
viewState={viewState}
|
viewState={viewState}
|
||||||
hideModeledMethods={false}
|
hideModeledMethods={false}
|
||||||
revealedMethodSignature={null}
|
revealedMethodSignature={null}
|
||||||
|
|||||||
Reference in New Issue
Block a user