foreman_ansible 7.0.3 → 7.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/ansible_playbooks_controller.rb +66 -0
  3. data/app/graphql/presenters/ansible_role_presenter.rb +4 -0
  4. data/app/graphql/types/ansible_role.rb +1 -0
  5. data/app/graphql/types/inherited_ansible_role.rb +4 -0
  6. data/app/jobs/sync_playbooks.rb +25 -0
  7. data/app/lib/proxy_api/ansible.rb +13 -0
  8. data/app/services/foreman_ansible/import_playbooks_error_notification.rb +38 -0
  9. data/app/services/foreman_ansible/import_playbooks_success_notification.rb +33 -0
  10. data/app/services/foreman_ansible/playbooks_importer.rb +73 -0
  11. data/app/services/foreman_ansible/proxy_api.rb +3 -4
  12. data/app/views/ansible_roles/index.html.erb +2 -0
  13. data/app/views/api/v2/ansible_playbooks/sync.json.rabl +5 -0
  14. data/app/views/foreman_ansible/job_templates/ansible_windows_updates.erb +160 -0
  15. data/config/routes.rb +7 -0
  16. data/db/seeds.d/90_notification_blueprints.rb +14 -0
  17. data/lib/foreman_ansible/register.rb +4 -2
  18. data/lib/foreman_ansible/version.rb +1 -1
  19. data/locale/ca/foreman_ansible.edit.po +1162 -0
  20. data/{webpack/components/withPagination.js → locale/ca/foreman_ansible.po.time_stamp} +0 -0
  21. data/locale/cs_CZ/foreman_ansible.edit.po +1207 -0
  22. data/locale/cs_CZ/foreman_ansible.po.time_stamp +0 -0
  23. data/locale/de/foreman_ansible.edit.po +1148 -0
  24. data/locale/de/foreman_ansible.po.time_stamp +0 -0
  25. data/locale/en/foreman_ansible.edit.po +1146 -0
  26. data/locale/en/foreman_ansible.po.time_stamp +0 -0
  27. data/locale/en_GB/foreman_ansible.edit.po +1155 -0
  28. data/locale/en_GB/foreman_ansible.po.time_stamp +0 -0
  29. data/locale/es/foreman_ansible.edit.po +1148 -0
  30. data/locale/es/foreman_ansible.po.time_stamp +0 -0
  31. data/locale/fr/foreman_ansible.edit.po +1148 -0
  32. data/locale/fr/foreman_ansible.po.time_stamp +0 -0
  33. data/locale/gl/foreman_ansible.edit.po +1156 -0
  34. data/locale/gl/foreman_ansible.po.time_stamp +0 -0
  35. data/locale/it/foreman_ansible.edit.po +1148 -0
  36. data/locale/it/foreman_ansible.po.time_stamp +0 -0
  37. data/locale/ja/foreman_ansible.edit.po +1148 -0
  38. data/locale/ja/foreman_ansible.po.time_stamp +0 -0
  39. data/locale/ko/foreman_ansible.edit.po +1148 -0
  40. data/locale/ko/foreman_ansible.po.time_stamp +0 -0
  41. data/locale/nl_NL/foreman_ansible.edit.po +1168 -0
  42. data/locale/nl_NL/foreman_ansible.po.time_stamp +0 -0
  43. data/locale/pl/foreman_ansible.edit.po +1180 -0
  44. data/locale/pl/foreman_ansible.po.time_stamp +0 -0
  45. data/locale/pt_BR/foreman_ansible.edit.po +1148 -0
  46. data/locale/pt_BR/foreman_ansible.po.time_stamp +0 -0
  47. data/locale/ru/foreman_ansible.edit.po +1149 -0
  48. data/locale/ru/foreman_ansible.po.time_stamp +0 -0
  49. data/locale/sv_SE/foreman_ansible.edit.po +1180 -0
  50. data/locale/sv_SE/foreman_ansible.po.time_stamp +0 -0
  51. data/locale/zh_CN/foreman_ansible.edit.po +1148 -0
  52. data/locale/zh_CN/foreman_ansible.po.time_stamp +0 -0
  53. data/locale/zh_TW/foreman_ansible.edit.po +1148 -0
  54. data/locale/zh_TW/foreman_ansible.po.time_stamp +0 -0
  55. data/test/fixtures/playbooks_example_output.json +1 -0
  56. data/test/fixtures/sample_playbooks.json +10 -0
  57. data/test/functional/api/v2/ansible_playbooks_controller_test.rb +65 -0
  58. data/test/functional/hosts_controller_test.rb +2 -2
  59. data/test/graphql/queries/host_ansible_roles_query_test.rb +61 -0
  60. data/test/unit/import_playbooks_test.rb +51 -0
  61. data/test/unit/lib/proxy_api/ansible_test.rb +6 -0
  62. data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/AnsibleVariableOverridesTable.js +58 -75
  63. data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js +44 -58
  64. data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/AllRolesTable.js +32 -55
  65. data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/index.js +1 -1
  66. data/webpack/components/AnsibleHostDetail/components/RolesTab/EditRolesModal/EditRolesForm.js +26 -24
  67. data/webpack/components/AnsibleHostDetail/components/RolesTab/EditRolesModal/index.js +1 -1
  68. data/webpack/components/AnsibleHostDetail/components/RolesTab/RolesTable.js +29 -42
  69. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariables.js +27 -38
  70. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesActions.js +2 -1
  71. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesConstants.js +1 -0
  72. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesSelectors.js +6 -0
  73. data/webpack/components/AnsibleRolesAndVariables/index.js +7 -1
  74. data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcher.test.js +0 -2
  75. data/webpack/components/AnsibleRolesSwitcher/components/AvailableRolesList.js +2 -2
  76. data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AvailableRolesList.test.js.snap +9 -6
  77. data/webpack/helpers/pageParamsHelper.js +3 -3
  78. metadata +56 -4
  79. data/webpack/helpers/paginationHelper.js +0 -9
