// 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 {
Button,
Dropdown,
DropdownItem,
KebabToggle,
Modal,
ModalVariant
} from '@patternfly/react-core'
import {
AngleDoubleUpIcon,
BanIcon,
} from '@patternfly/react-icons'
import { dequeue, dequeue_ref, promote } from '../../api'
import { addDequeueError, addPromoteError } from '../../actions/adminActions'
import { addNotification } from '../../actions/notifications'
import { fetchStatusIfNeeded } from '../../actions/status'
import LineAngleImage from '../../images/line-angle.png'
import LineTImage from '../../images/line-t.png'
import ChangePanel from './ChangePanel'
class Change extends React.Component {
static propTypes = {
change: PropTypes.object.isRequired,
queue: PropTypes.object.isRequired,
expanded: PropTypes.bool.isRequired,
pipeline: PropTypes.object,
tenant: PropTypes.object,
user: PropTypes.object,
dispatch: PropTypes.func
}
state = {
showDequeueModal: false,
showPromoteModal: false,
showAdminActions: false,
}
dequeueConfirm = () => {
const { tenant, change, pipeline } = this.props
let projectName = change.project
let changeId = change.id || 'N/A'
let changeRef = change.ref
this.setState(() => ({ showDequeueModal: false }))
// post-merge
if (/^[0-9a-f]{40}$/.test(changeId)) {
dequeue_ref(tenant.apiPrefix, projectName, pipeline.name, changeRef)
.then(() => {
this.props.dispatch(fetchStatusIfNeeded(tenant))
})
.catch(error => {
this.props.dispatch(addDequeueError(error))
})
// pre-merge, ie we have a change id
} else if (changeId !== 'N/A') {
dequeue(tenant.apiPrefix, projectName, pipeline.name, changeId)
.then(() => {
this.props.dispatch(fetchStatusIfNeeded(tenant))
})
.catch(error => {
this.props.dispatch(addDequeueError(error))
})
} else {
this.props.dispatch(addNotification({
url: null,
status: 'Invalid change ' + changeRef + ' on project ' + projectName,
text: '',
type: 'error',
}))
}
}
dequeueCancel = () => {
this.setState(() => ({ showDequeueModal: false }))
}
renderDequeueModal() {
const { showDequeueModal } = this.state
const { change } = this.props
let projectName = change.project
let changeId = change.id || change.ref
const title = 'You are about to dequeue a change'
return (
Confirm,
,
]}>
Please confirm that you want to cancel all ongoing builds on change {changeId} for project {projectName}.