katello 4.4.1 → 4.4.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60531c92a13f5d62aaea839bc1dc5512f0a75b0eea7f7a7820c0144747928501
4
- data.tar.gz: ec6e2f242dabd880929727846034aae0356aa76ae61a467864f66703b5899093
3
+ metadata.gz: 5ba77185c8a7b69f5804f90eca22f14863b4eaf37311fbbfcdd30e95bff824cf
4
+ data.tar.gz: 024c9250e18577f8897698c4af3d21e432c3986a6b84599876412a715fe2bbc5
5
5
  SHA512:
6
- metadata.gz: 5a678ed0980575f97093e0908c58964ce62137ab502b0c5b2755f04d09466c8ed77e00f7ae120762a6006347d33d7ce7b94bf045c62799023d8efa0912426b44
7
- data.tar.gz: 7a4e2f5eb5afac20586eb0c1581d560991cd012ded9887a249d873c579384b0d64f34db23d86a31db2d8f941b00a37f2bc579bad7ae6ad778f13e698b03137f5
6
+ metadata.gz: 00ba2a8b933f5069920529d0780c48c290a157ff62123a0f530332497c5c34e5901d20eb7b4b832a2f7fb1ba3ed6a7dd591b3131e1f20e5b1f75335d67d487a0
7
+ data.tar.gz: 31d37614299b5877a287ef408d3f3a37b46f8b2c9111860ce438c60e69b7fbab11c3e7531e433d0d54eea7f18e73f25a4d117b3364315dd3103102df082f788d
@@ -22,7 +22,6 @@ module Katello
22
22
  end
23
23
 
24
24
  def import_all(filtered_indexing = false)
25
- additive = filtered_indexing || (@repository&.mirroring_policy == 'additive')
26
25
  association_tracker = RepoAssociationTracker.new(@content_type, @service_class, @repository)
27
26
  units_from_pulp.each do |units|
28
27
  units.each do |unit|
@@ -52,7 +51,7 @@ module Katello
52
51
  end
53
52
 
54
53
  if @model_class.many_repository_associations && @repository
55
- sync_repository_associations(association_tracker, additive: additive)
54
+ sync_repository_associations(association_tracker, additive: filtered_indexing)
56
55
  end
57
56
  end
58
57
 
@@ -20,7 +20,7 @@ class CleanDuplicateContentUnits < ActiveRecord::Migration[6.0]
20
20
  to_delete = []
21
21
  to_update = []
22
22
  duplicate_models.each do |duplicate|
23
- query = {new_id_field => new_id}
23
+ query = { new_id_field => new_id }
24
24
  unique_fields.each do |field|
25
25
  query[field] = duplicate.send(field)
26
26
  end
@@ -52,28 +52,25 @@ class CleanDuplicateContentUnits < ActiveRecord::Migration[6.0]
52
52
  def up
53
53
  handle_null_pulp_ids
54
54
  add_foreign_keys
55
+ delete_deprecated_models
55
56
 
56
57
  handle_duplicate(Katello::ModuleStream,
57
58
  'module_stream_id',
58
59
  [:pulp_id],
59
- associated_models: {Katello::RepositoryModuleStream => :repository_id},
60
+ associated_models: { Katello::RepositoryModuleStream => :repository_id },
60
61
  child_models: [Katello::ContentViewModuleStreamFilterRule,
61
62
  Katello::ContentFacetApplicableModuleStream,
62
63
  Katello::ModuleProfile,
63
64
  Katello::ModuleStreamArtifact,
64
65
  Katello::ModuleStreamErratumPackage,
65
66
  Katello::ModuleStreamRpm])
66
- add_index :katello_module_streams, :pulp_id, :unique => true
67
67
 
68
- handle_duplicate(Katello::ModuleProfile, 'module_profile_id', [:module_stream_id, :name],
69
- child_models: [Katello::ModuleProfileRpm])
68
+ add_index :katello_module_streams, :pulp_id, :unique => true
70
69
  add_index :katello_module_profiles, [:module_stream_id, :name], :unique => true
