|
| 1 | +/* |
| 2 | + * Copyright OpenSearch Contributors |
| 3 | + * SPDX-License-Identifier: Apache-2.0 |
| 4 | + */ |
| 5 | + |
| 6 | +import React, { useState } from 'react'; |
| 7 | +import { |
| 8 | + EuiFlexItem, |
| 9 | + EuiFlyout, |
| 10 | + EuiFlyoutBody, |
| 11 | + EuiFlyoutHeader, |
| 12 | + EuiTab, |
| 13 | + EuiTabs, |
| 14 | + EuiTitle, |
| 15 | +} from '@elastic/eui'; |
| 16 | +import { |
| 17 | + WORKFLOW_RESOURCE_TYPE, |
| 18 | + WorkflowResource, |
| 19 | +} from '../../../../../common'; |
| 20 | +import { ResourceFlyoutContent } from './resource_flyout_content'; |
| 21 | +import { get } from 'lodash'; |
| 22 | + |
| 23 | +interface ResourcesFlyoutProps { |
| 24 | + resources: WorkflowResource[]; |
| 25 | + resourceDetails: string[]; |
| 26 | + onClose: () => void; |
| 27 | + errorMessage?: string; |
| 28 | +} |
| 29 | + |
| 30 | +/** |
| 31 | + * A simple flyout to display details for multiple workflow resources nested |
| 32 | + * under tabs. |
| 33 | + */ |
| 34 | +export function ResourcesFlyout(props: ResourcesFlyoutProps) { |
| 35 | + const [selectedResourceIdx, setSelectedResourceIdx] = useState<number>(0); |
| 36 | + const [selectedTabId, setSelectedTabId] = useState<string>( |
| 37 | + get(props, `resources.${selectedResourceIdx}.id`) |
| 38 | + ); |
| 39 | + const selectedResource = get( |
| 40 | + props, |
| 41 | + `resources.${selectedResourceIdx}`, |
| 42 | + undefined |
| 43 | + ) as WorkflowResource | undefined; |
| 44 | + const selectedResourceDetails = get( |
| 45 | + props, |
| 46 | + `resourceDetails.${selectedResourceIdx}`, |
| 47 | + undefined |
| 48 | + ) as string | undefined; |
| 49 | + |
| 50 | + return ( |
| 51 | + <EuiFlyout onClose={props.onClose}> |
| 52 | + <EuiFlyoutHeader> |
| 53 | + <EuiTitle> |
| 54 | + <h2>Resource details</h2> |
| 55 | + </EuiTitle> |
| 56 | + </EuiFlyoutHeader> |
| 57 | + <EuiFlyoutBody> |
| 58 | + <EuiFlexItem grow={false}> |
| 59 | + <EuiTabs size="s" expand={false}> |
| 60 | + {props.resources?.map((tab, idx) => { |
| 61 | + return ( |
| 62 | + <EuiTab |
| 63 | + onClick={() => { |
| 64 | + setSelectedTabId(tab.id); |
| 65 | + setSelectedResourceIdx(idx); |
| 66 | + }} |
| 67 | + isSelected={tab.id === selectedTabId} |
| 68 | + disabled={false} |
| 69 | + key={idx} |
| 70 | + > |
| 71 | + {tab?.type === WORKFLOW_RESOURCE_TYPE.INDEX_NAME |
| 72 | + ? 'Index' |
| 73 | + : 'Pipeline'} |
| 74 | + </EuiTab> |
| 75 | + ); |
| 76 | + })} |
| 77 | + </EuiTabs> |
| 78 | + </EuiFlexItem> |
| 79 | + {selectedResource !== undefined && |
| 80 | + selectedResourceDetails !== undefined && ( |
| 81 | + <ResourceFlyoutContent |
| 82 | + resource={selectedResource} |
| 83 | + resourceDetails={selectedResourceDetails} |
| 84 | + errorMessage={props.errorMessage} |
| 85 | + /> |
| 86 | + )} |
| 87 | + </EuiFlyoutBody> |
| 88 | + </EuiFlyout> |
| 89 | + ); |
| 90 | +} |
0 commit comments