@@ -1,7 +1,7 @@
1
- import React, { useState, useEffect } from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { translate as __ } from 'foremanReact/common/I18n';
3
3
  import PropTypes from 'prop-types';
4
-
4
+ import { isEqual } from 'lodash';
5
5
  import { useMutation } from '@apollo/client';
6
6
 
7
7
  import { Button, Modal, Spinner } from '@patternfly/react-core';
@@ -21,17 +21,15 @@ const EditRolesForm = props => {
21
21
  actions,
22
22
  } = props;
23
23
 
24
- const [formState, setFormState] = useState({
25
- availableOptions: [],
26
- chosenOptions: [],
27
- });
24
+ const initAvailableOpt = availableRoles.map(item => item.name);
25
+ const initChosenOpt = assignedRoles.map(item => item.name);
26
+ const [availableOptions, setAvailableOptions] = useState(initAvailableOpt);
27
+ const [chosenOptions, setChosenOptions] = useState(initChosenOpt);
28
28
 
29
- useEffect(() => {
30
- setFormState({
31
- availableOptions: availableRoles.map(item => item.name),
32
- chosenOptions: assignedRoles.map(item => item.name) || [],
33
- });
34
- }, [availableRoles, assignedRoles]);
29
+ const onListChange = (nextAvailable, nextChosen) => {
30
+ setAvailableOptions(nextAvailable);
31
+ setChosenOptions(nextChosen);
32
+ };
35
33
 
