2021-05-06 04:56:03 +05:30
|
|
|
import { Text, TextField } from "@fluentui/react";
|
2021-05-19 08:27:31 +05:30
|
|
|
import { useBoolean } from "@fluentui/react-hooks";
|
2021-04-01 04:14:07 +05:30
|
|
|
import React, { FunctionComponent, useState } from "react";
|
|
|
|
import { Areas } from "../../Common/Constants";
|
|
|
|
import { deleteDatabase } from "../../Common/dataAccess/deleteDatabase";
|
|
|
|
import DeleteFeedback from "../../Common/DeleteFeedback";
|
|
|
|
import { getErrorMessage, getErrorStack } from "../../Common/ErrorHandlingUtils";
|
|
|
|
import { Collection, Database } from "../../Contracts/ViewModels";
|
2021-05-27 16:07:07 -05:00
|
|
|
import { useSidePanel } from "../../hooks/useSidePanel";
|
2021-04-01 04:14:07 +05:30
|
|
|
import { DefaultExperienceUtility } from "../../Shared/DefaultExperienceUtility";
|
|
|
|
import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstants";
|
|
|
|
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
|
|
|
import { userContext } from "../../UserContext";
|
|
|
|
import { logConsoleError } from "../../Utils/NotificationConsoleUtils";
|
|
|
|
import Explorer from "../Explorer";
|
|
|
|
import { PanelInfoErrorComponent, PanelInfoErrorProps } from "./PanelInfoErrorComponent";
|
2021-05-19 08:27:31 +05:30
|
|
|
import { RightPaneForm, RightPaneFormProps } from "./RightPaneForm/RightPaneForm";
|
2021-04-01 04:14:07 +05:30
|
|
|
|
|
|
|
interface DeleteDatabaseConfirmationPanelProps {
|
|
|
|
explorer: Explorer;
|
|
|
|
selectedDatabase: Database;
|
|
|
|
}
|
|
|
|
|
2021-05-19 08:27:31 +05:30
|
|
|
export const DeleteDatabaseConfirmationPanel: FunctionComponent<DeleteDatabaseConfirmationPanelProps> = ({
|
|
|
|
explorer,
|
|
|
|
selectedDatabase,
|
|
|
|
}: DeleteDatabaseConfirmationPanelProps): JSX.Element => {
|
2021-05-27 16:07:07 -05:00
|
|
|
const closeSidePanel = useSidePanel((state) => state.closeSidePanel);
|
2021-04-01 04:14:07 +05:30
|
|
|
const [isLoading, { setTrue: setLoadingTrue, setFalse: setLoadingFalse }] = useBoolean(false);
|
|
|
|
|
|
|
|
const [formError, setFormError] = useState<string>("");
|
|
|
|
const [databaseInput, setDatabaseInput] = useState<string>("");
|
|
|
|
const [databaseFeedbackInput, setDatabaseFeedbackInput] = useState<string>("");
|
|
|
|
|
2021-05-19 08:27:31 +05:30
|
|
|
const submit = async (): Promise<void> => {
|
2021-04-01 04:14:07 +05:30
|
|
|
if (selectedDatabase?.id() && databaseInput !== selectedDatabase.id()) {
|
|
|
|
setFormError("Input database name does not match the selected database");
|
|
|
|
logConsoleError(`Error while deleting collection ${selectedDatabase && selectedDatabase.id()}`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setFormError("");
|
|
|
|
setLoadingTrue();
|
|
|
|
|
|
|
|
const startKey: number = TelemetryProcessor.traceStart(Action.DeleteDatabase, {
|
|
|
|
databaseId: selectedDatabase.id(),
|
|
|
|
dataExplorerArea: Areas.ContextualPane,
|
|
|
|
paneTitle: "Delete Database",
|
|
|
|
});
|
|
|
|
|
|
|
|
try {
|
|
|
|
await deleteDatabase(selectedDatabase.id());
|
2021-05-27 16:07:07 -05:00
|
|
|
closeSidePanel();
|
2021-04-01 04:14:07 +05:30
|
|
|
explorer.refreshAllDatabases();
|
|
|
|
explorer.tabsManager.closeTabsByComparator((tab) => tab.node?.id() === selectedDatabase.id());
|
|
|
|
explorer.selectedNode(undefined);
|
|
|
|
selectedDatabase
|
|
|
|
.collections()
|
|
|
|
.forEach((collection: Collection) =>
|
|
|
|
explorer.tabsManager.closeTabsByComparator(
|
|
|
|
(tab) => tab.node?.id() === collection.id() && (tab.node as Collection).databaseId === collection.databaseId
|
|
|
|
)
|
|
|
|
);
|
|
|
|
TelemetryProcessor.traceSuccess(
|
|
|
|
Action.DeleteDatabase,
|
|
|
|
{
|
|
|
|
databaseId: selectedDatabase.id(),
|
|
|
|
dataExplorerArea: Areas.ContextualPane,
|
|
|
|
paneTitle: "Delete Database",
|
|
|
|
},
|
|
|
|
startKey
|
|
|
|
);
|
|
|
|
|
|
|
|
if (shouldRecordFeedback()) {
|
|
|
|
const deleteFeedback = new DeleteFeedback(
|
|
|
|
userContext?.databaseAccount.id,
|
|
|
|
userContext?.databaseAccount.name,
|
2021-04-29 00:55:04 +05:30
|
|
|
DefaultExperienceUtility.getApiKindFromDefaultExperience(userContext.apiType),
|
2021-04-01 04:14:07 +05:30
|
|
|
databaseFeedbackInput
|
|
|
|
);
|
|
|
|
|
|
|
|
TelemetryProcessor.trace(Action.DeleteDatabase, ActionModifiers.Mark, {
|
|
|
|
message: JSON.stringify(deleteFeedback, Object.getOwnPropertyNames(deleteFeedback)),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} catch (error) {
|
|
|
|
setLoadingFalse();
|
|
|
|
setFormError(error);
|
|
|
|
const errorMessage = getErrorMessage(error);
|
|
|
|
TelemetryProcessor.traceFailure(
|
|
|
|
Action.DeleteDatabase,
|
|
|
|
{
|
|
|
|
databaseId: selectedDatabase.id(),
|
|
|
|
dataExplorerArea: Areas.ContextualPane,
|
|
|
|
paneTitle: "Delete Database",
|
|
|
|
error: errorMessage,
|
|
|
|
errorStack: getErrorStack(error),
|
|
|
|
},
|
|
|
|
startKey
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const shouldRecordFeedback = (): boolean => {
|
|
|
|
return explorer.isLastNonEmptyDatabase() || (explorer.isLastDatabase() && explorer.isSelectedDatabaseShared());
|
|
|
|
};
|
|
|
|
|
2021-05-19 08:27:31 +05:30
|
|
|
const props: RightPaneFormProps = {
|
|
|
|
formError,
|
|
|
|
isExecuting: isLoading,
|
|
|
|
submitButtonText: "OK",
|
|
|
|
onSubmit: () => submit(),
|
|
|
|
};
|
|
|
|
|
|
|
|
const errorProps: PanelInfoErrorProps = {
|
|
|
|
messageType: "warning",
|
|
|
|
showErrorDetails: false,
|
|
|
|
message:
|
|
|
|
"Warning! The action you are about to take cannot be undone. Continuing will permanently delete this resource and all of its children resources.",
|
|
|
|
};
|
|
|
|
|
2021-04-01 04:14:07 +05:30
|
|
|
return (
|
2021-05-19 08:27:31 +05:30
|
|
|
<RightPaneForm {...props}>
|
|
|
|
{!formError && <PanelInfoErrorComponent {...errorProps} />}
|
2021-04-01 04:14:07 +05:30
|
|
|
<div className="panelMainContent">
|
|
|
|
<div className="confirmDeleteInput">
|
|
|
|
<span className="mandatoryStar">* </span>
|
|
|
|
<Text variant="small">Confirm by typing the database id</Text>
|
|
|
|
<TextField
|
|
|
|
id="confirmDatabaseId"
|
|
|
|
autoFocus
|
|
|
|
styles={{ fieldGroup: { width: 300 } }}
|
|
|
|
onChange={(event, newInput?: string) => {
|
|
|
|
setDatabaseInput(newInput);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
{shouldRecordFeedback() && (
|
|
|
|
<div className="deleteDatabaseFeedback">
|
|
|
|
<Text variant="small" block>
|
|
|
|
Help us improve Azure Cosmos DB!
|
|
|
|
</Text>
|
|
|
|
<Text variant="small" block>
|
|
|
|
What is the reason why you are deleting this database?
|
|
|
|
</Text>
|
|
|
|
<TextField
|
|
|
|
id="deleteDatabaseFeedbackInput"
|
|
|
|
styles={{ fieldGroup: { width: 300 } }}
|
|
|
|
multiline
|
|
|
|
rows={3}
|
|
|
|
onChange={(event, newInput?: string) => {
|
|
|
|
setDatabaseFeedbackInput(newInput);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
</div>
|
2021-05-19 08:27:31 +05:30
|
|
|
</RightPaneForm>
|
2021-04-01 04:14:07 +05:30
|
|
|
);
|
|
|
|
};
|