import { cloneDeep } from 'lodash'; import React from 'react'; import type { Option } from 'react-select'; import { ArtifactEditor } from '../ArtifactEditor'; import { ArtifactTypePatterns } from '../../../../../artifact/ArtifactTypes'; import { IgorService } from '../../../../../ci'; import type { IArtifactEditorProps, IArtifactKindConfig, IBuild } from '../../../../../domain'; import { TetheredSelect } from '../../../../../presentation'; import { singleFieldArtifactEditor } from '../singleFieldArtifactEditor'; import { StageConfigField } from '../../../stages/common'; import { SpelText } from '../../../../../widgets/spelText/SpelText'; const TYPE = 'jenkins/file'; export const JenkinsMatch: IArtifactKindConfig = { label: 'Jenkins', typePattern: ArtifactTypePatterns.JENKINS_FILE, type: TYPE, isDefault: false, isMatch: true, description: 'A Jenkins artifact file.', key: 'default.jenkins', editCmp: singleFieldArtifactEditor('reference', TYPE, 'Relative path', 'pathFromWorkspaceRoot/file.ext', ''), }; export const JenkinsDefault: IArtifactKindConfig = { label: 'Jenkins', typePattern: ArtifactTypePatterns.JENKINS_FILE, type: TYPE, isDefault: true, isMatch: false, description: 'A Jenkins artifact file.', key: 'default.jenkins', editCmp: class extends ArtifactEditor { constructor(props: IArtifactEditorProps) { super(props, TYPE); this.state = { jobs: [], buildNumbers: [], }; } public componentDidMount() { IgorService.listJobsForMaster(this.props.account.name).then((jobs: string[]) => { this.setState({ jobs }); }); } private onReferenceChange = (reference: string) => { const clonedArtifact = cloneDeep(this.props.artifact); clonedArtifact.reference = reference; this.props.onChange(clonedArtifact); }; private onNameChange = (name: string) => { const clonedArtifact = cloneDeep(this.props.artifact); clonedArtifact.name = name; this.props.onChange(clonedArtifact); IgorService.listBuildsForJob(this.props.account.name, name).then( (allBuilds: IBuild[]) => { const buildNumbers = allBuilds .filter((build) => !build.building && build.result === 'SUCCESS') .sort((a, b) => b.number - a.number) .map((b) => b.number); this.setState({ buildNumbers }); }, () => { this.setState({ buildNumbers: [] }); }, ); }; public render() { const { buildNumbers, jobs } = this.state; const { artifact } = this.props; const buildOptions = buildNumbers.map((b: string) => ({ label: b, value: b })); buildOptions.splice(0, 0, { label: 'lastSuccessfulBuild', value: 'lastSuccessfulBuild' }); const jobOptions = jobs.map((j: string) => ({ label: j, value: j })); return ( <> this.onNameChange(option.value as string)} value={artifact.name} clearable={false} /> this.onVersionChange(option.value as string)} value={artifact.version} clearable={false} /> ); } }, };