Skip to content
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

feat(frontend): sharepoint and gdrive integration #2643

Merged
merged 121 commits into from
Jun 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
6cb889f
initial
Zewed May 22, 2024
5873410
other icons
Zewed May 22, 2024
caa9710
wip
Zewed May 22, 2024
a874ba0
wip
Zewed May 22, 2024
96ffd8b
generate componnets
Zewed May 22, 2024
31601bf
wip
Zewed May 22, 2024
a252df0
better ui
Zewed May 22, 2024
9c0927a
generate components
Zewed May 22, 2024
0ca0b72
wip
Zewed May 22, 2024
4eff1a9
can open modal
Zewed May 22, 2024
057f9d5
small
Zewed May 23, 2024
5ab68a4
Merge branch 'main' into feat/FrontIngestion
Zewed May 23, 2024
3c85ec2
done
Zewed May 23, 2024
8bfd765
Merge branch 'main' into feat/FrontIngestion
Zewed May 23, 2024
f5b768b
Merge branch 'main' into feat/FrontIngestion
Zewed May 23, 2024
29267df
connexion modal
Zewed May 23, 2024
a3fdfd0
wip
Zewed May 23, 2024
846b262
wip sharepoint
Zewed May 24, 2024
b0f7591
connection url
Zewed May 24, 2024
9113071
link
Zewed May 24, 2024
647f52f
wip
Zewed May 24, 2024
d00d184
wip
Zewed May 24, 2024
f803af8
wip
Zewed May 24, 2024
8467b4f
wip
Zewed May 24, 2024
10ffbb8
wip
Zewed May 24, 2024
cde112b
wip
Zewed May 24, 2024
846d057
wip
Zewed May 24, 2024
7d6a57d
wip from connections
Zewed May 24, 2024
000193e
wip
Zewed May 24, 2024
b7f440c
wip
Zewed May 26, 2024
8113537
wip
Zewed May 26, 2024
fe9aad4
wip
Zewed May 27, 2024
659c2a1
wip
Zewed May 27, 2024
00074f4
wip
Zewed May 27, 2024
ca5a712
wip
Zewed May 27, 2024
32a5c07
wip
Zewed May 27, 2024
9aaba0b
wip
Zewed May 27, 2024
9d44647
remove knowledge to feed number
Zewed May 27, 2024
728a979
connections before general
Zewed May 27, 2024
9c71d8a
work on brain creation steps
Zewed May 27, 2024
2ee9c80
cleaning
Zewed May 27, 2024
03dedde
wip
Zewed May 27, 2024
6c642d4
wip
Zewed May 27, 2024
505f1f8
wip
Zewed May 27, 2024
1b5cc7c
wip
Zewed May 27, 2024
fe7a8d0
wip
Zewed May 27, 2024
239a150
wip
Zewed May 28, 2024
789f029
Merge branch 'main' into feat/FrontIngestion
Zewed May 28, 2024
9023503
wip
Zewed May 29, 2024
6af5e52
wip
Zewed May 29, 2024
3428998
wip
Zewed May 29, 2024
0b3e2e2
wip
Zewed May 29, 2024
615b7be
wip
Zewed May 29, 2024
a13d753
wip again
Zewed May 29, 2024
9c51caa
wip
Zewed May 30, 2024
97b5f14
wip
Zewed May 30, 2024
2c89a49
small
Zewed May 30, 2024
c373cd8
wip
Zewed May 30, 2024
4dda132
wip
Zewed May 30, 2024
8e6bb63
oui oui oui
Zewed May 30, 2024
cfe375e
wip
Zewed May 30, 2024
9dd4a15
wip
Zewed May 30, 2024
2a11652
wip
Zewed May 30, 2024
65a93ef
wip
Zewed May 31, 2024
c6763f9
wip
Zewed May 31, 2024
b80da8f
wip
Zewed May 31, 2024
8e55ace
wip
Zewed May 31, 2024
c26691d
wip
Zewed May 31, 2024
342d52b
hey
Zewed May 31, 2024
334012f
wip
Zewed May 31, 2024
f2f3207
wip
Zewed Jun 3, 2024
43810d5
wip
Zewed Jun 3, 2024
73b9571
wip
Zewed Jun 3, 2024
57e4fb9
wip
Zewed Jun 3, 2024
d788634
wip
Zewed Jun 3, 2024
956ad56
Merge branch 'main' into feat/FrontIngestion
Zewed Jun 3, 2024
2337d1d
wip
Zewed Jun 3, 2024
3303068
wip
Zewed Jun 3, 2024
983bc63
remove all knowledge to feed
Zewed Jun 4, 2024
d90c461
wip
Zewed Jun 4, 2024
1101cc7
wip
Zewed Jun 4, 2024
aa85909
wip
Zewed Jun 5, 2024
1354771
wip
Zewed Jun 5, 2024
34589bb
wip
Zewed Jun 5, 2024
25c9fc8
wip
Zewed Jun 5, 2024
865412f
wip
Zewed Jun 5, 2024
f913055
wip
Zewed Jun 5, 2024
42c90b9
wip
Zewed Jun 5, 2024
a805aaf
seems to work well
Zewed Jun 5, 2024
d732791
wip
Zewed Jun 6, 2024
8d45155
small
Zewed Jun 6, 2024
6a9eddd
wip
Zewed Jun 6, 2024
b97a01d
wip
Zewed Jun 6, 2024
f62c122
wip
Zewed Jun 6, 2024
bd67c67
delete
Zewed Jun 6, 2024
1fbb35d
Merge branch 'main' into feat/FrontIngestion
Zewed Jun 6, 2024
a27cffe
Merge branch 'main' into feat/FrontIngestion
Zewed Jun 6, 2024
1e9c094
wip
Zewed Jun 6, 2024
5acfb5b
Add success page for Azure and Google Drive sync connections
Zewed Jun 6, 2024
07f5a7b
wip
Zewed Jun 7, 2024
193c2e4
wip
Zewed Jun 7, 2024
e60f338
small
Zewed Jun 7, 2024
cb7dcb4
small
Zewed Jun 7, 2024
9aeea80
wip
Zewed Jun 7, 2024
f1a7b06
wip
Zewed Jun 7, 2024
c83c29f
small
Zewed Jun 7, 2024
64db774
wip
Zewed Jun 7, 2024
b4366d5
wip
Zewed Jun 7, 2024
4f52498
wip
Zewed Jun 7, 2024
927a6cc
wip
Zewed Jun 7, 2024
5198a03
wip
Zewed Jun 7, 2024
a0c4dfc
wip
Zewed Jun 7, 2024
d1704e3
wip
Zewed Jun 7, 2024
aeeb4b8
wip
Zewed Jun 7, 2024
5f5ca7b
remove conenctions
Zewed Jun 7, 2024
06827b2
done done done
Zewed Jun 7, 2024
a24fd09
fix
Zewed Jun 8, 2024
28e7d5b
small fiox
Zewed Jun 8, 2024
ee964ec
Merge branch 'main' into feat/FrontIngestion
Zewed Jun 8, 2024
b228cfc
wip
Zewed Jun 8, 2024
b1b3c07
wip
Zewed Jun 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions backend/modules/sync/controller/azure_sync_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
from modules.sync.service.sync_service import SyncService, SyncUserService
from modules.user.entity.user_identity import UserIdentity
from msal import PublicClientApplication
from .successfull_connection import successfullConnectionPage
from fastapi.responses import HTMLResponse


