Skip to content
Merged
2 changes: 2 additions & 0 deletions web/src/app/admin/add-connector/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ function getCategoryDescription(category: SourceCategory): string {
return "Connect to cloud storage and file hosting services.";
case SourceCategory.Wiki:
return "Link to wiki and knowledge base platforms.";
case SourceCategory.Personal:
return "Connect to personal tools.";
case SourceCategory.Other:
return "Connect to other miscellaneous knowledge sources.";
default:
Expand Down
316 changes: 155 additions & 161 deletions web/src/app/admin/connectors/[connector]/AddConnectorPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -498,172 +498,166 @@ export default function AddConnector({
}
}}
>
{(formikProps) => {
return (
<div className="mx-auto w-full">
{popup}

{uploading && <Spinner />}

{creatingConnector && <Spinner />}

<AdminPageTitle
includeDivider={false}
icon={<SourceIcon iconSize={32} sourceType={connector} />}
title={displayName}
farRightElement={undefined}
/>

{formStep == 0 && (
<CardSection>
<Title className="mb-2 text-lg">Select a credential</Title>

{connector == ValidSources.Gmail ? (
<GmailMain />
) : (
<>
<ModifyCredential
showIfEmpty
accessType={formikProps.values.access_type}
defaultedCredential={currentCredential!}
credentials={credentials}
editableCredentials={editableCredentials}
onDeleteCredential={onDeleteCredential}
onSwitch={onSwap}
/>
{!createCredentialFormToggle && (
<div className="mt-6 flex space-x-4">
{/* Button to pop up a form to manually enter credentials */}
<Button
variant="secondary"
className="mt-6 text-sm mr-4"
onClick={async () => {
if (oauthDetails && oauthDetails.oauth_enabled) {
if (oauthDetails.additional_kwargs.length > 0) {
setCreateCredentialFormToggle(true);
{(formikProps) => (
<div className="mx-auto w-full">
{popup}

{uploading && <Spinner />}

{creatingConnector && <Spinner />}

<AdminPageTitle
includeDivider={false}
icon={<SourceIcon iconSize={32} sourceType={connector} />}
title={displayName}
farRightElement={undefined}
/>

{formStep == 0 && (
<CardSection>
<Title className="mb-2 text-lg">Select a credential</Title>

{connector == ValidSources.Gmail ? (
<GmailMain />
) : (
<>
<ModifyCredential
showIfEmpty
accessType={formikProps.values.access_type}
defaultedCredential={currentCredential!}
credentials={credentials}
editableCredentials={editableCredentials}
onDeleteCredential={onDeleteCredential}
onSwitch={onSwap}
/>
{!createCredentialFormToggle && (
<div className="mt-6 flex space-x-4">
{/* Button to pop up a form to manually enter credentials */}
<Button
variant="secondary"
className="mt-6 text-sm mr-4"
onClick={async () => {
if (oauthDetails && oauthDetails.oauth_enabled) {
if (oauthDetails.additional_kwargs.length > 0) {
setCreateCredentialFormToggle(true);
} else {
const redirectUrl =
await getConnectorOauthRedirectUrl(
connector,
{}
);
// if redirect is supported, just use it
if (redirectUrl) {
window.location.href = redirectUrl;
} else {
const redirectUrl =
await getConnectorOauthRedirectUrl(
connector,
{}
);
// if redirect is supported, just use it
if (redirectUrl) {
window.location.href = redirectUrl;
} else {
setCreateCredentialFormToggle(
(createConnectorToggle) =>
!createConnectorToggle
);
}
setCreateCredentialFormToggle(
(createConnectorToggle) =>
!createConnectorToggle
);
}
} else {
setCreateCredentialFormToggle(
(createConnectorToggle) =>
!createConnectorToggle
);
}
}}
>
Create New
</Button>
{/* Button to sign in via OAuth */}
{oauthSupportedSources.includes(connector) &&
(NEXT_PUBLIC_CLOUD_ENABLED ||
NEXT_PUBLIC_TEST_ENV) && (
<Button
variant="navigate"
onClick={handleAuthorize}
className="mt-6 "
disabled={isAuthorizing}
hidden={!isAuthorizeVisible}
>
{isAuthorizing
? "Authorizing..."
: `Authorize with ${getSourceDisplayName(
connector
)}`}
</Button>
)}
</div>
)}

{createCredentialFormToggle && (
<Modal
className="max-w-3xl rounded-lg"
onOutsideClick={() =>
setCreateCredentialFormToggle(false)
}
} else {
setCreateCredentialFormToggle(
(createConnectorToggle) => !createConnectorToggle
);
}
}}
>
{oauthDetailsLoading ? (
<Spinner />
) : (
<>
<Title className="mb-2 text-lg">
Create a {getSourceDisplayName(connector)}{" "}
credential
</Title>
{oauthDetails && oauthDetails.oauth_enabled ? (
<CreateStdOAuthCredential
sourceType={connector}
additionalFields={
oauthDetails.additional_kwargs
}
/>
) : (
<CreateCredential
close
refresh={refresh}
sourceType={connector}
accessType={formikProps.values.access_type}
setPopup={setPopup}
onSwitch={onSwap}
onClose={() =>
setCreateCredentialFormToggle(false)
}
/>
)}
</>
Create New
</Button>
{/* Button to sign in via OAuth */}
{oauthSupportedSources.includes(connector) &&
(NEXT_PUBLIC_CLOUD_ENABLED || NEXT_PUBLIC_TEST_ENV) && (
<Button
variant="navigate"
onClick={handleAuthorize}
className="mt-6 "
disabled={isAuthorizing}
hidden={!isAuthorizeVisible}
>
{isAuthorizing
? "Authorizing..."
: `Authorize with ${getSourceDisplayName(
connector
)}`}
</Button>
)}
</Modal>
)}
</>
)}
</CardSection>
)}

{formStep == 1 && (
<CardSection className="w-full py-8 flex gap-y-6 flex-col max-w-3xl px-12 mx-auto">
<DynamicConnectionForm
values={formikProps.values}
config={configuration}
connector={connector}
currentCredential={
currentCredential ||
liveGDriveCredential ||
liveGmailCredential ||
null
}
/>
</CardSection>
)}

{formStep === 2 && (
<CardSection>
<AdvancedFormPage />
</CardSection>
)}

<NavigationRow
activatedCredential={credentialActivated != null}
isValid={formikProps.isValid}
onSubmit={formikProps.handleSubmit}
noCredentials={noCredentials}
noAdvanced={connector == "file"}
/>
</div>
);
}}
</div>
)}

{createCredentialFormToggle && (
<Modal
className="max-w-3xl rounded-lg"
onOutsideClick={() =>
setCreateCredentialFormToggle(false)
}
>
{oauthDetailsLoading ? (
<Spinner />
) : (
<>
<Title className="mb-2 text-lg">
Create a {getSourceDisplayName(connector)}{" "}
credential
</Title>
{oauthDetails && oauthDetails.oauth_enabled ? (
<CreateStdOAuthCredential
sourceType={connector}
additionalFields={oauthDetails.additional_kwargs}
/>
) : (
<CreateCredential
close
refresh={refresh}
sourceType={connector}
accessType={formikProps.values.access_type}
setPopup={setPopup}
onSwitch={onSwap}
onClose={() =>
setCreateCredentialFormToggle(false)
}
/>
)}
</>
)}
</Modal>
)}
</>
)}
</CardSection>
)}

{formStep == 1 && (
<CardSection className="w-full py-8 flex gap-y-6 flex-col max-w-3xl px-12 mx-auto">
<DynamicConnectionForm
values={formikProps.values}
config={configuration}
connector={connector}
currentCredential={
currentCredential ||
liveGDriveCredential ||
liveGmailCredential ||
null
}
/>
</CardSection>
)}

{formStep === 2 && (
<CardSection>
<AdvancedFormPage />
</CardSection>
)}

<NavigationRow
activatedCredential={credentialActivated != null}
isValid={formikProps.isValid}
onSubmit={formikProps.handleSubmit}
noCredentials={noCredentials}
noAdvanced={connector == "file"}
/>
</div>
)}
</Formik>
);
}
6 changes: 2 additions & 4 deletions web/src/app/admin/connectors/[connector]/pages/Advanced.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import NumberInput from "./ConnectorInput/NumberInput";
import { TextFormField } from "@/components/Field";
import { TrashIcon } from "@/components/icons/icons";

const AdvancedFormPage = () => {
export default function AdvancedFormPage() {
return (
<div className="py-4 flex flex-col gap-y-6 rounded-lg max-w-2xl mx-auto">
<h2 className="text-2xl font-bold mb-4 text-text-800">
Expand Down Expand Up @@ -42,6 +42,4 @@ const AdvancedFormPage = () => {
</div>
</div>
);
};

export default AdvancedFormPage;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { FC, useEffect, useState } from "react";
import React, { useEffect, useState } from "react";
import CredentialSubText from "@/components/credentials/CredentialFields";
import { ConnectionConfiguration } from "@/lib/connectors/connectors";
import { TextFormField } from "@/components/Field";
Expand All @@ -17,12 +17,12 @@ export interface DynamicConnectionFormProps {
currentCredential: Credential<any> | null;
}

const DynamicConnectionForm: FC<DynamicConnectionFormProps> = ({
export default function DynamicConnectionForm({
config,
values,
connector,
currentCredential,
}) => {
}: DynamicConnectionFormProps) {
const { setFieldValue } = useFormikContext<any>(); // Get Formik's context functions

const [showAdvancedOptions, setShowAdvancedOptions] = useState(false);
Expand Down Expand Up @@ -97,6 +97,4 @@ const DynamicConnectionForm: FC<DynamicConnectionFormProps> = ({
)}
</>
);
};

export default DynamicConnectionForm;
}
Loading