Merge pull request #2583 from github/robertbrignull/data-unsaved-changes
Show when there are unsaved changes to a model
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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>
|
||||
</>
|
||||
)}
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
))}
|
||||
|
||||
Reference in New Issue
Block a user