argo-cd
55 строк · 2.3 Кб
1import {DataLoader, DropDown} from 'argo-ui';
2import * as React from 'react';
3
4import {Context} from '../../../shared/context';
5import {services} from '../../../shared/services';
6
7export const ApplicationsDetailsAppDropdown = (props: {appName: string}) => {
8const [opened, setOpened] = React.useState(false);
9const [appFilter, setAppFilter] = React.useState('');
10const ctx = React.useContext(Context);
11return (
12<DropDown
13onOpenStateChange={setOpened}
14isMenu={true}
15anchor={() => (
16<>
17<i className='fa fa-search' /> <span>{props.appName}</span>
18</>
19)}>
20{opened && (
21<ul>
22<li>
23<input
24className='argo-field'
25value={appFilter}
26onChange={e => setAppFilter(e.target.value)}
27ref={el =>
28el &&
29setTimeout(() => {
30if (el) {
31el.focus();
32}
33}, 100)
34}
35/>
36</li>
37<DataLoader load={() => services.applications.list([], {fields: ['items.metadata.name']})}>
38{apps =>
39apps.items
40.filter(app => {
41return appFilter.length === 0 || app.metadata.name.toLowerCase().includes(appFilter.toLowerCase());
42})
43.slice(0, 100) // take top 100 results after filtering to avoid performance issues
44.map(app => (
45<li key={app.metadata.name} onClick={() => ctx.navigation.goto(`/applications/${app.metadata.name}`)}>
46{app.metadata.name} {app.metadata.name === props.appName && ' (current)'}
47</li>
48))
49}
50</DataLoader>
51</ul>
52)}
53</DropDown>
54);
55};
56