packages/issue-dashboard-widgets/widgets/youtrack-activities-widget/app/edit-form-user-selector.js (78 lines of code) (raw):
import React from 'react';
import PropTypes from 'prop-types';
import {Size as InputSize} from '@jetbrains/ring-ui/components/input/input';
import Select from '@jetbrains/ring-ui/components/select/select';
import {i18n} from 'hub-dashboard-addons/dist/localization';
import '@jetbrains/ring-ui/components/form/form.scss';
import filter from './activities-filter';
import './style/activities-widget.css';
import {queryUsers} from './resources';
const toSelectOption = user => user && {
key: user.id,
label: user.name,
avatar: user.avatarURL,
model: user
};
class EditFormUserSelector extends React.Component {
static propTypes = {
dashboardApi: PropTypes.object,
onChange: PropTypes.func
};
constructor(props) {
super(props);
const selected = toSelectOption(filter.author);
const options = (selected ? [selected] : []);
this.state = {
availableAuthors: options,
selectedAuthor: selected,
request: null
};
}
changeAuthor = selected => {
this.setState({selectedAuthor: selected});
this.props.onChange(selected && selected.model);
};
queryUsers = async q => {
const fetchHub = this.props.dashboardApi.fetchHub;
const usersDataRequest = queryUsers(fetchHub, q);
this.setState({request: usersDataRequest});
const usersData = await usersDataRequest;
// only the latest request is relevant
if (this.state.request === usersDataRequest) {
const users = (usersData.users || []).map(it => {
if (it.profile && it.profile.avatar && it.profile.avatar.url) {
it.avatarURL = it.profile.avatar.url;
} else {
it.avatarURL = null;
}
return it;
});
this.setState({
availableAuthors: users.map(toSelectOption),
request: null
});
}
};
render() {
return (
<div className="aw__user-selector">
<div className="aw__user-selector__title">
{i18n('Change authors')}
</div>
<Select
className="aw__user-selector__form-select"
size={InputSize.S}
multiple={false}
data={this.state.availableAuthors}
filter={{
placeholder: 'Search user',
fn: () => true // disable client filtering
}}
onFilter={this.queryUsers}
selected={this.state.selectedAuthor}
onChange={this.changeAuthor}
loading={!!this.state.request}
clear
onOpen={this.queryUsers}
label={i18n('Any user')}
/>
</div>
);
}
}
export default EditFormUserSelector;