From d1b5a60bb97d43321ead06ff39181c18e8fb81e0 Mon Sep 17 00:00:00 2001 From: Marliana Lara Date: Wed, 1 Apr 2020 16:11:09 -0400 Subject: [PATCH] Add project node details --- .../components/PromptDetail/PromptDetail.jsx | 36 ++++++- .../PromptDetail/PromptDetail.test.jsx | 2 + .../PromptDetail/PromptProjectDetail.jsx | 93 +++++++++++++++++++ .../Modals/NodeModals/NodeViewModal.jsx | 25 ++--- .../Modals/NodeModals/NodeViewModal.test.jsx | 6 ++ 5 files changed, 141 insertions(+), 21 deletions(-) create mode 100644 awx/ui_next/src/components/PromptDetail/PromptProjectDetail.jsx diff --git a/awx/ui_next/src/components/PromptDetail/PromptDetail.jsx b/awx/ui_next/src/components/PromptDetail/PromptDetail.jsx index 4e013c87f2..e0df62172a 100644 --- a/awx/ui_next/src/components/PromptDetail/PromptDetail.jsx +++ b/awx/ui_next/src/components/PromptDetail/PromptDetail.jsx @@ -2,10 +2,14 @@ import React from 'react'; import { shape } from 'prop-types'; import { withI18n } from '@lingui/react'; import { t, Trans } from '@lingui/macro'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components'; + import { Chip, ChipGroup } from '@patternfly/react-core'; import { VariablesDetail } from '@components/CodeMirrorInput'; -import { DetailList, Detail } from '@components/DetailList'; -import styled from 'styled-components'; +import { DetailList, Detail, UserDateDetail } from '@components/DetailList'; + +import PromptProjectDetail from './PromptProjectDetail'; const PromptHeader = styled.h2` font-weight: bold; @@ -63,6 +67,34 @@ function PromptDetail({ i18n, resource, launchConfig = {} }) { label={i18n._(t`Timeout`)} value={formatTimeout(resource?.timeout)} /> + {resource?.summary_fields?.organization && ( + + {resource?.summary_fields?.organization.name} + + } + /> + )} + + {/* TODO: Add JT, WFJT, Inventory Source Details */} + {resource?.type === 'project' && ( + + )} + + + {hasPromptData(launchConfig) && ( diff --git a/awx/ui_next/src/components/PromptDetail/PromptDetail.test.jsx b/awx/ui_next/src/components/PromptDetail/PromptDetail.test.jsx index 5e7285b08d..e170bc996c 100644 --- a/awx/ui_next/src/components/PromptDetail/PromptDetail.test.jsx +++ b/awx/ui_next/src/components/PromptDetail/PromptDetail.test.jsx @@ -7,6 +7,8 @@ const mockTemplate = { name: 'Mock Template', description: 'mock description', unified_job_type: 'job', + created: '2019-08-08T19:24:05.344276Z', + modified: '2019-08-08T19:24:18.162949Z', }; const mockPromptLaunch = { diff --git a/awx/ui_next/src/components/PromptDetail/PromptProjectDetail.jsx b/awx/ui_next/src/components/PromptDetail/PromptProjectDetail.jsx new file mode 100644 index 0000000000..d0b2a5774a --- /dev/null +++ b/awx/ui_next/src/components/PromptDetail/PromptProjectDetail.jsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { withI18n } from '@lingui/react'; +import { t } from '@lingui/macro'; +import { Config } from '@contexts/Config'; +import { List, ListItem } from '@patternfly/react-core'; + +import { Detail } from '@components/DetailList'; +import CredentialChip from '@components/CredentialChip'; +import { toTitleCase } from '@util/strings'; + +function PromptProjectDetail({ i18n, resource }) { + const { + allow_override, + custom_virtualenv, + local_path, + scm_branch, + scm_clean, + scm_delete_on_update, + scm_refspec, + scm_type, + scm_update_on_launch, + scm_update_cache_timeout, + scm_url, + summary_fields, + } = resource; + + let optionsList = ''; + if ( + scm_clean || + scm_delete_on_update || + scm_update_on_launch || + allow_override + ) { + optionsList = ( + + {scm_clean && {i18n._(t`Clean`)}} + {scm_delete_on_update && ( + {i18n._(t`Delete on Update`)} + )} + {scm_update_on_launch && ( + {i18n._(t`Update Revision on Launch`)} + )} + {allow_override && ( + {i18n._(t`Allow Branch Override`)} + )} + + ); + } + + return ( + <> + + + + + {summary_fields?.credential?.id && ( + + } + /> + )} + {optionsList && } + + + + {({ project_base_dir }) => ( + + )} + + + + ); +} + +export default withI18n()(PromptProjectDetail); diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.jsx index d233adc03c..7ca5f4cf63 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.jsx @@ -20,38 +20,25 @@ import { function getNodeType(node) { const ujtType = node.type || node.unified_job_type; - - let nodeType; - let nodeAPI; switch (ujtType) { case 'job_template': case 'job': - nodeType = 'job_template'; - nodeAPI = JobTemplatesAPI; - break; + return ['job_template', JobTemplatesAPI]; case 'project': case 'project_update': - nodeType = 'project_sync'; - nodeAPI = ProjectsAPI; - break; + return ['project_sync', ProjectsAPI]; case 'inventory_source': case 'inventory_update': - nodeType = 'inventory_source_sync'; - nodeAPI = InventorySourcesAPI; - break; + return ['inventory_source_sync', InventorySourcesAPI]; case 'workflow_job_template': case 'workflow_job': - nodeType = 'workflow_job_template'; - nodeAPI = WorkflowJobTemplatesAPI; - break; + return ['workflow_job_template', WorkflowJobTemplatesAPI]; case 'workflow_approval_template': case 'workflow_approval': - nodeType = 'approval'; - nodeAPI = null; - break; + return ['approval', null]; default: + return null; } - return [nodeType, nodeAPI]; } function NodeViewModal({ i18n }) { diff --git a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx index 9026d1f575..d4f22b14de 100644 --- a/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx +++ b/awx/ui_next/src/screens/Template/WorkflowJobTemplateVisualizer/Modals/NodeModals/NodeViewModal.test.jsx @@ -34,6 +34,8 @@ describe('NodeViewModal', () => { name: 'Mock Node', description: '', unified_job_type: 'workflow_job', + created: '2019-08-08T19:24:05.344276Z', + modified: '2019-08-08T19:24:18.162949Z', }, }, }; @@ -94,6 +96,8 @@ describe('NodeViewModal', () => { name: 'Mock Node', description: '', type: 'job_template', + created: '2019-08-08T19:24:05.344276Z', + modified: '2019-08-08T19:24:18.162949Z', }, }, }; @@ -143,6 +147,8 @@ describe('NodeViewModal', () => { name: 'Mock Node', description: '', type: 'project_update', + created: '2019-08-08T19:24:05.344276Z', + modified: '2019-08-08T19:24:18.162949Z', }, }, };