# Initialize logger
logger = get_logger(__name__)
Expand All @@ -31,7 +34,7 @@
]


@azure_sync_router.get(
@azure_sync_router.post(
"/sync/azure/authorize",
dependencies=[Depends(AuthBearer())],
tags=["Sync"],
Expand Down Expand Up @@ -125,4 +128,4 @@ def oauth2callback_azure(request: Request):

sync_user_service.update_sync_user(current_user, state_dict, sync_user_input)
logger.info(f"Azure sync created successfully for user: {current_user}")
return {"message": "Azure sync created successfully"}
return HTMLResponse(successfullConnectionPage)
7 changes: 5 additions & 2 deletions backend/modules/sync/controller/google_sync_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
from modules.sync.dto.inputs import SyncsUserInput, SyncUserUpdateInput
from modules.sync.service.sync_service import SyncService, SyncUserService
from modules.user.entity.user_identity import UserIdentity
from .successfull_connection import successfullConnectionPage
from fastapi.responses import HTMLResponse


# Set environment variable for OAuthlib
os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
Expand Down Expand Up @@ -47,7 +50,7 @@
}


@google_sync_router.get(
@google_sync_router.post(
"/sync/google/authorize",
dependencies=[Depends(AuthBearer())],
tags=["Sync"],
Expand Down Expand Up @@ -138,4 +141,4 @@ def oauth2callback_google(request: Request):
)
sync_user_service.update_sync_user(current_user, state_dict, sync_user_input)
logger.info(f"Google Drive sync created successfully for user: {current_user}")
return {"message": "Google Drive sync created successfully"}
return HTMLResponse(successfullConnectionPage)
53 changes: 53 additions & 0 deletions backend/modules/sync/controller/successfull_connection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
successfullConnectionPage = """
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
<style>
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f8f9fa;
font-family: Arial, sans-serif;
}
.container {
text-align: center;
}
.message {
font-size: 2em;
margin-bottom: 20px;
}
.icon {
font-size: 2em;
color: white;
background-color: green;
border-radius: 50%;
padding: 20px;
margin-bottom: 20px;
}
.close-button {
padding: 10px 20px;
font-size: 1em;
color: #fff;
background-color: #6142d4;
border: none;
border-radius: 5px;
cursor: pointer;
}
.close-button:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<div class="container">
<i class="fas fa-check icon"></i>
<div class="message">Connection successful</div>
<button class="close-button" onclick="window.close();">Close Tab</button>
</div>
</body>
</html>
"""
2 changes: 1 addition & 1 deletion frontend/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports = {
complexity: ["error", 10],
"max-lines": ["error", 300],
"max-depth": ["error", 3],
"max-params": ["error", 4],
"max-params": ["error", 5],
eqeqeq: ["error", "smart"],
"import/no-extraneous-dependencies": [
"error",
Expand Down
14 changes: 9 additions & 5 deletions frontend/app/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ import { UserSettingsProvider } from "@/lib/context/UserSettingsProvider/User-se
import { IntercomProvider } from "@/lib/helpers/intercom/IntercomProvider";
import { UpdateMetadata } from "@/lib/helpers/updateMetadata";
import { usePageTracking } from "@/services/analytics/june/usePageTracking";

import "../lib/config/LocaleConfig/i18n";
import { FromConnectionsProvider } from "./chat/[chatId]/components/ActionsBar/components/KnowledgeToFeed/components/FromConnections/FromConnectionsProvider/FromConnection-provider";

if (
process.env.NEXT_PUBLIC_POSTHOG_KEY != null &&
Expand Down Expand Up @@ -90,11 +92,13 @@ const AppWithQueryClient = ({ children }: PropsWithChildren): JSX.Element => {
<BrainCreationProvider>
<MenuProvider>
<OnboardingProvider>
<ChatsProvider>
<ChatProvider>
<App>{children}</App>
</ChatProvider>
</ChatsProvider>
<FromConnectionsProvider>
<ChatsProvider>
<ChatProvider>
<App>{children}</App>
</ChatProvider>
</ChatsProvider>
</FromConnectionsProvider>
</OnboardingProvider>
</MenuProvider>
</BrainCreationProvider>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
width: 100%;
gap: Spacings.$spacing05;
overflow: hidden;
height: 100%;

.single_selector_wrapper {
width: 30%;
Expand All @@ -21,44 +22,8 @@

.tabs_content_wrapper {
width: 100%;
height: 200px;
}

.uploaded_knowledges_title {
color: var(--text-2);
display: flex;
justify-content: space-between;
}

.uploaded_knowledges {
padding: Spacings.$spacing03;
display: flex;
width: 100%;
overflow: scroll;
flex-direction: column;
gap: Spacings.$spacing02;
flex-grow: 1;
height: 80%;
overflow: scroll;

.uploaded_knowledge {
display: flex;
gap: Spacings.$spacing02;
align-items: center;
justify-content: space-between;
width: 100%;
overflow: hidden;
font-size: Typography.$small;

.left {
display: flex;
align-items: center;
gap: Spacings.$spacing02;
overflow: hidden;

.label {
@include Typography.EllipsisOverflow;
}
}
}
padding: Spacings.$spacing01;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useMemo, useState } from "react";
import { useEffect, useMemo, useState } from "react";

import { Icon } from "@/lib/components/ui/Icon/Icon";
import { useSync } from "@/lib/api/sync/useSync";
import { SingleSelector } from "@/lib/components/ui/SingleSelector/SingleSelector";
import { Tabs } from "@/lib/components/ui/Tabs/Tabs";
import { requiredRolesForUpload } from "@/lib/config/upload";
Expand All @@ -9,6 +9,8 @@ import { useKnowledgeToFeedContext } from "@/lib/context/KnowledgeToFeedProvider
import { Tab } from "@/lib/types/Tab";

import styles from "./KnowledgeToFeed.module.scss";
import { FromConnections } from "./components/FromConnections/FromConnections";
import { useFromConnectionsContext } from "./components/FromConnections/FromConnectionsProvider/hooks/useFromConnectionContext";
import { FromDocuments } from "./components/FromDocuments/FromDocuments";
import { FromWebsites } from "./components/FromWebsites/FromWebsites";
import { formatMinimalBrainsToSelectComponentInput } from "./utils/formatMinimalBrainsToSelectComponentInput";
Expand All @@ -18,10 +20,13 @@ export const KnowledgeToFeed = ({
}: {
hideBrainSelector?: boolean;
}): JSX.Element => {
const { allBrains, setCurrentBrainId, currentBrain } = useBrainContext();
const [selectedTab, setSelectedTab] = useState("From documents");
const { knowledgeToFeed, removeKnowledgeToFeed } =
useKnowledgeToFeedContext();
const { allBrains, setCurrentBrainId, currentBrainId, currentBrain } =
useBrainContext();
const [selectedTab, setSelectedTab] = useState("Documents");
const { knowledgeToFeed } = useKnowledgeToFeedContext();
const { openedConnections, setOpenedConnections, setCurrentSyncId } =
useFromConnectionsContext();
const { getActiveSyncsForBrain } = useSync();

const brainsWithUploadRights = formatMinimalBrainsToSelectComponentInput(
useMemo(
Expand All @@ -36,19 +41,69 @@ export const KnowledgeToFeed = ({

const knowledgesTabs: Tab[] = [
{
label: "From documents",
isSelected: selectedTab === "From documents",
onClick: () => setSelectedTab("From documents"),
label: "Documents",
isSelected: selectedTab === "Documents",
onClick: () => setSelectedTab("Documents"),
iconName: "file",
badge: knowledgeToFeed.filter(
(knowledge) => knowledge.source === "upload"
).length,
},
{
label: "From websites",
isSelected: selectedTab === "From websites",
onClick: () => setSelectedTab("From websites"),
label: "Websites",
isSelected: selectedTab === "Websites",
onClick: () => setSelectedTab("Websites"),
iconName: "website",
badge: knowledgeToFeed.filter((knowledge) => knowledge.source === "crawl")
.length,
},
{
label: "Connections",
isSelected: selectedTab === "Connections",
onClick: () => setSelectedTab("Connections"),
iconName: "sync",
badge: openedConnections.filter((connection) => connection.submitted)
.length,
},
];

useEffect(() => {
if (currentBrain) {
void (async () => {
try {
const res = await getActiveSyncsForBrain(currentBrain.id);
setCurrentSyncId(undefined);
setOpenedConnections(
res.map((sync) => ({
user_sync_id: sync.syncs_user_id,
id: sync.id,
provider: sync.syncs_user.provider,
submitted: true,
selectedFiles: {
files: [
...(sync.settings.folders?.map((folder) => ({
id: folder,
name: undefined,
is_folder: true,
})) ?? []),
...(sync.settings.files?.map((file) => ({
id: file,
name: undefined,
is_folder: false,
})) ?? []),
],
},
name: sync.name,
last_synced: sync.last_synced,
}))
);
} catch (error) {
console.error(error);
}
})();
}
}, [currentBrainId]);

return (
<div className={styles.knowledge_to_feed_wrapper}>
{!hideBrainSelector && (
Expand All @@ -68,39 +123,9 @@ export const KnowledgeToFeed = ({
)}
<Tabs tabList={knowledgesTabs} />
<div className={styles.tabs_content_wrapper}>
{selectedTab === "From documents" && <FromDocuments />}
{selectedTab === "From websites" && <FromWebsites />}
</div>
<div>
<div className={styles.uploaded_knowledges_title}>
<span>Knowledges to upload</span>
<span>{knowledgeToFeed.length}</span>
</div>
<div className={styles.uploaded_knowledges}>
{knowledgeToFeed.map((knowledge, index) => (
<div className={styles.uploaded_knowledge} key={index}>
<div className={styles.left}>
<Icon
name={knowledge.source === "crawl" ? "website" : "file"}
size="small"
color="black"
/>
<span className={styles.label}>
{knowledge.source === "crawl"
? knowledge.url
: knowledge.file.name}
</span>
</div>
<Icon
name="delete"
size="normal"
color="dangerous"
handleHover={true}
onClick={() => removeKnowledgeToFeed(index)}
/>
</div>
))}
</div>
{selectedTab === "Documents" && <FromDocuments />}
{selectedTab === "Websites" && <FromWebsites />}
{selectedTab === "Connections" && <FromConnections />}
</div>
</div>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { SyncElementLine } from "../SyncElementLine/SyncElementLine";

interface FileLineProps {
name: string;
selectable: boolean;
id: string;
}

export const FileLine = ({
name,
selectable,
id,
}: FileLineProps): JSX.Element => {
return (
<SyncElementLine
name={name}
selectable={selectable}
id={id}
isFolder={false}
/>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { SyncElementLine } from "../SyncElementLine/SyncElementLine";

interface FolderLineProps {
name: string;
selectable: boolean;
id: string;
}

export const FolderLine = ({
name,
selectable,
id,
}: FolderLineProps): JSX.Element => {
return (
<SyncElementLine
name={name}
selectable={selectable}
id={id}
isFolder={true}
/>
);
};
Loading