@@ -3,12 +3,12 @@ import { useCallback, useMemo, useState } from "react";
33import styled from "styled-components" ;
44import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usage" ;
55import { ModeledMethod } from "../../data-extensions-editor/modeled-method" ;
6- import { pluralize } from "../../common/word" ;
76import { ModeledMethodDataGrid } from "./ModeledMethodDataGrid" ;
87import { calculateModeledPercentage } from "../../data-extensions-editor/shared/modeled-percentage" ;
9- import { decimalFormatter , percentFormatter } from "./formatters" ;
8+ import { percentFormatter } from "./formatters" ;
109import { Codicon } from "../common" ;
1110import { Mode } from "../../data-extensions-editor/shared/mode" ;
11+ import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" ;
1212
1313const LibraryContainer = styled . div `
1414 margin-bottom: 1rem;
@@ -19,30 +19,52 @@ const TitleContainer = styled.button`
1919 gap: 0.5em;
2020 align-items: center;
2121 width: 100%;
22- font-size: 1.2em;
23- font-weight: bold;
2422
2523 color: var(--vscode-editor-foreground);
2624 background-color: transparent;
2725 border: none;
2826 cursor: pointer;
2927` ;
3028
31- const StatusContainer = styled . div `
29+ const NameContainer = styled . div `
3230 display: flex;
33- gap: 1em;
34- align-items: center;
31+ gap: 0.5em;
32+ align-items: baseline;
33+ flex-grow: 1;
34+ text-align: left;
35+ ` ;
36+
37+ const DependencyName = styled . span `
38+ font-size: 1.2em;
39+ font-weight: bold;
40+ ` ;
41+
42+ const ModeledPercentage = styled . span `
43+ color: var(--vscode-descriptionForeground);
44+ ` ;
45+
46+ const UnsavedLabel = styled . span `
47+ text-transform: uppercase;
48+ background-color: var(--vscode-input-background);
49+ padding: 0.2em 0.4em;
50+ border-radius: 0.2em;
51+ ` ;
52+
53+ const TitleButton = styled ( VSCodeButton ) `
54+ background-color: transparent;
3555
36- margin-top: 0.5em;
37- margin-bottom: 0.5em;
38- margin-left: 1em;
56+ &:hover {
57+ pointer: cursor;
58+ background-color: var(--vscode-button-secondaryBackground);
59+ }
3960` ;
4061
4162type Props = {
4263 title : string ;
4364 externalApiUsages : ExternalApiUsage [ ] ;
4465 modeledMethods : Record < string , ModeledMethod > ;
4566 mode : Mode ;
67+ hasUnsavedChanges : boolean ;
4668 onChange : (
4769 externalApiUsage : ExternalApiUsage ,
4870 modeledMethod : ModeledMethod ,
@@ -54,6 +76,7 @@ export const LibraryRow = ({
5476 externalApiUsages,
5577 modeledMethods,
5678 mode,
79+ hasUnsavedChanges,
5780 onChange,
5881} : Props ) => {
5982 const modeledPercentage = useMemo ( ( ) => {
@@ -66,9 +89,15 @@ export const LibraryRow = ({
6689 setExpanded ( ( oldIsExpanded ) => ! oldIsExpanded ) ;
6790 } , [ ] ) ;
6891
69- const usagesCount = useMemo ( ( ) => {
70- return externalApiUsages . reduce ( ( acc , curr ) => acc + curr . usages . length , 0 ) ;
71- } , [ externalApiUsages ] ) ;
92+ const handleModelWithAI = useCallback ( async ( e : React . MouseEvent ) => {
93+ e . stopPropagation ( ) ;
94+ e . preventDefault ( ) ;
95+ } , [ ] ) ;
96+
97+ const handleModelFromSource = useCallback ( async ( e : React . MouseEvent ) => {
98+ e . stopPropagation ( ) ;
99+ e . preventDefault ( ) ;
100+ } , [ ] ) ;
72101
73102 return (
74103 < LibraryContainer >
@@ -78,51 +107,29 @@ export const LibraryRow = ({
78107 ) : (
79108 < Codicon name = "chevron-right" label = "Expand" />
80109 ) }
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- ) }
110+ < NameContainer >
111+ < DependencyName > { title } </ DependencyName >
112+ < ModeledPercentage >
113+ { percentFormatter . format ( modeledPercentage / 100 ) } modeled
114+ </ ModeledPercentage >
115+ { hasUnsavedChanges ? < UnsavedLabel > UNSAVED</ UnsavedLabel > : null }
116+ </ NameContainer >
117+ < TitleButton onClick = { handleModelWithAI } >
118+ < Codicon name = "lightbulb-autofix" label = "Model with AI" />
119+ Model with AI
120+ </ TitleButton >
121+ < TitleButton onClick = { handleModelFromSource } >
122+ < Codicon name = "code" label = "Model from source" />
123+ Model from source
124+ </ TitleButton >
95125 </ TitleContainer >
96126 { isExpanded && (
97- < >
98- < StatusContainer >
99- < div >
100- { pluralize (
101- externalApiUsages . length ,
102- "method" ,
103- "methods" ,
104- decimalFormatter . format . bind ( decimalFormatter ) ,
105- ) }
106- </ div >
107- < div >
108- { pluralize (
109- usagesCount ,
110- "usage" ,
111- "usages" ,
112- decimalFormatter . format . bind ( decimalFormatter ) ,
113- ) }
114- </ div >
115- < div >
116- { percentFormatter . format ( modeledPercentage / 100 ) } modeled
117- </ div >
118- </ StatusContainer >
119- < ModeledMethodDataGrid
120- externalApiUsages = { externalApiUsages }
121- modeledMethods = { modeledMethods }
122- mode = { mode }
123- onChange = { onChange }
124- />
125- </ >
127+ < ModeledMethodDataGrid
128+ externalApiUsages = { externalApiUsages }
129+ modeledMethods = { modeledMethods }
130+ mode = { mode }
131+ onChange = { onChange }
132+ />
126133 ) }
127134 </ LibraryContainer >
128135 ) ;
0 commit comments