Add in-progress UI state for modeling methods (#2675)

This commit is contained in:
Charis Kyriakou
2023-08-07 12:58:41 +01:00
committed by GitHub
parent f1204ce8f4
commit 55557df53f
7 changed files with 111 additions and 33 deletions

View File

@@ -510,6 +510,11 @@ interface AddModeledMethodsMessage {
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
} }
interface SetInProgressMethodsMessage {
t: "setInProgressMethods";
inProgressMethods: string[];
}
interface SwitchModeMessage { interface SwitchModeMessage {
t: "switchMode"; t: "switchMode";
mode: Mode; mode: Mode;
@@ -556,7 +561,8 @@ export type ToDataExtensionsEditorMessage =
| SetExtensionPackStateMessage | SetExtensionPackStateMessage
| SetExternalApiUsagesMessage | SetExternalApiUsagesMessage
| LoadModeledMethodsMessage | LoadModeledMethodsMessage
| AddModeledMethodsMessage; | AddModeledMethodsMessage
| SetInProgressMethodsMessage;
export type FromDataExtensionsEditorMessage = export type FromDataExtensionsEditorMessage =
| ViewLoadedMsg | ViewLoadedMsg

View File

@@ -91,6 +91,10 @@ export function DataExtensionsEditor({
new Set(), new Set(),
); );
const [inProgressSignatures, setInProgressSignatures] = useState<Set<string>>(
new Set(),
);
const [hideModeledApis, setHideModeledApis] = useState(true); const [hideModeledApis, setHideModeledApis] = useState(true);
const [modeledMethods, setModeledMethods] = useState< const [modeledMethods, setModeledMethods] = useState<
@@ -135,6 +139,9 @@ export function DataExtensionsEditor({
]), ]),
); );
break; break;
case "setInProgressMethods":
setInProgressSignatures(new Set(msg.inProgressMethods));
break;
default: default:
assertNever(msg); assertNever(msg);
} }
@@ -330,6 +337,7 @@ export function DataExtensionsEditor({
externalApiUsages={externalApiUsages} externalApiUsages={externalApiUsages}
modeledMethods={modeledMethods} modeledMethods={modeledMethods}
modifiedSignatures={modifiedSignatures} modifiedSignatures={modifiedSignatures}
inProgressSignatures={inProgressSignatures}
viewState={viewState} viewState={viewState}
hideModeledApis={hideModeledApis} hideModeledApis={hideModeledApis}
onChange={onChange} onChange={onChange}

View File

@@ -0,0 +1,23 @@
import * as React from "react";
import { Dropdown } from "../common/Dropdown";
export const InProgressDropdown = () => {
const options: Array<{ label: string; value: string }> = [
{
label: "Thinking...",
value: "Thinking...",
},
];
const noop = () => {
// Do nothing
};
return (
<Dropdown
value="Thinking..."
options={options}
disabled={false}
onChange={noop}
/>
);
};

View File

@@ -72,6 +72,7 @@ type Props = {
externalApiUsages: ExternalApiUsage[]; externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
modifiedSignatures: Set<string>; modifiedSignatures: Set<string>;
inProgressSignatures: Set<string>;
viewState: DataExtensionEditorViewState; viewState: DataExtensionEditorViewState;
hideModeledApis: boolean; hideModeledApis: boolean;
onChange: ( onChange: (
@@ -97,6 +98,7 @@ export const LibraryRow = ({
externalApiUsages, externalApiUsages,
modeledMethods, modeledMethods,
modifiedSignatures, modifiedSignatures,
inProgressSignatures,
viewState, viewState,
hideModeledApis, hideModeledApis,
onChange, onChange,
@@ -209,6 +211,7 @@ export const LibraryRow = ({
externalApiUsages={externalApiUsages} externalApiUsages={externalApiUsages}
modeledMethods={modeledMethods} modeledMethods={modeledMethods}
modifiedSignatures={modifiedSignatures} modifiedSignatures={modifiedSignatures}
inProgressSignatures={inProgressSignatures}
mode={viewState.mode} mode={viewState.mode}
hideModeledApis={hideModeledApis} hideModeledApis={hideModeledApis}
onChange={onChangeWithModelName} onChange={onChangeWithModelName}

View File

@@ -2,6 +2,7 @@ import {
VSCodeDataGridCell, VSCodeDataGridCell,
VSCodeDataGridRow, VSCodeDataGridRow,
VSCodeLink, VSCodeLink,
VSCodeProgressRing,
} from "@vscode/webview-ui-toolkit/react"; } from "@vscode/webview-ui-toolkit/react";
import * as React from "react"; import * as React from "react";
import { ChangeEvent, useCallback, useMemo } from "react"; import { ChangeEvent, useCallback, useMemo } from "react";
@@ -23,6 +24,7 @@ import {
ModelingStatus, ModelingStatus,
ModelingStatusIndicator, ModelingStatusIndicator,
} from "./ModelingStatusIndicator"; } from "./ModelingStatusIndicator";
import { InProgressDropdown } from "./InProgressDropdown";
const ApiOrMethodCell = styled(VSCodeDataGridCell)` const ApiOrMethodCell = styled(VSCodeDataGridCell)`
display: flex; display: flex;
@@ -43,6 +45,12 @@ const ViewLink = styled(VSCodeLink)`
white-space: nowrap; white-space: nowrap;
`; `;
const ProgressRing = styled(VSCodeProgressRing)`
width: 16px;
height: 16px;
margin-left: auto;
`;
const modelTypeOptions: Array<{ value: ModeledMethodType; label: string }> = [ const modelTypeOptions: Array<{ value: ModeledMethodType; label: string }> = [
{ value: "none", label: "Unmodeled" }, { value: "none", label: "Unmodeled" },
{ value: "source", label: "Source" }, { value: "source", label: "Source" },
@@ -55,6 +63,7 @@ type Props = {
externalApiUsage: ExternalApiUsage; externalApiUsage: ExternalApiUsage;
modeledMethod: ModeledMethod | undefined; modeledMethod: ModeledMethod | undefined;
methodIsUnsaved: boolean; methodIsUnsaved: boolean;
modelingInProgress: boolean;
mode: Mode; mode: Mode;
hideModeledApis: boolean; hideModeledApis: boolean;
onChange: ( onChange: (
@@ -216,38 +225,59 @@ function ModelableMethodRow(props: Props) {
</UsagesButton> </UsagesButton>
)} )}
<ViewLink onClick={jumpToUsage}>View</ViewLink> <ViewLink onClick={jumpToUsage}>View</ViewLink>
{props.modelingInProgress && <ProgressRing />}
</ApiOrMethodCell> </ApiOrMethodCell>
<VSCodeDataGridCell gridColumn={2}> {props.modelingInProgress && (
<Dropdown <>
value={modeledMethod?.type ?? "none"} <VSCodeDataGridCell gridColumn={2}>
options={modelTypeOptions} <InProgressDropdown />
onChange={handleTypeInput} </VSCodeDataGridCell>
/> <VSCodeDataGridCell gridColumn={3}>
</VSCodeDataGridCell> <InProgressDropdown />
<VSCodeDataGridCell gridColumn={3}> </VSCodeDataGridCell>
<Dropdown <VSCodeDataGridCell gridColumn={4}>
value={modeledMethod?.input} <InProgressDropdown />
options={inputOptions} </VSCodeDataGridCell>
disabled={!showInputCell} <VSCodeDataGridCell gridColumn={5}>
onChange={handleInputInput} <InProgressDropdown />
/> </VSCodeDataGridCell>
</VSCodeDataGridCell> </>
<VSCodeDataGridCell gridColumn={4}> )}
<Dropdown {!props.modelingInProgress && (
value={modeledMethod?.output} <>
options={outputOptions} <VSCodeDataGridCell gridColumn={2}>
disabled={!showOutputCell} <Dropdown
onChange={handleOutputInput} value={modeledMethod?.type ?? "none"}
/> options={modelTypeOptions}
</VSCodeDataGridCell> onChange={handleTypeInput}
<VSCodeDataGridCell gridColumn={5}> />
<KindInput </VSCodeDataGridCell>
kinds={predicate?.supportedKinds || []} <VSCodeDataGridCell gridColumn={3}>
value={modeledMethod?.kind} <Dropdown
disabled={!showKindCell} value={modeledMethod?.input}
onChange={handleKindChange} options={inputOptions}
/> disabled={!showInputCell}
</VSCodeDataGridCell> onChange={handleInputInput}
/>
</VSCodeDataGridCell>
<VSCodeDataGridCell gridColumn={4}>
<Dropdown
value={modeledMethod?.output}
options={outputOptions}
disabled={!showOutputCell}
onChange={handleOutputInput}
/>
</VSCodeDataGridCell>
<VSCodeDataGridCell gridColumn={5}>
<KindInput
kinds={predicate?.supportedKinds || []}
value={modeledMethod?.kind}
disabled={!showKindCell}
onChange={handleKindChange}
/>
</VSCodeDataGridCell>
</>
)}
</VSCodeDataGridRow> </VSCodeDataGridRow>
); );
} }

View File

@@ -15,6 +15,7 @@ type Props = {
externalApiUsages: ExternalApiUsage[]; externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
modifiedSignatures: Set<string>; modifiedSignatures: Set<string>;
inProgressSignatures: Set<string>;
mode: Mode; mode: Mode;
hideModeledApis: boolean; hideModeledApis: boolean;
onChange: ( onChange: (
@@ -27,6 +28,7 @@ export const ModeledMethodDataGrid = ({
externalApiUsages, externalApiUsages,
modeledMethods, modeledMethods,
modifiedSignatures, modifiedSignatures,
inProgressSignatures,
mode, mode,
hideModeledApis, hideModeledApis,
onChange, onChange,
@@ -37,7 +39,7 @@ export const ModeledMethodDataGrid = ({
); );
return ( return (
<VSCodeDataGrid gridTemplateColumns="0.5fr 0.125fr 0.125fr 0.125fr 0.125fr"> <VSCodeDataGrid gridTemplateColumns="0.5fr 0.125fr 0.125fr 0.125fr 0.125fr 0.125fr">
<VSCodeDataGridRow rowType="header"> <VSCodeDataGridRow rowType="header">
<VSCodeDataGridCell cellType="columnheader" gridColumn={1}> <VSCodeDataGridCell cellType="columnheader" gridColumn={1}>
API or method API or method
@@ -61,6 +63,9 @@ export const ModeledMethodDataGrid = ({
externalApiUsage={externalApiUsage} externalApiUsage={externalApiUsage}
modeledMethod={modeledMethods[externalApiUsage.signature]} modeledMethod={modeledMethods[externalApiUsage.signature]}
methodIsUnsaved={modifiedSignatures.has(externalApiUsage.signature)} methodIsUnsaved={modifiedSignatures.has(externalApiUsage.signature)}
modelingInProgress={inProgressSignatures.has(
externalApiUsage.signature,
)}
mode={mode} mode={mode}
hideModeledApis={hideModeledApis} hideModeledApis={hideModeledApis}
onChange={onChange} onChange={onChange}

View File

@@ -14,6 +14,7 @@ type Props = {
externalApiUsages: ExternalApiUsage[]; externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
modifiedSignatures: Set<string>; modifiedSignatures: Set<string>;
inProgressSignatures: Set<string>;
viewState: DataExtensionEditorViewState; viewState: DataExtensionEditorViewState;
hideModeledApis: boolean; hideModeledApis: boolean;
onChange: ( onChange: (
@@ -41,6 +42,7 @@ export const ModeledMethodsList = ({
externalApiUsages, externalApiUsages,
modeledMethods, modeledMethods,
modifiedSignatures, modifiedSignatures,
inProgressSignatures,
viewState, viewState,
hideModeledApis, hideModeledApis,
onChange, onChange,
@@ -84,6 +86,7 @@ export const ModeledMethodsList = ({
externalApiUsages={grouped[libraryName]} externalApiUsages={grouped[libraryName]}
modeledMethods={modeledMethods} modeledMethods={modeledMethods}
modifiedSignatures={modifiedSignatures} modifiedSignatures={modifiedSignatures}
inProgressSignatures={inProgressSignatures}
viewState={viewState} viewState={viewState}
hideModeledApis={hideModeledApis} hideModeledApis={hideModeledApis}
onChange={onChange} onChange={onChange}