From ec53ec79d99386bb1f7a31b155ae1fe7d14968ea Mon Sep 17 00:00:00 2001 From: Jacob Benz <jacob.benz@h-da.de> Date: Tue, 6 May 2025 19:46:05 +0200 Subject: [PATCH] Fix storage bugs, add search for repo names --- .../cloud/sidebar/components/mobile-menu.tsx | 21 ++++++++++---- .../components/public-repository/index.tsx | 19 +++++++++---- .../search-bar/components/item.tsx | 3 +- .../public-repository/search-bar/index.tsx | 2 +- .../src/overmind/cloud/actions.tsx | 1 + .../src/providers/Gitlab_selfhosted.ts | 28 +++++++++++++++++++ .../src/types/index.ts | 2 +- 7 files changed, 62 insertions(+), 14 deletions(-) diff --git a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/mobile-menu.tsx b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/mobile-menu.tsx index d4309762..259145a0 100644 --- a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/mobile-menu.tsx +++ b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/mobile-menu.tsx @@ -24,7 +24,7 @@ interface MenuOption { export const MobileMenu = ({ onSelect, selectedMenu }: MobileMenuProps) => { const { name: providerName } = useAppState().cloud; - const { searchUsers, setCollectionSource, setOwner } = useActions().cloud; + const { searchUsers, setCollectionSource, setOwner , getRepo, navigateTo} = useActions().cloud; const { t } = useTranslation(); @@ -88,13 +88,22 @@ export const MobileMenu = ({ onSelect, selectedMenu }: MobileMenuProps) => { const toggleSearchBar = () => setShowSearch(!showSearch); const handleSearchSelect = async (publicRepository: PublicRepository) => { - await addPublicRepository(publicRepository); + // When the user selected a repo from the search results, this needs to be handled differently + if (publicRepository.type == "repository") { + const repo = await getRepo({repoName: publicRepository.name, repoId:publicRepository.id}) + if (repo) { + navigateTo({repo: repo}) + } - const { uuid, provider, ...rest } = publicRepository; - setOwner(rest as Owner); + } else { + await addPublicRepository(publicRepository); - setShowSearch(false); - onSelect(uuid); + const { uuid, provider, ...rest } = publicRepository; + setOwner(rest as Owner); + + setShowSearch(false); + onSelect(uuid); + } }; const handleCloseSearch = () => setShowSearch(false); diff --git a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/index.tsx b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/index.tsx index cd85baa2..2bbd9e56 100644 --- a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/index.tsx +++ b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/index.tsx @@ -24,7 +24,7 @@ const searcbarCollapsible = false; export const PublicRepositories = ({ onSelect, selectedMenu }: PublicRepositoriesProps) => { const { name: providerName, owner } = useAppState().cloud; - const { searchUsers, setOwner } = useActions().cloud; + const { searchUsers, setOwner, navigateTo, getRepo } = useActions().cloud; const { t } = useTranslation(); @@ -64,12 +64,21 @@ export const PublicRepositories = ({ onSelect, selectedMenu }: PublicRepositorie const handleCloseSearch = () => setShowSearch(searcbarCollapsible ? false : true); const handleSearchSelect = async (publicRepository: PublicRepository) => { - await addPublicRepository(publicRepository); + // When the user selected a repo from the search results, this needs to be handled differently + if (publicRepository.type == "repository") { + const repo = await getRepo({repoName: publicRepository.name, repoId:publicRepository.id}) + if (repo) { + navigateTo({repo: repo}) + } - const { uuid, provider, ...user } = publicRepository; - setOwner(user as Owner); + } else { + await addPublicRepository(publicRepository); - onSelect(user.username); + const { uuid, provider, ...user } = publicRepository; + setOwner(user as Owner); + + onSelect(user.username); + } }; const handleSearchChange = async (query: string) => await searchUsers(query); diff --git a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/components/item.tsx b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/components/item.tsx index 022b9287..6a350da7 100644 --- a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/components/item.tsx +++ b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/components/item.tsx @@ -1,5 +1,6 @@ import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import GroupWorkIcon from '@mui/icons-material/GroupWork'; +import CodeIcon from '@mui/icons-material/Code'; import { Icon, ListItem, @@ -32,7 +33,7 @@ export const Item = ({ onSelect, publicRepository }: ItemProps) => { > <ListItemIcon sx={{ minWidth: 30 }}> <Icon - component={type === 'organization' ? GroupWorkIcon : AccountCircleIcon} + component={type === 'organization' ? GroupWorkIcon : type === "repository" ? CodeIcon : AccountCircleIcon} fontSize="small" /> </ListItemIcon> diff --git a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/index.tsx b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/index.tsx index e42ee8a9..91e8a64c 100644 --- a/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/index.tsx +++ b/packages/cwrc-leafwriter-storage-service/src/cloud/sidebar/components/public-repository/search-bar/index.tsx @@ -48,7 +48,7 @@ export const SearchBar = ({ collapsible = true, onClear, onChange, onSelect }: S const { getInputProps, getListboxProps, inputValue } = useAutocomplete({ id: 'search-public-repository', options, - getOptionLabel: (option) => option.username, + getOptionLabel: (option) => option.username ? option.username : "", onInputChange: async (_event, newInputValue) => fetch(newInputValue), }); diff --git a/packages/cwrc-leafwriter-storage-service/src/overmind/cloud/actions.tsx b/packages/cwrc-leafwriter-storage-service/src/overmind/cloud/actions.tsx index 0679700d..5bb2cdb5 100644 --- a/packages/cwrc-leafwriter-storage-service/src/overmind/cloud/actions.tsx +++ b/packages/cwrc-leafwriter-storage-service/src/overmind/cloud/actions.tsx @@ -608,6 +608,7 @@ export const createRepo = async ( if (!repository) return null; state.cloud.repository = repository ? repository : undefined; + state.cloud.repositoryContent.path = [""] // After creating a new repo, it is safe to assume that we are at the root path of it state.cloud.repositories = undefined; await actions.cloud.fetchRepoContent(); diff --git a/packages/cwrc-leafwriter-storage-service/src/providers/Gitlab_selfhosted.ts b/packages/cwrc-leafwriter-storage-service/src/providers/Gitlab_selfhosted.ts index eff98436..03819092 100644 --- a/packages/cwrc-leafwriter-storage-service/src/providers/Gitlab_selfhosted.ts +++ b/packages/cwrc-leafwriter-storage-service/src/providers/Gitlab_selfhosted.ts @@ -404,6 +404,34 @@ export default class Gitlab implements Provider { const groupCollection = await this.searchGroups(query); if (groupCollection) collection = [...userCollection, ...groupCollection]; + // Also search for projects / repositories, because why not? + const projectCollection = await this.searchRepositories(query); + if (projectCollection) collection = [...userCollection, ...groupCollection, ...projectCollection]; + + return collection; + } + + async searchRepositories(query: string) { + const projectsResponse: AxiosResponse<any> | null = await this.axios.get('/search', { + params: { per_page: 5, scope: 'projects', search: query }, + }); + if (!projectsResponse) return []; + + const projectsData = projectsResponse.data ?? []; + + const projectsCollection: T.PublicRepository[] = projectsData.map( + ({ avatar_url, id, name }: any) => { + return { + avatar_url, + id, + name, + type:"repository" + }; + }, + ); + + let collection = projectsCollection ?? []; + return collection; } diff --git a/packages/cwrc-leafwriter-storage-service/src/types/index.ts b/packages/cwrc-leafwriter-storage-service/src/types/index.ts index 9bae950c..ddc6f5fc 100644 --- a/packages/cwrc-leafwriter-storage-service/src/types/index.ts +++ b/packages/cwrc-leafwriter-storage-service/src/types/index.ts @@ -116,7 +116,7 @@ export interface DropFile { export type CollectionSource = 'owner' | 'collaborator' | 'organization'; export type CollectionType = 'repos' | 'content' | 'organizations'; -export type UserType = 'user' | 'organization'; +export type UserType = 'user' | 'organization' | 'repository'; export interface NavigateToPathParams { org?: Organization; -- GitLab