- Modified the objectData prop in DeployJob to spread the properties from objectFormState, ensuring all relevant data is passed for deployment actions.
258 lines
8.2 KiB
JavaScript
258 lines
8.2 KiB
JavaScript
import { useRef, useState } from 'react'
|
|
import { useLocation } from 'react-router-dom'
|
|
import { Card, Flex, Modal, Space } from 'antd'
|
|
import { LoadingOutlined } from '@ant-design/icons'
|
|
import loglevel from 'loglevel'
|
|
import config from '../../../../config.js'
|
|
import useCollapseState from '../../hooks/useCollapseState.jsx'
|
|
import NotesPanel from '../../common/NotesPanel.jsx'
|
|
import InfoCollapse from '../../common/InfoCollapse.jsx'
|
|
import ObjectInfo from '../../common/ObjectInfo.jsx'
|
|
import ViewButton from '../../common/ViewButton.jsx'
|
|
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
|
|
import NoteIcon from '../../../Icons/NoteIcon.jsx'
|
|
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
|
|
import ObjectForm from '../../common/ObjectForm.jsx'
|
|
import EditButtons from '../../common/EditButtons.jsx'
|
|
import ActivityIndicator from '../../common/ActivityIndicator.jsx'
|
|
import ActionHandler from '../../common/ActionHandler.jsx'
|
|
import ObjectActions from '../../common/ObjectActions.jsx'
|
|
import ObjectTable from '../../common/ObjectTable.jsx'
|
|
import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
|
|
import JobIcon from '../../../Icons/JobIcon.jsx'
|
|
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
|
|
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
|
|
import DeployJob from './DeployJob.jsx'
|
|
import ScrollBox from '../../common/ScrollBox.jsx'
|
|
import { getModelByName } from '../../../../database/ObjectModels.js'
|
|
|
|
const log = loglevel.getLogger('JobInfo')
|
|
log.setLevel(config.logLevel)
|
|
|
|
const JobInfo = () => {
|
|
const location = useLocation()
|
|
const objectFormRef = useRef(null)
|
|
const actionHandlerRef = useRef(null)
|
|
const jobId = new URLSearchParams(location.search).get('jobId')
|
|
|
|
const [deployJobOpen, setDeployJobOpen] = useState(false)
|
|
const [collapseState, updateCollapseState] = useCollapseState('JobInfo', {
|
|
info: true,
|
|
subJobs: true,
|
|
notes: true,
|
|
auditLogs: false
|
|
})
|
|
|
|
const [objectFormState, setEditFormState] = useState({
|
|
isEditing: false,
|
|
editLoading: false,
|
|
formValid: false,
|
|
activities: [],
|
|
loading: false,
|
|
objectData: {
|
|
_id: jobId
|
|
}
|
|
})
|
|
|
|
const editDisabled =
|
|
getModelByName('job')
|
|
?.actions?.find((action) => action.name === 'edit')
|
|
?.disabled(objectFormState.objectData) ?? false
|
|
|
|
const actions = {
|
|
edit: () => {
|
|
objectFormRef?.current.startEditing()
|
|
return false
|
|
},
|
|
cancelEdit: () => {
|
|
objectFormRef?.current.cancelEditing()
|
|
return true
|
|
},
|
|
finishEdit: () => {
|
|
objectFormRef?.current.handleUpdate()
|
|
return true
|
|
},
|
|
deploy: () => {
|
|
setDeployJobOpen(true)
|
|
return false
|
|
}
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Flex
|
|
gap='large'
|
|
vertical='true'
|
|
style={{
|
|
maxHeight: '100%',
|
|
minHeight: 0
|
|
}}
|
|
>
|
|
<Flex justify={'space-between'}>
|
|
<Space size='small'>
|
|
<Space size='small'>
|
|
<ObjectActions
|
|
type='job'
|
|
id={jobId}
|
|
disabled={objectFormState.loading}
|
|
objectData={objectFormState.objectData}
|
|
/>
|
|
<ViewButton
|
|
disabled={objectFormState.loading}
|
|
items={[
|
|
{ key: 'info', label: 'Job Information' },
|
|
{ key: 'subJobs', label: 'Sub Jobs' },
|
|
{ key: 'notes', label: 'Notes' },
|
|
{ key: 'auditLogs', label: 'Audit Logs' }
|
|
]}
|
|
visibleState={collapseState}
|
|
updateVisibleState={updateCollapseState}
|
|
/>
|
|
<UserNotifierToggle
|
|
type='job'
|
|
objectData={objectFormState.objectData}
|
|
disabled={objectFormState.loading}
|
|
/>
|
|
<DocumentPrintButton
|
|
type='job'
|
|
objectData={objectFormState.objectData}
|
|
disabled={objectFormState.loading}
|
|
/>
|
|
</Space>
|
|
<ActivityIndicator
|
|
activities={objectFormState.activities}
|
|
showStartingDivider={true}
|
|
/>
|
|
</Space>
|
|
<Space>
|
|
<EditButtons
|
|
isEditing={objectFormState.isEditing}
|
|
handleUpdate={() => {
|
|
actionHandlerRef.current.callAction('finishEdit')
|
|
}}
|
|
cancelEditing={() => {
|
|
actionHandlerRef.current.callAction('cancelEdit')
|
|
}}
|
|
startEditing={() => {
|
|
actionHandlerRef.current.callAction('edit')
|
|
}}
|
|
editLoading={objectFormState.editLoading}
|
|
formValid={objectFormState.formValid}
|
|
disabled={
|
|
objectFormState.beingEditedByOther ||
|
|
objectFormState.loading ||
|
|
editDisabled
|
|
}
|
|
loading={objectFormState.editLoading}
|
|
/>
|
|
</Space>
|
|
</Flex>
|
|
|
|
<ScrollBox>
|
|
<Flex vertical gap={'large'}>
|
|
<ActionHandler
|
|
actions={actions}
|
|
loading={objectFormState.loading}
|
|
ref={actionHandlerRef}
|
|
>
|
|
<InfoCollapse
|
|
title='Job Information'
|
|
icon={<InfoCircleIcon />}
|
|
active={collapseState.info}
|
|
onToggle={(expanded) => updateCollapseState('info', expanded)}
|
|
collapseKey='info'
|
|
>
|
|
<ObjectForm
|
|
id={jobId}
|
|
type='job'
|
|
style={{ height: '100%' }}
|
|
ref={objectFormRef}
|
|
onStateChange={(state) => {
|
|
setEditFormState((prev) => ({ ...prev, ...state }))
|
|
}}
|
|
>
|
|
{({ loading, isEditing, objectData }) => (
|
|
<ObjectInfo
|
|
loading={loading}
|
|
indicator={<LoadingOutlined />}
|
|
isEditing={isEditing}
|
|
type='job'
|
|
objectData={objectData}
|
|
/>
|
|
)}
|
|
</ObjectForm>
|
|
</InfoCollapse>
|
|
</ActionHandler>
|
|
|
|
<InfoCollapse
|
|
title='Sub Jobs'
|
|
icon={<JobIcon />}
|
|
active={collapseState.subJobs}
|
|
onToggle={(expanded) => updateCollapseState('subJobs', expanded)}
|
|
collapseKey='subJobs'
|
|
>
|
|
<ObjectTable
|
|
type='subJob'
|
|
masterFilter={{ 'job._id': jobId }}
|
|
visibleColumns={{ 'job._id': false }}
|
|
/>
|
|
</InfoCollapse>
|
|
|
|
<InfoCollapse
|
|
title='Notes'
|
|
icon={<NoteIcon />}
|
|
active={collapseState.notes}
|
|
onToggle={(expanded) => updateCollapseState('notes', expanded)}
|
|
collapseKey='notes'
|
|
>
|
|
<Card>
|
|
<NotesPanel _id={jobId} type='job' />
|
|
</Card>
|
|
</InfoCollapse>
|
|
|
|
<InfoCollapse
|
|
title='Audit Logs'
|
|
icon={<AuditLogIcon />}
|
|
active={collapseState.auditLogs}
|
|
onToggle={(expanded) =>
|
|
updateCollapseState('auditLogs', expanded)
|
|
}
|
|
collapseKey='auditLogs'
|
|
>
|
|
{objectFormState.loading ? (
|
|
<InfoCollapsePlaceholder />
|
|
) : (
|
|
<ObjectTable
|
|
type='auditLog'
|
|
masterFilter={{ 'parent._id': jobId }}
|
|
visibleColumns={{ _id: false, 'parent._id': false }}
|
|
/>
|
|
)}
|
|
</InfoCollapse>
|
|
</Flex>
|
|
</ScrollBox>
|
|
</Flex>
|
|
<Modal
|
|
destroyOnHidden
|
|
footer={null}
|
|
open={deployJobOpen}
|
|
width={700}
|
|
onCancel={() => {
|
|
actionHandlerRef.current.clearAction()
|
|
setDeployJobOpen(false)
|
|
}}
|
|
>
|
|
<DeployJob
|
|
objectData={{ ...objectFormState.objectData }}
|
|
onOk={() => {
|
|
actionHandlerRef.current.clearAction()
|
|
setDeployJobOpen(false)
|
|
}}
|
|
/>
|
|
</Modal>
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default JobInfo
|