Skip to content

Commit de7d65f

Browse files
Replace checkbox with an icon that shows saved status
1 parent e73421d commit de7d65f

3 files changed

Lines changed: 47 additions & 6 deletions

File tree

extensions/ql-vscode/src/view/data-extensions-editor/LibraryRow.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export const LibraryRow = ({
200200
<ModeledMethodDataGrid
201201
externalApiUsages={externalApiUsages}
202202
modeledMethods={modeledMethods}
203+
modifiedSignatures={modifiedSignatures}
203204
mode={viewState.mode}
204205
onChange={onChangeWithModelName}
205206
/>

extensions/ql-vscode/src/view/data-extensions-editor/MethodRow.tsx

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
VSCodeCheckbox,
32
VSCodeDataGridCell,
43
VSCodeDataGridRow,
54
VSCodeLink,
@@ -20,6 +19,8 @@ import { extensiblePredicateDefinitions } from "../../data-extensions-editor/pre
2019
import { Mode } from "../../data-extensions-editor/shared/mode";
2120
import { Dropdown } from "../common/Dropdown";
2221
import { MethodClassifications } from "./MethodClassifications";
22+
import { Codicon } from "../common/icon";
23+
import { assertNever } from "../../common/helpers-pure";
2324

2425
const ApiOrMethodCell = styled(VSCodeDataGridCell)`
2526
display: flex;
@@ -51,6 +52,7 @@ const modelTypeOptions: Array<{ value: ModeledMethodType; label: string }> = [
5152
type Props = {
5253
externalApiUsage: ExternalApiUsage;
5354
modeledMethod: ModeledMethod | undefined;
55+
modifiedSignatures: Set<string>;
5456
mode: Mode;
5557
onChange: (
5658
externalApiUsage: ExternalApiUsage,
@@ -59,11 +61,12 @@ type Props = {
5961
};
6062

6163
export const MethodRow = (props: Props) => {
62-
const { externalApiUsage, modeledMethod } = props;
64+
const { externalApiUsage, modeledMethod, modifiedSignatures } = props;
6365

6466
const methodCanBeModeled =
6567
!externalApiUsage.supported ||
66-
(modeledMethod && modeledMethod?.type !== "none");
68+
(modeledMethod && modeledMethod?.type !== "none") ||
69+
modifiedSignatures.has(externalApiUsage.signature);
6770

6871
if (methodCanBeModeled) {
6972
return <ModelableMethodRow {...props} />;
@@ -73,7 +76,13 @@ export const MethodRow = (props: Props) => {
7376
};
7477

7578
function ModelableMethodRow(props: Props) {
76-
const { externalApiUsage, modeledMethod, mode, onChange } = props;
79+
const {
80+
externalApiUsage,
81+
modeledMethod,
82+
modifiedSignatures,
83+
mode,
84+
onChange,
85+
} = props;
7786

7887
const argumentsList = useMemo(() => {
7988
if (externalApiUsage.methodParameters === "()") {
@@ -192,10 +201,21 @@ function ModelableMethodRow(props: Props) {
192201
: undefined;
193202
const showKindCell = predicate?.supportedKinds;
194203

204+
const modificationState = useMemo(() => {
205+
if (modeledMethod) {
206+
if (modifiedSignatures.has(modeledMethod.signature)) {
207+
return "unsaved";
208+
} else if (modeledMethod.type !== "none") {
209+
return "saved";
210+
}
211+
}
212+
return "unmodeled";
213+
}, [modeledMethod, modifiedSignatures]);
214+
195215
return (
196216
<VSCodeDataGridRow>
197217
<ApiOrMethodCell gridColumn={1}>
198-
<VSCodeCheckbox />
218+
<ModificationIndicator state={modificationState} />
199219
<ExternalApiUsageName {...props} />
200220
{mode === Mode.Application && (
201221
<UsagesButton onClick={jumpToUsage}>
@@ -251,7 +271,7 @@ function UnmodelableMethodRow(props: Props) {
251271
return (
252272
<VSCodeDataGridRow>
253273
<ApiOrMethodCell gridColumn={1}>
254-
<VSCodeCheckbox />
274+
<ModificationIndicator state="saved" />
255275
<ExternalApiUsageName {...props} />
256276
{mode === Mode.Application && (
257277
<UsagesButton onClick={jumpToUsage}>
@@ -287,3 +307,20 @@ function sendJumpToUsageMessage(externalApiUsage: ExternalApiUsage) {
287307
location: externalApiUsage.usages[0].url,
288308
});
289309
}
310+
311+
function ModificationIndicator({
312+
state,
313+
}: {
314+
state: "unmodeled" | "unsaved" | "saved";
315+
}) {
316+
switch (state) {
317+
case "unmodeled":
318+
return <Codicon name="circle-large-outline" label="Method not modeled" />;
319+
case "unsaved":
320+
return <Codicon name="pass" label="Changes have not been saved" />;
321+
case "saved":
322+
return <Codicon name="pass-filled" label="Method modeled" />;
323+
default:
324+
assertNever(state);
325+
}
326+
}

extensions/ql-vscode/src/view/data-extensions-editor/ModeledMethodDataGrid.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { sortMethods } from "../../data-extensions-editor/shared/sorting";
1414
type Props = {
1515
externalApiUsages: ExternalApiUsage[];
1616
modeledMethods: Record<string, ModeledMethod>;
17+
modifiedSignatures: Set<string>;
1718
mode: Mode;
1819
onChange: (
1920
externalApiUsage: ExternalApiUsage,
@@ -24,6 +25,7 @@ type Props = {
2425
export const ModeledMethodDataGrid = ({
2526
externalApiUsages,
2627
modeledMethods,
28+
modifiedSignatures,
2729
mode,
2830
onChange,
2931
}: Props) => {
@@ -56,6 +58,7 @@ export const ModeledMethodDataGrid = ({
5658
key={externalApiUsage.signature}
5759
externalApiUsage={externalApiUsage}
5860
modeledMethod={modeledMethods[externalApiUsage.signature]}
61+
modifiedSignatures={modifiedSignatures}
5962
mode={mode}
6063
onChange={onChange}
6164
/>

0 commit comments

Comments
 (0)