71
-
72
- handle_duplicate(Katello::ModuleProfileRpm, 'module_profile_rpm_id', [:module_profile_id, :name])
73
70
  add_index :katello_module_profile_rpms, [:module_profile_id, :name], :unique => true
74
71
 
75
72
  handle_duplicate(Katello::AnsibleTag, 'ansible_tag_id', [:name],
76
- associated_models: {Katello::AnsibleCollectionTag => :ansible_collection_id})
73
+ associated_models: { Katello::AnsibleCollectionTag => :ansible_collection_id })
77
74
  add_index :katello_ansible_tags, [:name], :unique => true
78
75
 
79
76
  handle_duplicate(Katello::AnsibleCollectionTag, 'ansible_collection_tag_id', [:ansible_collection_id, :ansible_tag_id])
@@ -83,7 +80,7 @@ class CleanDuplicateContentUnits < ActiveRecord::Migration[6.0]
83
80
  handle_duplicate(Katello::GenericContentUnit,
84
81
  'generic_content_unit_id',
85
82
  [:pulp_id],
86
- associated_models: {Katello::RepositoryGenericContentUnit => :repository_id})
83
+ associated_models: { Katello::RepositoryGenericContentUnit => :repository_id })
87
84
  add_index :katello_generic_content_units, :pulp_id, :unique => true
88
85
 
