Merge pull request #2583 from github/robertbrignull/data-unsaved-changes

Show when there are unsaved changes to a model
This commit is contained in:
Robert
2023-07-06 12:08:01 +01:00
committed by GitHub
3 changed files with 24 additions and 4 deletions

View File

@@ -67,6 +67,8 @@ export function DataExtensionsEditor({
const [externalApiUsages, setExternalApiUsages] = useState<
ExternalApiUsage[]
>(initialExternalApiUsages);
const [unsavedModels, setUnsavedModels] = useState<Set<string>>(new Set());
const [modeledMethods, setModeledMethods] = useState<
Record<string, ModeledMethod>
>(initialModeledMethods);
@@ -86,6 +88,7 @@ export function DataExtensionsEditor({
break;
case "setExternalApiUsages":
setExternalApiUsages(msg.externalApiUsages);
setUnsavedModels(new Set());
break;
case "showProgress":
setProgress(msg);
@@ -130,11 +133,14 @@ export function DataExtensionsEditor({
const unModeledPercentage = 100 - modeledPercentage;
const onChange = useCallback(
(method: ExternalApiUsage, model: ModeledMethod) => {
(modelName: string, method: ExternalApiUsage, model: ModeledMethod) => {
setModeledMethods((oldModeledMethods) => ({
...oldModeledMethods,
[method.signature]: model,
}));
setUnsavedModels(
(oldUnsavedModels) => new Set([...oldUnsavedModels, modelName]),
);
},
[],
);
@@ -254,6 +260,7 @@ export function DataExtensionsEditor({
</ButtonsContainer>
<ModeledMethodsList
externalApiUsages={externalApiUsages}
unsavedModels={unsavedModels}
modeledMethods={modeledMethods}
mode={viewState?.mode ?? Mode.Application}
onChange={onChange}

View File

@@ -83,6 +83,7 @@ type Props = {
mode: Mode;
hasUnsavedChanges: boolean;
onChange: (
modelName: string,
externalApiUsage: ExternalApiUsage,
modeledMethod: ModeledMethod,
) => void;
@@ -121,6 +122,13 @@ export const LibraryRow = ({
e.preventDefault();
}, []);
const onChangeWithModelName = useCallback(
(externalApiUsage: ExternalApiUsage, modeledMethod: ModeledMethod) => {
onChange(title, externalApiUsage, modeledMethod);
},
[onChange, title],
);
return (
<LibraryContainer>
<TitleContainer onClick={toggleExpanded} aria-expanded={isExpanded}>
@@ -152,11 +160,13 @@ export const LibraryRow = ({
externalApiUsages={externalApiUsages}
modeledMethods={modeledMethods}
mode={mode}
onChange={onChange}
onChange={onChangeWithModelName}
/>
<SectionDivider />
<ButtonsContainer>
<VSCodeButton onClick={handleSave}>Save</VSCodeButton>
<VSCodeButton onClick={handleSave} disabled={!hasUnsavedChanges}>
Save
</VSCodeButton>
</ButtonsContainer>
</>
)}

View File

@@ -11,9 +11,11 @@ import {
type Props = {
externalApiUsages: ExternalApiUsage[];
unsavedModels: Set<string>;
modeledMethods: Record<string, ModeledMethod>;
mode: Mode;
onChange: (
modelName: string,
externalApiUsage: ExternalApiUsage,
modeledMethod: ModeledMethod,
) => void;
@@ -21,6 +23,7 @@ type Props = {
export const ModeledMethodsList = ({
externalApiUsages,
unsavedModels,
modeledMethods,
mode,
onChange,
@@ -39,9 +42,9 @@ export const ModeledMethodsList = ({
key={libraryName}
title={libraryName}
externalApiUsages={grouped[libraryName]}
hasUnsavedChanges={unsavedModels.has(libraryName)}
modeledMethods={modeledMethods}
mode={mode}
hasUnsavedChanges={false}
onChange={onChange}
/>
))}