36
34
  const [callMutation, { loading }] = useMutation(assignAnsibleRoles, {
37
35
  onCompleted: onCompleted(closeModal),
@@ -42,15 +40,19 @@ const EditRolesForm = props => {
42
40
 
43
41
  const variables = {
44
42
  id: encodeId('Host', hostId),
45
- ansibleRoleIds: roleNamesToIds(allRoles, formState.chosenOptions),
43
+ ansibleRoleIds: roleNamesToIds(allRoles, chosenOptions),
46
44
  };
47
45
 
46
+ const didNotModifyOptions = () =>
47
+ isEqual(initAvailableOpt.sort(), availableOptions.sort()) &&
48
+ isEqual(initChosenOpt, chosenOptions); // The order of the chosen options is important.
49
+
48
50
  const formActions = [
49
51
  <Button
50
52
  key="confirm"
51
53
  variant="primary"
52
54
  onClick={() => callMutation({ variables })}
53
- isDisabled={loading}
55
+ isDisabled={loading || didNotModifyOptions()}
54
56
  aria-label="submit ansible roles"
55
57
  >
56
58
  {__('Confirm')}
@@ -65,14 +67,9 @@ const EditRolesForm = props => {
65
67
  return (
66
68
  <Modal {...baseModalProps} actions={formActions}>
67
69
  <DualList
68
- availableOptions={formState.availableOptions}
69
- chosenOptions={formState.chosenOptions}
70
- onListChange={(newAvailable, newChosen) =>
71
- setFormState({
72
- availableOptions: newAvailable,
73
- chosenOptions: newChosen,
74
- })
75
- }
70
+ availableOptions={availableOptions}
71
+ chosenOptions={chosenOptions}
72
+ onListChange={onListChange}
76
73
  />
77
74
  </Modal>
78
75
  );
@@ -80,11 +77,16 @@ const EditRolesForm = props => {
80
77
 
81
78
  EditRolesForm.propTypes = {
82
79
  closeModal: PropTypes.func.isRequired,
83
- assignedRoles: PropTypes.array.isRequired,
84
- availableRoles: PropTypes.array.isRequired,
80
+ assignedRoles: PropTypes.array,
81
+ availableRoles: PropTypes.array,
85
82
  actions: PropTypes.array.isRequired,
86
83
  hostId: PropTypes.number.isRequired,
87
84
  baseModalProps: PropTypes.object.isRequired,
88
85
  };
89
86
 
87
+ EditRolesForm.defaultProps = {
88
+ assignedRoles: [],
89
+ availableRoles: [],
90
+ };
91
+
90
92
  export default withLoading(EditRolesForm);
@@ -20,7 +20,7 @@ const EditRolesModal = ({
20
20
  canEditHost,
21
21
  }) => {
22
22
  const baseModalProps = {
23
- width: '70%',
23
+ width: '50%',
24
24
  isOpen,
25
25
  className: 'foreman-modal',
26
26
  showClose: false,
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { translate as __ } from 'foremanReact/common/I18n';
4
4
  import { Route, Link } from 'react-router-dom';
5
- import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
5
+ import Pagination from 'foremanReact/components/Pagination';
6
6
 
7
7
  import {
8
8
  TableComposable,
@@ -12,20 +12,15 @@ import {
12
12
  Th,
13
13
  Td,
14
14
  } from '@patternfly/react-table';
15
- import { Flex, FlexItem, Button, Pagination } from '@patternfly/react-core';
15
+ import { Flex, FlexItem, Button } from '@patternfly/react-core';
16
16
 
17
17
  import EditRolesModal from './EditRolesModal';
18
18
 
19
19
  import withLoading from '../../../withLoading';
20
20
  import AllRolesModal from './AllRolesModal';
21
- import {
22
- preparePerPageOptions,
23
- refreshPage,
24
- } from '../../../../helpers/paginationHelper';
25
21
 
26
22
  const RolesTable = ({
27
23
  totalCount,
28
- pagination,
29
24
  history,
30
25
  ansibleRoles,
31
26
  hostId,
@@ -34,16 +29,6 @@ const RolesTable = ({
34
29
  }) => {
35
30
  const columns = [__('Name')];
36
31
 
37
- const handlePerPageSelected = (event, perPage) => {
38
- refreshPage(history, { page: 1, perPage });
39
- };
40
-
41
- const handlePageSelected = (event, page) => {
42
- refreshPage(history, { ...pagination, page });
43
- };
44
-
45
- const perPageOptions = preparePerPageOptions(usePaginationOptions());
46
-
47
32
  const editBtn = canEditHost ? (
48
33
  <FlexItem>
49
34
  <Link to="/Ansible/roles/edit">
@@ -67,36 +52,39 @@ const RolesTable = ({
67
52
  </Flex>
68
53
  <Flex>
69
54
  <FlexItem>{editBtn}</FlexItem>
55
+ <FlexItem align={{ default: 'alignRight' }}>
56
+ <Pagination updateParamsByUrl itemCount={totalCount} variant="top" />
57
+ </FlexItem>
58
+ </Flex>
59
+ <Flex direction={{ default: 'column' }}>
60
+ <FlexItem>
61
+ <TableComposable variant="compact">
62
+ <Thead>
63
+ <Tr>
64
+ {columns.map(col => (
65
+ <Th key={col}>{col}</Th>
66
+ ))}
67
+ </Tr>
68
+ </Thead>
69
+ <Tbody>
70
+ {ansibleRoles.map(role => (
71
+ <Tr key={role.id}>
72
+ <Td>
73
+ <a href={role.path}>{role.name}</a>
74
+ </Td>
75
+ </Tr>
76
+ ))}
77
+ </Tbody>
78
+ </TableComposable>
79
+ </FlexItem>
70
80
  <FlexItem align={{ default: 'alignRight' }}>
71
81
  <Pagination
82
+ updateParamsByUrl
72
83
  itemCount={totalCount}
73
- page={pagination.page}
74
- perPage={pagination.perPage}
75
- onSetPage={handlePageSelected}
76
- onPerPageSelect={handlePerPageSelected}
77
- perPageOptions={perPageOptions}
78
- variant="top"
84
+ variant="bottom"
79
85
  />
80
86
  </FlexItem>
81
87
  </Flex>
82
- <TableComposable variant="compact">
83
- <Thead>
84
- <Tr>
85
- {columns.map(col => (
86
- <Th key={col}>{col}</Th>
87
- ))}
88
- </Tr>
89
- </Thead>
90
- <Tbody>
91
- {ansibleRoles.map(role => (
92
- <Tr key={role.id}>
93
- <Td>
94
- <a href={role.path}>{role.name}</a>
95
- </Td>
96
- </Tr>
97
- ))}
98
- </Tbody>
99
- </TableComposable>
100
88
  <Route path="/Ansible/roles/edit">
101
89
  <EditRolesModal
102
90
  closeModal={() => history.goBack()}
@@ -123,7 +111,6 @@ RolesTable.propTypes = {
123
111
  hostId: PropTypes.number.isRequired,
124
112
  hostGlobalId: PropTypes.string.isRequired,
125
113
  history: PropTypes.object.isRequired,
126
- pagination: PropTypes.object.isRequired,
127
114
  totalCount: PropTypes.number.isRequired,
128
115
  canEditHost: PropTypes.bool.isRequired,
129
116
  };
@@ -12,9 +12,8 @@ import {
12
12
  ToolbarContent,
13
13
  ToolbarItem,
14
14
  Checkbox,
15
- Pagination,
16
15
  } from '@patternfly/react-core';
17
-
16
+ import Pagination from 'foremanReact/components/Pagination';
18
17
  import PropTypes from 'prop-types';
19
18
  import { DEFAULT_PER_PAGE } from './AnsibleRolesAndVariablesConstants';
20
19
  import './AnsibleRolesAndVariables.scss';
@@ -25,6 +24,7 @@ const ImportRolesAndVariablesTable = ({
25
24
  proxy,
26
25
  onSubmit,
27
26
  onCancel,
27
+ isImporting,
28
28
  }) => {
29
29
  const columns = columnsData.map(col => ({
30
30
  ...col,
@@ -34,10 +34,13 @@ const ImportRolesAndVariablesTable = ({
34
34
 
35
35
  const [isChecked, setIsChecked] = useState(false);
36
36
  const [selectedRowsCount, setSelectRowsCount] = useState(0);
37
-
38
- const [page, setPage] = useState();
39
- const [perPage, setPerPage] = useState(DEFAULT_PER_PAGE);
40
- const [paginatedRows, setPaginatedRows] = useState(rows.slice(0, perPage));
37
+ const [pagination, setPagination] = useState({
38
+ page: 1,
39
+ per_page: DEFAULT_PER_PAGE,
40
+ });
41
+ const [paginatedRows, setPaginatedRows] = useState(
42
+ rows.slice(0, pagination.per_page)
43
+ );
41
44
 
42
45
  const onSelect = (event, isSelected, rowId, row) => {
43
46
  const selectableRowLength = rows.filter(
@@ -68,43 +71,22 @@ const ImportRolesAndVariablesTable = ({
68
71
  onSelect(null, checked, -1);
69
72
  };
70
73
 
71
- const handleSetPage = (event, newPage) => {
72
- const startIdx = (newPage - 1) * perPage;
74
+ const handleSetPage = args => {
75
+ const startIdx = (args.page - 1) * args.per_page;
73
76
  const endIdx =
74
- rows.length < newPage * perPage ? rows.length : newPage * perPage;
75
- setPage(newPage);
77
+ rows.length < args.page * args.per_page
78
+ ? rows.length
79
+ : args.page * args.per_page;
80
+ setPagination(args);
76
81
  setPaginatedRows(rows.slice(startIdx, endIdx));
77
82
  };
78
83
 
79
- const handlePerPageSelect = (
80
- event,
81
- newPerPage,
82
- newPage,
83
- startIdx,
84
- endIdx
85
- ) => {
86
- setPerPage(newPerPage);
87
- setPage(newPage);
88
- setPaginatedRows(rows.slice(startIdx, endIdx));
89
- };
90
-
91
- const renderPagination = (variant = 'top') => (
84
+ const renderPagination = () => (
92
85
  <Pagination
93
86
  isCompact
94
87
  itemCount={rows.length}
95
- page={page}
96
- perPage={perPage}
97
- defaultToFullPage
98
- onSetPage={handleSetPage}
99
- onPerPageSelect={handlePerPageSelect}
100
- perPageOptions={[
101
- { title: '3', value: 3 },
102
- { title: '5', value: 5 },
103
- { title: '10', value: 10 },
104
- ]}
105
- titles={{
106
- paginationTitle: `${variant} pagination`,
107
- }}
88
+ perPage={pagination.per_page}
89
+ onChange={args => handleSetPage(args)}
108
90
  />
109
91
  );
110
92
 
@@ -131,10 +113,15 @@ const ImportRolesAndVariablesTable = ({
131
113
  <div className="submit-cancel-btns">
132
114
  <br />
133
115
  <br />
134
- <Button variant="primary" onClick={() => onSubmit(rows, proxy)}>
116
+ <Button
117
+ variant="primary"
118
+ onClick={() => onSubmit(rows, proxy)}
119
+ isLoading={isImporting}
120
+ isDisabled={isImporting || selectedRowsCount === 0}
121
+ >
135
122
  Submit
136
123
  </Button>
137
- <Button variant="secondary" onClick={onCancel}>
124
+ <Button variant="secondary" onClick={onCancel} isDisabled={isImporting}>
138
125
  Cancel
139
126
  </Button>
140
127
  </div>
@@ -165,6 +152,7 @@ ImportRolesAndVariablesTable.defaultProps = {
165
152
  proxy: undefined,
166
153
  onSubmit: undefined,
167
154
  onCancel: undefined,
155
+ isImporting: false,
168
156
  };
169
157
 
170
158
  ImportRolesAndVariablesTable.propTypes = {
@@ -173,6 +161,7 @@ ImportRolesAndVariablesTable.propTypes = {
173
161
  proxy: PropTypes.number,
174
162
  onSubmit: PropTypes.func,
175
163
  onCancel: PropTypes.func,
164
+ isImporting: PropTypes.bool,
176
165
  };
177
166
 
178
167
  export default ImportRolesAndVariablesTable;
@@ -4,6 +4,7 @@ import { post } from 'foremanReact/redux/API';
4
4
  import { push } from 'connected-react-router';
5
5
  import { prepareResult } from './AnsibleRolesAndVariablesHelpers';
6
6
  import {
7
+ IMPORT_ANSIBLE_V_R,
7
8
  ANSIBLE_ROLE_CONFIRM_IMPORT_PATH,
8
9
  ANSIBLE_ROLES_INDEX,
9
10
  } from './AnsibleRolesAndVariablesConstants';
@@ -14,7 +15,7 @@ export const onSubmit = (rows, proxy) => dispatch => {
14
15
  const params = prepareResult(rows);
15
16
  dispatch(
16
17
  post({
17
- key: 'import_ansible_v_r',
18
+ key: IMPORT_ANSIBLE_V_R,
18
19
  url: ANSIBLE_ROLE_CONFIRM_IMPORT_PATH,
19
20
  params: { changed: params, proxy },
20
21
  handleSuccess: () => {
@@ -1,3 +1,4 @@
1
+ export const IMPORT_ANSIBLE_V_R = 'IMPORT_ANSIBLE_V_R';
1
2
  export const ANSIBLE_ROLES_INDEX = '/ansible/ansible_roles';
2
3
  export const ANSIBLE_ROLE_CONFIRM_IMPORT_PATH =
3
4
  '/ansible/ansible_roles/confirm_import';
@@ -0,0 +1,6 @@
1
+ import { selectAPIStatus } from 'foremanReact/redux/API/APISelectors';
2
+ import { IMPORT_ANSIBLE_V_R } from './AnsibleRolesAndVariablesConstants';
3
+
4
+ // API statuses
5
+ export const selectApiImportStatus = state =>
6
+ selectAPIStatus(state, IMPORT_ANSIBLE_V_R);
@@ -1,10 +1,13 @@
1
1
  import React from 'react';
2
- import { useDispatch } from 'react-redux';
2
+ import { useDispatch, useSelector } from 'react-redux';
3
3
  import { push } from 'connected-react-router';
4
4
 
5
+ import { STATUS } from 'foremanReact/constants';
6
+
5
7
  import ImportRolesAndVariablesTable from './AnsibleRolesAndVariables';
6
8
  import { onSubmit } from './AnsibleRolesAndVariablesActions';
7
9
  import { ANSIBLE_ROLES_INDEX } from './AnsibleRolesAndVariablesConstants';
10
+ import { selectApiImportStatus } from './AnsibleRolesAndVariablesSelectors';
8
11
 
9
12
  const WrappedImportRolesAndVariables = props => {
10
13
  const cols = [
@@ -19,12 +22,15 @@ const WrappedImportRolesAndVariables = props => {
19
22
  const onCancel = () => {
20
23
  dispatch(push(ANSIBLE_ROLES_INDEX));
21
24
  };
25
+ const apiImportStatus = useSelector(selectApiImportStatus);
26
+
22
27
  return (
23
28
  <ImportRolesAndVariablesTable
24
29
  {...props}
25
30
  columnsData={cols}
26
31
  onSubmit={submit}
27
32
  onCancel={onCancel}
33
+ isImporting={apiImportStatus === STATUS.PENDING}
28
34
  />
29
35
  );
30
36
  };
@@ -2,8 +2,6 @@ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
2
 
3
3
  import AnsibleRolesSwitcher from '../AnsibleRolesSwitcher';
4
4
 
5
- jest.mock('foremanReact/components/Pagination/PaginationWrapper');
6
-
7
5
  const noop = () => {};
8
6
 
9
7
  const fixtures = {
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
 
4
4
  import { ListView, LoadingState } from 'patternfly-react';
5
- import PaginationWrapper from 'foremanReact/components/Pagination/PaginationWrapper';
5
+ import Pagination from 'foremanReact/components/Pagination';
6
6
 
7
7
  import AnsibleRole from './AnsibleRole';
8
8
 
@@ -16,7 +16,7 @@ const AvailableRolesList = ({
16
16
  }) => (
17
17
  <ListView>
18
18
  <div className="sticky-pagination">
19
- <PaginationWrapper
19
+ <Pagination
20
20
  viewType="list"
21
21
  itemCount={itemCount}
22
22
  pagination={pagination}
@@ -7,21 +7,24 @@ exports[`AvailableRolesList should render 1`] = `
7
7
  <div
8
8
  className="sticky-pagination"
9
9
  >
10
- <PaginationWrapper
11
- className=""
12
- disableNext={false}
13
- disablePrev={false}
10
+ <Pagination
11
+ className={null}
14
12
  dropdownButtonId="available-ansible-roles-pagination-row-dropdown"
15
13
  itemCount={2}
14
+ noSidePadding={false}
16
15
  onChange={[Function]}
17
- onPageSet={[Function]}
18
- onPerPageSelect={[Function]}
16
+ onPerPageSelect={null}
17
+ onSetPage={null}
18
+ page={1}
19
19
  pagination={
20
20
  Object {
21
21
  "page": 1,
22
22
  "perPage": 25,
23
23
  }
24
24
  }
25
+ perPage={null}
26
+ updateParamsByUrl={true}
27
+ variant="bottom"
25
28
  viewType="list"
26
29
  />
27
30
  </div>
@@ -14,7 +14,7 @@ export const addSearch = (basePath, params) => {
14
14
 
15
15
  export const useCurrentPagination = (
16
16
  history,
17
- keys = { page: 'page', perPage: 'perPage' }
17
+ keys = { page: 'page', perPage: 'per_page' }
18
18
  ) => {
19
19
  const pageParams = parsePageParams(history);
20
20
  const uiSettings = useForemanSettings();
@@ -28,7 +28,7 @@ export const useCurrentPagination = (
28
28
 
29
29
  export const pageToVars = (
30
30
  pagination,
31
- keys = { page: 'page', perPage: 'perPage' }
31
+ keys = { page: 'page', perPage: 'per_page' }
32
32
  ) => ({
33
33
  first: pagination[keys.page] * pagination[keys.perPage],
34
34
  last: pagination[keys.perPage],
@@ -36,5 +36,5 @@ export const pageToVars = (
36
36
 
37
37
  export const useParamsToVars = (
38
38
  history,
39
- keys = { page: 'page', perPage: 'perPage' }
39
+ keys = { page: 'page', perPage: 'per_page' }
40
40
  ) => pageToVars(useCurrentPagination(history, keys), keys);