// Copyright 2018 Red Hat, Inc // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. import * as React from 'react' import PropTypes from 'prop-types' import { connect } from 'react-redux' import { Link } from 'react-router-dom' import { Flex, FlexItem, List, ListItem, Title, } from '@patternfly/react-core' import { BookIcon, BuildIcon, CodeBranchIcon, CodeIcon, CubeIcon, FileCodeIcon, FingerprintIcon, HistoryIcon, OutlinedCalendarAltIcon, OutlinedClockIcon, StreamIcon, } from '@patternfly/react-icons' import * as moment from 'moment' import 'moment-duration-format' import { BuildResultBadge, BuildResultWithIcon, IconProperty } from './Misc' import { ExternalLink } from '../../Misc' function Build(props) { const { build, tenant, timezone, fetchable } = props return ( <> <BuildResultWithIcon result={build.result} colored={build.voting} size="md" > {build.job_name} {!build.voting && ' (non-voting)'} </BuildResultWithIcon> <BuildResultBadge result={build.result} /> {fetchable} {/* We handle the spacing for the body and the flex items by ourselves so they go hand in hand. By default, the flex items' spacing only affects left/right margin, but not top or bottom (which looks awkward when the items are stacked at certain breakpoints) */} {/* TODO (felix): What should we show for periodic builds here? They don't provide a change, but the ref_url is also not usable */} {build.change && ( } value={ Change {build.change},{build.patchset} } /> )} {/* TODO (felix): Link to project page in Zuul */} } value={ <> Project {build.project} } /> } value={ <> Branch {build.branch} } /> } value={ <> Pipeline {build.pipeline} } /> } value={ UUID {build.uuid}
Event ID {build.event_id}
} />
} value={ Started at {moment .utc(build.start_time) .tz(timezone) .format('YYYY-MM-DD HH:mm:ss')}
Completed at {moment .utc(build.end_time) .tz(timezone) .format('YYYY-MM-DD HH:mm:ss')}
} /> } value={ <> Took {moment .duration(build.duration, 'seconds') .format('h [hr] m [min] s [sec]')} } />
} value={ View job documentation } /> } value={ View buildset result } /> )} } value={ build.log_url ? ( View log ) : ( No log available ) } />
) } Build.propTypes = { build: PropTypes.object, tenant: PropTypes.object, hash: PropTypes.array, timezone: PropTypes.string, fetchable: PropTypes.node, } export default connect((state) => ({ tenant: state.tenant, timezone: state.timezone, }))(Build)