From 158bb8bf8a16b65c794961c672efb9ca559fea89 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 11 Mar 2019 14:48:48 +0100 Subject: [PATCH] adds combobox to select namespace strategy --- .../ui-types/src/NamespaceStrategies.js | 9 + .../packages/ui-types/src/index.js | 2 + .../src/config/components/form/ConfigForm.js | 9 +- .../config/components/form/GeneralSettings.js | 29 +-- .../form/NamespaceStrategySelect.js | 55 ++++++ scm-ui/src/config/containers/GlobalConfig.js | 30 ++- .../src/config/modules/namespaceStrategies.js | 105 ++++++++++ .../modules/namespaceStrategies.test.js | 187 ++++++++++++++++++ scm-ui/src/createReduxStore.js | 4 +- 9 files changed, 411 insertions(+), 19 deletions(-) create mode 100644 scm-ui-components/packages/ui-types/src/NamespaceStrategies.js create mode 100644 scm-ui/src/config/components/form/NamespaceStrategySelect.js create mode 100644 scm-ui/src/config/modules/namespaceStrategies.js create mode 100644 scm-ui/src/config/modules/namespaceStrategies.test.js diff --git a/scm-ui-components/packages/ui-types/src/NamespaceStrategies.js b/scm-ui-components/packages/ui-types/src/NamespaceStrategies.js new file mode 100644 index 0000000000..ec53e6a7db --- /dev/null +++ b/scm-ui-components/packages/ui-types/src/NamespaceStrategies.js @@ -0,0 +1,9 @@ +// @flow + +import type { Links } from "./hal"; + +export type NamespaceStrategies = { + current: string, + available: string[], + _links: Links +}; diff --git a/scm-ui-components/packages/ui-types/src/index.js b/scm-ui-components/packages/ui-types/src/index.js index f7b375ac98..02e88f12e1 100644 --- a/scm-ui-components/packages/ui-types/src/index.js +++ b/scm-ui-components/packages/ui-types/src/index.js @@ -26,3 +26,5 @@ export type { SubRepository, File } from "./Sources"; export type { SelectValue, AutocompleteObject } from "./Autocomplete"; export type { AvailableRepositoryPermissions, RepositoryRole } from "./AvailableRepositoryPermissions"; + +export type { NamespaceStrategies } from "./NamespaceStrategies"; diff --git a/scm-ui/src/config/components/form/ConfigForm.js b/scm-ui/src/config/components/form/ConfigForm.js index 7b650ccbfd..1c574a2912 100644 --- a/scm-ui/src/config/components/form/ConfigForm.js +++ b/scm-ui/src/config/components/form/ConfigForm.js @@ -2,6 +2,7 @@ import React from "react"; import { translate } from "react-i18next"; import { SubmitButton, Notification } from "@scm-manager/ui-components"; +import type { NamespaceStrategies } from "@scm-manager/ui-types"; import type { Config } from "@scm-manager/ui-types"; import ProxySettings from "./ProxySettings"; import GeneralSettings from "./GeneralSettings"; @@ -13,9 +14,11 @@ type Props = { submitForm: Config => void, config?: Config, loading?: boolean, - t: string => string, configReadPermission: boolean, - configUpdatePermission: boolean + configUpdatePermission: boolean, + namespaceStrategies?: NamespaceStrategies, + // context props + t: string => string, }; type State = { @@ -88,6 +91,7 @@ class ConfigForm extends React.Component { const { loading, t, + namespaceStrategies, configReadPermission, configUpdatePermission } = this.props; @@ -118,6 +122,7 @@ class ConfigForm extends React.Component {
{noPermissionNotification} string, + namespaceStrategies?: NamespaceStrategies, onChange: (boolean, any, string) => void, - hasUpdatePermission: boolean + hasUpdatePermission: boolean, + // context props + t: string => string }; class GeneralSettings extends React.Component { + render() { const { t, @@ -31,7 +36,8 @@ class GeneralSettings extends React.Component { pluginUrl, enabledXsrfProtection, defaultNamespaceStrategy, - hasUpdatePermission + hasUpdatePermission, + namespaceStrategies } = this.props; return ( @@ -67,13 +73,14 @@ class GeneralSettings extends React.Component { />
- +
diff --git a/scm-ui/src/config/components/form/NamespaceStrategySelect.js b/scm-ui/src/config/components/form/NamespaceStrategySelect.js new file mode 100644 index 0000000000..a480dadc98 --- /dev/null +++ b/scm-ui/src/config/components/form/NamespaceStrategySelect.js @@ -0,0 +1,55 @@ +//@flow +import React from "react"; +import { translate, type TFunction } from "react-i18next"; +import { Select } from "@scm-manager/ui-components"; +import type { NamespaceStrategies } from "@scm-manager/ui-types"; + +type Props = { + namespaceStrategies: NamespaceStrategies, + label: string, + value?: string, + disabled?: boolean, + helpText?: string, + onChange: (value: string, name?: string) => void, + // context props + t: TFunction +}; + +class NamespaceStrategySelect extends React.Component { + createNamespaceOptions = () => { + const { namespaceStrategies, t } = this.props; + let available = []; + if (namespaceStrategies && namespaceStrategies.available) { + available = namespaceStrategies.available; + } + + return available.map(ns => { + const key = "namespaceStrategies." + ns; + let label = t("namespaceStrategies." + ns); + if (label === key) { + label = ns; + } + return { + value: ns, + label: label + }; + }); + }; + + render() { + const { label, value, helpText, disabled, onChange } = this.props; + const nsOptions = this.createNamespaceOptions(); + return ( +