89
86
  handle_duplicate(Katello::DockerManifestList, 'docker_manifest_list_id', [:pulp_id],
@@ -112,6 +109,11 @@ class CleanDuplicateContentUnits < ActiveRecord::Migration[6.0]
112
109
  change_column :katello_docker_manifests, :pulp_id, :string, :null => false
113
110
  end
114
111
 
112
+ def delete_deprecated_models
113
+ Katello::ModuleProfileRpm.delete_all
114
+ Katello::ModuleProfile.delete_all
115
+ end
116
+
115
117
  def add_foreign_keys
116
118
  Katello::DockerManifestListManifest.where.not(docker_manifest_list_id: Katello::DockerManifestList.pluck(:id)).delete_all
117
119
  add_foreign_key :katello_docker_manifest_list_manifests, :katello_docker_manifest_lists, column: :docker_manifest_list_id
@@ -1,3 +1,3 @@
1
1
  module Katello
2
- VERSION = "4.4.1".freeze
2
+ VERSION = "4.4.2".freeze
3
3
  end
@@ -139,6 +139,7 @@ export const useBulkSelect = ({
139
139
  initialArry = [],
140
140
  initialSearchQuery = '',
141
141
  idColumn = 'id',
142
+ filtersQuery = '',
142
143
  isSelectable,
143
144
  }) => {
144
145
  const { selectionSet: inclusionSet, ...selectOptions } =
@@ -200,16 +201,16 @@ export const useBulkSelect = ({
200
201
  }
201
202
  };
202
203
 
203
- const fetchBulkParams = () => {
204
+ const fetchBulkParams = (idColumnName = idColumn) => {
204
205
  const searchQueryWithExclusionSet = () => {
205
- const query = [searchQuery,
206
- !isEmpty(exclusionSet) && `${idColumn} !^ (${[...exclusionSet].join(',')})`];
206
+ const query = [searchQuery, filtersQuery,
207
+ !isEmpty(exclusionSet) && `${idColumnName} !^ (${[...exclusionSet].join(',')})`];
207
208
  return query.filter(item => item).join(' and ');
208
209
  };
209
210
 
210
211
  const searchQueryWithInclusionSet = () => {
211
212
  if (isEmpty(inclusionSet)) throw new Error('Cannot build a search query with no items selected');
212
- return `${idColumn} ^ (${[...inclusionSet].join(',')})`;
213
+ return `${idColumnName} ^ (${[...inclusionSet].join(',')})`;
213
214
  };
214
215
 
215
216
  return selectAllMode ? searchQueryWithExclusionSet() : searchQueryWithInclusionSet();
@@ -0,0 +1,99 @@
1
+ import { act, renderHook } from '@testing-library/react-hooks';
2
+ import { useBulkSelect } from '../TableHooks';
3
+
4
+ const isSelectable = () => true;
5
+ const idColumn = 'errata_id';
6
+ const metadata = {
7
+ error: null, selectable: 2, subtotal: 2, total: 2,
8
+ };
9
+ const results = [
10
+ {
11
+ errata_id: 'RHSA-2022:2031',
12
+ id: 311,
13
+ severity: 'Low',
14
+ type: 'security',
15
+ },
16
+ {
17
+ errata_id: 'RHSA-2022:2110',
18
+ id: 17,
19
+ severity: 'Low',
20
+ type: 'security',
21
+ },
22
+ ];
23
+
24
+ it('returns a scoped search string based on inclusionSet', () => {
25
+ const { result } = renderHook(() => useBulkSelect({
26
+ results,
27
+ metadata,
28
+ idColumn,
29
+ isSelectable,
30
+ }));
31
+
32
+ act(() => {
33
+ result.current.selectOne(true, 'RHSA-2022:2031');
34
+ });
35
+
36
+ expect(result.current.fetchBulkParams()).toBe('errata_id ^ (RHSA-2022:2031)');
37
+ });
38
+
39
+ it('returns a scoped search string based on exclusionSet', () => {
40
+ const { result } = renderHook(() => useBulkSelect({
41
+ results,
42
+ metadata,
43
+ idColumn,
44
+ isSelectable,
45
+ }));
46
+
47
+ act(() => {
48
+ result.current.selectAll(true);
49
+ });
50
+
51
+ act(() => {
52
+ result.current.selectOne(false, 'RHSA-2022:2031');
53
+ });
54
+
55
+ expect(result.current.fetchBulkParams()).toBe('errata_id !^ (RHSA-2022:2031)');
56
+ });
57
+
58
+ it('adds search query to scoped search string based on exclusionSet', () => {
59
+ const { result } = renderHook(() => useBulkSelect({
60
+ results,
61
+ metadata,
62
+ idColumn,
63
+ isSelectable,
64
+ }));
65
+
66
+ act(() => {
67
+ result.current.updateSearchQuery('type=security');
68
+ });
69
+
70
+ act(() => {
71
+ result.current.selectAll(true);
72
+ });
73
+
74
+ act(() => {
75
+ result.current.selectOne(false, 'RHSA-2022:2031');
76
+ });
77
+
78
+ expect(result.current.fetchBulkParams()).toBe('type=security and errata_id !^ (RHSA-2022:2031)');
79
+ });
80
+
81
+ it('adds filter dropdown query to scoped search string', () => {
82
+ const { result } = renderHook(() => useBulkSelect({
83
+ results,
84
+ metadata,
85
+ idColumn,
86
+ isSelectable,
87
+ filtersQuery: 'severity=Low',
88
+ }));
89
+
90
+ act(() => {
91
+ result.current.selectAll(true);
92
+ });
93
+
94
+ act(() => {
95
+ result.current.selectOne(false, 'RHSA-2022:2031');
96
+ });
97
+
98
+ expect(result.current.fetchBulkParams()).toBe('severity=Low and errata_id !^ (RHSA-2022:2031)');
99
+ });
@@ -79,6 +79,17 @@ export const ErrataTab = () => {
79
79
  __('Published date'),
80
80
  ];
81
81
 
82
+ const filtersQuery = () => {
83
+ const query = [];
84
+ if (errataTypeSelected !== ERRATA_TYPE) {
85
+ query.push(`type=${TYPES_TO_PARAM[errataTypeSelected]}`);
86
+ }
87
+ if (errataSeveritySelected !== ERRATA_SEVERITY) {
88
+ query.push(`severity=${SEVERITIES_TO_PARAM[errataSeveritySelected]}`);
89
+ }
90
+ return query.join(' and ');
91
+ };
92
+
82
93
  const fetchItems = useCallback(
83
94
  (params) => {
84
95
  if (!hostId) return hostIdNotReady;
@@ -112,6 +123,7 @@ export const ErrataTab = () => {
112
123
  results,
113
124
  metadata,
114
125
  idColumn: 'errata_id',
126
+ filtersQuery: filtersQuery(),
115
127
  isSelectable: result => result.installable,
116
128
  initialSearchQuery: searchParam || '',
117
129
  });
@@ -248,7 +260,7 @@ export const ErrataTab = () => {
248
260
  );
249
261
 
250
262
  const hostIsNonLibrary = (
251
- contentFacet?.contentViewDefault === false && contentFacet.lifecycleEnvironmentLibrary === false
263
+ contentFacet?.contentViewDefault === false || contentFacet.lifecycleEnvironmentLibrary === false
252
264
  );
253
265
  const toggleGroup = (
254
266
  <Split hasGutter>
@@ -75,7 +75,7 @@ const RepositorySetsTab = () => {
75
75
  contentViewName,
76
76
  lifecycleEnvironmentName,
77
77
  } = contentFacet;
78
- const nonLibraryHost = contentViewDefault === false &&
78
+ const nonLibraryHost = contentViewDefault === false ||
79
79
  lifecycleEnvironmentLibrary === false;
80
80
  const simpleContentAccess = (Number(subscriptionStatus) === 5);
81
81
  const dispatch = useDispatch();
@@ -558,7 +558,7 @@ test('Toggle Group shows if it\'s not the default content view or library enviro
558
558
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
559
559
  });
560
560
 
561
- test('Toggle Group does not show if it\'s the default content view ', async (done) => {
561
+ test('Toggle Group shows if it\'s the default content view but non-library environment', async (done) => {
562
562
  const options = renderOptions({
563
563
  ...contentFacetAttributes,
564
564
  content_view_default: true,
@@ -579,14 +579,41 @@ test('Toggle Group does not show if it\'s the default content view ', async (don
579
579
 
580
580
  // Assert that the errata are now showing on the screen, but wait for them to appear.
581
581
  await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
582
- expect(queryByLabelText('Installable Errata')).not.toBeInTheDocument();
582
+ expect(queryByLabelText('Installable Errata')).toBeInTheDocument();
583
+ assertNockRequest(autocompleteScope);
584
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
585
+ });
586
+
587
+ test('Toggle Group shows if it\'s the library environment but non-default content view', async (done) => {
588
+ const options = renderOptions({
589
+ ...contentFacetAttributes,
590
+ lifecycle_environment_library: true,
591
+ });
592
+ // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
593
+ const autocompleteScope = mockForemanAutocomplete(nockInstance, autocompleteUrl);
594
+ const mockErrata = makeMockErrata({});
595
+ // return errata data results when we look for errata
596
+ const scope = nockInstance
597
+ .get(hostErrata)
598
+ .query(defaultQuery)
599
+ .reply(200, mockErrata);
600
+
601
+ const {
602
+ queryByLabelText,
603
+ getAllByText,
604
+ } = renderWithRedux(<ErrataTab />, options);
605
+
606
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
607
+ await patientlyWaitFor(() => expect(getAllByText('Important')[0]).toBeInTheDocument());
608
+ expect(queryByLabelText('Installable Errata')).toBeInTheDocument();
583
609
  assertNockRequest(autocompleteScope);
584
610
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
585
611
  });
586
612
 
587
- test('Toggle Group does not show if it\'s the library environment', async (done) => {
613
+ test('Toggle Group does not show if it\'s the default content view and library environment', async (done) => {
588
614
  const options = renderOptions({
589
615
  ...contentFacetAttributes,
616
+ content_view_default: true,
590
617
  lifecycle_environment_library: true,
591
618
  });
592
619
  // Setup autocomplete with mockForemanAutoComplete since we aren't adding /katello
@@ -36,7 +36,7 @@ const autocompleteUrl = '/repository_sets/auto_complete_search';
36
36
  const repositorySetBookmarks = foremanApi.getApiUrl('/bookmarks?search=controller%3Dkatello_product_contents');
37
37
  const contentOverride = foremanApi.getApiUrl('/hosts/1/subscriptions/content_override');
38
38
 
39
- const defaultQuery = {
39
+ const limitToEnvQuery = {
40
40
  content_access_mode_env: true,
41
41
  content_access_mode_all: true,
42
42
  host_id: 1,
@@ -44,8 +44,8 @@ const defaultQuery = {
44
44
  page: 1,
45
45
  search: '',
46
46
  };
47
- const libraryQuery = {
48
- ...defaultQuery,
47
+ const showAllQuery = {
48
+ ...limitToEnvQuery,
49
49
  content_access_mode_env: false,
50
50
  };
51
51
 
@@ -73,7 +73,7 @@ test('Can call API for repository sets and show basic table', async (done) => {
73
73
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
74
74
  const scope = nockInstance
75
75
  .get(hostRepositorySets)
76
- .query(defaultQuery)
76
+ .query(limitToEnvQuery)
77
77
  .reply(200, mockRepoSetData);
78
78
 
79
79
  const { getByText } = renderWithRedux(<RepositorySetsTab />, renderOptions());
@@ -97,7 +97,7 @@ test('Can handle no repository sets being present', async (done) => {
97
97
 
98
98
  const scope = nockInstance
99
99
  .get(hostRepositorySets)
100
- .query(defaultQuery)
100
+ .query(limitToEnvQuery)
101
101
  .reply(200, noResults);
102
102
 
103
103
  const { queryByText } = renderWithRedux(<RepositorySetsTab />, renderOptions());
@@ -113,7 +113,7 @@ test('Toggle Group shows if it\'s not the default content view or library enviro
113
113
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
114
114
  const scope = nockInstance
115
115
  .get(hostRepositorySets)
116
- .query(defaultQuery)
116
+ .query(limitToEnvQuery)
117
117
  .reply(200, mockRepoSetData);
118
118
 
119
119
  const {
@@ -128,7 +128,7 @@ test('Toggle Group shows if it\'s not the default content view or library enviro
128
128
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
129
129
  });
130
130
 
131
- test('Toggle Group does not show if it\'s the default content view ', async (done) => {
131
+ test('Toggle Group shows if it\'s the default content view but non-library environment', async (done) => {
132
132
  const options = renderOptions({
133
133
  ...contentFacetAttributes,
134
134
  content_view_default: true,
@@ -137,7 +137,7 @@ test('Toggle Group does not show if it\'s the default content view ', async (don
137
137
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
138
138
  const scope = nockInstance
139
139
  .get(hostRepositorySets)
140
- .query(libraryQuery)
140
+ .query(limitToEnvQuery)
141
141
  .reply(200, mockRepoSetData);
142
142
 
143
143
  const {
@@ -147,12 +147,12 @@ test('Toggle Group does not show if it\'s the default content view ', async (don
147
147
 
148
148
  // Assert that the errata are now showing on the screen, but wait for them to appear.
149
149
  await patientlyWaitFor(() => expect(getByText(firstRepoSet.contentUrl)).toBeInTheDocument());
150
- expect(queryByLabelText('Limit to environment')).not.toBeInTheDocument();
150
+ expect(queryByLabelText('Limit to environment')).toBeInTheDocument();
151
151
  assertNockRequest(autocompleteScope);
152
152
  assertNockRequest(scope, done); // Pass jest callback to confirm test is done
153
153
  });
154
154
 
155
- test('Toggle Group does not show if it\'s the library environment', async (done) => {
155
+ test('Toggle Group shows if it\'s the library environment but a non-default content view', async (done) => {
156
156
  const options = renderOptions({
157
157
  ...contentFacetAttributes,
158
158
  lifecycle_environment_library: true,
@@ -161,7 +161,32 @@ test('Toggle Group does not show if it\'s the library environment', async (done)
161
161
  // return errata data results when we look for errata
162
162
  const scope = nockInstance
163
163
  .get(hostRepositorySets)
164
- .query(libraryQuery)
164
+ .query(limitToEnvQuery)
165
+ .reply(200, mockRepoSetData);
166
+
167
+ const {
168
+ queryByLabelText,
169
+ getByText,
170
+ } = renderWithRedux(<RepositorySetsTab />, options);
171
+
172
+ // Assert that the errata are now showing on the screen, but wait for them to appear.
173
+ await patientlyWaitFor(() => expect(getByText(firstRepoSet.contentUrl)).toBeInTheDocument());
174
+ expect(queryByLabelText('Limit to environment')).toBeInTheDocument();
175
+ assertNockRequest(autocompleteScope);
176
+ assertNockRequest(scope, done); // Pass jest callback to confirm test is done
177
+ });
178
+
179
+ test('Toggle Group does not show if it\'s the library environment and default content view', async (done) => {
180
+ const options = renderOptions({
181
+ ...contentFacetAttributes,
182
+ lifecycle_environment_library: true,
183
+ content_view_default: true,
184
+ });
185
+ const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
186
+ // return errata data results when we look for errata
187
+ const scope = nockInstance
188
+ .get(hostRepositorySets)
189
+ .query(showAllQuery)
165
190
  .reply(200, mockRepoSetData);
166
191
 
167
192
  const {
@@ -182,7 +207,7 @@ test('Can toggle with the Toggle Group ', async (done) => {
182
207
  // return errata data results when we look for errata
183
208
  const scope = nockInstance
184
209
  .get(hostRepositorySets)
185
- .query(defaultQuery)
210
+ .query(limitToEnvQuery)
186
211
  .reply(200, mockRepoSetData);
187
212
 
188
213
  const {
@@ -202,7 +227,7 @@ test('Can override to disabled', async (done) => {
202
227
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
203
228
  const scope = nockInstance
204
229
  .get(hostRepositorySets)
205
- .query(defaultQuery)
230
+ .query(limitToEnvQuery)
206
231
  .reply(200, mockRepoSetData);
207
232
  const contentOverrideScope = nockInstance
208
233
  .put(contentOverride)
@@ -238,7 +263,7 @@ test('Can override to enabled', async (done) => {
238
263
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
239
264
  const scope = nockInstance
240
265
  .get(hostRepositorySets)
241
- .query(defaultQuery)
266
+ .query(limitToEnvQuery)
242
267
  .reply(200, mockRepoSetData);
243
268
  const contentOverrideScope = nockInstance
244
269
  .put(contentOverride)
@@ -274,7 +299,7 @@ test('Can reset to default', async (done) => {
274
299
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
275
300
  const scope = nockInstance
276
301
  .get(hostRepositorySets)
277
- .query(defaultQuery)
302
+ .query(limitToEnvQuery)
278
303
  .reply(200, mockRepoSetData);
279
304
  const contentOverrideScope = nockInstance
280
305
  .put(contentOverride)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katello
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.1
4
+ version: 4.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - N/A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-27 00:00:00.000000000 Z
11
+ date: 2022-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -87,6 +87,9 @@ dependencies:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '5.0'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '7.0'
90
93
  type: :runtime
91
94
  prerelease: false
92
95
  version_requirements: !ruby/object:Gem::Requirement
@@ -94,6 +97,9 @@ dependencies:
94
97
  - - ">="
95
98
  - !ruby/object:Gem::Version
96
99
  version: '5.0'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '7.0'
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: foreman_remote_execution
99
105
  requirement: !ruby/object:Gem::Requirement
@@ -4690,6 +4696,7 @@ files:
4690
4696
  - webpack/components/Table/PageControls.js
4691
4697
  - webpack/components/Table/TableHooks.js
4692
4698
  - webpack/components/Table/TableWrapper.js
4699
+ - webpack/components/Table/__test__/useBulkSelect.test.js
4693
4700
  - webpack/components/Table/helpers.js
4694
4701
  - webpack/components/TooltipButton/TooltipButton.js
4695
4702
  - webpack/components/TooltipButton/TooltipButton.scss
@@ -5388,7 +5395,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
5388
5395
  - !ruby/object:Gem::Version
5389
5396
  version: '0'
5390
5397
  requirements: []
5391
- rubygems_version: 3.2.22
5398
+ rubygems_version: 3.2.33
5392
5399
  signing_key:
5393
5400
  specification_version: 4
5394
5401
  summary: Content and Subscription Management plugin for Foreman