X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/38d27e9783f7f760cee84cc225e86144069848c4..1d6706fd7ae3f1c69508b1c25afccd85f6362e34:/src/views-components/sharing-dialog/participant-select.tsx diff --git a/src/views-components/sharing-dialog/participant-select.tsx b/src/views-components/sharing-dialog/participant-select.tsx index 402faa7f..058d7234 100644 --- a/src/views-components/sharing-dialog/participant-select.tsx +++ b/src/views-components/sharing-dialog/participant-select.tsx @@ -11,12 +11,13 @@ import { debounce } from 'debounce'; import { ListItemText, Typography } from '@material-ui/core'; import { noop } from 'lodash/fp'; import { GroupClass, GroupResource } from 'models/group'; -import { getUserDisplayName, UserResource } from 'models/user'; +import { getUserDetailsString, getUserDisplayName, UserResource } from 'models/user'; import { Resource, ResourceKind } from 'models/resource'; import { ListResults } from 'services/common-service/common-service'; export interface Participant { name: string; + tooltip: string; uuid: string; } @@ -24,9 +25,12 @@ type ParticipantResource = GroupResource | UserResource; interface ParticipantSelectProps { items: Participant[]; + excludedParticipants?: string[]; label?: string; autofocus?: boolean; onlyPeople?: boolean; + onlyActive?: boolean; + disabled?: boolean; onBlur?: (event: React.FocusEvent) => void; onFocus?: (event: React.FocusEvent) => void; @@ -40,12 +44,23 @@ interface ParticipantSelectState { suggestions: ParticipantResource[]; } -const getDisplayName = (item: GroupResource | UserResource) => { +const getDisplayName = (item: GroupResource | UserResource, detailed: boolean) => { switch (item.kind) { case ResourceKind.USER: - return getUserDisplayName(item, true); + return getUserDisplayName(item, detailed, detailed); case ResourceKind.GROUP: - return item.name; + return item.name + `(${`(${(item as Resource).uuid})`})`; + default: + return (item as Resource).uuid; + } +}; + +const getDisplayTooltip = (item: GroupResource | UserResource) => { + switch (item.kind) { + case ResourceKind.USER: + return getUserDetailsString(item); + case ResourceKind.GROUP: + return item.name + `(${`(${(item as Resource).uuid})`})`; default: return (item as Resource).uuid; } @@ -59,7 +74,7 @@ export const ParticipantSelect = connect()( }; render() { - const { label = 'Share' } = this.props; + const { label = 'Add people and groups' } = this.props; return ( + renderChipTooltip={this.renderChipTooltip} + renderSuggestion={this.renderSuggestion} + disabled={this.props.disabled} /> ); } + onBlur = (e) => { + if (this.props.onBlur) { + this.props.onBlur(e); + } + setTimeout(() => this.setState({ value: '', suggestions: [] }), 200); + } + renderChipValue(chipValue: Participant) { const { name, uuid } = chipValue; return name || uuid; } + renderChipTooltip(item: Participant) { + return item.tooltip; + } + renderSuggestion(item: ParticipantResource) { return ( - {getDisplayName(item)} + {getDisplayName(item, true)} ); } @@ -103,6 +131,7 @@ export const ParticipantSelect = connect()( this.setState({ value: '', suggestions: [] }); onCreate({ name: '', + tooltip: '', uuid: this.state.value, }); } @@ -113,7 +142,8 @@ export const ParticipantSelect = connect()( const { onSelect = noop } = this.props; this.setState({ value: '', suggestions: [] }); onSelect({ - name: getDisplayName(selection), + name: getDisplayName(selection, false), + tooltip: getDisplayTooltip(selection), uuid, }); } @@ -130,11 +160,14 @@ export const ParticipantSelect = connect()( const filterUsers = new FilterBuilder() .addILike('any', value) + .addEqual('is_active', this.props.onlyActive || undefined) + .addNotIn('uuid', this.props.excludedParticipants) .getFilters(); const userItems: ListResults = await userService.list({ filters: filterUsers, limit, count: "none" }); const filterGroups = new FilterBuilder() .addNotIn('group_class', [GroupClass.PROJECT, GroupClass.FILTER]) + .addNotIn('uuid', this.props.excludedParticipants) .addILike('name', value) .getFilters();