Skip to content

Commit 1697b8e

Browse files
author
Joe Reuter
authored
🪟🎨 Clean up connector form form controls (#21698)
* refactor * review comments * do not pass changes to retest source * reorder imports
1 parent 19fdca0 commit 1697b8e

27 files changed

+501
-538
lines changed

airbyte-webapp/src/components/common/DeleteBlock/DeleteBlock.tsx

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import React, { useCallback } from "react";
1+
import React from "react";
22
import { FormattedMessage } from "react-intl";
3-
import { useNavigate } from "react-router-dom";
43

54
import { H5 } from "components/base/Titles";
65
import { Button } from "components/ui/Button";
76
import { Card } from "components/ui/Card";
87

9-
import { useConfirmationModalService } from "hooks/services/ConfirmationModal";
8+
import { useDeleteModal } from "hooks/useDeleteModal";
109

1110
import styles from "./DeleteBlock.module.scss";
1211

@@ -16,22 +15,7 @@ interface IProps {
1615
}
1716

1817
export const DeleteBlock: React.FC<IProps> = ({ type, onDelete }) => {
19-
const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService();
20-
const navigate = useNavigate();
21-
22-
const onDeleteButtonClick = useCallback(() => {
23-
openConfirmationModal({
24-
text: `tables.${type}DeleteModalText`,
25-
title: `tables.${type}DeleteConfirm`,
26-
submitButtonText: "form.delete",
27-
onSubmit: async () => {
28-
await onDelete();
29-
closeConfirmationModal();
30-
navigate("../..");
31-
},
32-
submitButtonDataId: "delete",
33-
});
34-
}, [closeConfirmationModal, onDelete, openConfirmationModal, navigate, type]);
18+
const onDeleteButtonClick = useDeleteModal(type, onDelete);
3519

3620
return (
3721
<Card className={styles.deleteBlock}>

airbyte-webapp/src/components/connectorBuilder/StreamTestingPanel/ConfigMenu.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { faClose, faUser } from "@fortawesome/free-solid-svg-icons";
22
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
33
import { useMemo } from "react";
4-
import { FormattedMessage, useIntl } from "react-intl";
4+
import { FormattedMessage } from "react-intl";
55
import { useLocalStorage } from "react-use";
66

77
import { Button } from "components/ui/Button";
88
import { Callout } from "components/ui/Callout";
9+
import { FlexContainer, FlexItem } from "components/ui/Flex";
910
import { Modal, ModalBody } from "components/ui/Modal";
1011
import { NumberBadge } from "components/ui/NumberBadge";
1112
import { Tooltip } from "components/ui/Tooltip";
@@ -27,7 +28,6 @@ interface ConfigMenuProps {
2728
}
2829

2930
export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, testInputJsonErrors, isOpen, setIsOpen }) => {
30-
const { formatMessage } = useIntl();
3131
const { jsonManifest, editorView, setEditorView } = useConnectorBuilderFormState();
3232

3333
const { testInputJson, setTestInputJson } = useConnectorBuilderTestState();
@@ -112,20 +112,36 @@ export const ConfigMenu: React.FC<ConfigMenuProps> = ({ className, testInputJson
112112
<ConnectorForm
113113
formType="source"
114114
bodyClassName={styles.formContent}
115-
footerClassName={styles.inputFormModalFooter}
116115
selectedConnectorDefinitionSpecification={connectorDefinitionSpecification}
117116
formValues={{ connectionConfiguration: testInputJson }}
118117
onSubmit={async (values) => {
119118
setTestInputJson(values.connectionConfiguration as StreamReadRequestBodyConfig);
120119
setIsOpen(false);
121120
}}
122-
onCancel={() => {
123-
setIsOpen(false);
124-
}}
125-
onReset={() => {
126-
setTestInputJson({});
127-
}}
128-
submitLabel={formatMessage({ id: "connectorBuilder.saveInputsForm" })}
121+
renderFooter={({ dirty, isSubmitting, resetConnectorForm }) => (
122+
<div className={styles.inputFormModalFooter}>
123+
<FlexContainer>
124+
<FlexItem grow>
125+
<Button
126+
onClick={() => {
127+
resetConnectorForm();
128+
setTestInputJson({});
129+
}}
130+
type="button"
131+
variant="danger"
132+
>
133+
<FormattedMessage id="form.reset" />
134+
</Button>
135+
</FlexItem>
136+
<Button type="button" variant="secondary" onClick={() => setIsOpen(false)}>
137+
<FormattedMessage id="form.cancel" />
138+
</Button>
139+
<Button type="submit" disabled={isSubmitting || !dirty}>
140+
<FormattedMessage id="connectorBuilder.saveInputsForm" />
141+
</Button>
142+
</FlexContainer>
143+
</div>
144+
)}
129145
/>
130146
</>
131147
</ConfigMenuErrorBoundaryComponent>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { useCallback } from "react";
2+
import { useNavigate } from "react-router-dom";
3+
4+
import { useConfirmationModalService } from "./services/ConfirmationModal";
5+
6+
export function useDeleteModal(type: "source" | "destination" | "connection", onDelete: () => Promise<unknown>) {
7+
const { openConfirmationModal, closeConfirmationModal } = useConfirmationModalService();
8+
const navigate = useNavigate();
9+
10+
return useCallback(() => {
11+
openConfirmationModal({
12+
text: `tables.${type}DeleteModalText`,
13+
title: `tables.${type}DeleteConfirm`,
14+
submitButtonText: "form.delete",
15+
onSubmit: async () => {
16+
await onDelete();
17+
closeConfirmationModal();
18+
navigate("../..");
19+
},
20+
submitButtonDataId: "delete",
21+
});
22+
}, [closeConfirmationModal, onDelete, openConfirmationModal, navigate, type]);
23+
}

airbyte-webapp/src/locales/en.json

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,12 @@
6262
"form.saveChanges": "Save changes",
6363
"form.openDatepicker": "Open datepicker",
6464
"form.datepickerTimeCaption": "Time (UTC)",
65-
"form.saveChangesAndTest": "Save changes and test",
66-
"form.sourceRetest": "Retest source",
67-
"form.destinationRetest": "Retest destination",
65+
"form.saveChangesAndTest": "Test and save",
66+
"form.sourceRetest": "Retest saved source",
67+
"form.destinationRetest": "Retest saved destination",
68+
"form.test": "Test",
69+
"form.sourceRetestTitle": "Test the source",
70+
"form.destinationRetestTitle": "Test the destination",
6871
"form.discardChanges": "Discard changes",
6972
"form.discardChangesConfirmation": "There are unsaved changes. Are you sure you want to discard your changes?",
7073
"form.every.minutes": "Every {value, plural, one {minute} other {# minutes}}",

airbyte-webapp/src/pages/SourcesPage/pages/SourceItemPage/components/SourceSettings.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import React, { useEffect } from "react";
1+
import React, { useCallback, useEffect } from "react";
22
import { FormattedMessage } from "react-intl";
33

4-
import { DeleteBlock } from "components/common/DeleteBlock";
5-
64
import { ConnectionConfiguration } from "core/domain/connection";
75
import { SourceRead, WebBackendConnectionListItem } from "core/request/AirbyteClient";
86
import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics";
97
import { useFormChangeTrackerService, useUniqueFormId } from "hooks/services/FormChangeTracker";
108
import { useDeleteSource, useUpdateSource } from "hooks/services/useSourceHook";
9+
import { useDeleteModal } from "hooks/useDeleteModal";
1110
import { useSourceDefinition } from "services/connector/SourceDefinitionService";
1211
import { useGetSourceDefinitionSpecification } from "services/connector/SourceDefinitionSpecificationService";
1312
import { ConnectorCard } from "views/Connector/ConnectorCard";
@@ -49,10 +48,12 @@ const SourceSettings: React.FC<SourceSettingsProps> = ({ currentSource, connecti
4948
});
5049
};
5150

52-
const onDelete = async () => {
51+
const onDelete = useCallback(async () => {
5352
clearFormChange(formId);
5453
await deleteSource({ connectionsWithSource, source: currentSource });
55-
};
54+
}, [clearFormChange, connectionsWithSource, currentSource, deleteSource, formId]);
55+
56+
const onDeleteClick = useDeleteModal("source", onDelete);
5657

5758
return (
5859
<div className={styles.content}>
@@ -66,8 +67,8 @@ const SourceSettings: React.FC<SourceSettingsProps> = ({ currentSource, connecti
6667
selectedConnectorDefinitionId={sourceDefinitionSpecification.sourceDefinitionId}
6768
connector={currentSource}
6869
onSubmit={onSubmit}
70+
onDeleteClick={onDeleteClick}
6971
/>
70-
<DeleteBlock type="source" onDelete={onDelete} />
7172
</div>
7273
);
7374
};

airbyte-webapp/src/pages/destination/DestinationSettingsPage/DestinationSettingsPage.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import React from "react";
1+
import React, { useCallback } from "react";
22
import { FormattedMessage } from "react-intl";
33
import { useParams } from "react-router-dom";
44

5-
import { DeleteBlock } from "components/common/DeleteBlock";
65
import { StepsTypes } from "components/ConnectorBlocks";
76

87
import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics";
98
import { useFormChangeTrackerService, useUniqueFormId } from "hooks/services/FormChangeTracker";
109
import { useConnectionList } from "hooks/services/useConnectionHook";
1110
import { useDeleteDestination, useGetDestination, useUpdateDestination } from "hooks/services/useDestinationHook";
11+
import { useDeleteModal } from "hooks/useDeleteModal";
1212
import { useDestinationDefinition } from "services/connector/DestinationDefinitionService";
1313
import { useGetDestinationDefinitionSpecification } from "services/connector/DestinationDefinitionSpecificationService";
1414
import { ConnectorCard } from "views/Connector/ConnectorCard";
@@ -36,13 +36,15 @@ export const DestinationSettingsPage: React.FC = () => {
3636
});
3737
};
3838

39-
const onDelete = async () => {
39+
const onDelete = useCallback(async () => {
4040
clearFormChange(formId);
4141
await deleteDestination({
4242
connectionsWithDestination,
4343
destination,
4444
});
45-
};
45+
}, [clearFormChange, connectionsWithDestination, deleteDestination, destination, formId]);
46+
47+
const onDeleteClick = useDeleteModal("destination", onDelete);
4648

4749
return (
4850
<div className={styles.content}>
@@ -56,8 +58,8 @@ export const DestinationSettingsPage: React.FC = () => {
5658
selectedConnectorDefinitionId={destinationSpecification.destinationDefinitionId}
5759
connector={destination}
5860
onSubmit={onSubmitForm}
61+
onDeleteClick={onDeleteClick}
5962
/>
60-
<DeleteBlock type="destination" onDelete={onDelete} />
6163
</div>
6264
);
6365
};
Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
@use "scss/variables";
22

3-
.cardForm {
4-
padding: 22px 27px 23px 24px;
5-
}
6-
73
.connectorSelectControl {
84
margin-bottom: variables.$spacing-xl;
95
}
@@ -19,7 +15,3 @@
1915
margin-top: variables.$spacing-md;
2016
margin-left: variables.$spacing-lg;
2117
}
22-
23-
.connectionTestLogs {
24-
margin-top: variables.$spacing-lg;
25-
}

0 commit comments

Comments
 (0)