Skip to content

Commit b87dfa4

Browse files
authored
Show in-progress state in method modeling panel (#2979)
1 parent b1a4586 commit b87dfa4

14 files changed

Lines changed: 169 additions & 6 deletions

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,11 @@ interface SetInModelingModeMessage {
583583
inModelingMode: boolean;
584584
}
585585

586+
interface SetInProgressMessage {
587+
t: "setInProgress";
588+
inProgress: boolean;
589+
}
590+
586591
interface RevealMethodMessage {
587592
t: "revealMethod";
588593
methodSignature: string;
@@ -646,6 +651,7 @@ interface SetSelectedMethodMessage {
646651
method: Method;
647652
modeledMethods: ModeledMethod[];
648653
isModified: boolean;
654+
isInProgress: boolean;
649655
}
650656

651657
export type ToMethodModelingMessage =
@@ -654,4 +660,5 @@ export type ToMethodModelingMessage =
654660
| SetMultipleModeledMethodsMessage
655661
| SetMethodModifiedMessage
656662
| SetSelectedMethodMessage
657-
| SetInModelingModeMessage;
663+
| SetInModelingModeMessage
664+
| SetInProgressMessage;

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { assertNever } from "../../common/helpers-pure";
1414
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
1515
import { ModelConfigListener } from "../../config";
1616
import { DatabaseItem } from "../../databases/local-databases";
17+
import { hasInProgressMethodSignature } from "../shared/in-progress-methods";
1718

1819
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
1920
ToMethodModelingMessage,
@@ -75,6 +76,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
7576
method: selectedMethod.method,
7677
modeledMethods: selectedMethod.modeledMethods,
7778
isModified: selectedMethod.isModified,
79+
isInProgress: selectedMethod.isInProgress,
7880
});
7981
}
8082

@@ -188,6 +190,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
188190
method: e.method,
189191
modeledMethods: e.modeledMethods,
190192
isModified: e.isModified,
193+
isInProgress: e.isInProgress,
191194
});
192195
}
193196
}),
@@ -216,6 +219,24 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
216219
}
217220
}),
218221
);
222+
223+
this.push(
224+
this.modelingStore.onInProgressMethodsChanged(async (e) => {
225+
if (this.method && this.databaseItem) {
226+
const dbUri = this.databaseItem.databaseUri.toString();
227+
if (e.dbUri === dbUri) {
228+
const inProgress = hasInProgressMethodSignature(
229+
e.methods,
230+
this.method.signature,
231+
);
232+
await this.postMessage({
233+
t: "setInProgress",
234+
inProgress,
235+
});
236+
}
237+
}
238+
}),
239+
);
219240
}
220241

