1
0
mirror of https://github.com/ansible/awx.git synced 2024-10-30 13:55:31 +03:00

add launch prompt inventory step

This commit is contained in:
Keith Grant 2020-03-26 15:50:40 -07:00
parent 49b1ce6e8c
commit 7f4bbbe5c5
4 changed files with 116 additions and 15 deletions

View File

@ -163,7 +163,12 @@ class LaunchButton extends React.Component {
<ErrorDetail error={launchError} />
</AlertModal>
)}
{showLaunchPrompt && <LaunchPrompt config={launchConfig} />}
{showLaunchPrompt && (
<LaunchPrompt
config={launchConfig}
onCancel={() => this.setState({ showLaunchPrompt: false })}
/>
)}
</Fragment>
);
}

View File

@ -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 <div>Choose an inventory</div>;
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 <ContentLoading />;
}
return (
<OptionsList
value={field.value ? [field.value] : []}
options={inventories}
optionCount={count}
searchColumns={[
{
name: i18n._(t`Name`),
key: 'name',
isDefault: true,
},
{
name: i18n._(t`Created By (Username)`),
key: 'created_by__username',
},
{
name: i18n._(t`Modified By (Username)`),
key: 'modified_by__username',
},
]}
sortColumns={[
{
name: i18n._(t`Name`),
key: 'name',
},
]}
header={i18n._(t`Inventory`)}
name="inventory"
qsConfig={QS_CONFIG}
readOnly
selectItem={helpers.setValue}
deselectItem={() => field.onChange(null)}
/>
);
}
export default InventoryStep;
export default withI18n()(InventoryStep);

View File

@ -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: <InventoryStep />,
});
}
// 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: <CredentialsStep />,
@ -73,17 +79,23 @@ function LaunchPrompt({ config, i18n }) {
component: <PreviewStep />,
});
const handleClose = x => {
console.log(x);
const handleSubmit = x => {
console.log('SUBMIT', x);
};
return (
<Wizard
isOpen
onClose={handleClose}
title={i18n._(t`Prompts`)}
steps={steps}
/>
<Formik
initialValues={initialValues}
onSubmit={() => console.log('FORMIK SUBMIT ?!')}
>
<Wizard
isOpen
onClose={onCancel}
onSave={handleSubmit}
title={i18n._(t`Prompts`)}
steps={steps}
/>
</Formik>
);
}

View File

@ -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';