diff --git a/scm-ui-components/packages/ui-components/src/Help.js b/scm-ui-components/packages/ui-components/src/Help.js index 9cb37e722d..6b632810e9 100644 --- a/scm-ui-components/packages/ui-components/src/Help.js +++ b/scm-ui-components/packages/ui-components/src/Help.js @@ -1,8 +1,9 @@ //@flow import React from "react"; import injectSheet from "react-jss"; -import Tooltip from './Tooltip'; -import HelpIcon from './HelpIcon'; +import classNames from "classnames"; +import Tooltip from "./Tooltip"; +import HelpIcon from "./HelpIcon"; const styles = { tooltip: { @@ -14,21 +15,22 @@ const styles = { type Props = { message: string, + className?: string, classes: any -} +}; class Help extends React.Component { - render() { - const { message, classes } = this.props; + const { message, className, classes } = this.props; return ( - + ); } - } export default injectSheet(styles)(Help); - diff --git a/scm-ui-components/packages/ui-components/src/Tag.js b/scm-ui-components/packages/ui-components/src/Tag.js index 3a377d057b..6ccdf0093f 100644 --- a/scm-ui-components/packages/ui-components/src/Tag.js +++ b/scm-ui-components/packages/ui-components/src/Tag.js @@ -8,7 +8,8 @@ type Props = { icon?: string, label: string, title?: string, - onClick?: () => void + onClick?: () => void, + onRemove?: () => void }; class Tag extends React.Component { @@ -17,25 +18,41 @@ class Tag extends React.Component { }; render() { - const { className, color, icon, label, title, onClick } = this.props; + const { + className, + color, + icon, + label, + title, + onClick, + onRemove + } = this.props; let showIcon = null; if (icon) { showIcon = ( <> -   + +   ); } + let showDelete = null; + if (onRemove) { + showDelete = ; + } return ( - - {showIcon} - {label} - + <> + + {showIcon} + {label} + + {showDelete} + ); } } diff --git a/scm-ui-components/packages/ui-components/src/TagGroup.js b/scm-ui-components/packages/ui-components/src/TagGroup.js new file mode 100644 index 0000000000..06940f2b1a --- /dev/null +++ b/scm-ui-components/packages/ui-components/src/TagGroup.js @@ -0,0 +1,65 @@ +//@flow +import * as React from "react"; +import injectSheet from "react-jss"; +import { Help, Tag } from "./index"; + +type Props = { + items: string[], + label: string, + helpText?: string, + onRemove: (string[]) => void, + + // context props + classes: Object +}; + +const styles = { + help: { + position: "relative" + } +}; + +class TagGroup extends React.Component { + render() { + const { items, label, helpText, classes } = this.props; + let help = null; + if (helpText) { + help = ; + } + return ( +
+ {label && items ? ( +
+ + {label} + {help} + {items.length > 0 ? ":" : ""} + +
+ ) : ( + "" + )} + {items.map(item => { + return ( +
+
+ +
+
+ ); + })} +
+ ); + } + + removeEntry = (item: string) => { + const newItems = this.props.items.filter(name => name !== item); + this.props.onRemove(newItems); + }; +} + +export default injectSheet(styles)(TagGroup); diff --git a/scm-ui-components/packages/ui-components/src/forms/MemberNameTable.js b/scm-ui-components/packages/ui-components/src/forms/MemberNameTable.js index 30dac31093..f90744b026 100644 --- a/scm-ui-components/packages/ui-components/src/forms/MemberNameTable.js +++ b/scm-ui-components/packages/ui-components/src/forms/MemberNameTable.js @@ -2,44 +2,30 @@ import React from "react"; import { translate } from "react-i18next"; import RemoveEntryOfTableButton from "../buttons/RemoveEntryOfTableButton"; +import TagGroup from "../TagGroup"; type Props = { members: string[], - t: string => string, - memberListChanged: (string[]) => void + memberListChanged: (string[]) => void, + t: string => string }; -type State = {}; - -class MemberNameTable extends React.Component { +class MemberNameTable extends React.Component { render() { - const { t } = this.props; + const { members, t } = this.props; + return ( - - - {this.props.members.map(member => { - return ( - - - - - ); - })} - -
{member} - -
+ this.removeEntry} + /> ); } - removeEntry = (membername: string) => { - const newMembers = this.props.members.filter(name => name !== membername); - this.props.memberListChanged(newMembers); + removeEntry = (member: string[]) => { + this.props.memberListChanged(member); }; } diff --git a/scm-ui-components/packages/ui-components/src/index.js b/scm-ui-components/packages/ui-components/src/index.js index 1745dd8576..d872eadc49 100644 --- a/scm-ui-components/packages/ui-components/src/index.js +++ b/scm-ui-components/packages/ui-components/src/index.js @@ -24,6 +24,7 @@ export { default as ProtectedRoute } from "./ProtectedRoute.js"; export { default as Help } from "./Help"; export { default as HelpIcon } from "./HelpIcon"; export { default as Tag } from "./Tag"; +export { default as TagGroup } from "./TagGroup"; export { default as Tooltip } from "./Tooltip"; // TODO do we need this? getPageFromMatch is already exported by urls export { getPageFromMatch } from "./urls"; diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 98f0993552..f5036a16d2 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -36,7 +36,7 @@ $green: #00c79b; } .main { - min-height: calc(100vh - 260px); + min-height: calc(100vh - 300px); } // shown in top section when pageactions set