foreman_ansible 7.0.4 → 7.1.0
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/api/v2/ansible_playbooks_controller.rb +66 -0
 - data/app/jobs/sync_playbooks.rb +25 -0
 - data/app/lib/proxy_api/ansible.rb +13 -0
 - data/app/services/foreman_ansible/import_playbooks_error_notification.rb +38 -0
 - data/app/services/foreman_ansible/import_playbooks_success_notification.rb +33 -0
 - data/app/services/foreman_ansible/playbooks_importer.rb +73 -0
 - data/app/services/foreman_ansible/proxy_api.rb +3 -4
 - data/app/views/ansible_roles/index.html.erb +2 -0
 - data/app/views/api/v2/ansible_playbooks/sync.json.rabl +5 -0
 - data/app/views/foreman_ansible/job_templates/ansible_windows_updates.erb +160 -0
 - data/app/views/foreman_ansible/job_templates/configure_cloud_connector_-_ansible_default.erb +37 -0
 - data/config/routes.rb +7 -0
 - data/db/seeds.d/90_notification_blueprints.rb +14 -0
 - data/lib/foreman_ansible/register.rb +3 -1
 - data/lib/foreman_ansible/remote_execution.rb +6 -0
 - data/lib/foreman_ansible/version.rb +1 -1
 - data/test/fixtures/playbooks_example_output.json +1 -0
 - data/test/fixtures/sample_playbooks.json +10 -0
 - data/test/functional/api/v2/ansible_playbooks_controller_test.rb +65 -0
 - data/test/functional/hosts_controller_test.rb +2 -2
 - data/test/unit/import_playbooks_test.rb +51 -0
 - data/test/unit/lib/proxy_api/ansible_test.rb +6 -0
 - data/webpack/components/AnsibleHostDetail/components/AnsibleVariableOverrides/AnsibleVariableOverridesTable.js +58 -75
 - data/webpack/components/AnsibleHostDetail/components/JobsTab/PreviousJobsTable.js +44 -58
 - data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/AllRolesTable.js +32 -55
 - data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/index.js +1 -1
 - data/webpack/components/AnsibleHostDetail/components/RolesTab/RolesTable.js +29 -42
 - data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariables.js +27 -38
 - data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesActions.js +2 -1
 - data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesConstants.js +1 -0
 - data/webpack/components/AnsibleRolesAndVariables/AnsibleRolesAndVariablesSelectors.js +6 -0
 - data/webpack/components/AnsibleRolesAndVariables/index.js +7 -1
 - data/webpack/components/AnsibleRolesSwitcher/components/AvailableRolesList.js +2 -2
 - data/webpack/components/AnsibleRolesSwitcher/components/__snapshots__/AvailableRolesList.test.js.snap +9 -6
 - data/webpack/helpers/pageParamsHelper.js +3 -3
 - metadata +46 -31
 - data/webpack/components/withPagination.js +0 -0
 - data/webpack/helpers/paginationHelper.js +0 -9
 
| 
         @@ -20,7 +20,7 @@ class HostsControllerExtensionsTest < ActionController::TestCase 
     | 
|
| 
       20 
20 
     | 
    
         
             
                             0 => { :ansible_role_id => @role.id, :position => 0 }
         
     | 
| 
       21 
21 
     | 
    
         
             
                           } }
         
     | 
| 
       22 
22 
     | 
    
         
             
                  post :create, :params => { :host => host }, :session => set_session_user
         
     | 
| 
       23 
     | 
    
         
            -
                  assert_redirected_to  
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_redirected_to host_details_page_url(assigns('host'))
         
     | 
| 
       24 
24 
     | 
    
         
             
                  assert assigns('host').ansible_roles, [@role]
         
     | 
| 
       25 
25 
     | 
    
         
             
                end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
         @@ -34,7 +34,7 @@ class HostsControllerExtensionsTest < ActionController::TestCase 
     | 
|
| 
       34 
34 
     | 
    
         
             
                         } }
         
     | 
| 
       35 
35 
     | 
    
         
             
                       },
         
     | 
| 
       36 
36 
     | 
    
         
             
                       :session => set_session_user
         
     | 
| 
       37 
     | 
    
         
            -
                  assert_redirected_to  
     | 
| 
      
 37 
     | 
    
         
            +
                  assert_redirected_to host_details_page_url(assigns('host'))
         
     | 
| 
       38 
38 
     | 
    
         
             
                  assert_equal assigns('host').ansible_roles, [@role]
         
     | 
| 
       39 
39 
     | 
    
         
             
                end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'test_plugin_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class ImportPlaybooksTest < ActiveSupport::TestCase
         
     | 
| 
      
 4 
     | 
    
         
            +
              let(:ansible_proxy) { FactoryBot.create(:smart_proxy, :with_ansible) }
         
     | 
| 
      
 5 
     | 
    
         
            +
              let(:proxy_api) { ::ProxyAPI::Ansible.new(url: ansible_proxy.url) }
         
     | 
| 
      
 6 
     | 
    
         
            +
              subject { ::ForemanAnsible::PlaybooksImporter.new(ansible_proxy) }
         
     | 
| 
      
 7 
     | 
    
         
            +
              let(:sample_playbooks) { JSON.parse(File.read(ansible_fixture_file('sample_playbooks.json'))) }
         
     | 
| 
      
 8 
     | 
    
         
            +
              let(:playbook1_output) { sample_playbooks.first }
         
     | 
| 
      
 9 
     | 
    
         
            +
              let(:playbook2_output) { sample_playbooks.last }
         
     | 
| 
      
 10 
     | 
    
         
            +
              let(:first_playbook) { ['xprazak2.forklift_collection.foreman_provisioning.yml'] }
         
     | 
| 
      
 11 
     | 
    
         
            +
              let(:second_playbook) { ['xprazak2.forklift_collection.collect_debug_draft.yml'] }
         
     | 
| 
      
 12 
     | 
    
         
            +
              let(:playbook1_template) { JSON.parse(File.read(ansible_fixture_file('playbooks_example_output.json')))['template'] }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              setup do
         
     | 
