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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba89e76b07357c27678169c5350b13a80ea346896e681e7061da8c9ff5c6d2ce
4
- data.tar.gz: c0a597c5a7db439fcd6627460b0fa91ed9e5bf0ef2d5308f356d35582c141b9d
3
+ metadata.gz: 113adfd7bfb8197852703d6bb8ca03e724b355a55723b8a0146c016607bb0024
4
+ data.tar.gz: 9117207fc628934e82528eb2238f0bcb010e3f92654b621675485ca4f1a59f9e
5
5
  SHA512:
6
- metadata.gz: 3f873f26387eb89860543bca5f888b017c2ac692c986873b97b48506f30429172d49e926450937262a9dcb06c26c45d7eefabdb7f3cce0b8c70ce6786ea7e4ad
7
- data.tar.gz: b021241e11f9db347960eb55e2497112cf996f1e77e48d92f593fa47b735c0268532ec61e2779bd35fc01768178037eaedf8248b59dfc178031dd56fb1340b6f
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(:locks).where(foreman_tasks_locks:
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.state = :stopped
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
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '4.1.3'.freeze
2
+ VERSION = '4.1.6'.freeze
3
3
  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={!(props.selectedRows.length || props.allRowsSelected)}
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
- {showSelectAll && props.itemCount >= props.pagination.perPage && (
98
- <SelectAllAlert
99
- itemCount={props.itemCount}
100
- perPage={props.pagination.perPage}
101
- selectAllRows={selectAllRows}
102
- unselectAllRows={props.unselectAllRows}
103
- allRowsSelected={props.allRowsSelected}
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 { subtotal, page, per_page: perPageString, action_name: actionName } =
23
- response || {};
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
- if (state.allRowsSelected) {
44
- // User can unselect rows if only the page rows are selected
45
- return state
46
- .set(
47
- 'selectedRows',
48
- payload.results.map(row => row.id).filter(row => row !== payload.id)
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({ tasksTableQuery: { allRowsSelected: true } }),
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 }] },
@@ -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
  `;
@@ -3,6 +3,7 @@
3
3
  exports[`selectionHeaderCellFormatter render 1`] = `
4
4
  <TableSelectionHeaderCell
5
5
  checked={true}
6
+ disabled={false}
6
7
  id="selectAll"
7
8
  label="some-label"
8
9
  onChange={[Function]}
@@ -4,7 +4,7 @@ describe('selectionHeaderCellFormatter', () => {
4
4
  it('render', () => {
5
5
  expect(
6
6
  selectionHeaderCellFormatter(
7
- { allPageSelected: () => true },
7
+ { allPageSelected: () => true, permissions: { edit: true } },
8
8
  'some-label'
9
9
  )
10
10
  ).toMatchSnapshot();
@@ -5,6 +5,7 @@ export default (selectionController, label) => (
5
5
  <TableSelectionHeaderCell
6
6
  label={label}
7
7
  checked={selectionController.allPageSelected()}
8
+ disabled={!selectionController.permissions.edit}
8
9
  onChange={selectionController.selectPage}
9
10
  />
10
11
  );
@@ -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.3
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: 2021-08-10 00:00:00.000000000 Z
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.2
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