foreman_ansible 7.0.4 → 8.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/ansible_playbooks_controller.rb +66 -0
  3. data/app/controllers/foreman_ansible/api/v2/hostgroups_controller_extensions.rb +5 -1
  4. data/app/controllers/foreman_ansible/api/v2/hosts_controller_extensions.rb +3 -1
  5. data/app/graphql/presenters/ansible_role_presenter.rb +4 -0
  6. data/app/graphql/types/ansible_role.rb +1 -0
  7. data/app/graphql/types/inherited_ansible_role.rb +4 -0
  8. data/app/helpers/foreman_ansible/hosts_helper.rb +19 -0
  9. data/app/jobs/sync_playbooks.rb +25 -0
  10. data/app/lib/proxy_api/ansible.rb +13 -0
  11. data/app/services/foreman_ansible/import_playbooks_error_notification.rb +38 -0
  12. data/app/services/foreman_ansible/import_playbooks_success_notification.rb +33 -0
  13. data/app/services/foreman_ansible/playbooks_importer.rb +73 -0
  14. data/app/services/foreman_ansible/proxy_api.rb +3 -4
  15. data/app/services/foreman_ansible/variables_importer.rb +9 -9
  16. data/app/views/ansible_roles/index.html.erb +2 -0
  17. data/app/views/api/v2/ansible_playbooks/sync.json.rabl +5 -0
  18. data/app/views/api/v2/hostgroups/ansible_roles.json.rabl +9 -1
  19. data/app/views/api/v2/hosts/ansible_roles.json.rabl +9 -1
  20. data/app/views/foreman_ansible/job_templates/ansible_roles_-_install_from_git.erb +4 -1
  21. data/app/views/foreman_ansible/job_templates/ansible_windows_updates.erb +160 -0
  22. data/config/routes.rb +10 -3
  23. data/db/migrate/20200421201839_update_ansible_inv_template_name.rb +1 -5
  24. data/db/seeds.d/90_notification_blueprints.rb +14 -0
  25. data/lib/foreman_ansible/engine.rb +0 -1
  26. data/lib/foreman_ansible/register.rb +9 -3
  27. data/lib/foreman_ansible/version.rb +1 -1
  28. data/locale/action_names.rb +4 -3
  29. data/locale/ca/foreman_ansible.edit.po +1162 -0
  30. data/locale/ca/foreman_ansible.po +360 -45
  31. data/{webpack/components/withPagination.js → locale/ca/foreman_ansible.po.time_stamp} +0 -0
  32. data/locale/cs_CZ/foreman_ansible.edit.po +1207 -0
  33. data/locale/cs_CZ/foreman_ansible.po +372 -57
  34. data/locale/cs_CZ/foreman_ansible.po.time_stamp +0 -0
  35. data/locale/de/foreman_ansible.edit.po +1148 -0
  36. data/locale/de/foreman_ansible.po +355 -40
  37. data/locale/de/foreman_ansible.po.time_stamp +0 -0
  38. data/locale/en/foreman_ansible.edit.po +1146 -0
  39. data/locale/en/foreman_ansible.po +355 -40
  40. data/locale/en/foreman_ansible.po.time_stamp +0 -0
  41. data/locale/en_GB/foreman_ansible.edit.po +1155 -0
  42. data/locale/en_GB/foreman_ansible.po +357 -42
  43. data/locale/en_GB/foreman_ansible.po.time_stamp +0 -0
  44. data/locale/es/foreman_ansible.edit.po +1148 -0
  45. data/locale/es/foreman_ansible.po +355 -40
  46. data/locale/es/foreman_ansible.po.time_stamp +0 -0
  47. data/locale/foreman_ansible.pot +767 -263
  48. data/locale/fr/foreman_ansible.edit.po +1148 -0
  49. data/locale/fr/foreman_ansible.po +355 -40
  50. data/locale/fr/foreman_ansible.po.time_stamp +0 -0
  51. data/locale/gl/foreman_ansible.edit.po +1156 -0
  52. data/locale/gl/foreman_ansible.po +358 -43
  53. data/locale/gl/foreman_ansible.po.time_stamp +0 -0
  54. data/locale/it/foreman_ansible.edit.po +1148 -0
  55. data/locale/it/foreman_ansible.po +355 -40
  56. data/locale/it/foreman_ansible.po.time_stamp +0 -0
  57. data/locale/ja/foreman_ansible.edit.po +1148 -0
  58. data/locale/ja/foreman_ansible.po +355 -40
  59. data/locale/ja/foreman_ansible.po.time_stamp +0 -0
  60. data/locale/ko/foreman_ansible.edit.po +1148 -0
  61. data/locale/ko/foreman_ansible.po +355 -40
  62. data/locale/ko/foreman_ansible.po.time_stamp +0 -0
  63. data/locale/nl_NL/foreman_ansible.edit.po +1168 -0
  64. data/locale/nl_NL/foreman_ansible.po +359 -44
  65. data/locale/nl_NL/foreman_ansible.po.time_stamp +0 -0
  66. data/locale/pl/foreman_ansible.edit.po +1180 -0
  67. data/locale/pl/foreman_ansible.po +363 -48
  68. data/locale/pl/foreman_ansible.po.time_stamp +0 -0
  69. data/locale/pt_BR/foreman_ansible.edit.po +1148 -0
  70. data/locale/pt_BR/foreman_ansible.po +355 -40
  71. data/locale/pt_BR/foreman_ansible.po.time_stamp +0 -0
  72. data/locale/ru/foreman_ansible.edit.po +1149 -0
  73. data/locale/ru/foreman_ansible.po +355 -40
  74. data/locale/ru/foreman_ansible.po.time_stamp +0 -0
  75. data/locale/sv_SE/foreman_ansible.edit.po +1180 -0
  76. data/locale/sv_SE/foreman_ansible.po +363 -48
  77. data/locale/sv_SE/foreman_ansible.po.time_stamp +0 -0
  78. data/locale/zh_CN/foreman_ansible.edit.po +1148 -0
  79. data/locale/zh_CN/foreman_ansible.po +355 -40
  80. data/locale/zh_CN/foreman_ansible.po.time_stamp +0 -0
  81. data/locale/zh_TW/foreman_ansible.edit.po +1148 -0
  82. data/locale/zh_TW/foreman_ansible.po +355 -40
  83. data/locale/zh_TW/foreman_ansible.po.time_stamp +0 -0
  84. data/test/fixtures/playbooks_example_output.json +1 -0
  85. data/test/fixtures/sample_playbooks.json +10 -0
  86. data/test/functional/api/v2/ansible_playbooks_controller_test.rb +65 -0
  87. data/test/functional/hosts_controller_test.rb +2 -2
  88. data/test/graphql/queries/host_ansible_roles_query_test.rb +61 -0
  89. data/test/unit/import_playbooks_test.rb +51 -0
  90. data/test/unit/lib/proxy_api/ansible_test.rb +6 -0
  91. data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/AnsibleVariableOverridesTable.js +58 -75
  92. data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js +44 -58
  93. data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js.orig +151 -0
  94. data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/AllRolesTable.js +43 -56
  95. data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/index.js +1 -1
  96. data/webpack/components/AnsibleHostDetail/components/RolesTab/EditRolesModal/EditRolesForm.js +26 -24
  97. data/webpack/components/AnsibleHostDetail/components/RolesTab/EditRolesModal/index.js +3 -2
  98. data/webpack/components/AnsibleHostDetail/components/RolesTab/RolesTable.js +39 -43
  99. data/webpack/components/AnsibleHostDetail/components/RolesTab/__test__/RolesTab.fixtures.js +30 -0
  100. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariables.js +27 -38
  101. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesActions.js +2 -1
  102. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesConstants.js +1 -0
  103. data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesSelectors.js +6 -0
  104. data/webpack/components/AnsibleRolesAndVariables/index.js +7 -1
  105. data/webpack/components/AnsibleRolesSwitcher/__tests__/AnsibleRolesSwitcher.test.js +0 -2
  106. data/webpack/components/AnsibleRolesSwitcher/components/AnsibleRole.js +3 -12
  107. data/webpack/components/AnsibleRolesSwitcher/components/AvailableRolesList.js +2 -2
  108. data/webpack/components/AnsibleRolesSwitcher/components/OrderedRolesTooltip.js +11 -12
  109. data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AnsibleRole.test.js.snap +6 -20
  110. data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AvailableRolesList.test.js.snap +9 -6
  111. data/webpack/components/withLoading.js +7 -12
  112. data/webpack/graphql/queries/allAnsibleRoles.gql +3 -0
  113. data/webpack/graphql/queries/hostAnsibleRoles.gql +3 -0
  114. data/webpack/helpers/pageParamsHelper.js +3 -3
  115. metadata +87 -34
  116. data/app/helpers/foreman_ansible/hosts_helper_extensions.rb +0 -30
  117. data/webpack/helpers/paginationHelper.js +0 -9
