-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🪟🎉 Connector builder: Available inputs dropdown #20983
Merged
Merged
Changes from all commits
Commits
Show all changes
112 commits
Select commit
Hold shift + click to select a range
d2ed762
improve some types
f474a1c
Merge remote-tracking branch 'upstream/master' into chore-improve-con…
5b0521f
improve further
af659fd
Merge remote-tracking branch 'upstream/master' into chore-improve-con…
1cd3bbb
clean up a bit more
807c436
refactor loading state
6c76e0f
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
05c3107
move loading state up
eee4303
remove isLoading references
7d6f977
remove unused props and make fetch connector error work
0fe11f0
remove special component for name
34d4814
remove top level state for unifinished flows
67d62c5
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
afea882
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
c7e7475
Merge branch 'master' into flash1293/connector-form-loading-state
cc7f65f
Merge branch 'chore-improve-connector-form-types' into flash1293/conn…
a1c6cbd
start removing uiwidget
9be8337
Update airbyte-webapp/src/views/Connector/ConnectorCard/ConnectorCard…
37cee8f
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
5686241
Merge branch 'flash1293/connector-form-loading-state' of github.com:a…
7b73364
remove undefined option for selected id
7058d26
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
dd7e82a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
6d4c7d3
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
d624792
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
36cf941
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
b7a6322
Merge remote-tracking branch 'upstream/master' into flash1293/connect…
72b602a
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
5e47a4a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
6c71028
Merge remote-tracking branch 'origin/master' into flash1293/connector…
809625f
remove unused prop
10446eb
Merge branch 'flash1293/connector-form-loading-state' into flash1293/…
4a7a885
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
2024b60
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
ee30092
fix types
d91df38
remove uiwidget state
93fe558
Merge remote-tracking branch 'origin/master' into flash1293/connector…
cbc023a
Merge branch 'flash1293/connector-form-name-override' into flash1293/…
ec54d38
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
47152ea
clean up
6ec0e10
adjust comment
1aa7829
handle errors in a nice way
7b90088
do not respect default on oneOf fields
fbefbdd
rename to formblock
6b3e5e2
reduce re-renders
9aa3f80
Merge remote-tracking branch 'origin/master' into flash1293/connector…
c765003
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
5cd77ec
pass error to secure inputs
5dfbc22
Merge remote-tracking branch 'origin/master' into flash1293/connector…
a6aa741
simplify and improve styling
95717d2
align top
40d162d
Merge branch 'flash1293/connector-form-unifinished-flows' into flash1…
b9384ee
Merge remote-tracking branch 'origin/master' into flash1293/connector…
582a5f2
code review
18d6ce8
remove comment
60c1f1c
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
9cb595d
Merge remote-tracking branch 'origin/master' into flash1293/connector…
fe74a45
review comments
5c00ad0
rename file
bd0dffc
be strict about boolean values
1ff8c13
add example
c6ee526
track form error in error boundary
05bbd6f
Merge branch 'flash1293/connector-form-remove-ui-widget-state' of git…
fff4703
Merge remote-tracking branch 'origin/master' into flash1293/connector…
94ba866
review comments
97bb0a7
handle unexpected cases better
633b9b2
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
e47517f
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
e931956
Merge remote-tracking branch 'origin/master' into feature/connector-b…
6889f66
enrich error with connector id
7b60406
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
d5e56eb
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
35a74ba
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
02c8096
🪟🎉 Add copy stream button (#20577)
526adfc
rename prop
7d49233
🪟🎉 Connector builder: Integrate connector form for test input (#20385)
c5da764
Merge remote-tracking branch 'origin/master' into flash1293/connector…
6c0bf9d
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
477977f
use request_body_json instead of request_body_data
lmossman 200cfe7
:window: :art: Move `Add` button into the line of Connector Builder k…
lmossman c7fd310
🪟🎉 Connector builder: Allow defining inputs (#20431)
e0e3796
fix merge conflict with dropdown prop being renamed to control
e23a6d8
[Connector Builder] Add paginator (#20698)
lmossman 610e668
[Connector Builder] Add stream slicer (#20748)
lmossman e68ff49
debounce form builder values update to reduce load
9ccf294
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
ae9a229
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
a9e1d09
🪟🔧 Connector builder: use new lowcode manifest (#20715)
e4f7bba
debounce validation as well
16c71ae
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
54c070d
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
2e20fa6
akways show stream test button in error state if there are errors
65199d0
fix type of oauth input
92722e0
Merge branch 'master' into flash1293/connector-form-remove-ui-widget-…
718c233
Merge branch 'flash1293/connector-form-remove-ui-widget-state' into f…
6a8be0b
Merge remote-tracking branch 'origin/master' into feature/connector-b…
16b8d53
available inputs dropdown
16ce351
add validation schema for add stream form
lmossman 25d6586
validate all views on test click
lmossman 64a5eb9
add type to prevent console warning
lmossman 5041667
Merge branch 'feature/connector-builder' into flash1293/available-inp…
d68cbf2
Merge remote-tracking branch 'origin/master' into flash1293/available…
1f89b62
improve styling
bdc8b0e
make sure padding is set correctly
1b72f90
make sure focus is set right
b08a7e6
comment
b0176ec
Merge remote-tracking branch 'origin/master' into flash1293/available…
b2469e1
merge with master
lmossman 7be7725
use correct state hook
lmossman a62b3ef
Merge branch 'master' into flash1293/available-inputs-dropdown
lmossman 3b05ad1
Merge branch 'master' into flash1293/available-inputs-dropdown
lmossman 62bd54e
add tooltip to user input button and fix wording for new user input o…
lmossman File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
63 changes: 63 additions & 0 deletions
63
airbyte-webapp/src/components/connectorBuilder/Builder/BuilderFieldWithInputs.module.scss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
@use "scss/variables"; | ||
@use "scss/colors"; | ||
|
||
.button { | ||
align-self: flex-end; | ||
width: auto; | ||
border: none; | ||
background: none; | ||
color: colors.$grey-300; | ||
|
||
&:hover { | ||
background: none; | ||
border: none; | ||
color: colors.$blue-500; | ||
} | ||
} | ||
|
||
.selectedOption { | ||
margin-top: variables.$spacing-lg; | ||
background: none; | ||
font-size: 12px; | ||
color: colors.$blue-500; | ||
|
||
&:hover { | ||
color: colors.$blue-900; | ||
} | ||
|
||
& > span { | ||
padding-top: 0; | ||
padding-bottom: 0; | ||
} | ||
} | ||
|
||
.container { | ||
position: absolute; | ||
right: variables.$spacing-sm; | ||
top: 0; | ||
display: flex; | ||
flex-direction: column; | ||
max-width: 400px; | ||
width: 100%; | ||
|
||
// make the element click through, but all children should behave as normal so the input can be clicked as normal | ||
pointer-events: none; | ||
|
||
& > * { | ||
pointer-events: all; | ||
} | ||
} | ||
|
||
.buttonContent { | ||
background: none; | ||
border: none; | ||
display: flex; | ||
gap: variables.$spacing-xs; | ||
color: inherit; | ||
align-items: center; | ||
cursor: pointer; | ||
} | ||
|
||
.inputWithHelper { | ||
padding-right: 55px; | ||
} |
108 changes: 108 additions & 0 deletions
108
airbyte-webapp/src/components/connectorBuilder/Builder/BuilderFieldWithInputs.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
import { faPlus, faUser } from "@fortawesome/free-solid-svg-icons"; | ||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; | ||
import { useField } from "formik"; | ||
import { useMemo, useState } from "react"; | ||
import { FormattedMessage, useIntl } from "react-intl"; | ||
|
||
import { ListBox, ListBoxControlButtonProps, Option } from "components/ui/ListBox"; | ||
import { Tooltip } from "components/ui/Tooltip"; | ||
|
||
import { useConnectorBuilderFormState } from "services/connectorBuilder/ConnectorBuilderStateService"; | ||
|
||
import { getInferredInputs } from "../types"; | ||
import { BuilderField, BuilderFieldProps } from "./BuilderField"; | ||
import styles from "./BuilderFieldWithInputs.module.scss"; | ||
import { InputForm, newInputInEditing } from "./InputsForm"; | ||
|
||
export const BuilderFieldWithInputs: React.FC<BuilderFieldProps> = (props) => { | ||
const [field, , helpers] = useField(props.path); | ||
|
||
return ( | ||
<BuilderField | ||
{...props} | ||
adornment={<UserInputHelper setValue={helpers.setValue} currentValue={field.value} />} | ||
className={styles.inputWithHelper} | ||
/> | ||
); | ||
}; | ||
|
||
export const UserInputHelper = ({ | ||
setValue, | ||
currentValue, | ||
}: { | ||
setValue: (value: string) => void; | ||
currentValue: string; | ||
}) => { | ||
const { formatMessage } = useIntl(); | ||
const [modalOpen, setModalOpen] = useState(false); | ||
const { builderFormValues } = useConnectorBuilderFormState(); | ||
const listOptions = useMemo(() => { | ||
const options: Array<Option<string | undefined>> = [ | ||
...builderFormValues.inputs, | ||
...getInferredInputs(builderFormValues), | ||
].map((input) => ({ | ||
label: input.definition.title || input.key, | ||
value: input.key, | ||
})); | ||
options.push({ | ||
value: undefined, | ||
label: formatMessage({ id: "connectorBuilder.inputModal.newTitle" }), | ||
icon: <FontAwesomeIcon icon={faPlus} />, | ||
}); | ||
return options; | ||
}, [builderFormValues, formatMessage]); | ||
return ( | ||
<> | ||
<ListBox<string | undefined> | ||
buttonClassName={styles.button} | ||
optionClassName={styles.option} | ||
className={styles.container} | ||
selectedOptionClassName={styles.selectedOption} | ||
controlButton={UserInputHelperControlButton} | ||
selectedValue={undefined} | ||
onSelect={(selectedValue) => { | ||
if (selectedValue) { | ||
setValue(`${currentValue || ""}{{ config['${selectedValue}'] }}`); | ||
} else { | ||
// This hack is necessary because listbox will put the focus back when the option list gets hidden, which conflicts with the auto-focus setting of the modal. | ||
// As it's not possible to prevent listbox from forcing the focus back on the button component, this will wait until the focus went to the button, then opens the modal | ||
// so it can move it to the first input | ||
setTimeout(() => { | ||
setModalOpen(true); | ||
}, 50); | ||
} | ||
}} | ||
options={listOptions} | ||
/> | ||
{modalOpen && ( | ||
<InputForm | ||
inputInEditing={newInputInEditing()} | ||
onClose={(newInput) => { | ||
setModalOpen(false); | ||
if (!newInput) { | ||
return; | ||
} | ||
setValue(`${currentValue}{{ config['${newInput.key}'] }}`); | ||
}} | ||
/> | ||
)} | ||
</> | ||
); | ||
}; | ||
|
||
const UserInputHelperControlButton: React.FC<ListBoxControlButtonProps<string | undefined>> = () => { | ||
return ( | ||
<Tooltip | ||
control={ | ||
<div className={styles.buttonContent}> | ||
{"{{"} | ||
<FontAwesomeIcon icon={faUser} /> | ||
{"}}"} | ||
</div> | ||
} | ||
placement="top" | ||
> | ||
<FormattedMessage id="connectorBuilder.interUserInputValue" /> | ||
</Tooltip> | ||
); | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
airbyte-webapp/src/components/connectorBuilder/Builder/InputsForm.module.scss
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
@use "scss/variables"; | ||
@use "scss/colors"; | ||
|
||
.inputForm { | ||
gap: variables.$spacing-lg; | ||
display: flex; | ||
flex-direction: column; | ||
} | ||
|
||
.deleteButtonContainer { | ||
flex-grow: 1; | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
More of a meta-question for my own learning: why do you use the
React.FC<>
approach for the component that the file is named after, but use this alternate approach for secondary components in the file?What is the difference between these approaches? I know that this approach results in the component's type being JSX.Element instead of React.FC<>, but what are the consequences of that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just forgot to add it here, but it's more a code-style thing in this scenario.
Using the React.FC type is more explicit about this being a function component which improves typing, but only a very little bit.
For example take a look at this "function":
it's actually slightly invalid because a function component is not allowed to return undefined (has to be null). However, as this is just a function as far as Typescript is concerned, there won't be a type error at definition time (it will complain if you actually try to use it though).
If you do
however, it will complain directly with
Also, there are a few additional keys you can set on the function object itself (functions are also objects in Javascript, so you can set arbitrary stuff on them) that are picked up by react:
However, they are not really important in our setup as it's mostly about an ad-hoc runtime typing React can do (which we don't really need as all our code is typed via Typescript already).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Got it, that makes sense. So it is probably better to always defer to using
React.FC
since it applies stricter typing constraints and will therefore fail faster