@@ -9,6 +9,7 @@ import { calculateModeledPercentage } from "../../data-extensions-editor/shared/
99import { decimalFormatter , percentFormatter } from "./formatters" ;
1010import { Codicon } from "../common" ;
1111import { Mode } from "../../data-extensions-editor/shared/mode" ;
12+ import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" ;
1213
1314const LibraryContainer = styled . div `
1415 margin-bottom: 1rem;
@@ -19,15 +20,46 @@ const TitleContainer = styled.button`
1920 gap: 0.5em;
2021 align-items: center;
2122 width: 100%;
22- font-size: 1.2em;
23- font-weight: bold;
2423
2524 color: var(--vscode-editor-foreground);
2625 background-color: transparent;
2726 border: none;
2827 cursor: pointer;
2928` ;
3029
30+ const NameContainer = styled . div `
31+ display: flex;
32+ gap: 0.5em;
33+ align-items: baseline;
34+ flex-grow: 1;
35+ text-align: left;
36+ ` ;
37+
38+ const DependencyName = styled . span `
39+ font-size: 1.2em;
40+ font-weight: bold;
41+ ` ;
42+
43+ const ModeledPercentage = styled . span `
44+ color: var(--vscode-descriptionForeground);
45+ ` ;
46+
47+ const UnsavedLabel = styled . span `
48+ text-transform: uppercase;
49+ background-color: var(--vscode-input-background);
50+ padding: 0.2em 0.4em;
51+ border-radius: 0.2em;
52+ ` ;
53+
54+ const TitleButton = styled ( VSCodeButton ) `
55+ background-color: transparent;
56+
57+ &:hover {
58+ pointer: cursor;
59+ background-color: var(--vscode-button-secondaryBackground);
60+ }
61+ ` ;
62+
3163const StatusContainer = styled . div `
3264 display: flex;
3365 gap: 1em;
@@ -43,6 +75,7 @@ type Props = {
4375 externalApiUsages : ExternalApiUsage [ ] ;
4476 modeledMethods : Record < string , ModeledMethod > ;
4577 mode : Mode ;
78+ hasUnsavedChanges : boolean ;
4679 onChange : (
4780 externalApiUsage : ExternalApiUsage ,
4881 modeledMethod : ModeledMethod ,
@@ -54,6 +87,7 @@ export const LibraryRow = ({
5487 externalApiUsages,
5588 modeledMethods,
5689 mode,
90+ hasUnsavedChanges,
5791 onChange,
5892} : Props ) => {
5993 const modeledPercentage = useMemo ( ( ) => {
@@ -70,6 +104,16 @@ export const LibraryRow = ({
70104 return externalApiUsages . reduce ( ( acc , curr ) => acc + curr . usages . length , 0 ) ;
71105 } , [ externalApiUsages ] ) ;
72106
107+ const handleModelWithAI = useCallback ( async ( e : React . MouseEvent ) => {
108+ e . stopPropagation ( ) ;
109+ e . preventDefault ( ) ;
110+ } , [ ] ) ;
111+
112+ const handleModelFromSource = useCallback ( async ( e : React . MouseEvent ) => {
113+ e . stopPropagation ( ) ;
114+ e . preventDefault ( ) ;
115+ } , [ ] ) ;
116+
73117 return (
74118 < LibraryContainer >
75119 < TitleContainer onClick = { toggleExpanded } aria-expanded = { isExpanded } >
@@ -78,20 +122,21 @@ export const LibraryRow = ({
78122 ) : (
79123 < Codicon name = "chevron-right" label = "Expand" />
80124 ) }
81- { title }
82- { isExpanded ? null : (
83- < >
84- { " " }
85- (
86- { pluralize (
87- externalApiUsages . length ,
88- "method" ,
89- "methods" ,
90- decimalFormatter . format . bind ( decimalFormatter ) ,
91- ) }
92- , { percentFormatter . format ( modeledPercentage / 100 ) } modeled)
93- </ >
94- ) }
125+ < NameContainer >
126+ < DependencyName > { title } </ DependencyName >
127+ < ModeledPercentage >
128+ { percentFormatter . format ( modeledPercentage / 100 ) } modeled
129+ </ ModeledPercentage >
130+ { hasUnsavedChanges ? < UnsavedLabel > UNSAVED</ UnsavedLabel > : null }
131+ </ NameContainer >
132+ < TitleButton onClick = { handleModelWithAI } >
133+ < Codicon name = "lightbulb-autofix" label = "Model with AI" />
134+ Model with AI
135+ </ TitleButton >
136+ < TitleButton onClick = { handleModelFromSource } >
137+ < Codicon name = "code" label = "Model from source" />
138+ Model from source
139+ </ TitleButton >
95140 </ TitleContainer >
96141 { isExpanded && (
97142 < >
0 commit comments