foreman-tasks 4.1.3 → 4.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/foreman_tasks/api/tasks_controller.rb +1 -1
- data/app/controllers/foreman_tasks/tasks_controller.rb +3 -5
- data/lib/foreman_tasks/version.rb +1 -1
- data/test/controllers/api/tasks_controller_test.rb +11 -0
- data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +8 -0
- data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +21 -10
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableReducer.js +17 -16
- data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +3 -0
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableReducer.test.js +3 -1
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +10 -0
- data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableReducer.test.js.snap +5 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionHeaderCellFormatter.test.js.snap +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionHeaderCellFormatter.test.js +1 -1
- data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionHeaderCellFormatter.js +1 -0
- data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 113adfd7bfb8197852703d6bb8ca03e724b355a55723b8a0146c016607bb0024
|
4
|
+
data.tar.gz: 9117207fc628934e82528eb2238f0bcb010e3f92654b621675485ca4f1a59f9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b8228f8d1ea657cf35106884d1d1b537f0ac910af82c1d74f43a2eb28d2337c6a76cd4f89d927a7731af222453acd6439110b92281a9acbadf1696d1dd55ff4
|
7
|
+
data.tar.gz: 365c53bf9ce1c3e3e15a9632828f867a83d74ecad2fdd7c1c7ce1b3ecd4d6d6f6775adef6f1e02fb6eff79cf6a6c437663e0a4c8e1cd773c9dded48445138cee
|
@@ -260,7 +260,7 @@ module ForemanTasks
|
|
260
260
|
raise BadRequest,
|
261
261
|
_('Resource search_params requires resource_type and resource_id to be specified')
|
262
262
|
end
|
263
|
-
scope.joins(:
|
263
|
+
scope.joins(:links).where(foreman_tasks_links:
|
264
264
|
{ resource_type: search_params[:resource_type],
|
265
265
|
resource_id: search_params[:resource_id] })
|
266
266
|
when 'task'
|
@@ -72,17 +72,15 @@ module ForemanTasks
|
|
72
72
|
def unlock
|
73
73
|
task = find_dynflow_task
|
74
74
|
if task.paused?
|
75
|
-
task
|
76
|
-
task.save!
|
77
|
-
render json: { statusText: 'OK' }
|
75
|
+
force_unlock(task)
|
78
76
|
else
|
79
77
|
render json: {}, status: :bad_request
|
80
78
|
end
|
81
79
|
end
|
82
80
|
|
83
|
-
def force_unlock
|
84
|
-
task = find_dynflow_task
|
81
|
+
def force_unlock(task = find_dynflow_task)
|
85
82
|
task.state = :stopped
|
83
|
+
task.locks.destroy_all
|
86
84
|
task.save!
|
87
85
|
render json: { statusText: 'OK' }
|
88
86
|
end
|
@@ -68,6 +68,17 @@ module ForemanTasks
|
|
68
68
|
data = JSON.parse(response.body)
|
69
69
|
_(data[0]['results'][0]['id']).must_equal task.id
|
70
70
|
end
|
71
|
+
|
72
|
+
it 'can search for a specific resource' do
|
73
|
+
org = FactoryBot.create(:organization)
|
74
|
+
task = FactoryBot.create(:task_with_links, resource_id: org.id, resource_type: 'Organization')
|
75
|
+
|
76
|
+
post :bulk_search, params: { :searches => [{ :type => 'resource', :resource_id => org.id, :resource_type => 'Organization' }] }
|
77
|
+
|
78
|
+
assert_response :success
|
79
|
+
data = JSON.parse(response.body)
|
80
|
+
_(data[0]['results'][0]['id']).must_equal task.id
|
81
|
+
end
|
71
82
|
end
|
72
83
|
|
73
84
|
describe 'GET /api/tasks/show' do
|
@@ -27,6 +27,7 @@ const TasksTable = ({
|
|
27
27
|
openClickedModal,
|
28
28
|
openModal,
|
29
29
|
allRowsSelected,
|
30
|
+
permissions,
|
30
31
|
}) => {
|
31
32
|
const { search, pathname } = history.location;
|
32
33
|
const url = pathname + search;
|
@@ -59,6 +60,7 @@ const TasksTable = ({
|
|
59
60
|
},
|
60
61
|
isSelected: ({ rowData }) =>
|
61
62
|
allRowsSelected || selectedRows.includes(rowData.id),
|
63
|
+
permissions,
|
62
64
|
};
|
63
65
|
};
|
64
66
|
|
@@ -162,6 +164,9 @@ TasksTable.propTypes = {
|
|
162
164
|
unselectRow: PropTypes.func.isRequired,
|
163
165
|
openModal: PropTypes.func.isRequired,
|
164
166
|
allRowsSelected: PropTypes.bool,
|
167
|
+
permissions: PropTypes.shape({
|
168
|
+
edit: PropTypes.bool,
|
169
|
+
}),
|
165
170
|
};
|
166
171
|
|
167
172
|
TasksTable.defaultProps = {
|
@@ -173,6 +178,9 @@ TasksTable.defaultProps = {
|
|
173
178
|
},
|
174
179
|
selectedRows: [],
|
175
180
|
allRowsSelected: false,
|
181
|
+
permissions: {
|
182
|
+
edit: false,
|
183
|
+
},
|
176
184
|
};
|
177
185
|
|
178
186
|
export default TasksTable;
|
@@ -81,7 +81,10 @@ const TasksTablePage = ({
|
|
81
81
|
title={__('Export All')}
|
82
82
|
/>
|
83
83
|
<ActionSelectButton
|
84
|
-
disabled={
|
84
|
+
disabled={
|
85
|
+
!props.permissions.edit ||
|
86
|
+
!(props.selectedRows.length || props.allRowsSelected)
|
87
|
+
}
|
85
88
|
onCancel={() => openModal(CANCEL_SELECTED_MODAL)}
|
86
89
|
onResume={() => openModal(RESUME_SELECTED_MODAL)}
|
87
90
|
onForceCancel={() => openModal(FORCE_UNLOCK_SELECTED_MODAL)}
|
@@ -94,15 +97,17 @@ const TasksTablePage = ({
|
|
94
97
|
}
|
95
98
|
>
|
96
99
|
<React.Fragment>
|
97
|
-
{
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
100
|
+
{props.permissions.edit &&
|
101
|
+
showSelectAll &&
|
102
|
+
props.itemCount >= props.pagination.perPage && (
|
103
|
+
<SelectAllAlert
|
104
|
+
itemCount={props.itemCount}
|
105
|
+
perPage={props.pagination.perPage}
|
106
|
+
selectAllRows={selectAllRows}
|
107
|
+
unselectAllRows={props.unselectAllRows}
|
108
|
+
allRowsSelected={props.allRowsSelected}
|
109
|
+
/>
|
110
|
+
)}
|
106
111
|
<TasksTable history={history} {...props} openModal={openModal} />
|
107
112
|
</React.Fragment>
|
108
113
|
</PageLayout>
|
@@ -131,6 +136,9 @@ TasksTablePage.propTypes = {
|
|
131
136
|
showSelectAll: PropTypes.bool,
|
132
137
|
unselectAllRows: PropTypes.func.isRequired,
|
133
138
|
reloadPage: PropTypes.func.isRequired,
|
139
|
+
permissions: PropTypes.shape({
|
140
|
+
edit: PropTypes.bool,
|
141
|
+
}),
|
134
142
|
};
|
135
143
|
|
136
144
|
TasksTablePage.defaultProps = {
|
@@ -146,6 +154,9 @@ TasksTablePage.defaultProps = {
|
|
146
154
|
createHeader: () => __('Tasks'),
|
147
155
|
showSelectAll: false,
|
148
156
|
modalID: '',
|
157
|
+
permissions: {
|
158
|
+
edit: false,
|
159
|
+
},
|
149
160
|
};
|
150
161
|
|
151
162
|
export default TasksTablePage;
|
@@ -19,8 +19,13 @@ const initialState = Immutable({
|
|
19
19
|
|
20
20
|
export const TasksTableQueryReducer = (state = initialState, action) => {
|
21
21
|
const { type, payload, response } = action;
|
22
|
-
const {
|
23
|
-
|
22
|
+
const {
|
23
|
+
subtotal,
|
24
|
+
page,
|
25
|
+
per_page: perPageString,
|
26
|
+
action_name: actionName,
|
27
|
+
can_edit: canEdit,
|
28
|
+
} = response || {};
|
24
29
|
const ACTION_TYPES = createTableActionTypes(TASKS_TABLE_ID);
|
25
30
|
switch (type) {
|
26
31
|
case SELECT_ALL_ROWS:
|
@@ -34,26 +39,22 @@ export const TasksTableQueryReducer = (state = initialState, action) => {
|
|
34
39
|
perPage: Number(perPageString),
|
35
40
|
},
|
36
41
|
selectedRows: [],
|
42
|
+
permissions: {
|
43
|
+
edit: canEdit,
|
44
|
+
},
|
37
45
|
});
|
38
46
|
case SELECT_ROWS:
|
39
47
|
return state.set('selectedRows', union(payload, state.selectedRows));
|
40
48
|
case OPEN_SELECT_ALL:
|
41
49
|
return state.set('showSelectAll', true);
|
42
50
|
case UNSELECT_ROWS:
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
.set('allRowsSelected', false)
|
51
|
-
.set('showSelectAll', false);
|
52
|
-
}
|
53
|
-
return state.set(
|
54
|
-
'selectedRows',
|
55
|
-
state.selectedRows.filter(row => row !== payload.id)
|
56
|
-
);
|
51
|
+
return state
|
52
|
+
.set(
|
53
|
+
'selectedRows',
|
54
|
+
state.selectedRows.filter(row => row !== payload.id)
|
55
|
+
)
|
56
|
+
.set('showSelectAll', false)
|
57
|
+
.set('allRowsSelected', false);
|
57
58
|
case UNSELECT_ALL_ROWS:
|
58
59
|
return state
|
59
60
|
.set('selectedRows', [])
|
@@ -24,6 +24,9 @@ export const selectActionName = state =>
|
|
24
24
|
export const selectSelectedRows = state =>
|
25
25
|
selectTasksTableQuery(state).selectedRows || [];
|
26
26
|
|
27
|
+
export const selectPermissions = state =>
|
28
|
+
selectTasksTableQuery(state).permissions || { edit: false };
|
29
|
+
|
27
30
|
export const selectResults = createSelector(
|
28
31
|
selectTasksTableContent,
|
29
32
|
({ results }) =>
|
@@ -73,7 +73,9 @@ const fixtures = {
|
|
73
73
|
},
|
74
74
|
},
|
75
75
|
'should handle UNSELECT_ROWS with all rows selected': {
|
76
|
-
state: Immutable({
|
76
|
+
state: Immutable({
|
77
|
+
tasksTableQuery: { allRowsSelected: true, selectedRows: [3, 4, 5] },
|
78
|
+
}),
|
77
79
|
action: {
|
78
80
|
type: UNSELECT_ROWS,
|
79
81
|
payload: { id: [4], results: [{ id: 3 }, { id: 4 }, { id: 5 }] },
|
data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap
CHANGED
@@ -126,6 +126,11 @@ exports[`TasksTablePage rendering render with Breadcrubs and edit permissions 1`
|
|
126
126
|
}
|
127
127
|
}
|
128
128
|
parentTaskID={null}
|
129
|
+
permissions={
|
130
|
+
Object {
|
131
|
+
"edit": false,
|
132
|
+
}
|
133
|
+
}
|
129
134
|
reloadPage={[MockFunction]}
|
130
135
|
results={
|
131
136
|
Array [
|
@@ -261,6 +266,11 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
|
|
261
266
|
}
|
262
267
|
}
|
263
268
|
parentTaskID={null}
|
269
|
+
permissions={
|
270
|
+
Object {
|
271
|
+
"edit": false,
|
272
|
+
}
|
273
|
+
}
|
264
274
|
reloadPage={[MockFunction]}
|
265
275
|
results={
|
266
276
|
Array [
|
@@ -59,6 +59,9 @@ Object {
|
|
59
59
|
"page": 3,
|
60
60
|
"perPage": 12,
|
61
61
|
},
|
62
|
+
"permissions": Object {
|
63
|
+
"edit": undefined,
|
64
|
+
},
|
62
65
|
"selectedRows": Array [],
|
63
66
|
},
|
64
67
|
}
|
@@ -77,7 +80,9 @@ Object {
|
|
77
80
|
exports[`TasksTableReducer reducer should handle UNSELECT_ROWS 1`] = `
|
78
81
|
Object {
|
79
82
|
"tasksTableQuery": Object {
|
83
|
+
"allRowsSelected": false,
|
80
84
|
"selectedRows": Array [],
|
85
|
+
"showSelectAll": false,
|
81
86
|
},
|
82
87
|
}
|
83
88
|
`;
|
@@ -16,6 +16,7 @@ import {
|
|
16
16
|
selectAllRowsSelected,
|
17
17
|
selectShowSelectAll,
|
18
18
|
selectModalID,
|
19
|
+
selectPermissions,
|
19
20
|
} from './TasksTableSelectors';
|
20
21
|
|
21
22
|
const mapStateToProps = state => ({
|
@@ -30,6 +31,7 @@ const mapStateToProps = state => ({
|
|
30
31
|
allRowsSelected: selectAllRowsSelected(state),
|
31
32
|
showSelectAll: selectShowSelectAll(state),
|
32
33
|
modalID: selectModalID(state),
|
34
|
+
permissions: selectPermissions(state),
|
33
35
|
});
|
34
36
|
|
35
37
|
const mapDispatchToProps = dispatch =>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-tasks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Nečas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dynflow
|
@@ -611,7 +611,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
611
611
|
- !ruby/object:Gem::Version
|
612
612
|
version: '0'
|
613
613
|
requirements: []
|
614
|
-
rubygems_version: 3.1.
|
614
|
+
rubygems_version: 3.1.4
|
615
615
|
signing_key:
|
616
616
|
specification_version: 4
|
617
617
|
summary: Foreman plugin for showing tasks information for resources and users
|