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 d430976252ffe924dc9bf8be8f42b03b439662bf..259145a02e2542f31cb2af2e8e41c52f55c88f02 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 cd85baa2e60d0bbdf17f5723534478f6b8bc2bcf..2bbd9e56e79c6754b72d959d61fb21e45375f361 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 022b9287135459b29324e3e5e65f1fe90f97a731..6a350da7dbbdebcf160c1806399fb67d7ad451dc 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 e42ee8a9de3813d3f9d3c86c7f093b8db4ac12dd..91e8a64cdae55003e3a46d8290d6eb6929425aac 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 0679700d724f630f2356fd82b994242589525844..5bb2cdb5a2e90fced2104696a1fafd9f8d8b30e8 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 eff984363adae211e0a5152c67ee86eb21ca1d61..03819092bb01cfe0ec1ab5e3d84490ea0aaf4fb6 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 9bae950c38e42eb8022050391aee623c41c803ba..ddc6f5fc726be39bbea95e478370ad962db11d08 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;