| 
      
 15 
     | 
    
         
            +
                subject.stubs(:proxy_api).returns(proxy_api)
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              describe 'check the job templates that were created due to the import' do
         
     | 
| 
      
 19 
     | 
    
         
            +
                test 'should just create job templates from playbooks' do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  subject.expects(:playbooks).with(second_playbook).returns([playbook2_output])
         
     | 
| 
      
 21 
     | 
    
         
            +
                  actual = subject.import_playbooks(second_playbook)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  assert_not_nil actual_created = actual[:created]
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_equal 1, actual_created.count
         
     | 
| 
      
 24 
     | 
    
         
            +
                  job_template = JobTemplate.where(id: actual_created.keys.first).first
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert_equal job_template.name, actual_created.values.first
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              describe 'check the updated job templated due to import playbooks' do
         
     | 
| 
      
 30 
     | 
    
         
            +
                test ' should not update an identical job template' do
         
     | 
| 
      
 31 
     | 
    
         
            +
                  FactoryBot.create(:job_template, id: 111, name: playbook1_output['name'],
         
     | 
| 
      
 32 
     | 
    
         
            +
                                                   template: playbook1_template)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  subject.expects(:playbooks).with(first_playbook).returns([playbook1_output])
         
     | 
| 
      
 34 
     | 
    
         
            +
                  actual = subject.import_playbooks(first_playbook)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  assert_not_nil actual_updated =  actual[:updated]
         
     | 
| 
      
 36 
     | 
    
         
            +
                  assert_not_nil actual_created =  actual[:created]
         
     | 
| 
      
 37 
     | 
    
         
            +
                  assert_equal 0, actual_updated.count
         
     | 
| 
      
 38 
     | 
    
         
            +
                  assert_equal 0, actual_created.count
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                test ' should just update a job template from playbooks' do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  job_template = FactoryBot.create(:job_template, id: 112, name: playbook2_output['name'], template: 'check')
         
     | 
| 
      
 43 
     | 
    
         
            +
                  subject.expects(:playbooks).with(second_playbook).returns([playbook2_output])
         
     | 
| 
      
 44 
     | 
    
         
            +
                  actual = subject.import_playbooks(second_playbook)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  assert_not_nil actual_updated = actual[:updated]
         
     | 
| 
      
 46 
     | 
    
         
            +
                  assert_equal 1, actual_updated.count
         
     | 
| 
      
 47 
     | 
    
         
            +
                  assert_equal actual_updated.keys.first, job_template.id
         
     | 
| 
      
 48 
     | 
    
         
            +
                  assert_not_nil job_template.template
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
              end
         
     | 
| 
      
 51 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -14,6 +14,12 @@ class AnsibleTest < ActiveSupport::TestCase 
     | 
|
| 
       14 
14 
     | 
    
         
             
                assert_equal roles, @proxy_api.roles
         
     | 
| 
       15 
15 
     | 
    
         
             
              end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
              test 'should get ansible playbooks from proxy' do
         
     | 
| 
      
 18 
     | 
    
         
            +
                playbooks = ['some_playbook.some_author', 'test_playbook.test_author']
         
     | 
| 
      
 19 
     | 
    
         
            +
                @proxy_api.expects(:get).returns(fake_rest_client_response(playbooks))
         
     | 
| 
      
 20 
     | 
    
         
            +
                assert_equal playbooks, @proxy_api.playbooks
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       17 
23 
     | 
    
         
             
              test 'should raise error with appropriate message' do
         
     | 
| 
       18 
24 
     | 
    
         
             
                message = 'Connection refused'
         
     | 
| 
       19 
25 
     | 
    
         
             
                @proxy_api.expects(:get).raises(Errno::ECONNREFUSED, message)
         
     | 
| 
         @@ -4,7 +4,6 @@ import { useDispatch } from 'react-redux'; 
     | 
|
| 
       4 
4 
     | 
    
         
             
            import { useMutation } from '@apollo/client';
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            import { sprintf, translate as __ } from 'foremanReact/common/I18n';
         
     | 
| 
       7 
     | 
    
         
            -
            import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
         
     | 
| 
       8 
7 
     | 
    
         
             
            import { openConfirmModal } from 'foremanReact/components/ConfirmModal';
         
     | 
| 
       9 
