Skip to content

Commit f8ad722

Browse files
Merge pull request #2574 from github/robertbrignull/data-title
Update data extensions modelling table title bar
2 parents 31e94a8 + 97219b9 commit f8ad722

2 files changed

Lines changed: 64 additions & 56 deletions

File tree

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

Lines changed: 63 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { useCallback, useMemo, useState } from "react";
33
import styled from "styled-components";
44
import { ExternalApiUsage } from "../../data-extensions-editor/external-api-usage";
55
import { ModeledMethod } from "../../data-extensions-editor/modeled-method";
6-
import { pluralize } from "../../common/word";
76
import { ModeledMethodDataGrid } from "./ModeledMethodDataGrid";
87
import { calculateModeledPercentage } from "../../data-extensions-editor/shared/modeled-percentage";
9-
import { decimalFormatter, percentFormatter } from "./formatters";
8+
import { percentFormatter } from "./formatters";
109
import { Codicon } from "../common";
1110
import { Mode } from "../../data-extensions-editor/shared/mode";
11+
import { VSCodeButton } from "@vscode/webview-ui-toolkit/react";
1212

1313
const 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

4162
type 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+
&nbsp;Model with AI
120+
</TitleButton>
121+
<TitleButton onClick={handleModelFromSource}>
122+
<Codicon name="code" label="Model from source" />
123+
&nbsp;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
);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export const ModeledMethodsList = ({
4141
externalApiUsages={grouped[libraryName]}
4242
modeledMethods={modeledMethods}
4343
mode={mode}
44+
hasUnsavedChanges={false}
4445
onChange={onChange}
4546
/>
4647
))}

0 commit comments

Comments
 (0)