From e9f22e89eca11f87166033c7545187ca5a2def8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 11 Jan 2022 16:17:57 +0100 Subject: [PATCH] Autocomplete for namespaces (#1916) Changes the "namespace" input in the repository creation form or the "rename repository" dialog to an autocomplete input. Of course this is only available for the "custom" namespace strategy. --- .../de/user/repo/assets/create-repository.png | Bin 34898 -> 31684 bytes docs/de/user/repo/index.md | 7 +- .../en/user/repo/assets/create-repository.png | Bin 32815 -> 29598 bytes docs/en/user/repo/index.md | 5 +- gradle/changelog/autocomplete_namespaces.yaml | 2 + scm-ui/ui-api/src/index.ts | 1 + scm-ui/ui-api/src/namespaceSuggestions.ts | 32 +++++++ scm-ui/ui-components/src/Autocomplete.tsx | 12 ++- .../src/__snapshots__/storyshots.test.ts.snap | 4 + .../src/modals/Modal.stories.tsx | 66 ++++++++++++-- scm-ui/ui-components/src/modals/Modal.tsx | 38 ++++++-- scm-ui/ui-types/src/Autocomplete.ts | 2 +- .../components/NamespaceAndNameFields.tsx | 38 +++----- .../src/repos/components/NamespaceInput.tsx | 83 ++++++++++++++++++ .../src/repos/containers/RenameRepository.tsx | 38 ++++---- .../java/sonia/scm/GenericDisplayManager.java | 3 +- .../v2/resources/AutoCompleteResource.java | 59 +++++++++++-- .../api/v2/resources/IndexDtoGenerator.java | 1 + .../scm/api/v2/resources/ResourceLinks.java | 4 + .../resources/AutoCompleteResourceTest.java | 28 +++++- 20 files changed, 346 insertions(+), 77 deletions(-) create mode 100644 gradle/changelog/autocomplete_namespaces.yaml create mode 100644 scm-ui/ui-api/src/namespaceSuggestions.ts create mode 100644 scm-ui/ui-webapp/src/repos/components/NamespaceInput.tsx diff --git a/docs/de/user/repo/assets/create-repository.png b/docs/de/user/repo/assets/create-repository.png index 2f314dcef5bee6d8749338107776892b430d915c..4fa11f438eee10debf6c1c6b274ebf2ff8da8775 100644 GIT binary patch delta 13683 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 delta 17031 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 literal 32815 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 diff --git a/docs/en/user/repo/index.md b/docs/en/user/repo/index.md index e72becc28b..60d1ad9e06 100644 --- a/docs/en/user/repo/index.md +++ b/docs/en/user/repo/index.md @@ -24,7 +24,10 @@ In SCM-Manager new Git, Mercurial & Subversion (SVN) repositories can be created Optionally, repositories can be initialized during the creation. That creates a standard branch (master or default) for Git and Mercurial repositories. Additionally, it performs a commit that creates a README.md. For Subversion repositories the README.md will be created in a directory named `trunk`. -If the namespace strategy is set to custom, the namespace field is also mandatory. The namespace must heed the same restrictions as the name. Additionally, namespaces that only consist of three digits, or the words "create" and "import" are not valid. +If the namespace strategy is set to custom, the namespace field is also mandatory. The namespace must heed the same +restrictions as the name. Additionally, namespaces that only consist of three digits, or the words "create" +and "import" are not valid. After typing the first characters, existing matching namespaces are suggested which can +be chosen. To create a new namespace, this has to be chosen from the drop down explicitly. ![Create Repository](assets/create-repository.png) diff --git a/gradle/changelog/autocomplete_namespaces.yaml b/gradle/changelog/autocomplete_namespaces.yaml new file mode 100644 index 0000000000..268c020769 --- /dev/null +++ b/gradle/changelog/autocomplete_namespaces.yaml @@ -0,0 +1,2 @@ +- type: changed + description: Autocompletion for namespaces ([#1916](https://github.com/scm-manager/scm-manager/pull/1916)) diff --git a/scm-ui/ui-api/src/index.ts b/scm-ui/ui-api/src/index.ts index e13c174c25..5ca6572913 100644 --- a/scm-ui/ui-api/src/index.ts +++ b/scm-ui/ui-api/src/index.ts @@ -36,6 +36,7 @@ export * from "./users"; export * from "./suggestions"; export * from "./userSuggestions"; export * from "./groupSuggestions"; +export * from "./namespaceSuggestions"; export * from "./repositories"; export * from "./namespaces"; export * from "./branches"; diff --git a/scm-ui/ui-api/src/namespaceSuggestions.ts b/scm-ui/ui-api/src/namespaceSuggestions.ts new file mode 100644 index 0000000000..9080271e11 --- /dev/null +++ b/scm-ui/ui-api/src/namespaceSuggestions.ts @@ -0,0 +1,32 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import { Link } from "@scm-manager/ui-types"; +import { useIndexLinks } from "./base"; +import { useSuggestions } from "./suggestions"; + +export const useNamespaceSuggestions = () => { + const indexLinks = useIndexLinks(); + const autocompleteLink = (indexLinks.autocomplete as Link[]).find((i) => i.name === "namespaces"); + return useSuggestions(autocompleteLink?.href); +}; diff --git a/scm-ui/ui-components/src/Autocomplete.tsx b/scm-ui/ui-components/src/Autocomplete.tsx index b54c2a02bc..80d4cfdeeb 100644 --- a/scm-ui/ui-components/src/Autocomplete.tsx +++ b/scm-ui/ui-components/src/Autocomplete.tsx @@ -37,8 +37,11 @@ type Props = { placeholder: string; loadingMessage: string; noOptionsMessage: string; + errorMessage?: string; + informationMessage?: string; creatable?: boolean; className?: string; + disabled?: boolean; }; type State = {}; @@ -78,8 +81,11 @@ class Autocomplete extends React.Component { loadingMessage, noOptionsMessage, loadSuggestions, + errorMessage, + informationMessage, creatable, - className + className, + disabled } = this.props; return ( @@ -108,6 +114,7 @@ class Autocomplete extends React.Component { }); }} aria-label={helpText || label} + isDisabled={disabled} /> ) : ( { loadingMessage={() => loadingMessage} noOptionsMessage={() => noOptionsMessage} aria-label={helpText || label} + isDisabled={disabled} /> )} + {errorMessage ?

{errorMessage}

: null} + {informationMessage ?

{informationMessage}

: null} ); } diff --git a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap index 8f04dae547..f5f2111693 100644 --- a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap +++ b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap @@ -19219,6 +19219,10 @@ exports[`Storyshots Modal/Modal With form elements 1`] = `null`; exports[`Storyshots Modal/Modal With long tooltips 1`] = `null`; +exports[`Storyshots Modal/Modal With overflow 1`] = `null`; + +exports[`Storyshots Modal/Modal With overflow and footer 1`] = `null`; + exports[`Storyshots Notification Closeable 1`] = `
{}; +const doNothing = () => { + // nothing to do +}; const withFormElementsBody = ( <> @@ -71,8 +75,21 @@ const withFormElementsFooter = ( ); +const loadSuggestions: (p: string) => Promise = () => + new Promise(resolve => { + setTimeout(() => { + resolve([ + { value: { id: "trillian", displayName: "Tricia McMillan" }, label: "Tricia McMillan" }, + { value: { id: "zaphod", displayName: "Zaphod Beeblebrox" }, label: "Zaphod Beeblebrox" }, + { value: { id: "ford", displayName: "Ford Prefect" }, label: "Ford Prefect" }, + { value: { id: "dent", displayName: "Arthur Dent" }, label: "Arthur Dent" }, + { value: { id: "marvin", displayName: "Marvin" }, label: "Marvin the Paranoid Android " } + ]); + }); + }); + storiesOf("Modal/Modal", module) - .addDecorator((story) => {story()}) + .addDecorator(story => {story()}) .add("Default", () => (

{text}

@@ -104,7 +121,7 @@ storiesOf("Modal/Modal", module) This story exists because we had a problem, that long tooltips causes a horizontal scrollbar on the modal.
-

The following elements will have a verly long help text, which has triggered the scrollbar in the past.

+

The following elements will have a very long help text, which has triggered the scrollbar in the past.


@@ -211,10 +228,47 @@ storiesOf("Modal/Modal", module)

- )); + )) + .add("With overflow", () => { + return ( + +

Please Select

+ { + // nothing to do + }} + loadSuggestions={loadSuggestions} + /> +
+ ); + }) + .add("With overflow and footer", () => { + return ( + +

Please Select

+ { + // nothing to do + }} + loadSuggestions={loadSuggestions} + /> +
+ ); + }); -const NonCloseableModal: FC = ({ children }) => { - return ; +type NonCloseableModalProps = { overflowVisible?: boolean; footer?: any }; + +const NonCloseableModal: FC = ({ overflowVisible, footer, children }) => { + return ( + + ); }; const CloseableModal: FC = ({ children }) => { diff --git a/scm-ui/ui-components/src/modals/Modal.tsx b/scm-ui/ui-components/src/modals/Modal.tsx index bcda9f486b..d3a6ef3d81 100644 --- a/scm-ui/ui-components/src/modals/Modal.tsx +++ b/scm-ui/ui-components/src/modals/Modal.tsx @@ -42,10 +42,24 @@ type Props = { headColor?: string; headTextColor?: string; size?: ModalSize; + overflowVisible?: boolean; }; -const SizedModal = styled.div<{ size?: ModalSize }>` +const SizedModal = styled.div<{ size?: ModalSize; overflow: string }>` width: ${props => (props.size ? `${modalSizes[props.size]}%` : "640px")}; + overflow: ${props => props.overflow}; +`; + +const DivWithOptionalOverflow = styled.div<{ overflow: string; borderBottomRadius: string }>` + overflow: ${props => props.overflow}; + border-bottom-left-radius: ${props => props.borderBottomRadius}; + border-bottom-right-radius: ${props => props.borderBottomRadius}; +`; + +const SectionWithOptionalOverflow = styled.section<{ overflow: string; borderBottomRadius: string }>` + overflow: ${props => props.overflow}; + border-bottom-left-radius: ${props => props.borderBottomRadius}; + border-bottom-right-radius: ${props => props.borderBottomRadius}; `; export const Modal: FC = ({ @@ -57,7 +71,8 @@ export const Modal: FC = ({ className, headColor = "secondary-less", headTextColor = "secondary-most", - size + size, + overflowVisible }) => { const portalRootElement = usePortalRootElement("modalsRoot"); const initialFocusRef = useRef(null); @@ -85,18 +100,29 @@ export const Modal: FC = ({ } }; + const overflowAttribute = overflowVisible ? "visible" : "auto"; + const borderBottomRadiusAttribute = overflowVisible && !footer ? "inherit" : "unset"; + const modalElement = ( -
+
- +

{title}

-
{body}
+ + {body} + {showFooter}
-
+
); return ReactDOM.createPortal(modalElement, portalRootElement); diff --git a/scm-ui/ui-types/src/Autocomplete.ts b/scm-ui/ui-types/src/Autocomplete.ts index d237088d1d..33607db776 100644 --- a/scm-ui/ui-types/src/Autocomplete.ts +++ b/scm-ui/ui-types/src/Autocomplete.ts @@ -24,7 +24,7 @@ export type AutocompleteObject = { id: string; - displayName: string; + displayName?: string; }; export type SelectValue = { diff --git a/scm-ui/ui-webapp/src/repos/components/NamespaceAndNameFields.tsx b/scm-ui/ui-webapp/src/repos/components/NamespaceAndNameFields.tsx index 5dbd2a949f..50348d5d4d 100644 --- a/scm-ui/ui-webapp/src/repos/components/NamespaceAndNameFields.tsx +++ b/scm-ui/ui-webapp/src/repos/components/NamespaceAndNameFields.tsx @@ -23,12 +23,12 @@ */ import React, { FC, useEffect, useState } from "react"; -import { CUSTOM_NAMESPACE_STRATEGY, RepositoryCreation } from "@scm-manager/ui-types"; +import { CUSTOM_NAMESPACE_STRATEGY, RepositoryCreation} from "@scm-manager/ui-types"; import { useTranslation } from "react-i18next"; import { InputField } from "@scm-manager/ui-components"; -import { ExtensionPoint } from "@scm-manager/ui-extensions"; import * as validator from "./form/repositoryValidation"; -import { useNamespaceStrategies } from "@scm-manager/ui-api"; +import { useNamespaceStrategies} from "@scm-manager/ui-api"; +import NamespaceInput from "./NamespaceInput"; type Props = { repository: RepositoryCreation; @@ -82,30 +82,6 @@ const NamespaceAndNameFields: FC = ({ repository, onChange, setValid, dis onChange({ ...repository, name }); }; - const renderNamespaceField = () => { - let informationMessage = undefined; - if (repository?.namespace?.indexOf(" ") > 0) { - informationMessage = t("validation.namespaceSpaceWarningText"); - } - - const props = { - label: t("repository.namespace"), - helpText: t("help.namespaceHelpText"), - value: repository ? repository.namespace : "", - onChange: handleNamespaceChange, - errorMessage: t("validation.namespace-invalid"), - validationError: namespaceValidationError, - disabled: disabled, - informationMessage - }; - - if (namespaceStrategy === CUSTOM_NAMESPACE_STRATEGY) { - return ; - } - - return ; - }; - // not yet loaded if (namespaceStrategy === "") { return null; @@ -113,7 +89,13 @@ const NamespaceAndNameFields: FC = ({ repository, onChange, setValid, dis return ( <> - {renderNamespaceField()} + void; + namespaceStrategy?: string; + namespaceValidationError?: boolean; + disabled?: boolean; +}; + +const NamespaceInput: FC = ({ + namespace, + handleNamespaceChange, + namespaceStrategy, + namespaceValidationError, + disabled +}) => { + const [t] = useTranslation("repos"); + const loadNamespaceSuggestions = useNamespaceSuggestions(); + + let informationMessage = undefined; + if (namespace?.indexOf(" ") > 0) { + informationMessage = t("validation.namespaceSpaceWarningText"); + } + + const repositorySelectValue = namespace ? { value: { id: namespace, displayName: "" }, label: namespace } : undefined; + const props = { + label: t("repository.namespace"), + helpText: t("help.namespaceHelpText"), + value: namespace, + onChange: handleNamespaceChange, + errorMessage: namespaceValidationError ? t("validation.namespace-invalid") : "", + informationMessage: informationMessage, + validationError: namespaceValidationError, + disabled: disabled + }; + + if (namespaceStrategy === CUSTOM_NAMESPACE_STRATEGY) { + return ( + handleNamespaceChange(namespaceValue.value.id)} + placeholder={""} + creatable={true} + /> + ); + } + + return ; +}; + +export default NamespaceInput; diff --git a/scm-ui/ui-webapp/src/repos/containers/RenameRepository.tsx b/scm-ui/ui-webapp/src/repos/containers/RenameRepository.tsx index 29ed94eeb7..762e5d349d 100644 --- a/scm-ui/ui-webapp/src/repos/containers/RenameRepository.tsx +++ b/scm-ui/ui-webapp/src/repos/containers/RenameRepository.tsx @@ -23,13 +23,18 @@ */ import React, { FC, useState } from "react"; -import { CUSTOM_NAMESPACE_STRATEGY, Repository } from "@scm-manager/ui-types"; +import { Repository } from "@scm-manager/ui-types"; import { Button, ButtonGroup, ErrorNotification, InputField, Level, Loading, Modal } from "@scm-manager/ui-components"; import { useTranslation } from "react-i18next"; import { Redirect } from "react-router-dom"; -import { ExtensionPoint } from "@scm-manager/ui-extensions"; import * as validator from "../components/form/repositoryValidation"; import { useNamespaceStrategies, useRenameRepository } from "@scm-manager/ui-api"; +import NamespaceInput from "../components/NamespaceInput"; +import styled from "styled-components"; + +const WithOverflow = styled.div` + overflow: visible; +`; type Props = { repository: Repository; @@ -76,25 +81,8 @@ const RenameRepository: FC = ({ repository }) => { setName(name); }; - const renderNamespaceField = () => { - const props = { - label: t("repository.namespace"), - helpText: t("help.namespaceHelpText"), - value: namespace, - onChange: handleNamespaceChange, - errorMessage: t("validation.namespace-invalid"), - validationError: namespaceValidationError - }; - - if (namespaceStrategies?.current === CUSTOM_NAMESPACE_STRATEGY) { - return ; - } - - return ; - }; - const modalBody = ( -
+ {renamingError ? : null} = ({ repository }) => { value={name} onChange={handleNameChange} /> - {renderNamespaceField()} -
+ + ); const footer = ( @@ -137,6 +130,7 @@ const RenameRepository: FC = ({ repository }) => { footer={footer} body={modalBody} closeFunction={() => setShowModal(false)} + overflowVisible={true} /> ); diff --git a/scm-webapp/src/main/java/sonia/scm/GenericDisplayManager.java b/scm-webapp/src/main/java/sonia/scm/GenericDisplayManager.java index af157f92ed..15f8871842 100644 --- a/scm-webapp/src/main/java/sonia/scm/GenericDisplayManager.java +++ b/scm-webapp/src/main/java/sonia/scm/GenericDisplayManager.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm; import sonia.scm.search.SearchRequest; @@ -32,7 +32,6 @@ import java.util.Optional; import java.util.function.Function; import static java.util.Optional.ofNullable; -import static sonia.scm.group.DisplayGroup.from; public abstract class GenericDisplayManager implements DisplayManager { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java index 8fbb8012b0..3bd20fc4f7 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/AutoCompleteResource.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.api.v2.resources; import io.swagger.v3.oas.annotations.OpenAPIDefinition; @@ -32,6 +32,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import sonia.scm.ReducedModelObject; import sonia.scm.group.GroupDisplayManager; +import sonia.scm.repository.NamespaceManager; +import sonia.scm.search.SearchRequest; +import sonia.scm.search.SearchUtil; import sonia.scm.user.UserDisplayManager; import sonia.scm.web.VndMediaType; @@ -46,6 +49,8 @@ import java.util.Collection; import java.util.List; import java.util.stream.Collectors; +import static sonia.scm.DisplayManager.DEFAULT_LIMIT; + @OpenAPIDefinition(tags = { @Tag(name = "Autocomplete", description = "Autocomplete related endpoints") }) @@ -58,16 +63,18 @@ public class AutoCompleteResource { public static final String INVALID_PARAMETER_LENGTH = "Invalid parameter length."; - private ReducedObjectModelToDtoMapper mapper; + private final ReducedObjectModelToDtoMapper mapper; - private UserDisplayManager userDisplayManager; - private GroupDisplayManager groupDisplayManager; + private final UserDisplayManager userDisplayManager; + private final GroupDisplayManager groupDisplayManager; + private final NamespaceManager namespaceManager; @Inject - public AutoCompleteResource(ReducedObjectModelToDtoMapper mapper, UserDisplayManager userDisplayManager, GroupDisplayManager groupDisplayManager) { + public AutoCompleteResource(ReducedObjectModelToDtoMapper mapper, UserDisplayManager userDisplayManager, GroupDisplayManager groupDisplayManager, NamespaceManager namespaceManager) { this.mapper = mapper; this.userDisplayManager = userDisplayManager; this.groupDisplayManager = groupDisplayManager; + this.namespaceManager = namespaceManager; } @GET @@ -123,12 +130,50 @@ public class AutoCompleteResource { return map(groupDisplayManager.autocomplete(filter)); } + @GET + @Path("namespaces") + @Produces(VndMediaType.AUTOCOMPLETE) + @Operation(summary = "Search namespaces", description = "Returns matching namespaces.", tags = "Autocomplete") + @ApiResponse( + responseCode = "200", + description = "success", + content = @Content( + mediaType = VndMediaType.AUTOCOMPLETE, + schema = @Schema(implementation = ReducedObjectModelDto.class) + )) + @ApiResponse(responseCode = "400", description = "if the searched string contains less than 2 characters") + @ApiResponse(responseCode = "401", description = "not authenticated / invalid credentials") + @ApiResponse( + responseCode = "500", + description = "internal server error", + content = @Content( + mediaType = VndMediaType.ERROR_TYPE, + schema = @Schema(implementation = ErrorDto.class) + ) + ) + public List searchNamespace(@NotEmpty(message = PARAMETER_IS_REQUIRED) @Size(min = MIN_SEARCHED_CHARS, message = INVALID_PARAMETER_LENGTH) @QueryParam("q") String filter) { + SearchRequest searchRequest = new SearchRequest(filter, true, DEFAULT_LIMIT); + return map(SearchUtil.search( + searchRequest, + namespaceManager.getAll(), + namespace -> SearchUtil.matchesOne(searchRequest, namespace.getNamespace()) ? new ReducedModelObject() { + @Override + public String getId() { + return namespace.getId(); + } + + @Override + public String getDisplayName() { + return null; + } + } : null + )); + } + private List map(Collection autocomplete) { return autocomplete .stream() .map(mapper::map) .collect(Collectors.toList()); } - - } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java index 2a2532ac61..0deea54e22 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/IndexDtoGenerator.java @@ -121,6 +121,7 @@ public class IndexDtoGenerator extends HalAppenderMapper { if (GroupPermissions.autocomplete().isPermitted()) { autoCompleteLinks.add(Link.linkBuilder("autocomplete", resourceLinks.autoComplete().groups()).withName("groups").build()); } + autoCompleteLinks.add(Link.linkBuilder("autocomplete", resourceLinks.autoComplete().namespaces()).withName("namespaces").build()); builder.array(autoCompleteLinks); if (GroupPermissions.list().isPermitted()) { builder.single(link("groups", resourceLinks.groupCollection().self())); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java index 8ec0177ebd..5de7e80a00 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ResourceLinks.java @@ -317,6 +317,10 @@ class ResourceLinks { String groups() { return linkBuilder.method("searchGroup").parameters().href(); } + + String namespaces() { + return linkBuilder.method("searchNamespace").parameters().href(); + } } ConfigLinks config() { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java index 191c469d4a..ed2c689f7b 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/AutoCompleteResourceTest.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.api.v2.resources; import com.fasterxml.jackson.databind.ObjectMapper; @@ -36,11 +36,14 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.DisplayManager; import sonia.scm.group.DefaultGroupDisplayManager; import sonia.scm.group.Group; import sonia.scm.group.xml.XmlGroupDAO; +import sonia.scm.repository.Namespace; +import sonia.scm.repository.NamespaceManager; import sonia.scm.store.ConfigurationStore; import sonia.scm.store.ConfigurationStoreFactory; import sonia.scm.user.DefaultUserDisplayManager; @@ -56,6 +59,7 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; +import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -78,6 +82,8 @@ public class AutoCompleteResourceTest { private XmlUserDAO userDao; private XmlGroupDAO groupDao; + @Mock + private NamespaceManager namespaceManager; private XmlDatabase xmlDB; private ObjectMapper jsonObjectMapper = new ObjectMapper(); @@ -97,7 +103,7 @@ public class AutoCompleteResourceTest { ReducedObjectModelToDtoMapperImpl mapper = new ReducedObjectModelToDtoMapperImpl(); DefaultUserDisplayManager userManager = new DefaultUserDisplayManager(this.userDao); DefaultGroupDisplayManager groupManager = new DefaultGroupDisplayManager(groupDao); - AutoCompleteResource autoCompleteResource = new AutoCompleteResource(mapper, userManager, groupManager); + AutoCompleteResource autoCompleteResource = new AutoCompleteResource(mapper, userManager, groupManager, namespaceManager); dispatcher.addSingletonResource(autoCompleteResource); } @@ -269,6 +275,24 @@ public class AutoCompleteResourceTest { assertResultSize(response, defaultLimit); } + @Test + @SubjectAware(username = "user_without_autocomplete_permission", password = "secret") + public void shouldSearchNamespacesForAllUsers() throws Exception { + when(namespaceManager.getAll()).thenReturn(asList(new Namespace("hog"), new Namespace("hitchhiker"))); + + MockHttpRequest request = MockHttpRequest + .get("/" + AutoCompleteResource.PATH + "namespaces?q=hi") + .contentType(VndMediaType.AUTOCOMPLETE) + .accept(VndMediaType.AUTOCOMPLETE); + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertEquals(HttpServletResponse.SC_OK, response.getStatus()); + assertResultSize(response, 1); + assertTrue(response.getContentAsString().contains("\"id\":\"hitchhiker\"")); + } + private User createMockUser(String id, String name) { return new User(id, name, "em@l.de"); }