foreman-tasks 1.1.2 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/README.md +2 -0
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +33 -1
- data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
- data/app/lib/actions/proxy_action.rb +1 -1
- data/app/models/foreman_tasks/task.rb +4 -0
- data/app/models/foreman_tasks/task/dynflow_task.rb +3 -1
- data/app/models/setting/foreman_tasks.rb +1 -1
- data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
- data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
- data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
- data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
- data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +3 -3
- data/db/seeds.d/30-notification_blueprints.rb +7 -0
- data/lib/foreman_tasks/engine.rb +2 -7
- data/lib/foreman_tasks/version.rb +1 -1
- data/locale/action_names.rb +1 -1
- data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
- data/locale/en/foreman_tasks.po +270 -54
- data/locale/foreman_tasks.pot +630 -292
- data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
- data/locale/fr/foreman_tasks.po +817 -0
- data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
- data/locale/ja/foreman_tasks.po +817 -0
- data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
- data/locale/zh_CN/foreman_tasks.po +816 -0
- data/package.json +1 -0
- data/script/npm_link_foreman_js.sh +26 -0
- data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
- data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
- data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
- data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
- data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
- data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
- data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
- data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
- data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
- data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
- data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +149 -167
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +68 -3
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
- data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +124 -76
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +35 -5
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +40 -16
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -4
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -6
- data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -10
- data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +7 -1
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +18 -2
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +30 -13
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +91 -0
- data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +13 -4
- data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -8
- data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
- data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
- data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
- data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
- data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
- data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
- data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
- data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
- data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
- data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
- data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
- data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
- data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
- data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
- data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
- data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
- data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
- data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
- data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -0
- data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
- data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
- data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
- data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
- data/webpack/__mocks__/foremanReact/{API.js → redux/API.js} +1 -1
- metadata +41 -21
- data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
- data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
- data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
- data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
- data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
- data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
- data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
- data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
- data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
- data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
|
@@ -10,20 +10,6 @@
|
|
|
10
10
|
.container {
|
|
11
11
|
margin: 0;
|
|
12
12
|
}
|
|
13
|
-
/*
|
|
14
|
-
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
|
15
|
-
* listed below.
|
|
16
|
-
*
|
|
17
|
-
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
|
18
|
-
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
|
19
|
-
*
|
|
20
|
-
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
|
21
|
-
* compiled file, but it's generally better to create a new file per style scope.
|
|
22
|
-
*
|
|
23
|
-
*= require_self
|
|
24
|
-
*= require_tree .
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
13
|
.spin {
|
|
28
14
|
-webkit-animation: spin 1s infinite linear;
|
|
29
15
|
-moz-animation: spin 1s infinite linear;
|
|
@@ -60,4 +46,7 @@
|
|
|
60
46
|
transform: rotate(360deg);
|
|
61
47
|
}
|
|
62
48
|
}
|
|
49
|
+
.dynflow-button > span {
|
|
50
|
+
pointer-events: auto;
|
|
51
|
+
}
|
|
63
52
|
}
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
import API from 'foremanReact/API';
|
|
1
|
+
import { API } from 'foremanReact/redux/API';
|
|
2
2
|
import {
|
|
3
3
|
showLoading,
|
|
4
4
|
hideLoading,
|
|
5
5
|
} from 'foremanReact/components/Layout/LayoutActions';
|
|
6
|
+
import { addToast } from 'foremanReact/redux/actions/toasts';
|
|
7
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
|
6
8
|
import {
|
|
7
9
|
FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST,
|
|
8
10
|
FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
|
|
9
11
|
FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE,
|
|
10
12
|
FOREMAN_TASK_DETAILS_STOP_POLLING,
|
|
11
13
|
FOREMAN_TASK_DETAILS_START_POLLING,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
TASK_STEP_CANCEL_REQUEST,
|
|
15
|
+
TASK_STEP_CANCEL_FAILURE,
|
|
16
|
+
TASK_STEP_CANCEL_SUCCESS,
|
|
14
17
|
} from './TaskDetailsConstants';
|
|
15
18
|
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
errorToastData,
|
|
20
|
+
infoToastData,
|
|
21
|
+
successToastData,
|
|
22
|
+
} from '../common/ToastsHelpers';
|
|
19
23
|
|
|
20
24
|
export const taskReloadStop = timeoutId => {
|
|
21
25
|
if (timeoutId) {
|
|
@@ -52,7 +56,9 @@ export const refetchTaskDetails = (id, loading) => dispatch => {
|
|
|
52
56
|
|
|
53
57
|
const reloadTasksDetails = async (id, dispatch) => {
|
|
54
58
|
try {
|
|
55
|
-
const { data } = await API.get(
|
|
59
|
+
const { data } = await API.get(
|
|
60
|
+
`/foreman_tasks/api/tasks/${id}/details?include_permissions`
|
|
61
|
+
);
|
|
56
62
|
dispatch(requestSuccess(data));
|
|
57
63
|
} catch (error) {
|
|
58
64
|
dispatch(requestFailure(error));
|
|
@@ -79,7 +85,9 @@ const getTasksDetails = async (
|
|
|
79
85
|
refetchTaskDetailsAction
|
|
80
86
|
) => {
|
|
81
87
|
try {
|
|
82
|
-
const { data } = await API.get(
|
|
88
|
+
const { data } = await API.get(
|
|
89
|
+
`/foreman_tasks/api/tasks/${id}/details?include_permissions`
|
|
90
|
+
);
|
|
83
91
|
dispatch(requestSuccess(data));
|
|
84
92
|
if (data.state !== 'stopped') {
|
|
85
93
|
dispatch(taskReloadStart(timeoutId, refetchTaskDetailsAction, id));
|
|
@@ -105,11 +113,27 @@ const requestFailure = error => ({
|
|
|
105
113
|
payload: error,
|
|
106
114
|
});
|
|
107
115
|
|
|
108
|
-
export const
|
|
109
|
-
type:
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
+
export const cancelStep = (taskId, stepId) => async dispatch => {
|
|
117
|
+
dispatch({ type: TASK_STEP_CANCEL_REQUEST });
|
|
118
|
+
dispatch(addToast(infoToastData(`${__('Trying to cancel step')} ${stepId}`)));
|
|
119
|
+
try {
|
|
120
|
+
await API.post(
|
|
121
|
+
`/foreman_tasks/tasks/${taskId}/cancel_step?step_id=${stepId}`
|
|
122
|
+
);
|
|
123
|
+
dispatch({ type: TASK_STEP_CANCEL_SUCCESS });
|
|
124
|
+
dispatch(addToast(successToastData(`${stepId} {__('Step Canceled')}`)));
|
|
125
|
+
} catch (error) {
|
|
126
|
+
dispatch({ type: TASK_STEP_CANCEL_FAILURE, payload: error });
|
|
127
|
+
dispatch(
|
|
128
|
+
addToast(
|
|
129
|
+
errorToastData(
|
|
130
|
+
`${__('Could not cancel step.')} ${__(
|
|
131
|
+
'Error:'
|
|
132
|
+
)} ${stepId} ${error.response &&
|
|
133
|
+
error.response.data &&
|
|
134
|
+
error.response.data.error}`
|
|
135
|
+
)
|
|
136
|
+
)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
@@ -12,7 +12,6 @@ export const FOREMAN_TASK_DETAILS_STOP_POLLING =
|
|
|
12
12
|
export const FOREMAN_TASK_DETAILS_START_POLLING =
|
|
13
13
|
'FOREMAN_TASK_DETAILS_START_POLLING';
|
|
14
14
|
|
|
15
|
-
export const
|
|
16
|
-
|
|
17
|
-
export const
|
|
18
|
-
'FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL';
|
|
15
|
+
export const TASK_STEP_CANCEL_REQUEST = 'TASK_STEP_CANCEL_REQUEST';
|
|
16
|
+
export const TASK_STEP_CANCEL_FAILURE = 'TASK_STEP_CANCEL_FAILURE';
|
|
17
|
+
export const TASK_STEP_CANCEL_SUCCESS = 'TASK_STEP_CANCEL_SUCCESS';
|
|
@@ -4,8 +4,6 @@ import {
|
|
|
4
4
|
FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
|
|
5
5
|
FOREMAN_TASK_DETAILS_STOP_POLLING,
|
|
6
6
|
FOREMAN_TASK_DETAILS_START_POLLING,
|
|
7
|
-
FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
|
|
8
|
-
FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
|
|
9
7
|
} from './TaskDetailsConstants';
|
|
10
8
|
|
|
11
9
|
const initialState = Immutable({});
|
|
@@ -34,10 +32,6 @@ export default (state = initialState, action) => {
|
|
|
34
32
|
case FOREMAN_TASK_DETAILS_START_POLLING:
|
|
35
33
|
clearTimeout(state.timeoutId);
|
|
36
34
|
return state.merge({ taskReload: true, timeoutId: payload.timeoutId });
|
|
37
|
-
case FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL:
|
|
38
|
-
return state.set('showUnlockModal', !state.showUnlockModal);
|
|
39
|
-
case FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL:
|
|
40
|
-
return state.set('showForceUnlockModal', !state.showForceUnlockModal);
|
|
41
35
|
default:
|
|
42
36
|
return state;
|
|
43
37
|
}
|
|
@@ -30,7 +30,7 @@ export const selectErrors = state => {
|
|
|
30
30
|
|
|
31
31
|
export const selectProgress = state =>
|
|
32
32
|
selectTaskDetails(state).progress
|
|
33
|
-
?
|
|
33
|
+
? Math.trunc(selectTaskDetails(state).progress * 100)
|
|
34
34
|
: 0;
|
|
35
35
|
|
|
36
36
|
export const selectUsername = state =>
|
|
@@ -52,9 +52,6 @@ export const selectHelp = state => selectTaskDetails(state).help || null;
|
|
|
52
52
|
export const selectHasSubTasks = state =>
|
|
53
53
|
selectTaskDetails(state).has_sub_tasks || false;
|
|
54
54
|
|
|
55
|
-
export const selectAllowDangerousActions = state =>
|
|
56
|
-
selectTaskDetails(state).allowDangerousActions || false;
|
|
57
|
-
|
|
58
55
|
export const selectLocks = state => selectTaskDetails(state).locks || [];
|
|
59
56
|
|
|
60
57
|
export const selectUsernamePath = state =>
|
|
@@ -75,14 +72,11 @@ export const selectTaskReload = state =>
|
|
|
75
72
|
export const selectParentTask = state =>
|
|
76
73
|
selectTaskDetails(state).parent_task_id || '';
|
|
77
74
|
|
|
78
|
-
export const selectShowUnlockModal = state =>
|
|
79
|
-
selectTaskDetails(state).showUnlockModal || false;
|
|
80
|
-
|
|
81
|
-
export const selectShowForceUnlockModal = state =>
|
|
82
|
-
selectTaskDetails(state).showForceUnlockModal || false;
|
|
83
|
-
|
|
84
75
|
export const selectExternalId = state =>
|
|
85
76
|
selectTaskDetails(state).external_id || null;
|
|
86
77
|
|
|
87
78
|
export const selectDynflowEnableConsole = state =>
|
|
88
79
|
selectTaskDetails(state).dynflow_enable_console || false;
|
|
80
|
+
|
|
81
|
+
export const selectCanEdit = state =>
|
|
82
|
+
selectTaskDetails(state).can_edit || false;
|
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// Get Task ID from URL. Split url by '/', filter non-empty values and get Task ID.
|
|
2
|
+
export const getTaskID = () =>
|
|
3
|
+
window.location.pathname
|
|
4
|
+
.split('/')
|
|
5
|
+
.filter(i => i)
|
|
6
|
+
.slice(-1)[0];
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
|
2
2
|
|
|
3
3
|
import TaskDetails from '../TaskDetails';
|
|
4
|
+
import { minProps } from './TaskDetails.fixtures';
|
|
4
5
|
|
|
5
6
|
const fixtures = {
|
|
6
|
-
'render
|
|
7
|
+
'render with min Props': minProps,
|
|
7
8
|
};
|
|
8
9
|
|
|
10
|
+
delete window.location;
|
|
11
|
+
window.location = new URL(
|
|
12
|
+
'https://foreman.com/foreman_tasks/tasks/a15dd820-32f1-4ced-9ab7-c0fab8234c47/'
|
|
13
|
+
);
|
|
14
|
+
|
|
9
15
|
describe('TaskDetails', () => {
|
|
10
16
|
describe('rendering', () =>
|
|
11
17
|
testComponentSnapshotsWithFixtures(TaskDetails, fixtures));
|
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
import { testActionSnapshotWithFixtures } from '@theforeman/test';
|
|
2
|
-
import API from 'foremanReact/API';
|
|
2
|
+
import { API } from 'foremanReact/redux/API';
|
|
3
3
|
import {
|
|
4
4
|
taskReloadStop,
|
|
5
5
|
taskReloadStart,
|
|
6
6
|
fetchTaskDetails,
|
|
7
|
+
cancelStep,
|
|
7
8
|
} from '../TaskDetailsActions';
|
|
8
9
|
|
|
9
|
-
jest.mock('foremanReact/API');
|
|
10
|
+
jest.mock('foremanReact/redux/API');
|
|
10
11
|
|
|
11
12
|
API.get.mockImplementation(async () => ({ data: 'some-data' }));
|
|
13
|
+
API.post.mockImplementation(async () => ({ data: 'some-data' }));
|
|
12
14
|
|
|
13
15
|
const fixtures = {
|
|
14
16
|
'should start reload': () => taskReloadStart(1),
|
|
15
17
|
'should stop reload': () => taskReloadStop(2),
|
|
16
18
|
'should fetch-task-details and success': () => fetchTaskDetails(),
|
|
19
|
+
'should cancelStep and success': () => cancelStep('task-id', 'step-id'),
|
|
20
|
+
|
|
21
|
+
'should fetch-task-details and fail': () => {
|
|
22
|
+
API.get.mockImplementationOnce(() =>
|
|
23
|
+
Promise.reject(new Error('Network Error'))
|
|
24
|
+
);
|
|
25
|
+
return fetchTaskDetails();
|
|
26
|
+
},
|
|
27
|
+
'should cancelStep and fail': () => {
|
|
28
|
+
API.post.mockImplementationOnce(() =>
|
|
29
|
+
Promise.reject(new Error('Network Error'))
|
|
30
|
+
);
|
|
31
|
+
return cancelStep('task-id', 'step-id');
|
|
32
|
+
},
|
|
17
33
|
};
|
|
18
34
|
|
|
19
35
|
describe('TaskDetails - Actions', () =>
|
data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`TaskDetails rendering render
|
|
3
|
+
exports[`TaskDetails rendering render with min Props 1`] = `
|
|
4
4
|
<div
|
|
5
5
|
className="task-details-react well"
|
|
6
6
|
>
|
|
@@ -15,7 +15,8 @@ exports[`TaskDetails rendering render without Props 1`] = `
|
|
|
15
15
|
>
|
|
16
16
|
<Task
|
|
17
17
|
action=""
|
|
18
|
-
|
|
18
|
+
canEdit={false}
|
|
19
|
+
cancelStep={[MockFunction]}
|
|
19
20
|
cancelTaskRequest={[Function]}
|
|
20
21
|
cancellable={false}
|
|
21
22
|
dynflowEnableConsole={false}
|
|
@@ -24,33 +25,46 @@ exports[`TaskDetails rendering render without Props 1`] = `
|
|
|
24
25
|
executionPlan={Object {}}
|
|
25
26
|
externalId=""
|
|
26
27
|
failedSteps={Array []}
|
|
27
|
-
fetchTaskDetails={
|
|
28
|
+
fetchTaskDetails={
|
|
29
|
+
[MockFunction] {
|
|
30
|
+
"calls": Array [
|
|
31
|
+
Array [
|
|
32
|
+
"a15dd820-32f1-4ced-9ab7-c0fab8234c47",
|
|
33
|
+
null,
|
|
34
|
+
[MockFunction],
|
|
35
|
+
],
|
|
36
|
+
],
|
|
37
|
+
"results": Array [
|
|
38
|
+
Object {
|
|
39
|
+
"type": "return",
|
|
40
|
+
"value": undefined,
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
}
|
|
44
|
+
}
|
|
28
45
|
hasSubTasks={false}
|
|
29
46
|
help=""
|
|
30
|
-
id=""
|
|
47
|
+
id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
|
|
31
48
|
input={Array []}
|
|
32
49
|
label=""
|
|
33
50
|
locks={Array []}
|
|
34
51
|
output={Object {}}
|
|
35
52
|
parentTask=""
|
|
36
53
|
progress={0}
|
|
37
|
-
refetchTaskDetails={[
|
|
54
|
+
refetchTaskDetails={[MockFunction]}
|
|
38
55
|
result="error"
|
|
39
56
|
resumable={false}
|
|
40
57
|
resumeTaskRequest={[Function]}
|
|
41
58
|
runningSteps={Array []}
|
|
42
|
-
showForceUnlockModal={false}
|
|
43
|
-
showUnlockModal={false}
|
|
44
59
|
startAt=""
|
|
45
60
|
startBefore=""
|
|
46
61
|
startedAt=""
|
|
47
62
|
state=""
|
|
63
|
+
taskProgressToggle={[Function]}
|
|
48
64
|
taskReload={false}
|
|
49
|
-
taskReloadStart={[
|
|
50
|
-
taskReloadStop={[
|
|
65
|
+
taskReloadStart={[MockFunction]}
|
|
66
|
+
taskReloadStop={[MockFunction]}
|
|
51
67
|
timeoutId={null}
|
|
52
|
-
toggleForceUnlockModal={[Function]}
|
|
53
|
-
toggleUnlockModal={[Function]}
|
|
54
68
|
username=""
|
|
55
69
|
usernamePath=""
|
|
56
70
|
/>
|
|
@@ -60,8 +74,11 @@ exports[`TaskDetails rendering render without Props 1`] = `
|
|
|
60
74
|
title="Running Steps"
|
|
61
75
|
>
|
|
62
76
|
<RunningSteps
|
|
63
|
-
|
|
77
|
+
cancelStep={[MockFunction]}
|
|
78
|
+
id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
|
|
64
79
|
runningSteps={Array []}
|
|
80
|
+
taskProgressToggle={[Function]}
|
|
81
|
+
taskReload={false}
|
|
65
82
|
/>
|
|
66
83
|
</Tab>
|
|
67
84
|
<Tab
|
|
@@ -88,7 +105,7 @@ exports[`TaskDetails rendering render without Props 1`] = `
|
|
|
88
105
|
<Raw
|
|
89
106
|
endedAt=""
|
|
90
107
|
externalId=""
|
|
91
|
-
id=""
|
|
108
|
+
id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
|
|
92
109
|
input={Array []}
|
|
93
110
|
label=""
|
|
94
111
|
output={Object {}}
|
|
@@ -1,5 +1,96 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
+
exports[`TaskDetails - Actions should cancelStep and fail 1`] = `
|
|
4
|
+
Array [
|
|
5
|
+
Array [
|
|
6
|
+
Object {
|
|
7
|
+
"type": "TASK_STEP_CANCEL_REQUEST",
|
|
8
|
+
},
|
|
9
|
+
],
|
|
10
|
+
Array [
|
|
11
|
+
Object {
|
|
12
|
+
"payload": Object {
|
|
13
|
+
"message": Object {
|
|
14
|
+
"message": "Trying to cancel step step-id",
|
|
15
|
+
"type": "info",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
"type": "TOASTS_ADD",
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
Array [
|
|
22
|
+
Object {
|
|
23
|
+
"payload": [Error: Network Error],
|
|
24
|
+
"type": "TASK_STEP_CANCEL_FAILURE",
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
Array [
|
|
28
|
+
Object {
|
|
29
|
+
"payload": Object {
|
|
30
|
+
"message": Object {
|
|
31
|
+
"message": "Could not cancel step. Error: step-id undefined",
|
|
32
|
+
"type": "error",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
"type": "TOASTS_ADD",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
]
|
|
39
|
+
`;
|
|
40
|
+
|
|
41
|
+
exports[`TaskDetails - Actions should cancelStep and success 1`] = `
|
|
42
|
+
Array [
|
|
43
|
+
Array [
|
|
44
|
+
Object {
|
|
45
|
+
"type": "TASK_STEP_CANCEL_REQUEST",
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
Array [
|
|
49
|
+
Object {
|
|
50
|
+
"payload": Object {
|
|
51
|
+
"message": Object {
|
|
52
|
+
"message": "Trying to cancel step step-id",
|
|
53
|
+
"type": "info",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
"type": "TOASTS_ADD",
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
Array [
|
|
60
|
+
Object {
|
|
61
|
+
"type": "TASK_STEP_CANCEL_SUCCESS",
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
Array [
|
|
65
|
+
Object {
|
|
66
|
+
"payload": Object {
|
|
67
|
+
"message": Object {
|
|
68
|
+
"message": "step-id {__('Step Canceled')}",
|
|
69
|
+
"type": "success",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
"type": "TOASTS_ADD",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
]
|
|
76
|
+
`;
|
|
77
|
+
|
|
78
|
+
exports[`TaskDetails - Actions should fetch-task-details and fail 1`] = `
|
|
79
|
+
Array [
|
|
80
|
+
Array [
|
|
81
|
+
Object {
|
|
82
|
+
"type": "FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
Array [
|
|
86
|
+
Object {
|
|
87
|
+
"payload": [Error: Network Error],
|
|
88
|
+
"type": "FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE",
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
]
|
|
92
|
+
`;
|
|
93
|
+
|
|
3
94
|
exports[`TaskDetails - Actions should fetch-task-details and success 1`] = `
|
|
4
95
|
Array [
|
|
5
96
|
Array [
|