@@ -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 = {
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { ListView, Tooltip, OverlayTrigger } from 'patternfly-react';
3
+ import { ListView } from 'patternfly-react';
4
+ import { Tooltip } from '@patternfly/react-core';
4
5
  import classNames from 'classnames';
5
6
  import { translate as __ } from 'foremanReact/common/I18n';
6
7
 
@@ -13,12 +14,6 @@ const AnsibleRole = ({ role, icon, onClick, resourceName, index }) => {
13
14
  ? __('This Ansible role is inherited from parent host group')
14
15
  : __('This Ansible role is inherited from host group');
15
16
 
16
- const tooltip = (
17
- <Tooltip id={role.id}>
18
- <span>{text}</span>
19
- </Tooltip>
20
- );
21
-
22
17
  const clickHandler = (onClickFn, ansibleRole) => event => {
23
18
  event.preventDefault();
24
19
  onClickFn(ansibleRole);
@@ -48,11 +43,7 @@ const AnsibleRole = ({ role, icon, onClick, resourceName, index }) => {
48
43
  );
49
44
 
50
45
  if (role.inherited) {
51
- return (
52
- <OverlayTrigger overlay={tooltip} placement="top">
53
- {listItem()}
54
- </OverlayTrigger>
55
- );
46
+ return <Tooltip content={<span>{text}</span>}>{listItem()}</Tooltip>;
56
47
  }
57
48
 
58
49
  return listItem(clickHandler);
@@ -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}
@@ -1,22 +1,21 @@
1
1
  import React from 'react';
2
2
  import { translate as __ } from 'foremanReact/common/I18n';
3
- import { Tooltip, Icon, OverlayTrigger } from 'patternfly-react';
3
+ import { Tooltip } from '@patternfly/react-core';
4
+ import { InfoCircleIcon } from '@patternfly/react-icons';
4
5
 
5
6
  const OrderedRolesTooltip = props => {
6
- const tooltip = (
7
- <Tooltip id="assigned-ansible-roles-tooltip">
8
- <span>
9
- {__(
10
- 'Use drag and drop to change order of the roles. Ordering of roles is respected for Ansible runs, inherited roles are always before those assigned directly'
11
- )}
12
- </span>
13
- </Tooltip>
7
+ const content = (
8
+ <span>
9
+ {__(
10
+ 'Use drag and drop to change order of the roles. Ordering of roles is respected for Ansible runs, inherited roles are always before those assigned directly'
11
+ )}
12
+ </span>
14
13
  );
15
14
 
16
15
  return (
17
- <OverlayTrigger overlay={tooltip} trigger={['hover', 'focus']}>
18
- <Icon type="pf" name="info" style={{ 'margin-right': '10px' }} />
19
- </OverlayTrigger>
16
+ <Tooltip content={content}>
17
+ <InfoCircleIcon style={{ marginRight: '10px' }} />
18
+ </Tooltip>
20
19
  );
21
20
  };
22
21
 
@@ -65,25 +65,11 @@ exports[`AnsibleRole should render a role to remove 1`] = `
65
65
  `;
66
66
 
67
67
  exports[`AnsibleRole should render inherited role to remove 1`] = `
68
- <OverlayTrigger
69
- defaultOverlayShown={false}
70
- overlay={
71
- <Tooltip
72
- bsClass="tooltip"
73
- id={5}
74
- placement="right"
75
- >
76
- <span>
77
- This Ansible role is inherited from host group
78
- </span>
79
- </Tooltip>
80
- }
81
- placement="top"
82
- trigger={
83
- Array [
84
- "hover",
85
- "focus",
86
- ]
68
+ <Tooltip
69
+ content={
70
+ <span>
71
+ This Ansible role is inherited from host group
72
+ </span>
87
73
  }
88
74
  >
89
75
  <ListViewItem
@@ -104,5 +90,5 @@ exports[`AnsibleRole should render inherited role to remove 1`] = `
104
90
  onExpandClose={[Function]}
105
91
  stacked={true}
106
92
  />
107
- </OverlayTrigger>
93
+ </Tooltip>
108
94
  `;
@@ -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>
@@ -13,14 +13,12 @@ import {
13
13
  } from '../permissionsHelper';
14
14
  import ErrorState from './ErrorState';
15
15
 
16
- const pluckData = (data, path) => {
16
+ const getResultsLength = (data, path) => {
17
17
  const split = path.split('.');
18
- return split.reduce((memo, item) => {
19
- if (item) {
20
- return memo[item];
21
- }
22
- throw new Error('Unexpected empty segment in response data path');
23
- }, data);
18
+ return split.reduce(
19
+ (prevValue, currentValue) => prevValue + data[currentValue]?.length || 0,
20
+ 0
21
+ );
24
22
  };
25
23
 
26
24
  const withLoading = Component => {
@@ -79,12 +77,9 @@ const withLoading = Component => {
79
77
  }
80
78
 
81
79
  const renamedData = renameData(data);
82
- const result = pluckData(renamedData, renamedDataPath);
80
+ const resultLength = getResultsLength(renamedData, renamedDataPath);
83
81
 
84
- if (
85
- showEmptyState &&
86
- ((Array.isArray(result) && result.length === 0) || !result)
87
- ) {
82
+ if (showEmptyState && !resultLength) {
88
83
  return emptyWrapper(
89
84
  <EmptyState
90
85
  {...{
@@ -7,6 +7,9 @@ query($id: String!, $first: Int, $last: Int){
7
7
  id
8
8
  name
9
9
  inherited
10
+ ansibleVariables {
11
+ totalCount
12
+ }
10
13
  }
11
14
  }
12
15
  }
@@ -9,6 +9,9 @@ query($id: String!, $first: Int, $last: Int) {
9
9
  id
10
10
  name
11
11
  path
12
+ ansibleVariables {
13
+ totalCount
14
+ }
12
15
  }
13
16
  }
14
17
  }
@@ -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);