From 7f4bbbe5c50ea6c40a7d09dcd8b3da06ad5ecfd0 Mon Sep 17 00:00:00 2001 From: Keith Grant Date: Thu, 26 Mar 2020 15:50:40 -0700 Subject: [PATCH] add launch prompt inventory step --- .../components/LaunchButton/LaunchButton.jsx | 7 +- .../components/LaunchPrompt/InventoryStep.jsx | 91 ++++++++++++++++++- .../components/LaunchPrompt/LaunchPrompt.jsx | 32 +++++-- awx/ui_next/src/components/Lookup/index.js | 1 + 4 files changed, 116 insertions(+), 15 deletions(-) diff --git a/awx/ui_next/src/components/LaunchButton/LaunchButton.jsx b/awx/ui_next/src/components/LaunchButton/LaunchButton.jsx index 17db547e9a..9f24a04a66 100644 --- a/awx/ui_next/src/components/LaunchButton/LaunchButton.jsx +++ b/awx/ui_next/src/components/LaunchButton/LaunchButton.jsx @@ -163,7 +163,12 @@ class LaunchButton extends React.Component { )} - {showLaunchPrompt && } + {showLaunchPrompt && ( + this.setState({ showLaunchPrompt: false })} + /> + )} ); } diff --git a/awx/ui_next/src/components/LaunchPrompt/InventoryStep.jsx b/awx/ui_next/src/components/LaunchPrompt/InventoryStep.jsx index 28a3122bd1..a1fcd96a2c 100644 --- a/awx/ui_next/src/components/LaunchPrompt/InventoryStep.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/InventoryStep.jsx @@ -1,7 +1,90 @@ -import React from 'react'; +import React, { useCallback, useEffect } from 'react'; +import { useHistory } from 'react-router-dom'; +import { withI18n } from '@lingui/react'; +import { t } from '@lingui/macro'; +import { useField } from 'formik'; +import { InventoriesAPI } from '@api'; +import { getQSConfig, parseQueryString } from '@util/qs'; +import useRequest from '@util/useRequest'; +// TODO move OptionsList out of Lookup/shared +import { OptionsList } from '@components/Lookup'; +import ContentLoading from '@components/ContentLoading'; -function InventoryStep() { - return
Choose an inventory
; +const QS_CONFIG = getQSConfig('inventory', { + page: 1, + page_size: 5, + order_by: 'name', +}); + +function InventoryStep({ i18n }) { + const history = useHistory(); + const [field, meta, helpers] = useField('inventory'); + + const { + isLoading, + error, + result: { inventories, count }, + request: fetchInventories, + } = useRequest( + useCallback(async () => { + const params = parseQueryString(QS_CONFIG, history.location.search); + const { data } = await InventoriesAPI.read(params); + if (!field.value && data.results.length) { + helpers.setValue(data.results[0]); + } + return { + inventories: data.results, + count: data.count, + }; + }, [history.location]), + { + count: 0, + inventories: [], + } + ); + + useEffect(() => { + fetchInventories(); + }, [fetchInventories]); + + if (isLoading) { + return ; + } + + return ( + field.onChange(null)} + /> + ); } -export default InventoryStep; +export default withI18n()(InventoryStep); diff --git a/awx/ui_next/src/components/LaunchPrompt/LaunchPrompt.jsx b/awx/ui_next/src/components/LaunchPrompt/LaunchPrompt.jsx index dfd32656df..862dca5eff 100644 --- a/awx/ui_next/src/components/LaunchPrompt/LaunchPrompt.jsx +++ b/awx/ui_next/src/components/LaunchPrompt/LaunchPrompt.jsx @@ -2,13 +2,15 @@ import React from 'react'; import { Wizard } from '@patternfly/react-core'; import { withI18n } from '@lingui/react'; import { t } from '@lingui/macro'; +import { Formik } from 'formik'; import InventoryStep from './InventoryStep'; import CredentialsStep from './CredentialsStep'; import OtherPromptsStep from './OtherPromptsStep'; import SurveyStep from './SurveyStep'; import PreviewStep from './PreviewStep'; -function LaunchPrompt({ config, i18n }) { +function LaunchPrompt({ config, onCancel, i18n }) { + // CONFIG // can_start_without_user_input: false // passwords_needed_to_start: [] // ask_scm_branch_on_launch: false @@ -26,14 +28,17 @@ function LaunchPrompt({ config, i18n }) { // credential_needed_to_start: false // inventory_needed_to_start: false // job_template_data: {name: "JT with prompts", id: 25, description: "" + const steps = []; + const initialValues = {}; if (config.ask_inventory_on_launch) { + initialValues.inventory = null; steps.push({ name: i18n._(t`Inventory`), component: , }); } - // angular code was: + // TODO: match old UI Logic: // if (vm.promptDataClone.launchConf.ask_credential_on_launch || // (_.has(vm, 'promptDataClone.prompts.credentials.passwords.vault') && // vm.promptDataClone.prompts.credentials.passwords.vault.length > 0) || @@ -42,6 +47,7 @@ function LaunchPrompt({ config, i18n }) { // _.has(vm, 'promptDataClone.prompts.credentials.passwords.ssh_password') // ) { if (config.ask_credential_on_launch) { + initialValues.credentials = []; steps.push({ name: i18n._(t`Credential`), component: , @@ -73,17 +79,23 @@ function LaunchPrompt({ config, i18n }) { component: , }); - const handleClose = x => { - console.log(x); + const handleSubmit = x => { + console.log('SUBMIT', x); }; return ( - + console.log('FORMIK SUBMIT ?!')} + > + + ); } diff --git a/awx/ui_next/src/components/Lookup/index.js b/awx/ui_next/src/components/Lookup/index.js index cde48e2bcd..cd9d5bc226 100644 --- a/awx/ui_next/src/components/Lookup/index.js +++ b/awx/ui_next/src/components/Lookup/index.js @@ -3,3 +3,4 @@ export { default as InstanceGroupsLookup } from './InstanceGroupsLookup'; export { default as InventoryLookup } from './InventoryLookup'; export { default as ProjectLookup } from './ProjectLookup'; export { default as MultiCredentialsLookup } from './MultiCredentialsLookup'; +export { default as OptionsList } from './shared/OptionsList';