221242
private registerToModelConfigEvents(): void {

extensions/ql-vscode/src/model-editor/modeling-store.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import { DatabaseItem } from "../databases/local-databases";
55
import { Method, Usage } from "./method";
66
import { ModeledMethod } from "./modeled-method";
77
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
8-
import { InProgressMethods } from "./shared/in-progress-methods";
8+
import {
9+
InProgressMethods,
10+
hasInProgressMethodSignature,
11+
} from "./shared/in-progress-methods";
912
import { INITIAL_MODE, Mode } from "./shared/mode";
1013

1114
interface InternalDbModelingState {
@@ -37,6 +40,7 @@ interface SelectedMethodDetails {
3740
readonly usage: Usage | undefined;
3841
readonly modeledMethods: readonly ModeledMethod[];
3942
readonly isModified: boolean;
43+
readonly isInProgress: boolean;
4044
}
4145

4246
interface MethodsChangedEvent {
@@ -73,6 +77,7 @@ interface SelectedMethodChangedEvent {
7377
readonly usage: Usage;
7478
readonly modeledMethods: readonly ModeledMethod[];
7579
readonly isModified: boolean;
80+
readonly isInProgress: boolean;
7681
}
7782

7883
interface InProgressMethodsChangedEvent {
@@ -420,6 +425,10 @@ export class ModelingStore extends DisposableObject {
420425
usage,
421426
modeledMethods: dbState.modeledMethods[method.signature] ?? [],
422427
isModified: dbState.modifiedMethodSignatures.has(method.signature),
428+
isInProgress: hasInProgressMethodSignature(
429+
dbState.inProgressMethods,
430+
method.signature,
431+
),
423432
});
424433
}
425434

@@ -460,6 +469,10 @@ export class ModelingStore extends DisposableObject {
460469
isModified: dbState.modifiedMethodSignatures.has(
461470
selectedMethod.signature,
462471
),
472+
isInProgress: hasInProgressMethodSignature(
473+
dbState.inProgressMethods,
474+
selectedMethod.signature,
475+
),
463476
};
464477
}
465478

extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,16 @@ export function hasInProgressMethod(
1515

1616
return false;
1717
}
18+
19+
export function hasInProgressMethodSignature(
20+
inProgressMethods: InProgressMethods,
21+
signature: string,
22+
): boolean {
23+
for (const methods of Object.values(inProgressMethods)) {
24+
if (methods.includes(signature)) {
25+
return true;
26+
}
27+
}
28+
29+
return false;
30+
}

extensions/ql-vscode/src/stories/method-modeling/MethodModelingInputs.stories.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,10 @@ FullyModeledMethod.args = {
5151
method,
5252
modeledMethod,
5353
};
54+
55+
export const ModelingInProgress = Template.bind({});
56+
ModelingInProgress.args = {
57+
method,
58+
modeledMethod,
59+
isModelingInProgress: true,
60+
};

extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export type MethodModelingProps = {
5252
modelingStatus: ModelingStatus;
5353
method: Method;
5454
modeledMethods: ModeledMethod[];
55+
isModelingInProgress: boolean;
5556
showMultipleModels?: boolean;
5657
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
5758
};
@@ -60,6 +61,7 @@ export const MethodModeling = ({
6061
modelingStatus,
6162
modeledMethods,
6263
method,
64+
isModelingInProgress,
6365
showMultipleModels = false,
6466
onChange,
6567
}: MethodModelingProps): JSX.Element => {
@@ -78,6 +80,7 @@ export const MethodModeling = ({
7880
method={method}
7981
modeledMethods={modeledMethods}
8082
showMultipleModels={showMultipleModels}
83+
isModelingInProgress={isModelingInProgress}
8184
onChange={onChange}
8285
/>
8386
<ReviewInEditorButton method={method} />

extensions/ql-vscode/src/view/method-modeling/MethodModelingInputs.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { ModelTypeDropdown } from "../model-editor/ModelTypeDropdown";
66
import { ModelInputDropdown } from "../model-editor/ModelInputDropdown";
77
import { ModelOutputDropdown } from "../model-editor/ModelOutputDropdown";
88
import { ModelKindDropdown } from "../model-editor/ModelKindDropdown";
9+
import { InProgressDropdown } from "../model-editor/InProgressDropdown";
910

1011
const Container = styled.div`
1112
padding-top: 0.5rem;
@@ -24,12 +25,14 @@ const Name = styled.span`
2425
export type MethodModelingInputsProps = {
2526
method: Method;
2627
modeledMethod: ModeledMethod | undefined;
28+
isModelingInProgress: boolean;
2729
onChange: (modeledMethod: ModeledMethod) => void;
2830
};
2931

3032
export const MethodModelingInputs = ({
3133
method,
3234
modeledMethod,
35+
isModelingInProgress,
3336
onChange,
3437
}: MethodModelingInputsProps): JSX.Element => {
3538
const inputProps = {
@@ -43,25 +46,41 @@ export const MethodModelingInputs = ({
4346
<Container>
4447
<Input>
4548
<Name>Model Type</Name>
46-
<ModelTypeDropdown {...inputProps} />
49+
{isModelingInProgress ? (
50+
<InProgressDropdown />
51+
) : (
52+
<ModelTypeDropdown {...inputProps} />
53+
)}
4754
</Input>
4855
</Container>
4956
<Container>
5057
<Input>
5158
<Name>Input</Name>
52-
<ModelInputDropdown {...inputProps} />
59+
{isModelingInProgress ? (
60+
<InProgressDropdown />
61+
) : (
62+
<ModelInputDropdown {...inputProps} />
63+
)}
5364
</Input>
5465
</Container>
5566
<Container>
5667
<Input>
5768
<Name>Output</Name>
58-
<ModelOutputDropdown {...inputProps} />
69+
{isModelingInProgress ? (
70+
<InProgressDropdown />
71+
) : (
72+
<ModelOutputDropdown {...inputProps} />
73+
)}
5974
</Input>
6075
</Container>
6176
<Container>
6277
<Input>
6378
<Name>Kind</Name>
64-
<ModelKindDropdown {...inputProps} />
79+
{isModelingInProgress ? (
80+
<InProgressDropdown />
81+
) : (
82+
<ModelKindDropdown {...inputProps} />
83+
)}
6584
</Input>
6685
</Container>
6786
</>

extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ export function MethodModelingView({ initialViewState }: Props): JSX.Element {
2828

2929
const [isMethodModified, setIsMethodModified] = useState<boolean>(false);
3030

31+
const [isModelingInProgress, setIsModelingInProgress] =
32+
useState<boolean>(false);
33+
3134
const modelingStatus = useMemo(
3235
() => getModelingStatus(modeledMethods, isMethodModified),
3336
[modeledMethods, isMethodModified],
@@ -58,6 +61,9 @@ export function MethodModelingView({ initialViewState }: Props): JSX.Element {
5861
setModeledMethods(msg.modeledMethods);
5962
setIsMethodModified(msg.isModified);
6063
break;
64+
case "setInProgress":
65+
setIsModelingInProgress(msg.inProgress);
66+
break;
6167
default:
6268
assertNever(msg);
6369
}
@@ -102,6 +108,7 @@ export function MethodModelingView({ initialViewState }: Props): JSX.Element {
102108
modelingStatus={modelingStatus}
103109
method={method}
104110
modeledMethods={modeledMethods}
111+
isModelingInProgress={isModelingInProgress}
105112
showMultipleModels={viewState?.showMultipleModels}
106113
onChange={onChange}
107114
/>

extensions/ql-vscode/src/view/method-modeling/ModeledMethodsPanel.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { convertToLegacyModeledMethod } from "../../model-editor/shared/modeled-
1010
export type ModeledMethodsPanelProps = {
1111
method: Method;
1212
modeledMethods: ModeledMethod[];
13+
isModelingInProgress: boolean;
1314
showMultipleModels: boolean;
1415
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
1516
};
@@ -21,6 +22,7 @@ const SingleMethodModelingInputs = styled(MethodModelingInputs)`
2122
export const ModeledMethodsPanel = ({
2223
method,
2324
modeledMethods,
25+
isModelingInProgress,
2426
showMultipleModels,
2527
onChange,
2628
}: ModeledMethodsPanelProps) => {
@@ -36,6 +38,7 @@ export const ModeledMethodsPanel = ({
3638
<SingleMethodModelingInputs
3739
method={method}
3840
modeledMethod={convertToLegacyModeledMethod(modeledMethods)}
41+
isModelingInProgress={isModelingInProgress}
3942
onChange={handleSingleChange}
4043
/>
4144
);
@@ -45,6 +48,7 @@ export const ModeledMethodsPanel = ({
4548
<MultipleModeledMethodsPanel
4649
method={method}
4750
modeledMethods={modeledMethods}
51+
isModelingInProgress={isModelingInProgress}
4852
onChange={onChange}
4953
/>
5054
);

extensions/ql-vscode/src/view/method-modeling/MultipleModeledMethodsPanel.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ModeledMethodAlert } from "./ModeledMethodAlert";
1616
export type MultipleModeledMethodsPanelProps = {
1717
method: Method;
1818
modeledMethods: ModeledMethod[];
19+
isModelingInProgress: boolean;
1920
onChange: (methodSignature: string, modeledMethods: ModeledMethod[]) => void;
2021
};
2122

@@ -54,6 +55,7 @@ const ModificationActions = styled.div`
5455
export const MultipleModeledMethodsPanel = ({
5556
method,
5657
modeledMethods,
58+
isModelingInProgress,
5759
onChange,
5860
}: MultipleModeledMethodsPanelProps) => {
5961
const [selectedIndex, setSelectedIndex] = useState<number>(0);
@@ -134,12 +136,14 @@ export const MultipleModeledMethodsPanel = ({
134136
<MethodModelingInputs
135137
method={method}
136138
modeledMethod={modeledMethods[selectedIndex]}
139+
isModelingInProgress={isModelingInProgress}
137140
onChange={handleChange}
138141
/>
139142
) : (
140143
<MethodModelingInputs
141144
method={method}
142145
modeledMethod={undefined}
146+
isModelingInProgress={isModelingInProgress}
143147
onChange={handleChange}
144148
/>
145149
)}

0 commit comments

Comments
 (0)