diff --git a/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentList.jsx b/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentList.jsx
index 278566e632..914b884f1f 100644
--- a/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentList.jsx
+++ b/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentList.jsx
@@ -195,6 +195,7 @@ function ExecutionEnvironmentList({ i18n }) {
isSelected={selected.some(
row => row.id === executionEnvironment.id
)}
+ fetchExecutionEnvironments={fetchExecutionEnvironments}
/>
)}
emptyStateControls={
diff --git a/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentListItem.jsx b/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentListItem.jsx
index 1f56b53727..07816ff5fc 100644
--- a/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentListItem.jsx
+++ b/awx/ui_next/src/screens/ExecutionEnvironment/ExecutionEnvironmentList/ExecutionEnvironmentListItem.jsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useState, useCallback } from 'react';
import { string, bool, func } from 'prop-types';
import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro';
@@ -8,7 +8,10 @@ import { Tr, Td } from '@patternfly/react-table';
import { PencilAltIcon } from '@patternfly/react-icons';
import { ActionsTd, ActionItem } from '../../../components/PaginatedTable';
+import CopyButton from '../../../components/CopyButton';
import { ExecutionEnvironment } from '../../../types';
+import { ExecutionEnvironmentsAPI } from '../../../api';
+import { timeOfDay } from '../../../util/dates';
function ExecutionEnvironmentListItem({
executionEnvironment,
@@ -17,7 +20,29 @@ function ExecutionEnvironmentListItem({
onSelect,
i18n,
rowIndex,
+ fetchExecutionEnvironments,
}) {
+ const [isDisabled, setIsDisabled] = useState(false);
+
+ const copyExecutionEnvironment = useCallback(async () => {
+ await ExecutionEnvironmentsAPI.copy(executionEnvironment.id, {
+ name: `${executionEnvironment.name} @ ${timeOfDay()}`,
+ });
+ await fetchExecutionEnvironments();
+ }, [
+ executionEnvironment.id,
+ executionEnvironment.name,
+ fetchExecutionEnvironments,
+ ]);
+
+ const handleCopyStart = useCallback(() => {
+ setIsDisabled(true);
+ }, []);
+
+ const handleCopyFinish = useCallback(() => {
+ setIsDisabled(false);
+ }, []);
+
const labelId = `check-action-${executionEnvironment.id}`;
return (
@@ -65,6 +90,19 @@ function ExecutionEnvironmentListItem({