packages/issue-dashboard-widgets/widgets/youtrack-activities-widget/app/edit-form-youtrack-selector.js (77 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 ServiceResources from '@jetbrains/hub-widget-ui/dist/service-resources';
import '@jetbrains/ring-ui/components/form/form.scss';
import filter from './activities-filter';
import './style/activities-widget.css';
const MIN_YOUTRACK_VERSION = '2019.1';
class EditFormYoutrackSelector extends React.Component {
static propTypes = {
dashboardApi: PropTypes.object,
onChangeAsync: PropTypes.func
};
constructor(props) {
super(props);
const youTrack = filter.youTrackId && {
id: filter.youTrackId,
homeUrl: filter.youTrackUrl
};
this.state = {
availableYouTracks: youTrack ? [youTrack] : [],
selectedYouTrack: youTrack,
isLoading: false,
errorMessage: null
};
}
componentDidMount() {
this.loadYouTrackList();
}
setFormLoaderEnabled(isLoading) {
this.setState({isLoading});
}
async loadYouTrackList() {
const youtracks = await ServiceResources.getYouTrackServices(
this.props.dashboardApi, MIN_YOUTRACK_VERSION
);
this.setState({
availableYouTracks: youtracks
});
}
async onAfterYouTrackChanged() {
this.setFormLoaderEnabled(true);
if (this.state.selectedYouTrack) {
await this.props.onChangeAsync(this.state.selectedYouTrack);
}
this.setFormLoaderEnabled(false);
}
changeYouTrack = selected => {
this.setState({
selectedYouTrack: selected.model,
errorMessage: ''
}, () => this.onAfterYouTrackChanged());
};
render() {
const {availableYouTracks} = this.state;
const selectedYouTrack = (availableYouTracks || []).filter(
youTrack => youTrack.id === filter.youTrackId
)[0];
const toSelectOption = service => service && {
key: service.id,
label: service.name,
description: service.homeUrl,
model: service
};
return (
availableYouTracks.length > 1 &&
(
<Select
size={InputSize.FULL}
type={Select.Type.BUTTON}
data={availableYouTracks.map(toSelectOption)}
selected={toSelectOption(selectedYouTrack)}
onSelect={this.changeYouTrack}
filter
label={i18n('Select YouTrack')}
/>
)
);
}
}
export default EditFormYoutrackSelector;