foreman-tasks 4.1.3 → 4.1.6
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/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
|