Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | 9x 9x 9x 9x 9x 9x 9x 9x 9x 20x 9x 18x 16x 16x 16x 16x 6x 6x 16x 6x 6x 16x 16x 25x 25x 10x 20x 15x 16x 25x 16x 16x 16x 16x 16x | /*
* Copyright 2021 Harness Inc. All rights reserved.
* Use of this source code is governed by the PolyForm Shield 1.0.0 license
* that can be found in the licenses directory at the root of this repository, also available at
* https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
*/
import React from 'react'
import { useParams } from 'react-router-dom'
import { Select as BPSelect, ItemRenderer, ItemListRenderer, IItemListRendererProps } from '@blueprintjs/select'
import { Button, Menu, Spinner } from '@blueprintjs/core'
import type { PipelineType, ProjectPathProps } from '@common/interfaces/RouteInterfaces'
import { useGetPipelineList, PMSPipelineSummaryResponse, PagePMSPipelineSummaryResponse } from 'services/pipeline-ng'
import { String } from 'framework/strings'
import css from './PipelineSelect.module.scss'
export interface PipelineSelectProps {
selectedPipeline?: string
onPipelineSelect(id: string): void
defaultSelect?: string
className?: string
}
const Select = BPSelect.ofType<PMSPipelineSummaryResponse>()
const itemRenderer: ItemRenderer<PMSPipelineSummaryResponse> = (item, props) => (
<Menu.Item key={item.identifier} text={item.name} active={props.modifiers.active} onClick={props.handleClick} />
)
export default function PipelineSelect(props: PipelineSelectProps): React.ReactElement {
const { accountId, projectIdentifier, orgIdentifier, module } = useParams<PipelineType<ProjectPathProps>>()
const [query, setQuery] = React.useState('')
const [data, setData] = React.useState<PagePMSPipelineSummaryResponse | undefined>()
const {
loading,
mutate: reloadPipelines,
cancel
} = useGetPipelineList({
queryParams: {
accountIdentifier: accountId,
projectIdentifier,
module,
orgIdentifier,
searchTerm: query,
size: 10
}
})
const fetchPipelines = React.useCallback(async () => {
cancel()
setData(await (await reloadPipelines({ filterType: 'PipelineSetup' })).data)
}, [reloadPipelines, cancel])
React.useEffect(() => {
cancel()
fetchPipelines()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [accountId, projectIdentifier, orgIdentifier, module, query])
function clearSelection(): void {
props.onPipelineSelect('')
}
const selectedValue = props.selectedPipeline
? (data?.content || []).find(item => item.identifier === props.selectedPipeline)
: null
const getMenuItem = (itemListProps: IItemListRendererProps<PMSPipelineSummaryResponse>) => {
Iif (loading) {
return <Spinner size={20} />
}
if (itemListProps.items.length > 0) {
return (
<React.Fragment>
{selectedValue ? <Menu.Item text="Clear Selection" icon="cross" onClick={clearSelection} /> : null}
{itemListProps.items.map((item, i) => itemListProps.renderItem(item, i))}
</React.Fragment>
)
}
return <Menu.Item text="No Results" disabled />
}
const itemListRender: ItemListRenderer<PMSPipelineSummaryResponse> = itemListProps => (
<Menu>{getMenuItem(itemListProps)}</Menu>
)
function handleSelect(item: PMSPipelineSummaryResponse): void {
props.onPipelineSelect(item.identifier || '')
}
const getSelectedItem = () => {
Iif (selectedValue) {
return selectedValue.name
}
return defaultSelect ? defaultSelect : <String stringID="pipelines" />
}
const { defaultSelect, className } = props
return (
<Select
items={data?.content || []}
itemRenderer={itemRenderer}
onItemSelect={handleSelect}
popoverProps={{ minimal: true, wrapperTagName: 'div', targetTagName: 'div' }}
activeItem={selectedValue}
resetOnQuery={false}
query={query}
onQueryChange={setQuery}
itemListRenderer={itemListRender}
className={className}
>
<Button className={css.main} rightIcon="chevron-down" data-testid="pipeline-select">
{getSelectedItem()}
</Button>
</Select>
)
}
|