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 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