8 
     | 
    
         
             
            import {
         
     | 
| 
       10 
9 
     | 
    
         
             
              TableComposable,
         
     | 
| 
         @@ -14,8 +13,9 @@ import { 
     | 
|
| 
       14 
13 
     | 
    
         
             
              Th,
         
     | 
| 
       15 
14 
     | 
    
         
             
              Td,
         
     | 
| 
       16 
15 
     | 
    
         
             
            } from '@patternfly/react-table';
         
     | 
| 
       17 
     | 
    
         
            -
            import { Flex, FlexItem 
     | 
| 
      
 16 
     | 
    
         
            +
            import { Flex, FlexItem } from '@patternfly/react-core';
         
     | 
| 
       18 
17 
     | 
    
         | 
| 
      
 18 
     | 
    
         
            +
            import Pagination from 'foremanReact/components/Pagination';
         
     | 
| 
       19 
19 
     | 
    
         
             
            import deleteAnsibleVariableOverride from '../../../../graphql/mutations/deleteAnsibleVariableOverride.gql';
         
     | 
| 
       20 
20 
     | 
    
         
             
            import EditableAction from './EditableAction';
         
     | 
| 
       21 
21 
     | 
    
         
             
            import EditableValue from './EditableValue';
         
     | 
| 
         @@ -29,10 +29,6 @@ import { 
     | 
|
| 
       29 
29 
     | 
    
         
             
            } from './AnsibleVariableOverridesTableHelper';
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
            import withLoading from '../../../withLoading';
         
     | 
| 
       32 
     | 
    
         
            -
            import {
         
     | 
| 
       33 
     | 
    
         
            -
              preparePerPageOptions,
         
     | 
| 
       34 
     | 
    
         
            -
              refreshPage,
         
     | 
| 
       35 
     | 
    
         
            -
            } from '../../../../helpers/paginationHelper';
         
     | 
| 
       36 
32 
     | 
    
         | 
| 
       37 
33 
     | 
    
         
             
            const reducer = (state, action) =>
         
     | 
| 
       38 
34 
     | 
    
         
             
              state.map((item, index) => {
         
     | 
| 
         @@ -58,8 +54,6 @@ const AnsibleVariableOverridesTable = ({ 
     | 
|
| 
       58 
54 
     | 
    
         
             
              hostId,
         
     | 
| 
       59 
55 
     | 
    
         
             
              hostGlobalId,
         
     | 
| 
       60 
56 
     | 
    
         
             
              totalCount,
         
     | 
| 
       61 
     | 
    
         
            -
              pagination,
         
     | 
| 
       62 
     | 
    
         
            -
              history,
         
     | 
| 
       63 
57 
     | 
    
         
             
            }) => {
         
     | 
| 
       64 
58 
     | 
    
         
             
              const columns = [
         
     | 
| 
       65 
59 
     | 
    
         
             
                __('Name'),
         
     | 
| 
         @@ -69,16 +63,6 @@ const AnsibleVariableOverridesTable = ({ 
     | 
|
| 
       69 
63 
     | 
    
         
             
                __('Source attribute'),
         
     | 
| 
       70 
64 
     | 
    
         
             
              ];
         
     | 
| 
       71 
65 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
              const handlePerPageSelected = (event, perPage) => {
         
     | 
| 
       73 
     | 
    
         
            -
                refreshPage(history, { page: 1, perPage });
         
     | 
| 
       74 
     | 
    
         
            -
              };
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
              const handlePageSelected = (event, page) => {
         
     | 
| 
       77 
     | 
    
         
            -
                refreshPage(history, { ...pagination, page });
         
     | 
| 
       78 
     | 
    
         
            -
              };
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
              const perPageOptions = preparePerPageOptions(usePaginationOptions());
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
66 
     | 
    
         
             
              const [editableState, innerDispatch] = useReducer(
         
     | 
| 
       83 
67 
     | 
    
         
             
                reducer,
         
     | 
| 
       84 
68 
     | 
    
         
             
                variables,
         
     | 
| 
         @@ -162,67 +146,68 @@ const AnsibleVariableOverridesTable = ({ 
     | 
|
| 
       162 
146 
     | 
    
         | 
| 
       163 
147 
     | 
    
         
             
              return (
         
     | 
| 
       164 
148 
     | 
    
         
             
                <React.Fragment>
         
     | 
| 
       165 
     | 
    
         
            -
                  <Flex>
         
     | 
| 
      
 149 
     | 
    
         
            +
                  <Flex direction={{ default: 'column' }}>
         
     | 
| 
      
 150 
     | 
    
         
            +
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
      
 151 
     | 
    
         
            +
                      <Pagination updateParamsByUrl itemCount={totalCount} variant="top" />
         
     | 
| 
      
 152 
     | 
    
         
            +
                    </FlexItem>
         
     | 
| 
      
 153 
     | 
    
         
            +
                    <FlexItem>
         
     | 
| 
      
 154 
     | 
    
         
            +
                      <TableComposable variant="compact">
         
     | 
| 
      
 155 
     | 
    
         
            +
                        <Thead>
         
     | 
| 
      
 156 
     | 
    
         
            +
                          <Tr>
         
     | 
| 
      
 157 
     | 
    
         
            +
                            {columns.map(col => (
         
     | 
| 
      
 158 
     | 
    
         
            +
                              <Th key={col}>{col}</Th>
         
     | 
| 
      
 159 
     | 
    
         
            +
                            ))}
         
     | 
| 
      
 160 
     | 
    
         
            +
                            <Th />
         
     | 
| 
      
 161 
     | 
    
         
            +
                          </Tr>
         
     | 
| 
      
 162 
     | 
    
         
            +
                        </Thead>
         
     | 
| 
      
 163 
     | 
    
         
            +
                        <Tbody>
         
     | 
| 
      
 164 
     | 
    
         
            +
                          {variables.map((variable, idx) => (
         
     | 
| 
      
 165 
     | 
    
         
            +
                            <Tr key={idx}>
         
     | 
| 
      
 166 
     | 
    
         
            +
                              <Td>
         
     | 
| 
      
 167 
     | 
    
         
            +
                                <a href={variable.path}>{variable.key}</a>
         
     | 
| 
      
 168 
     | 
    
         
            +
                              </Td>
         
     | 
| 
      
 169 
     | 
    
         
            +
                              <Td>{variable.ansibleRoleName}</Td>
         
     | 
| 
      
 170 
     | 
    
         
            +
                              <Td>{variable.parameterType}</Td>
         
     | 
| 
      
 171 
     | 
    
         
            +
                              <Td>
         
     | 
| 
      
 172 
     | 
    
         
            +
                                <EditableValue
         
     | 
| 
      
 173 
     | 
    
         
            +
                                  variable={variable}
         
     | 
| 
      
 174 
     | 
    
         
            +
                                  editing={editableState[idx].open}
         
     | 
| 
      
 175 
     | 
    
         
            +
                                  onChange={onValueChange(idx, variable)}
         
     | 
| 
      
 176 
     | 
    
         
            +
                                  value={editableState[idx].value}
         
     | 
| 
      
 177 
     | 
    
         
            +
                                  validation={editableState[idx].validation}
         
     | 
| 
      
 178 
     | 
    
         
            +
                                  working={editableState[idx].working}
         
     | 
| 
      
 179 
     | 
    
         
            +
                                />
         
     | 
| 
      
 180 
     | 
    
         
            +
                              </Td>
         
     | 
| 
      
 181 
     | 
    
         
            +
                              <Td>{formatSourceAttr(variable)}</Td>
         
     | 
| 
      
 182 
     | 
    
         
            +
                              <Td>
         
     | 
| 
      
 183 
     | 
    
         
            +
                                <EditableAction
         
     | 
| 
      
 184 
     | 
    
         
            +
                                  open={editableState[idx].open}
         
     | 
| 
      
 185 
     | 
    
         
            +
                                  onClose={setEditable(idx, false)}
         
     | 
| 
      
 186 
     | 
    
         
            +
                                  onOpen={setEditable(idx, true)}
         
     | 
| 
      
 187 
     | 
    
         
            +
                                  toggleWorking={toggleWorking(idx)}
         
     | 
| 
      
 188 
     | 
    
         
            +
                                  variable={variable}
         
     | 
| 
      
 189 
     | 
    
         
            +
                                  state={editableState[idx]}
         
     | 
| 
      
 190 
     | 
    
         
            +
                                  hostId={hostId}
         
     | 
| 
      
 191 
     | 
    
         
            +
                                  hostName={hostAttrs.name}
         
     | 
| 
      
 192 
     | 
    
         
            +
                                  hostGlobalId={hostGlobalId}
         
     | 
| 
      
 193 
     | 
    
         
            +
                                  onSubmitSuccess={onSubmitSuccess(idx, variable)}
         
     | 
| 
      
 194 
     | 
    
         
            +
                                  onValidationError={onValidationError(idx)}
         
     | 
| 
      
 195 
     | 
    
         
            +
                                />
         
     | 
| 
      
 196 
     | 
    
         
            +
                              </Td>
         
     | 
| 
      
 197 
     | 
    
         
            +
                              <Td actions={{ items: actionsResolver(variable, idx) }} />
         
     | 
| 
      
 198 
     | 
    
         
            +
                            </Tr>
         
     | 
| 
      
 199 
     | 
    
         
            +
                          ))}
         
     | 
| 
      
 200 
     | 
    
         
            +
                        </Tbody>
         
     | 
| 
      
 201 
     | 
    
         
            +
                      </TableComposable>
         
     | 
| 
      
 202 
     | 
    
         
            +
                    </FlexItem>
         
     | 
| 
       166 
203 
     | 
    
         
             
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
       167 
204 
     | 
    
         
             
                      <Pagination
         
     | 
| 
      
 205 
     | 
    
         
            +
                        updateParamsByUrl
         
     | 
| 
       168 
206 
     | 
    
         
             
                        itemCount={totalCount}
         
     | 
| 
       169 
     | 
    
         
            -
                         
     | 
| 
       170 
     | 
    
         
            -
                        perPage={pagination.perPage}
         
     | 
| 
       171 
     | 
    
         
            -
                        onSetPage={handlePageSelected}
         
     | 
| 
       172 
     | 
    
         
            -
                        onPerPageSelect={handlePerPageSelected}
         
     | 
| 
       173 
     | 
    
         
            -
                        perPageOptions={perPageOptions}
         
     | 
| 
       174 
     | 
    
         
            -
                        variant="top"
         
     | 
| 
      
 207 
     | 
    
         
            +
                        variant="bottom"
         
     | 
| 
       175 
208 
     | 
    
         
             
                      />
         
     | 
| 
       176 
209 
     | 
    
         
             
                    </FlexItem>
         
     | 
| 
       177 
210 
     | 
    
         
             
                  </Flex>
         
     | 
| 
       178 
     | 
    
         
            -
                  <TableComposable variant="compact">
         
     | 
| 
       179 
     | 
    
         
            -
                    <Thead>
         
     | 
| 
       180 
     | 
    
         
            -
                      <Tr>
         
     | 
| 
       181 
     | 
    
         
            -
                        {columns.map(col => (
         
     | 
| 
       182 
     | 
    
         
            -
                          <Th key={col}>{col}</Th>
         
     | 
| 
       183 
     | 
    
         
            -
                        ))}
         
     | 
| 
       184 
     | 
    
         
            -
                        <Th />
         
     | 
| 
       185 
     | 
    
         
            -
                      </Tr>
         
     | 
| 
       186 
     | 
    
         
            -
                    </Thead>
         
     | 
| 
       187 
     | 
    
         
            -
                    <Tbody>
         
     | 
| 
       188 
     | 
    
         
            -
                      {variables.map((variable, idx) => (
         
     | 
| 
       189 
     | 
    
         
            -
                        <Tr key={idx}>
         
     | 
| 
       190 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       191 
     | 
    
         
            -
                            <a href={variable.path}>{variable.key}</a>
         
     | 
| 
       192 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       193 
     | 
    
         
            -
                          <Td>{variable.ansibleRoleName}</Td>
         
     | 
| 
       194 
     | 
    
         
            -
                          <Td>{variable.parameterType}</Td>
         
     | 
| 
       195 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       196 
     | 
    
         
            -
                            <EditableValue
         
     | 
| 
       197 
     | 
    
         
            -
                              variable={variable}
         
     | 
| 
       198 
     | 
    
         
            -
                              editing={editableState[idx].open}
         
     | 
| 
       199 
     | 
    
         
            -
                              onChange={onValueChange(idx, variable)}
         
     | 
| 
       200 
     | 
    
         
            -
                              value={editableState[idx].value}
         
     | 
| 
       201 
     | 
    
         
            -
                              validation={editableState[idx].validation}
         
     | 
| 
       202 
     | 
    
         
            -
                              working={editableState[idx].working}
         
     | 
| 
       203 
     | 
    
         
            -
                            />
         
     | 
| 
       204 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       205 
     | 
    
         
            -
                          <Td>{formatSourceAttr(variable)}</Td>
         
     | 
| 
       206 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       207 
     | 
    
         
            -
                            <EditableAction
         
     | 
| 
       208 
     | 
    
         
            -
                              open={editableState[idx].open}
         
     | 
| 
       209 
     | 
    
         
            -
                              onClose={setEditable(idx, false)}
         
     | 
| 
       210 
     | 
    
         
            -
                              onOpen={setEditable(idx, true)}
         
     | 
| 
       211 
     | 
    
         
            -
                              toggleWorking={toggleWorking(idx)}
         
     | 
| 
       212 
     | 
    
         
            -
                              variable={variable}
         
     | 
| 
       213 
     | 
    
         
            -
                              state={editableState[idx]}
         
     | 
| 
       214 
     | 
    
         
            -
                              hostId={hostId}
         
     | 
| 
       215 
     | 
    
         
            -
                              hostName={hostAttrs.name}
         
     | 
| 
       216 
     | 
    
         
            -
                              hostGlobalId={hostGlobalId}
         
     | 
| 
       217 
     | 
    
         
            -
                              onSubmitSuccess={onSubmitSuccess(idx, variable)}
         
     | 
| 
       218 
     | 
    
         
            -
                              onValidationError={onValidationError(idx)}
         
     | 
| 
       219 
     | 
    
         
            -
                            />
         
     | 
| 
       220 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       221 
     | 
    
         
            -
                          <Td actions={{ items: actionsResolver(variable, idx) }} />
         
     | 
| 
       222 
     | 
    
         
            -
                        </Tr>
         
     | 
| 
       223 
     | 
    
         
            -
                      ))}
         
     | 
| 
       224 
     | 
    
         
            -
                    </Tbody>
         
     | 
| 
       225 
     | 
    
         
            -
                  </TableComposable>
         
     | 
| 
       226 
211 
     | 
    
         
             
                </React.Fragment>
         
     | 
| 
       227 
212 
     | 
    
         
             
              );
         
     | 
| 
       228 
213 
     | 
    
         
             
            };
         
     | 
| 
         @@ -233,8 +218,6 @@ AnsibleVariableOverridesTable.propTypes = { 
     | 
|
| 
       233 
218 
     | 
    
         
             
              hostId: PropTypes.number.isRequired,
         
     | 
| 
       234 
219 
     | 
    
         
             
              hostGlobalId: PropTypes.string.isRequired,
         
     | 
| 
       235 
220 
     | 
    
         
             
              totalCount: PropTypes.number.isRequired,
         
     | 
| 
       236 
     | 
    
         
            -
              pagination: PropTypes.object.isRequired,
         
     | 
| 
       237 
     | 
    
         
            -
              history: PropTypes.object.isRequired,
         
     | 
| 
       238 
221 
     | 
    
         
             
            };
         
     | 
| 
       239 
222 
     | 
    
         | 
| 
       240 
223 
     | 
    
         
             
            export default withLoading(AnsibleVariableOverridesTable);
         
     | 
| 
         @@ -1,8 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            import React from 'react';
         
     | 
| 
       2 
2 
     | 
    
         
             
            import PropTypes from 'prop-types';
         
     | 
| 
       3 
3 
     | 
    
         
             
            import { translate as __ } from 'foremanReact/common/I18n';
         
     | 
| 
       4 
     | 
    
         
            -
            import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
4 
     | 
    
         
             
            import RelativeDateTime from 'foremanReact/components/common/dates/RelativeDateTime';
         
     | 
| 
       7 
5 
     | 
    
         | 
| 
       8 
6 
     | 
    
         
             
            import {
         
     | 
| 
         @@ -13,15 +11,12 @@ import { 
     | 
|
| 
       13 
11 
     | 
    
         
             
              Th,
         
     | 
| 
       14 
12 
     | 
    
         
             
              Td,
         
     | 
| 
       15 
13 
     | 
    
         
             
            } from '@patternfly/react-table';
         
     | 
| 
       16 
     | 
    
         
            -
            import { Flex, FlexItem 
     | 
| 
      
 14 
     | 
    
         
            +
            import { Flex, FlexItem } from '@patternfly/react-core';
         
     | 
| 
      
 15 
     | 
    
         
            +
            import Pagination from 'foremanReact/components/Pagination';
         
     | 
| 
       17 
16 
     | 
    
         | 
| 
       18 
17 
     | 
    
         
             
            import { decodeId } from '../../../../globalIdHelper';
         
     | 
| 
       19 
18 
     | 
    
         
             
            import withLoading from '../../../withLoading';
         
     | 
| 
       20 
19 
     | 
    
         
             
            import { readableCron, readablePurpose } from './JobsTabHelper';
         
     | 
| 
       21 
     | 
    
         
            -
            import {
         
     | 
| 
       22 
     | 
    
         
            -
              preparePerPageOptions,
         
     | 
| 
       23 
     | 
    
         
            -
              refreshPage,
         
     | 
| 
       24 
     | 
    
         
            -
            } from '../../../../helpers/paginationHelper';
         
     | 
| 
       25 
20 
     | 
    
         | 
| 
       26 
21 
     | 
    
         
             
            const PreviousJobsTable = ({ history, totalCount, jobs, pagination }) => {
         
     | 
| 
       27 
22 
     | 
    
         
             
              const columns = [
         
     | 
| 
         @@ -32,66 +27,57 @@ const PreviousJobsTable = ({ history, totalCount, jobs, pagination }) => { 
     | 
|
| 
       32 
27 
     | 
    
         
             
                __('Schedule'),
         
     | 
| 
       33 
28 
     | 
    
         
             
              ];
         
     | 
| 
       34 
29 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
              const handlePerPageSelected = (event, perPage) => {
         
     | 
| 
       36 
     | 
    
         
            -
                refreshPage(history, { page: 1, perPage });
         
     | 
| 
       37 
     | 
    
         
            -
              };
         
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
              const handlePageSelected = (event, page) => {
         
     | 
| 
       40 
     | 
    
         
            -
                refreshPage(history, { ...pagination, page });
         
     | 
| 
       41 
     | 
    
         
            -
              };
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
              const perPageOptions = preparePerPageOptions(usePaginationOptions());
         
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
30 
     | 
    
         
             
              return (
         
     | 
| 
       46 
31 
     | 
    
         
             
                <React.Fragment>
         
     | 
| 
       47 
32 
     | 
    
         
             
                  <h3>{__('Previously executed jobs')}</h3>
         
     | 
| 
       48 
     | 
    
         
            -
                  <Flex className="pf-u-pt-md">
         
     | 
| 
      
 33 
     | 
    
         
            +
                  <Flex direction={{ default: 'column' }} className="pf-u-pt-md">
         
     | 
| 
      
 34 
     | 
    
         
            +
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
      
 35 
     | 
    
         
            +
                      <Pagination updateParamsByUrl itemCount={totalCount} variant="top" />
         
     | 
| 
      
 36 
     | 
    
         
            +
                    </FlexItem>
         
     | 
| 
      
 37 
     | 
    
         
            +
                    <FlexItem>
         
     | 
| 
      
 38 
     | 
    
         
            +
                      <TableComposable variant="compact">
         
     | 
| 
      
 39 
     | 
    
         
            +
                        <Thead>
         
     | 
| 
      
 40 
     | 
    
         
            +
                          <Tr>
         
     | 
| 
      
 41 
     | 
    
         
            +
                            {columns.map(col => (
         
     | 
| 
      
 42 
     | 
    
         
            +
                              <Th key={col}>{col}</Th>
         
     | 
| 
      
 43 
     | 
    
         
            +
                            ))}
         
     | 
| 
      
 44 
     | 
    
         
            +
                          </Tr>
         
     | 
| 
      
 45 
     | 
    
         
            +
                        </Thead>
         
     | 
| 
      
 46 
     | 
    
         
            +
                        <Tbody>
         
     | 
| 
      
 47 
     | 
    
         
            +
                          {jobs.map(job => (
         
     | 
| 
      
 48 
     | 
    
         
            +
                            <Tr key={job.id}>
         
     | 
| 
      
 49 
     | 
    
         
            +
                              <Td>
         
     | 
| 
      
 50 
     | 
    
         
            +
                                <a
         
     | 
| 
      
 51 
     | 
    
         
            +
                                  onClick={() =>
         
     | 
| 
      
 52 
     | 
    
         
            +
                                    window.tfm.nav.pushUrl(
         
     | 
| 
      
 53 
     | 
    
         
            +
                                      `/job_invocations/${decodeId(job.id)}`
         
     | 
| 
      
 54 
     | 
    
         
            +
                                    )
         
     | 
| 
      
 55 
     | 
    
         
            +
                                  }
         
     | 
| 
      
 56 
     | 
    
         
            +
                                >
         
     | 
| 
      
 57 
     | 
    
         
            +
                                  {job.description}
         
     | 
| 
      
 58 
     | 
    
         
            +
                                </a>
         
     | 
| 
      
 59 
     | 
    
         
            +
                                 
         
     | 
| 
      
 60 
     | 
    
         
            +
                                {readablePurpose(job.recurringLogic.purpose)}
         
     | 
| 
      
 61 
     | 
    
         
            +
                              </Td>
         
     | 
| 
      
 62 
     | 
    
         
            +
                              <Td>{job.task.result}</Td>
         
     | 
| 
      
 63 
     | 
    
         
            +
                              <Td>{job.task.state}</Td>
         
     | 
| 
      
 64 
     | 
    
         
            +
                              <Td>
         
     | 
| 
      
 65 
     | 
    
         
            +
                                <RelativeDateTime date={job.startAt} />
         
     | 
| 
      
 66 
     | 
    
         
            +
                              </Td>
         
     | 
| 
      
 67 
     | 
    
         
            +
                              <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
         
     | 
| 
      
 68 
     | 
    
         
            +
                            </Tr>
         
     | 
| 
      
 69 
     | 
    
         
            +
                          ))}
         
     | 
| 
      
 70 
     | 
    
         
            +
                        </Tbody>
         
     | 
| 
      
 71 
     | 
    
         
            +
                      </TableComposable>
         
     | 
| 
      
 72 
     | 
    
         
            +
                    </FlexItem>
         
     | 
| 
       49 
73 
     | 
    
         
             
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
       50 
74 
     | 
    
         
             
                      <Pagination
         
     | 
| 
      
 75 
     | 
    
         
            +
                        updateParamsByUrl
         
     | 
| 
       51 
76 
     | 
    
         
             
                        itemCount={totalCount}
         
     | 
| 
       52 
     | 
    
         
            -
                         
     | 
| 
       53 
     | 
    
         
            -
                        perPage={pagination.perPage}
         
     | 
| 
       54 
     | 
    
         
            -
                        onSetPage={handlePageSelected}
         
     | 
| 
       55 
     | 
    
         
            -
                        onPerPageSelect={handlePerPageSelected}
         
     | 
| 
       56 
     | 
    
         
            -
                        perPageOptions={perPageOptions}
         
     | 
| 
       57 
     | 
    
         
            -
                        variant="top"
         
     | 
| 
      
 77 
     | 
    
         
            +
                        variant="bottom"
         
     | 
| 
       58 
78 
     | 
    
         
             
                      />
         
     | 
| 
       59 
79 
     | 
    
         
             
                    </FlexItem>
         
     | 
| 
       60 
80 
     | 
    
         
             
                  </Flex>
         
     | 
| 
       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 
     | 
    
         
            -
                      {jobs.map(job => (
         
     | 
| 
       71 
     | 
    
         
            -
                        <Tr key={job.id}>
         
     | 
| 
       72 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       73 
     | 
    
         
            -
                            <a
         
     | 
| 
       74 
     | 
    
         
            -
                              onClick={() =>
         
     | 
| 
       75 
     | 
    
         
            -
                                window.tfm.nav.pushUrl(
         
     | 
| 
       76 
     | 
    
         
            -
                                  `/job_invocations/${decodeId(job.id)}`
         
     | 
| 
       77 
     | 
    
         
            -
                                )
         
     | 
| 
       78 
     | 
    
         
            -
                              }
         
     | 
| 
       79 
     | 
    
         
            -
                            >
         
     | 
| 
       80 
     | 
    
         
            -
                              {job.description}
         
     | 
| 
       81 
     | 
    
         
            -
                            </a>
         
     | 
| 
       82 
     | 
    
         
            -
                             
         
     | 
| 
       83 
     | 
    
         
            -
                            {readablePurpose(job.recurringLogic.purpose)}
         
     | 
| 
       84 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       85 
     | 
    
         
            -
                          <Td>{job.task.result}</Td>
         
     | 
| 
       86 
     | 
    
         
            -
                          <Td>{job.task.state}</Td>
         
     | 
| 
       87 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       88 
     | 
    
         
            -
                            <RelativeDateTime date={job.startAt} />
         
     | 
| 
       89 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       90 
     | 
    
         
            -
                          <Td>{readableCron(job.recurringLogic.cronLine)}</Td>
         
     | 
| 
       91 
     | 
    
         
            -
                        </Tr>
         
     | 
| 
       92 
     | 
    
         
            -
                      ))}
         
     | 
| 
       93 
     | 
    
         
            -
                    </Tbody>
         
     | 
| 
       94 
     | 
    
         
            -
                  </TableComposable>
         
     | 
| 
       95 
81 
     | 
    
         
             
                </React.Fragment>
         
     | 
| 
       96 
82 
     | 
    
         
             
              );
         
     | 
| 
       97 
83 
     | 
    
         
             
            };
         
     | 
    
        data/webpack/components/AnsibleHostDetail/components/RolesTab/AllRolesModal/AllRolesTable.js
    CHANGED
    
    | 
         @@ -1,7 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            import React from 'react';
         
     | 
| 
       2 
2 
     | 
    
         
             
            import PropTypes from 'prop-types';
         
     | 
| 
       3 
3 
     | 
    
         
             
            import { translate as __ } from 'foremanReact/common/I18n';
         
     | 
| 
       4 
     | 
    
         
            -
            import { usePaginationOptions } from 'foremanReact/components/Pagination/PaginationHooks';
         
     | 
| 
       5 
4 
     | 
    
         | 
| 
       6 
5 
     | 
    
         
             
            import {
         
     | 
| 
       7 
6 
     | 
    
         
             
              TableComposable,
         
     | 
| 
         @@ -11,70 +10,50 @@ import { 
     | 
|
| 
       11 
10 
     | 
    
         
             
              Th,
         
     | 
| 
       12 
11 
     | 
    
         
             
              Td,
         
     | 
| 
       13 
12 
     | 
    
         
             
            } from '@patternfly/react-table';
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
            import  
     | 
| 
      
 13 
     | 
    
         
            +
            import { Flex, FlexItem } from '@patternfly/react-core';
         
     | 
| 
      
 14 
     | 
    
         
            +
            import Pagination from 'foremanReact/components/Pagination';
         
     | 
| 
       16 
15 
     | 
    
         
             
            import withLoading from '../../../../withLoading';
         
     | 
| 
       17 
     | 
    
         
            -
            import {
         
     | 
| 
       18 
     | 
    
         
            -
              preparePerPageOptions,
         
     | 
| 
       19 
     | 
    
         
            -
              refreshPage,
         
     | 
| 
       20 
     | 
    
         
            -
            } from '../../../../../helpers/paginationHelper';
         
     | 
| 
       21 
16 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
            const AllRolesTable = ({
         
     | 
| 
       23 
     | 
    
         
            -
              allAnsibleRoles,
         
     | 
| 
       24 
     | 
    
         
            -
              totalCount,
         
     | 
| 
       25 
     | 
    
         
            -
              pagination,
         
     | 
| 
       26 
     | 
    
         
            -
              history,
         
     | 
| 
       27 
     | 
    
         
            -
            }) => {
         
     | 
| 
      
 17 
     | 
    
         
            +
            const AllRolesTable = ({ allAnsibleRoles, totalCount }) => {
         
     | 
| 
       28 
18 
     | 
    
         
             
              const columns = [__('Name'), __('Source')];
         
     | 
| 
       29 
19 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
              const handlePerPageSelected = (event, allPerPage) => {
         
     | 
| 
       31 
     | 
    
         
            -
                refreshPage(history, { allPage: 1, allPerPage });
         
     | 
| 
       32 
     | 
    
         
            -
              };
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
              const handlePageSelected = (event, allPage) => {
         
     | 
| 
       35 
     | 
    
         
            -
                refreshPage(history, { ...pagination, allPage });
         
     | 
| 
       36 
     | 
    
         
            -
              };
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
              const perPageOptions = preparePerPageOptions(usePaginationOptions());
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
20 
     | 
    
         
             
              return (
         
     | 
| 
       41 
21 
     | 
    
         
             
                <React.Fragment>
         
     | 
| 
       42 
     | 
    
         
            -
                  <Flex className="pf-u-pt-md">
         
     | 
| 
      
 22 
     | 
    
         
            +
                  <Flex direction={{ default: 'column' }} className="pf-u-pt-md">
         
     | 
| 
      
 23 
     | 
    
         
            +
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
      
 24 
     | 
    
         
            +
                      <Pagination updateParamsByUrl itemCount={totalCount} variant="top" />
         
     | 
| 
      
 25 
     | 
    
         
            +
                    </FlexItem>
         
     | 
| 
      
 26 
     | 
    
         
            +
                    <TableComposable variant="compact">
         
     | 
| 
      
 27 
     | 
    
         
            +
                      <Thead>
         
     | 
| 
      
 28 
     | 
    
         
            +
                        <Tr>
         
     | 
| 
      
 29 
     | 
    
         
            +
                          <Th />
         
     | 
| 
      
 30 
     | 
    
         
            +
                          {columns.map(col => (
         
     | 
| 
      
 31 
     | 
    
         
            +
                            <Th key={`${col}-all`}>{col}</Th>
         
     | 
| 
      
 32 
     | 
    
         
            +
                          ))}
         
     | 
| 
      
 33 
     | 
    
         
            +
                        </Tr>
         
     | 
| 
      
 34 
     | 
    
         
            +
                      </Thead>
         
     | 
| 
      
 35 
     | 
    
         
            +
                      <Tbody>
         
     | 
| 
      
 36 
     | 
    
         
            +
                        {allAnsibleRoles.map(role => (
         
     | 
| 
      
 37 
     | 
    
         
            +
                          <Tr key={`${role.id}-all`} id={role.id}>
         
     | 
| 
      
 38 
     | 
    
         
            +
                            <Td />
         
     | 
| 
      
 39 
     | 
    
         
            +
                            <Td>{role.name}</Td>
         
     | 
| 
      
 40 
     | 
    
         
            +
                            <Td>
         
     | 
| 
      
 41 
     | 
    
         
            +
                              {role.inherited
         
     | 
| 
      
 42 
     | 
    
         
            +
                                ? __('Inherited from Hostgroup')
         
     | 
| 
      
 43 
     | 
    
         
            +
                                : __('Directly assigned to Host')}
         
     | 
| 
      
 44 
     | 
    
         
            +
                            </Td>
         
     | 
| 
      
 45 
     | 
    
         
            +
                          </Tr>
         
     | 
| 
      
 46 
     | 
    
         
            +
                        ))}
         
     | 
| 
      
 47 
     | 
    
         
            +
                      </Tbody>
         
     | 
| 
      
 48 
     | 
    
         
            +
                    </TableComposable>
         
     | 
| 
       43 
49 
     | 
    
         
             
                    <FlexItem align={{ default: 'alignRight' }}>
         
     | 
| 
       44 
50 
     | 
    
         
             
                      <Pagination
         
     | 
| 
      
 51 
     | 
    
         
            +
                        updateParamsByUrl
         
     | 
| 
       45 
52 
     | 
    
         
             
                        itemCount={totalCount}
         
     | 
| 
       46 
     | 
    
         
            -
                         
     | 
| 
       47 
     | 
    
         
            -
                        perPage={pagination.allPerPage}
         
     | 
| 
       48 
     | 
    
         
            -
                        onSetPage={handlePageSelected}
         
     | 
| 
       49 
     | 
    
         
            -
                        onPerPageSelect={handlePerPageSelected}
         
     | 
| 
       50 
     | 
    
         
            -
                        perPageOptions={perPageOptions}
         
     | 
| 
       51 
     | 
    
         
            -
                        variant="top"
         
     | 
| 
      
 53 
     | 
    
         
            +
                        variant="bottom"
         
     | 
| 
       52 
54 
     | 
    
         
             
                      />
         
     | 
| 
       53 
55 
     | 
    
         
             
                    </FlexItem>
         
     | 
| 
       54 
56 
     | 
    
         
             
                  </Flex>
         
     | 
| 
       55 
     | 
    
         
            -
                  <TableComposable variant="compact">
         
     | 
| 
       56 
     | 
    
         
            -
                    <Thead>
         
     | 
| 
       57 
     | 
    
         
            -
                      <Tr>
         
     | 
| 
       58 
     | 
    
         
            -
                        <Th />
         
     | 
| 
       59 
     | 
    
         
            -
                        {columns.map(col => (
         
     | 
| 
       60 
     | 
    
         
            -
                          <Th key={`${col}-all`}>{col}</Th>
         
     | 
| 
       61 
     | 
    
         
            -
                        ))}
         
     | 
| 
       62 
     | 
    
         
            -
                      </Tr>
         
     | 
| 
       63 
     | 
    
         
            -
                    </Thead>
         
     | 
| 
       64 
     | 
    
         
            -
                    <Tbody>
         
     | 
| 
       65 
     | 
    
         
            -
                      {allAnsibleRoles.map(role => (
         
     | 
| 
       66 
     | 
    
         
            -
                        <Tr key={`${role.id}-all`} id={role.id}>
         
     | 
| 
       67 
     | 
    
         
            -
                          <Td />
         
     | 
| 
       68 
     | 
    
         
            -
                          <Td>{role.name}</Td>
         
     | 
| 
       69 
     | 
    
         
            -
                          <Td>
         
     | 
| 
       70 
     | 
    
         
            -
                            {role.inherited
         
     | 
| 
       71 
     | 
    
         
            -
                              ? __('Inherited from Hostgroup')
         
     | 
| 
       72 
     | 
    
         
            -
                              : __('Directly assigned to Host')}
         
     | 
| 
       73 
     | 
    
         
            -
                          </Td>
         
     | 
| 
       74 
     | 
    
         
            -
                        </Tr>
         
     | 
| 
       75 
     | 
    
         
            -
                      ))}
         
     | 
| 
       76 
     | 
    
         
            -
                    </Tbody>
         
     | 
| 
       77 
     | 
    
         
            -
                  </TableComposable>
         
     | 
| 
       78 
57 
     | 
    
         
             
                </React.Fragment>
         
     | 
| 
       79 
58 
     | 
    
         
             
              );
         
     | 
| 
       80 
59 
     | 
    
         
             
            };
         
     | 
| 
         @@ -82,8 +61,6 @@ const AllRolesTable = ({ 
     | 
|
| 
       82 
61 
     | 
    
         
             
            AllRolesTable.propTypes = {
         
     | 
| 
       83 
62 
     | 
    
         
             
              allAnsibleRoles: PropTypes.array.isRequired,
         
     | 
| 
       84 
63 
     | 
    
         
             
              totalCount: PropTypes.number.isRequired,
         
     | 
| 
       85 
     | 
    
         
            -
              pagination: PropTypes.object.isRequired,
         
     | 
| 
       86 
     | 
    
         
            -
              history: PropTypes.object.isRequired,
         
     | 
| 
       87 
64 
     | 
    
         
             
            };
         
     | 
| 
       88 
65 
     | 
    
         | 
| 
       89 
66 
     | 
    
         
             
            export default withLoading(AllRolesTable);
         
     | 
| 
         @@ -27,7 +27,7 @@ const AllRolesModal = ({ hostGlobalId, onClose, history }) => { 
     | 
|
| 
       27 
27 
     | 
    
         
             
                ),
         
     | 
| 
       28 
28 
     | 
    
         
             
              };
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
              const paginationKeys = { page: ' 
     | 
| 
      
 30 
     | 
    
         
            +
              const paginationKeys = { page: 'page', perPage: 'per_page' };
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
       32 
32 
     | 
    
         
             
              const wrapper = child => <Modal {...baseModalProps}>{child}</Modal>;
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
         @@ -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  
     | 
| 
      
 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 
     | 
| 
      
 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 
     | 
    
         
            -
                         
     | 
| 
       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 
     | 
    
         
             
            };
         
     |