argo-cd
83 строки · 3.6 Кб
1import * as React from 'react';
2import {FormApi} from 'react-form';
3
4import {AutocompleteField, DataLoader, DropDownMenu, FormField} from 'argo-ui';
5import {RevisionHelpIcon} from '../../../shared/components';
6import {services} from '../../../shared/services';
7
8interface RevisionFormFieldProps {
9formApi: FormApi;
10helpIconTop?: string;
11hideLabel?: boolean;
12repoURL: string;
13}
14
15export class RevisionFormField extends React.PureComponent<RevisionFormFieldProps, {filterType: string}> {
16constructor(props: RevisionFormFieldProps) {
17super(props);
18this.state = {filterType: 'Branches'};
19}
20
21public setFilter(newValue: string) {
22this.setState({filterType: newValue});
23}
24
25public render() {
26const selectedFilter = this.state.filterType;
27const extraPadding = this.props.hideLabel ? '0em' : '1.53em';
28const rowClass = this.props.hideLabel ? '' : ' argo-form-row';
29return (
30<div className={'row' + rowClass}>
31<div className='columns small-10'>
32<React.Fragment>
33<DataLoader
34input={{repoURL: this.props.repoURL, filterType: selectedFilter}}
35load={async (src: any): Promise<string[]> => {
36if (src.repoURL) {
37return services.repos
38.revisions(src.repoURL)
39.then(revisionsRes =>
40['HEAD']
41.concat(selectedFilter === 'Branches' ? revisionsRes.branches || [] : [])
42.concat(selectedFilter === 'Tags' ? revisionsRes.tags || [] : [])
43)
44.catch(() => []);
45}
46return [];
47}}>
48{(revisions: string[]) => (
49<FormField
50formApi={this.props.formApi}
51label={this.props.hideLabel ? undefined : 'Revision'}
52field='spec.source.targetRevision'
53component={AutocompleteField}
54componentProps={{
55items: revisions,
56filterSuggestions: true
57}}
58/>
59)}
60</DataLoader>
61<RevisionHelpIcon type='git' top={this.props.helpIconTop} right='0em' />
62</React.Fragment>
63</div>
64<div style={{paddingTop: extraPadding}} className='columns small-2'>
65<DropDownMenu
66anchor={() => (
67<p>
68{this.state.filterType} <i className='fa fa-caret-down' />
69</p>
70)}
71qeId='application-create-dropdown-revision'
72items={['Branches', 'Tags'].map((type: 'Branches' | 'Tags') => ({
73title: type,
74action: () => {
75this.setFilter(type);
76}
77}))}
78/>
79</div>
80</div>
81);
82}
83}
84