You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2021/11/04 23:28:09 UTC
[superset] branch master updated: fix: clear 'delete' confirmation
(#17345)
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new 43f4ab8 fix: clear 'delete' confirmation (#17345)
43f4ab8 is described below
commit 43f4ab845a9d0c5b70a58b1596319b638081ce54
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Thu Nov 4 16:26:38 2021 -0700
fix: clear 'delete' confirmation (#17345)
* fix: clear 'delete' confirmation
* Add tests
---
.../components/DeleteModal/DeleteModal.test.tsx | 15 +++++++++-
.../src/components/DeleteModal/index.tsx | 34 ++++++++++++++++++----
2 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/superset-frontend/src/components/DeleteModal/DeleteModal.test.tsx b/superset-frontend/src/components/DeleteModal/DeleteModal.test.tsx
index 61c4a9a..6cec92e 100644
--- a/superset-frontend/src/components/DeleteModal/DeleteModal.test.tsx
+++ b/superset-frontend/src/components/DeleteModal/DeleteModal.test.tsx
@@ -44,13 +44,23 @@ test('Calling "onHide"', () => {
onHide: jest.fn(),
open: true,
};
- render(<DeleteModal {...props} />);
+ const modal = <DeleteModal {...props} />;
+ render(modal);
expect(props.onHide).toBeCalledTimes(0);
expect(props.onConfirm).toBeCalledTimes(0);
+
+ // type "del" in the input
+ userEvent.type(screen.getByTestId('delete-modal-input'), 'del');
+ expect(screen.getByTestId('delete-modal-input')).toHaveValue('del');
+
+ // close the modal
expect(screen.getByText('×')).toBeVisible();
userEvent.click(screen.getByText('×'));
expect(props.onHide).toBeCalledTimes(1);
expect(props.onConfirm).toBeCalledTimes(0);
+
+ // confirm input has been cleared
+ expect(screen.getByTestId('delete-modal-input')).toHaveValue('');
});
test('Calling "onConfirm" only after typing "delete" in the input', () => {
@@ -75,4 +85,7 @@ test('Calling "onConfirm" only after typing "delete" in the input', () => {
userEvent.type(screen.getByTestId('delete-modal-input'), 'delete');
userEvent.click(screen.getByText('delete'));
expect(props.onConfirm).toBeCalledTimes(1);
+
+ // confirm input has been cleared
+ expect(screen.getByTestId('delete-modal-input')).toHaveValue('');
});
diff --git a/superset-frontend/src/components/DeleteModal/index.tsx b/superset-frontend/src/components/DeleteModal/index.tsx
index 98639cd..f113903 100644
--- a/superset-frontend/src/components/DeleteModal/index.tsx
+++ b/superset-frontend/src/components/DeleteModal/index.tsx
@@ -52,12 +52,35 @@ export default function DeleteModal({
title,
}: DeleteModalProps) {
const [disableChange, setDisableChange] = useState(true);
+ const [confirmation, setConfirmation] = useState<string>('');
+
+ const hide = () => {
+ setConfirmation('');
+ onHide();
+ };
+
+ const confirm = () => {
+ setConfirmation('');
+ onConfirm();
+ };
+
+ const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {
+ const targetValue = event.target.value ?? '';
+ setDisableChange(targetValue.toUpperCase() !== t('DELETE'));
+ setConfirmation(targetValue);
+ };
+
+ const onPressEnter = () => {
+ if (!disableChange) {
+ confirm();
+ }
+ };
return (
<Modal
disablePrimaryButton={disableChange}
- onHide={onHide}
- onHandledPrimaryAction={onConfirm}
+ onHide={hide}
+ onHandledPrimaryAction={confirm}
primaryButtonName={t('delete')}
primaryButtonType="danger"
show={open}
@@ -73,10 +96,9 @@ export default function DeleteModal({
type="text"
id="delete"
autoComplete="off"
- onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
- const targetValue = event.target.value ?? '';
- setDisableChange(targetValue.toUpperCase() !== t('DELETE'));
- }}
+ value={confirmation}
+ onChange={onChange}
+ onPressEnter={onPressEnter}
/>
</StyledDiv>
</Modal>