11import {
2- VSCodeCheckbox ,
32 VSCodeDataGridCell ,
43 VSCodeDataGridRow ,
54 VSCodeLink ,
@@ -20,6 +19,8 @@ import { extensiblePredicateDefinitions } from "../../data-extensions-editor/pre
2019import { Mode } from "../../data-extensions-editor/shared/mode" ;
2120import { Dropdown } from "../common/Dropdown" ;
2221import { MethodClassifications } from "./MethodClassifications" ;
22+ import { Codicon } from "../common/icon" ;
23+ import { assertNever } from "../../common/helpers-pure" ;
2324
2425const ApiOrMethodCell = styled ( VSCodeDataGridCell ) `
2526 display: flex;
@@ -51,6 +52,7 @@ const modelTypeOptions: Array<{ value: ModeledMethodType; label: string }> = [
5152type 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
6163export 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
7578function 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+ }
0 commit comments