katello 5.0.0.rc2 → 5.0.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.
Files changed (243) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/katello/locale/bn/katello.js +41 -2
  3. data/app/assets/javascripts/katello/locale/bn_IN/katello.js +41 -2
  4. data/app/assets/javascripts/katello/locale/ca/katello.js +41 -2
  5. data/app/assets/javascripts/katello/locale/cs/katello.js +41 -2
  6. data/app/assets/javascripts/katello/locale/cs_CZ/katello.js +42 -3
  7. data/app/assets/javascripts/katello/locale/de/katello.js +42 -3
  8. data/app/assets/javascripts/katello/locale/de_AT/katello.js +41 -2
  9. data/app/assets/javascripts/katello/locale/de_DE/katello.js +41 -2
  10. data/app/assets/javascripts/katello/locale/el/katello.js +41 -2
  11. data/app/assets/javascripts/katello/locale/en/katello.js +41 -2
  12. data/app/assets/javascripts/katello/locale/en_GB/katello.js +41 -2
  13. data/app/assets/javascripts/katello/locale/en_US/katello.js +41 -2
  14. data/app/assets/javascripts/katello/locale/es/katello.js +42 -3
  15. data/app/assets/javascripts/katello/locale/et_EE/katello.js +41 -2
  16. data/app/assets/javascripts/katello/locale/fr/katello.js +42 -3
  17. data/app/assets/javascripts/katello/locale/gl/katello.js +41 -2
  18. data/app/assets/javascripts/katello/locale/gu/katello.js +41 -2
  19. data/app/assets/javascripts/katello/locale/he_IL/katello.js +41 -2
  20. data/app/assets/javascripts/katello/locale/hi/katello.js +41 -2
  21. data/app/assets/javascripts/katello/locale/id/katello.js +41 -2
  22. data/app/assets/javascripts/katello/locale/it/katello.js +42 -3
  23. data/app/assets/javascripts/katello/locale/ja/katello.js +42 -3
  24. data/app/assets/javascripts/katello/locale/ka/katello.js +42 -3
  25. data/app/assets/javascripts/katello/locale/kn/katello.js +41 -2
  26. data/app/assets/javascripts/katello/locale/ko/katello.js +42 -3
  27. data/app/assets/javascripts/katello/locale/ml_IN/katello.js +41 -2
  28. data/app/assets/javascripts/katello/locale/mr/katello.js +41 -2
  29. data/app/assets/javascripts/katello/locale/nl_NL/katello.js +41 -2
  30. data/app/assets/javascripts/katello/locale/or/katello.js +41 -2
  31. data/app/assets/javascripts/katello/locale/pa/katello.js +41 -2
  32. data/app/assets/javascripts/katello/locale/pl/katello.js +41 -2
  33. data/app/assets/javascripts/katello/locale/pl_PL/katello.js +41 -2
  34. data/app/assets/javascripts/katello/locale/pt/katello.js +41 -2
  35. data/app/assets/javascripts/katello/locale/pt_BR/katello.js +42 -3
  36. data/app/assets/javascripts/katello/locale/ro/katello.js +41 -2
  37. data/app/assets/javascripts/katello/locale/ro_RO/katello.js +41 -2
  38. data/app/assets/javascripts/katello/locale/ru/katello.js +42 -3
  39. data/app/assets/javascripts/katello/locale/sl/katello.js +41 -2
  40. data/app/assets/javascripts/katello/locale/sv_SE/katello.js +41 -2
  41. data/app/assets/javascripts/katello/locale/ta/katello.js +41 -2
  42. data/app/assets/javascripts/katello/locale/ta_IN/katello.js +41 -2
  43. data/app/assets/javascripts/katello/locale/te/katello.js +41 -2
  44. data/app/assets/javascripts/katello/locale/tr/katello.js +41 -2
  45. data/app/assets/javascripts/katello/locale/vi/katello.js +41 -2
  46. data/app/assets/javascripts/katello/locale/vi_VN/katello.js +41 -2
  47. data/app/assets/javascripts/katello/locale/zh/katello.js +41 -2
  48. data/app/assets/javascripts/katello/locale/zh_CN/katello.js +42 -3
  49. data/app/assets/javascripts/katello/locale/zh_TW/katello.js +42 -3
  50. data/app/controllers/katello/concerns/api/v2/hosts_controller_extensions.rb +10 -10
  51. data/app/controllers/katello/concerns/registration_commands_controller_extensions.rb +1 -1
  52. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  53. data/app/views/katello/api/v2/activation_keys/base.json.rabl +18 -18
  54. data/app/views/katello/api/v2/content_facet/base.json.rabl +19 -19
  55. data/app/views/katello/api/v2/content_view_environments/show.json.rabl +10 -10
  56. data/app/views/katello/api/v2/content_view_versions/base.json.rabl +2 -2
  57. data/db/migrate/20220929204746_add_content_view_environment_content_facet.rb +5 -5
  58. data/db/migrate/20240730163043_add_content_view_environment_activation_key.rb +5 -5
  59. data/db/migrate/20260402151630_add_content_view_environment_to_hostgroup_content_facet.rb +4 -4
  60. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/details/views/activation-key-info.html +1 -1
  61. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/activation-keys/new/views/activation-key-new.html +1 -1
  62. data/lib/katello/tasks/upgrades/4.20/clean_cve_with_no_cvv.rake +4 -4
  63. data/lib/katello/version.rb +1 -1
  64. data/lib/rubocop/cop/katello/cve_abbreviation.rb +82 -0
  65. data/locale/bn/LC_MESSAGES/katello.mo +0 -0
  66. data/locale/bn/katello.po +41 -2
  67. data/locale/bn_IN/LC_MESSAGES/katello.mo +0 -0
  68. data/locale/bn_IN/katello.po +41 -2
  69. data/locale/ca/LC_MESSAGES/katello.mo +0 -0
  70. data/locale/ca/katello.po +41 -2
  71. data/locale/cs/LC_MESSAGES/katello.mo +0 -0
  72. data/locale/cs/katello.po +41 -2
  73. data/locale/cs_CZ/LC_MESSAGES/katello.mo +0 -0
  74. data/locale/cs_CZ/katello.po +42 -3
  75. data/locale/de/LC_MESSAGES/katello.mo +0 -0
  76. data/locale/de/katello.po +42 -3
  77. data/locale/de_AT/LC_MESSAGES/katello.mo +0 -0
  78. data/locale/de_AT/katello.po +41 -2
  79. data/locale/de_DE/LC_MESSAGES/katello.mo +0 -0
  80. data/locale/de_DE/katello.po +41 -2
  81. data/locale/el/LC_MESSAGES/katello.mo +0 -0
  82. data/locale/el/katello.po +41 -2
  83. data/locale/en/LC_MESSAGES/katello.mo +0 -0
  84. data/locale/en/katello.po +41 -2
  85. data/locale/en_GB/LC_MESSAGES/katello.mo +0 -0
  86. data/locale/en_GB/katello.po +41 -2
  87. data/locale/en_US/LC_MESSAGES/katello.mo +0 -0
  88. data/locale/en_US/katello.po +41 -2
  89. data/locale/es/LC_MESSAGES/katello.mo +0 -0
  90. data/locale/es/katello.po +42 -3
  91. data/locale/et_EE/LC_MESSAGES/katello.mo +0 -0
  92. data/locale/et_EE/katello.po +41 -2
  93. data/locale/fr/LC_MESSAGES/katello.mo +0 -0
  94. data/locale/fr/katello.po +42 -3
  95. data/locale/gl/LC_MESSAGES/katello.mo +0 -0
  96. data/locale/gl/katello.po +41 -2
  97. data/locale/gu/LC_MESSAGES/katello.mo +0 -0
  98. data/locale/gu/katello.po +41 -2
  99. data/locale/he_IL/LC_MESSAGES/katello.mo +0 -0
  100. data/locale/he_IL/katello.po +41 -2
  101. data/locale/hi/LC_MESSAGES/katello.mo +0 -0
  102. data/locale/hi/katello.po +41 -2
  103. data/locale/id/LC_MESSAGES/katello.mo +0 -0
  104. data/locale/id/katello.po +41 -2
  105. data/locale/it/LC_MESSAGES/katello.mo +0 -0
  106. data/locale/it/katello.po +42 -3
  107. data/locale/ja/LC_MESSAGES/katello.mo +0 -0
  108. data/locale/ja/katello.po +42 -3
  109. data/locale/ka/LC_MESSAGES/katello.mo +0 -0
  110. data/locale/ka/katello.po +42 -3
  111. data/locale/katello.pot +315 -257
  112. data/locale/kn/LC_MESSAGES/katello.mo +0 -0
  113. data/locale/kn/katello.po +41 -2
  114. data/locale/ko/LC_MESSAGES/katello.mo +0 -0
  115. data/locale/ko/katello.po +42 -3
  116. data/locale/ml_IN/LC_MESSAGES/katello.mo +0 -0
  117. data/locale/ml_IN/katello.po +41 -2
  118. data/locale/mr/LC_MESSAGES/katello.mo +0 -0
  119. data/locale/mr/katello.po +41 -2
  120. data/locale/nl_NL/LC_MESSAGES/katello.mo +0 -0
  121. data/locale/nl_NL/katello.po +41 -2
  122. data/locale/or/LC_MESSAGES/katello.mo +0 -0
  123. data/locale/or/katello.po +41 -2
  124. data/locale/pa/LC_MESSAGES/katello.mo +0 -0
  125. data/locale/pa/katello.po +41 -2
  126. data/locale/pl/LC_MESSAGES/katello.mo +0 -0
  127. data/locale/pl/katello.po +41 -2
  128. data/locale/pl_PL/LC_MESSAGES/katello.mo +0 -0
  129. data/locale/pl_PL/katello.po +41 -2
  130. data/locale/pt/LC_MESSAGES/katello.mo +0 -0
  131. data/locale/pt/katello.po +41 -2
  132. data/locale/pt_BR/LC_MESSAGES/katello.mo +0 -0
  133. data/locale/pt_BR/katello.po +42 -3
  134. data/locale/ro/LC_MESSAGES/katello.mo +0 -0
  135. data/locale/ro/katello.po +41 -2
  136. data/locale/ro_RO/LC_MESSAGES/katello.mo +0 -0
  137. data/locale/ro_RO/katello.po +41 -2
  138. data/locale/ru/LC_MESSAGES/katello.mo +0 -0
  139. data/locale/ru/katello.po +42 -3
  140. data/locale/sl/LC_MESSAGES/katello.mo +0 -0
  141. data/locale/sl/katello.po +41 -2
  142. data/locale/sv_SE/LC_MESSAGES/katello.mo +0 -0
  143. data/locale/sv_SE/katello.po +41 -2
  144. data/locale/ta/LC_MESSAGES/katello.mo +0 -0
  145. data/locale/ta/katello.po +41 -2
  146. data/locale/ta_IN/LC_MESSAGES/katello.mo +0 -0
  147. data/locale/ta_IN/katello.po +41 -2
  148. data/locale/te/LC_MESSAGES/katello.mo +0 -0
  149. data/locale/te/katello.po +41 -2
  150. data/locale/tr/LC_MESSAGES/katello.mo +0 -0
  151. data/locale/tr/katello.po +41 -2
  152. data/locale/vi/LC_MESSAGES/katello.mo +0 -0
  153. data/locale/vi/katello.po +41 -2
  154. data/locale/vi_VN/LC_MESSAGES/katello.mo +0 -0
  155. data/locale/vi_VN/katello.po +41 -2
  156. data/locale/zh/LC_MESSAGES/katello.mo +0 -0
  157. data/locale/zh/katello.po +41 -2
  158. data/locale/zh_CN/LC_MESSAGES/katello.mo +0 -0
  159. data/locale/zh_CN/katello.po +42 -3
  160. data/locale/zh_TW/LC_MESSAGES/katello.mo +0 -0
  161. data/locale/zh_TW/katello.po +42 -3
  162. data/package.json +2 -2
  163. data/webpack/ForemanColumnExtensions/index.js +1 -1
  164. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/AssignHostCVModal.js +3 -3
  165. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/ContentViewDetailsCard.js +5 -5
  166. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/OrderableAssignments.js +5 -5
  167. data/webpack/components/extensions/HostDetails/Cards/ContentViewDetailsCard/__tests__/AssignHostCVModal.test.js +17 -17
  168. data/webpack/components/extensions/Hosts/BulkActions/BulkAssignCVEnvsModal/BulkAssignCVEnvsModal.js +4 -8
  169. data/webpack/components/extensions/Hosts/BulkActions/BulkAssignCVEnvsModal/__tests__/BulkAssignCVEnvsModal.test.js +1 -1
  170. data/webpack/components/extensions/Hosts/BulkActions/BulkAssignCVEnvsModal/index.js +2 -1
  171. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/BulkChangeHostCollectionsModal.js +5 -10
  172. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/__tests__/BulkChangeHostCollectionsModal.test.js +6 -24
  173. data/webpack/components/extensions/Hosts/BulkActions/BulkChangeHostCollectionsModal/index.js +2 -1
  174. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/04_ReviewFooter.js +2 -0
  175. data/webpack/components/extensions/Hosts/BulkActions/BulkErrataWizard/BulkErrataWizard.js +2 -1
  176. data/webpack/components/extensions/Hosts/BulkActions/BulkManageTracesModal/BulkManageTracesModal.js +4 -0
  177. data/webpack/components/extensions/Hosts/BulkActions/BulkManageTracesModal/index.js +2 -1
  178. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/04_ReviewFooter.js +2 -0
  179. data/webpack/components/extensions/Hosts/BulkActions/BulkPackagesWizard/BulkPackagesWizard.js +2 -1
  180. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/03_ReviewFooter.js +2 -0
  181. data/webpack/components/extensions/Hosts/BulkActions/BulkRepositorySetsWizard/BulkRepositorySetsWizard.js +2 -1
  182. data/webpack/components/extensions/Hosts/BulkActions/BulkSystemPurposeModal/BulkSystemPurposeModal.js +5 -0
  183. data/webpack/components/extensions/Hosts/BulkActions/BulkSystemPurposeModal/index.js +2 -1
  184. data/webpack/components/extensions/Hosts/BulkActions/__tests__/bulkSystemPurposeModal.test.js +6 -1
  185. data/webpack/components/extensions/RegistrationCommands/__tests__/ActivationKeys.test.js +6 -6
  186. data/webpack/components/extensions/RegistrationCommands/fields/ActivationKeys.js +1 -1
  187. data/webpack/containers/Application/config.js +1 -1
  188. data/webpack/eslint-rules/no-cve-abbreviation.js +121 -0
  189. data/webpack/global_index.js +6 -6
  190. data/webpack/redux/reducers/index.js +0 -2
  191. data/webpack/scenes/ActivationKeys/Details/ActivationKeyDetails.js +2 -2
  192. data/webpack/scenes/ActivationKeys/Details/components/AssignAKCVModal.js +3 -3
  193. data/webpack/scenes/ActivationKeys/Details/components/CreateAKCVModal.js +1 -1
  194. data/webpack/scenes/ActivationKeys/Details/components/{CVEDetailsCard.js → CvEnvDetailsCard.js} +9 -9
  195. data/webpack/scenes/ActivationKeys/Details/components/{CVEDetailsCreateCard.js → CvEnvDetailsCreateCard.js} +10 -10
  196. data/webpack/scenes/ActivationKeys/Details/components/__tests__/{CVEDetailsCreateCard.test.js → CvEnvDetailsCreateCard.test.js} +8 -8
  197. data/webpack/scenes/ContainerImages/Booted/BootedContainerImagesPage.js +2 -2
  198. data/webpack/scenes/ContainerImages/ContainerImagesPage.js +59 -52
  199. data/webpack/scenes/ContainerImages/ContainerImagesPage.scss +27 -4
  200. data/webpack/scenes/ContainerImages/Synced/SyncedContainerImagesPage.js +1 -1
  201. data/webpack/scenes/ContentViews/Details/Versions/Delete/RemoveSteps/CVVersionRemoveReview.js +9 -9
  202. data/webpack/scenes/Hosts/ChangeContentSource/actions.js +2 -2
  203. data/webpack/scenes/Subscriptions/Manifest/CdnTabContent.js +44 -0
  204. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.js +179 -307
  205. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModalConstants.js +5 -0
  206. data/webpack/scenes/Subscriptions/Manifest/ManifestActions.js +64 -70
  207. data/webpack/scenes/Subscriptions/Manifest/ManifestConstants.js +5 -0
  208. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryContent.js +61 -0
  209. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryReducer.js +1 -1
  210. data/webpack/scenes/Subscriptions/Manifest/ManifestTabContent.js +357 -0
  211. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManageManifestModal.test.js +129 -0
  212. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestActions.test.js +69 -110
  213. data/webpack/scenes/Subscriptions/Manifest/__tests__/ManifestHistoryReducer.test.js +6 -2
  214. data/webpack/scenes/Subscriptions/Manifest/index.js +16 -1
  215. data/webpack/scenes/Subscriptions/SubscriptionActions.js +79 -145
  216. data/webpack/scenes/Subscriptions/SubscriptionConstants.js +4 -35
  217. data/webpack/scenes/Subscriptions/SubscriptionsColumns.js +90 -0
  218. data/webpack/scenes/Subscriptions/SubscriptionsPage.js +297 -217
  219. data/webpack/scenes/Subscriptions/SubscriptionsPage.scss +40 -30
  220. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsActions.js +11 -8
  221. data/webpack/scenes/Subscriptions/UpstreamSubscriptions/UpstreamSubscriptionsConstants.js +0 -1
  222. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsPage.test.js +104 -205
  223. data/webpack/scenes/Subscriptions/__tests__/subscriptions.fixtures.js +12 -8
  224. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTable.js +245 -241
  225. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionsTable.test.js +61 -27
  226. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/components/Table.js +487 -73
  227. data/webpack/scenes/Subscriptions/components/SubscriptionsToolbar/SubscriptionsToolbar.js +22 -4
  228. data/webpack/utils/contentViewEnvironmentLabel.js +3 -3
  229. data/webpack/utils/helpers.js +2 -2
  230. metadata +15 -20
  231. data/webpack/scenes/Subscriptions/Manifest/ManageManifestModal.scss +0 -39
  232. data/webpack/scenes/Subscriptions/Manifest/ManifestHistoryTableSchema.js +0 -47
  233. data/webpack/scenes/Subscriptions/SubscriptionReducer.js +0 -223
  234. data/webpack/scenes/Subscriptions/SubscriptionsSelectors.js +0 -31
  235. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsActions.test.js +0 -297
  236. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsReducer.test.js +0 -244
  237. data/webpack/scenes/Subscriptions/__tests__/SubscriptionsSelectors.test.js +0 -47
  238. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionNameFormatter.js +0 -23
  239. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionTypeFormatter.js +0 -32
  240. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/SubscriptionsTableSchema.js +0 -169
  241. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/__tests__/SubscriptionTypeFormatter.test.js +0 -41
  242. data/webpack/scenes/Subscriptions/components/SubscriptionsTable/index.js +0 -2
  243. data/webpack/scenes/Subscriptions/index.js +0 -57
@@ -103,7 +103,7 @@ ContentViewEnvironmentDisplay.propTypes = {
103
103
  }).isRequired,
104
104
  };
105
105
 
106
- export const CVEDetailsBareCard = ({
106
+ export const CvEnvDetailsBareCard = ({
107
107
  contentViewEnvironments, hostPermissions, permissions, dropdownItems,
108
108
  isDropdownOpen, toggleKebab, openModal, allowMultipleContentViews,
109
109
  }) => {
@@ -185,7 +185,7 @@ export const CVEDetailsBareCard = ({
185
185
  );
186
186
  };
187
187
 
188
- CVEDetailsBareCard.propTypes = {
188
+ CvEnvDetailsBareCard.propTypes = {
189
189
  contentViewEnvironments: PropTypes.arrayOf(PropTypes.shape({
190
190
  content_view: PropTypes.shape({
191
191
  name: PropTypes.string,
@@ -212,7 +212,7 @@ CVEDetailsBareCard.propTypes = {
212
212
  allowMultipleContentViews: PropTypes.bool,
213
213
  };
214
214
 
215
- CVEDetailsBareCard.defaultProps = {
215
+ CvEnvDetailsBareCard.defaultProps = {
216
216
  contentViewEnvironments: [],
217
217
  hostPermissions: {},
218
218
  permissions: {},
@@ -258,12 +258,12 @@ export const ContentViewEnvironmentDetails = ({
258
258
  const existingAssignments = contentViewEnvironments.map(env => ({
259
259
  contentView: env.content_view,
260
260
  environment: env.lifecycle_environment,
261
- cveLabel: env.label, // Use the CVE label from the API
261
+ cvEnvLabel: env.label, // Use the content view environment label from the API
262
262
  }));
263
263
 
264
264
  return (
265
265
  <GridItem rowSpan={1} md={6} lg={4} xl2={3} >
266
- <CVEDetailsBareCard
266
+ <CvEnvDetailsBareCard
267
267
  isDropdownOpen={isDropdownOpen}
268
268
  toggleKebab={toggleKebab}
269
269
  contentViewEnvironments={contentViewEnvironments}
@@ -49,7 +49,7 @@ const AssignmentShape = PropTypes.shape({
49
49
  id: PropTypes.string.isRequired,
50
50
  contentView: ContentViewShape,
51
51
  environment: EnvironmentShape,
52
- cveLabel: PropTypes.string,
52
+ cvEnvLabel: PropTypes.string,
53
53
  isExpanded: PropTypes.bool,
54
54
  cvSelectOpen: PropTypes.bool,
55
55
  selectedEnv: PropTypes.arrayOf(EnvironmentShape),
@@ -60,7 +60,7 @@ const AssignmentShape = PropTypes.shape({
60
60
  const ExistingAssignmentShape = PropTypes.shape({
61
61
  contentView: ContentViewShape,
62
62
  environment: EnvironmentShape,
63
- cveLabel: PropTypes.string,
63
+ cvEnvLabel: PropTypes.string,
64
64
  });
65
65
 
66
66
  const AssignmentSection = ({
@@ -307,7 +307,7 @@ export const OrderableAssignmentList = ({
307
307
  id: `existing-${index}`,
308
308
  contentView: assignment.contentView,
309
309
  environment: assignment.environment,
310
- cveLabel: assignment.cveLabel, // Preserve the CVE label from API
310
+ cvEnvLabel: assignment.cvEnvLabel, // Preserve the content view environment label from API
311
311
  isExpanded: !shouldCollapseByDefault,
312
312
  cvSelectOpen: false,
313
313
  selectedEnv: assignment.environment ? [assignment.environment] : [],
@@ -419,7 +419,7 @@ export const OrderableAssignmentList = ({
419
419
  selectedCV: null,
420
420
  environment: selection[0] || null,
421
421
  contentView: null,
422
- cveLabel: null, // Clear CV environment label when environment changes
422
+ cvEnvLabel: null, // Clear CVEnv label when environment changes
423
423
  });
424
424
  };
425
425
 
@@ -451,7 +451,7 @@ export const OrderableAssignmentList = ({
451
451
  selectedCV: selection,
452
452
  cvSelectOpen: false,
453
453
  contentView: contentViewWithVersion,
454
- cveLabel: null, // Clear CV environment label when CV changes
454
+ cvEnvLabel: null, // Clear CVEnv label when CV changes
455
455
  });
456
456
  };
457
457
 
@@ -570,7 +570,7 @@ describe('AssignHostCVModal', () => {
570
570
  {
571
571
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
572
572
  environment: { id: 1, name: 'Library', label: 'Library' },
573
- cveLabel: 'Library/cv_1',
573
+ cvEnvLabel: 'Library/cv_1',
574
574
  },
575
575
  ];
576
576
 
@@ -602,12 +602,12 @@ describe('AssignHostCVModal', () => {
602
602
  {
603
603
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
604
604
  environment: { id: 1, name: 'Library', label: 'Library' },
605
- cveLabel: 'Library/cv_1',
605
+ cvEnvLabel: 'Library/cv_1',
606
606
  },
607
607
  {
608
608
  contentView: { id: 3, name: 'cv_2', label: 'cv_2' },
609
609
  environment: { id: 2, name: 'dev', label: 'dev' },
610
- cveLabel: 'dev/cv_2',
610
+ cvEnvLabel: 'dev/cv_2',
611
611
  },
612
612
  ];
613
613
 
@@ -654,7 +654,7 @@ describe('AssignHostCVModal', () => {
654
654
  {
655
655
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
656
656
  environment: { id: 1, name: 'Library', label: 'Library' },
657
- cveLabel: 'Library/cv_1',
657
+ cvEnvLabel: 'Library/cv_1',
658
658
  },
659
659
  ];
660
660
 
@@ -706,12 +706,12 @@ describe('AssignHostCVModal', () => {
706
706
  {
707
707
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
708
708
  environment: { id: 1, name: 'Library', label: 'Library' },
709
- cveLabel: 'Library/cv_1',
709
+ cvEnvLabel: 'Library/cv_1',
710
710
  },
711
711
  {
712
712
  contentView: { id: 3, name: 'cv_2', label: 'cv_2' },
713
713
  environment: { id: 2, name: 'dev', label: 'dev' },
714
- cveLabel: 'dev/cv_2',
714
+ cvEnvLabel: 'dev/cv_2',
715
715
  },
716
716
  ];
717
717
 
@@ -746,7 +746,7 @@ describe('AssignHostCVModal', () => {
746
746
  {
747
747
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
748
748
  environment: { id: 1, name: 'Library', label: 'Library' },
749
- cveLabel: 'Library/cv_1',
749
+ cvEnvLabel: 'Library/cv_1',
750
750
  },
751
751
  ];
752
752
 
@@ -805,7 +805,7 @@ describe('AssignHostCVModal', () => {
805
805
  jest.restoreAllMocks();
806
806
  });
807
807
 
808
- test('Save with existing assignment preserves cveLabel', async () => {
808
+ test('Save with existing assignment preserves cvEnvLabel', async () => {
809
809
  const existingAssignments = [
810
810
  {
811
811
  contentView: {
@@ -821,7 +821,7 @@ describe('AssignHostCVModal', () => {
821
821
  label: 'Library',
822
822
  library: true,
823
823
  },
824
- cveLabel: 'Library/cv_1', // Existing label from API
824
+ cvEnvLabel: 'Library/cv_1', // Existing label from API
825
825
  },
826
826
  {
827
827
  contentView: {
@@ -837,7 +837,7 @@ describe('AssignHostCVModal', () => {
837
837
  label: 'Library',
838
838
  library: true,
839
839
  },
840
- cveLabel: 'Library', // Default CV in Library uses just env label
840
+ cvEnvLabel: 'Library', // Default CV in Library uses just env label
841
841
  },
842
842
  ];
843
843
 
@@ -877,7 +877,7 @@ describe('AssignHostCVModal', () => {
877
877
  userEvent.click(saveButton);
878
878
  });
879
879
 
880
- // Verify API was called with existing cveLabel preserved for first assignment
880
+ // Verify API was called with existing cvEnvLabel preserved for first assignment
881
881
  await patientlyWaitFor(() => {
882
882
  expect(mockAssignHostCVEnvironments).toHaveBeenCalledWith(
883
883
  expect.objectContaining({
@@ -1048,17 +1048,17 @@ describe('AssignHostCVModal', () => {
1048
1048
  {
1049
1049
  contentView: { id: 2, name: 'cv_1', label: 'cv_1' },
1050
1050
  environment: { id: 1, name: 'Library', label: 'Library' },
1051
- cveLabel: 'Library/cv_1',
1051
+ cvEnvLabel: 'Library/cv_1',
1052
1052
  },
1053
1053
  {
1054
1054
  contentView: { id: 3, name: 'composite_cv', label: 'composite_cv' },
1055
1055
  environment: { id: 2, name: 'dev', label: 'dev' },
1056
- cveLabel: 'dev/composite_cv',
1056
+ cvEnvLabel: 'dev/composite_cv',
1057
1057
  },
1058
1058
  {
1059
1059
  contentView: { id: 4, name: 'cv_2', label: 'cv_2' },
1060
1060
  environment: { id: 3, name: 'prod', label: 'prod' },
1061
- cveLabel: 'prod/cv_2',
1061
+ cvEnvLabel: 'prod/cv_2',
1062
1062
  },
1063
1063
  ];
1064
1064
 
@@ -1126,7 +1126,7 @@ describe('AssignHostCVModal', () => {
1126
1126
  });
1127
1127
  });
1128
1128
 
1129
- test('Changing CV in existing assignment builds new label instead of reusing old cveLabel', async () => {
1129
+ test('Changing CV in existing assignment builds new label instead of reusing old cvEnvLabel', async () => {
1130
1130
  const existingAssignments = [
1131
1131
  {
1132
1132
  contentView: {
@@ -1142,7 +1142,7 @@ describe('AssignHostCVModal', () => {
1142
1142
  label: 'Library',
1143
1143
  library: true,
1144
1144
  },
1145
- cveLabel: 'Library/cv_1', // User currently has cv_1
1145
+ cvEnvLabel: 'Library/cv_1', // User currently has cv_1
1146
1146
  },
1147
1147
  ];
1148
1148
 
@@ -1203,7 +1203,7 @@ describe('AssignHostCVModal', () => {
1203
1203
  });
1204
1204
 
1205
1205
  // Verify API was called with NEW label (Library/composite_cv),
1206
- // NOT the old cveLabel (Library/cv_1)
1206
+ // NOT the old cvEnvLabel (Library/cv_1)
1207
1207
  await patientlyWaitFor(() => {
1208
1208
  expect(mockAssignHostCVEnvironments).toHaveBeenCalledWith(
1209
1209
  expect.objectContaining({
@@ -6,9 +6,6 @@ import { Modal, Button, TextContent, Text, TextVariants } from '@patternfly/reac
6
6
  import { PlusCircleIcon } from '@patternfly/react-icons';
7
7
  import { translate as __ } from 'foremanReact/common/I18n';
8
8
  import { STATUS } from 'foremanReact/constants';
9
- import { foremanUrl } from 'foremanReact/common/helpers';
10
- import { APIActions } from 'foremanReact/redux/API';
11
- import { HOSTS_API_PATH, API_REQUEST_KEY } from 'foremanReact/routes/Hosts/constants';
12
9
  import { useAPI } from 'foremanReact/common/hooks/API/APIHooks';
13
10
  import { selectAPIStatus } from 'foremanReact/redux/API/APISelectors';
14
11
  import { ENVIRONMENT_PATHS_KEY } from '../../../../../scenes/ContentViews/components/EnvironmentPaths/EnvironmentPathConstants';
@@ -28,6 +25,7 @@ const BulkAssignCVEnvsModal = ({
28
25
  orgId,
29
26
  fetchBulkParams,
30
27
  allowMultipleContentViews,
28
+ refreshTableData,
31
29
  }) => {
32
30
  const [assignments, setAssignments] = useState([]);
33
31
  const dispatch = useDispatch();
@@ -42,11 +40,7 @@ const BulkAssignCVEnvsModal = ({
42
40
  };
43
41
 
44
42
  const handleSuccess = () => {
45
- // Refresh the hosts table to show updated content view environments
46
- dispatch(APIActions.get({
47
- key: API_REQUEST_KEY,
48
- url: foremanUrl(HOSTS_API_PATH),
49
- }));
43
+ refreshTableData();
50
44
  handleModalClose();
51
45
  };
52
46
 
@@ -178,12 +172,14 @@ BulkAssignCVEnvsModal.propTypes = {
178
172
  orgId: PropTypes.number.isRequired,
179
173
  fetchBulkParams: PropTypes.func.isRequired,
180
174
  allowMultipleContentViews: PropTypes.bool,
175
+ refreshTableData: PropTypes.func,
181
176
  };
182
177
 
183
178
  BulkAssignCVEnvsModal.defaultProps = {
184
179
  isOpen: false,
185
180
  closeModal: () => {},
186
181
  allowMultipleContentViews: true,
182
+ refreshTableData: () => {},
187
183
  };
188
184
 
189
185
  export default BulkAssignCVEnvsModal;
@@ -272,7 +272,7 @@ test('builds correct payload for multiple CVEs preserving order', () => {
272
272
  },
273
273
  };
274
274
 
275
- // Verify request payload contains all CVE labels in correct order
275
+ // Verify request payload contains all content view environment labels in correct order
276
276
  expect(requestBody).toEqual({
277
277
  content_view_environments: [
278
278
  'library_label/test_cv_1',
@@ -6,7 +6,7 @@ import BulkAssignCVEnvsModal from './BulkAssignCVEnvsModal';
6
6
 
7
7
  const BulkAssignCVEnvsModalScene = () => {
8
8
  const orgId = useForemanOrganization()?.id;
9
- const { selectedCount, fetchBulkParams } = useContext(ForemanActionsBarContext);
9
+ const { selectedCount, fetchBulkParams, refreshTableData } = useContext(ForemanActionsBarContext);
10
10
  const { isOpen, close: closeModal } = useBulkModalOpen('bulk-assign-cves-modal');
11
11
  const foremanContext = useForemanContext();
12
12
  const allowMultipleContentViews =
@@ -24,6 +24,7 @@ const BulkAssignCVEnvsModalScene = () => {
24
24
  closeModal={closeModal}
25
25
  orgId={orgId}
26
26
  allowMultipleContentViews={allowMultipleContentViews}
27
+ refreshTableData={refreshTableData}
27
28
  />
28
29
  );
29
30
  };
@@ -22,12 +22,7 @@ import { ExclamationTriangleIcon, PlusCircleIcon } from '@patternfly/react-icons
22
22
  import { addToast } from 'foremanReact/components/ToastsList';
23
23
  import { translate as __ } from 'foremanReact/common/I18n';
24
24
  import { STATUS } from 'foremanReact/constants';
25
- import { foremanUrl, noop } from 'foremanReact/common/helpers';
26
- import { APIActions } from 'foremanReact/redux/API';
27
- import {
28
- HOSTS_API_PATH,
29
- API_REQUEST_KEY,
30
- } from 'foremanReact/routes/Hosts/constants';
25
+ import { noop } from 'foremanReact/common/helpers';
31
26
  import { useForemanOrganization } from 'foremanReact/Root/Context/ForemanContext';
32
27
  import { useTableIndexAPIResponse, useSetParamsAndApiAndSearch } from 'foremanReact/components/PF4/TableIndexPage/Table/TableIndexHooks';
33
28
  import { useBulkSelect } from 'foremanReact/components/PF4/TableIndexPage/Table/TableHooks';
@@ -46,6 +41,7 @@ const BulkChangeHostCollectionsModal = ({
46
41
  closeModal,
47
42
  fetchBulkParams,
48
43
  selectedCount: selectedHostsCount,
44
+ refreshTableData,
49
45
  }) => {
50
46
  const dispatch = useDispatch();
51
47
  const [addRadioChecked, setAddRadioChecked] = useState(true);
@@ -165,10 +161,7 @@ const BulkChangeHostCollectionsModal = ({
165
161
  : __('Host collections updated');
166
162
 
167
163
  dispatch(addToast({ type: 'success', message }));
168
- dispatch(APIActions.get({
169
- key: API_REQUEST_KEY,
170
- url: foremanUrl(HOSTS_API_PATH),
171
- }));
164
+ refreshTableData();
172
165
  handleModalClose();
173
166
  };
174
167
 
@@ -417,6 +410,7 @@ BulkChangeHostCollectionsModal.propTypes = {
417
410
  closeModal: PropTypes.func,
418
411
  fetchBulkParams: PropTypes.func,
419
412
  selectedCount: PropTypes.number,
413
+ refreshTableData: PropTypes.func,
420
414
  };
421
415
 
422
416
  BulkChangeHostCollectionsModal.defaultProps = {
@@ -424,6 +418,7 @@ BulkChangeHostCollectionsModal.defaultProps = {
424
418
  closeModal: () => {},
425
419
  fetchBulkParams: () => '',
426
420
  selectedCount: 0,
421
+ refreshTableData: () => {},
427
422
  };
428
423
 
429
424
  export default BulkChangeHostCollectionsModal;
@@ -64,6 +64,7 @@ const defaultProps = {
64
64
  closeModal: jest.fn(),
65
65
  fetchBulkParams: jest.fn(() => 'name ~ test'),
66
66
  selectedCount: 5,
67
+ refreshTableData: jest.fn(),
67
68
  };
68
69
 
69
70
  beforeEach(() => {
@@ -351,11 +352,6 @@ test('shows success toast notification on successful save', async () => {
351
352
  .put('/api/v2/hosts/bulk/add_host_collections')
352
353
  .reply(200, { displayMessages: ['Host collections updated'] });
353
354
 
354
- const hostsRefreshScope = nockInstance
355
- .get('/api/hosts')
356
- .query(true)
357
- .reply(200, { results: [] });
358
-
359
355
  const { getAllByRole, getByText } = renderWithRedux(
360
356
  <BulkChangeHostCollectionsModal {...defaultProps} />,
361
357
  renderOptions(),
@@ -387,10 +383,13 @@ test('shows success toast notification on successful save', async () => {
387
383
 
388
384
  await patientlyWaitFor(() => {
389
385
  expect(addToast).toHaveBeenCalledWith(expect.objectContaining({ type: 'success' }));
386
+ expect(defaultProps.refreshTableData).toHaveBeenCalledTimes(1);
387
+ expect(defaultProps.closeModal).toHaveBeenCalledTimes(1);
388
+ expect(defaultProps.refreshTableData.mock.invocationCallOrder[0])
389
+ .toBeLessThan(defaultProps.closeModal.mock.invocationCallOrder[0]);
390
390
  });
391
391
 
392
392
  assertNockRequest(saveScope, false);
393
- assertNockRequest(hostsRefreshScope, false);
394
393
  assertNockRequest(hostCollectionsScope, false);
395
394
  assertNockRequest(autocompleteScope, false);
396
395
  });
@@ -444,6 +443,7 @@ test('shows error toast notification on failed save', async () => {
444
443
 
445
444
  await patientlyWaitFor(() => {
446
445
  expect(addToast).toHaveBeenCalledWith(expect.objectContaining({ type: 'danger' }));
446
+ expect(defaultProps.refreshTableData).not.toHaveBeenCalled();
447
447
  });
448
448
 
449
449
  assertNockRequest(saveScope, false);
@@ -469,11 +469,6 @@ test('makes correct API call when Add action is selected', async () => {
469
469
  .put('/api/v2/hosts/bulk/add_host_collections')
470
470
  .reply(200, { displayMessages: ['Host collections updated'] });
471
471
 
472
- const hostsRefreshScope = nockInstance
473
- .get('/api/hosts')
474
- .query(true)
475
- .reply(200, { results: [] });
476
-
477
472
  const { getAllByRole, getByText, getByLabelText } = renderWithRedux(
478
473
  <BulkChangeHostCollectionsModal {...defaultProps} />,
479
474
  renderOptions(),
@@ -510,7 +505,6 @@ test('makes correct API call when Add action is selected', async () => {
510
505
 
511
506
  assertNockRequest(hostCollectionsScope, false);
512
507
  assertNockRequest(autocompleteScope, false);
513
- assertNockRequest(hostsRefreshScope, false);
514
508
  });
515
509
 
516
510
  // Test for Remove action API call
@@ -531,11 +525,6 @@ test('makes correct API call when Remove action is selected', async () => {
531
525
  .put('/api/v2/hosts/bulk/remove_host_collections')
532
526
  .reply(200, { displayMessages: ['Host collections updated'] });
533
527
 
534
- const hostsRefreshScope = nockInstance
535
- .get('/api/hosts')
536
- .query(true)
537
- .reply(200, { results: [] });
538
-
539
528
  const { getAllByRole, getByText, getByLabelText } = renderWithRedux(
540
529
  <BulkChangeHostCollectionsModal {...defaultProps} />,
541
530
  renderOptions(),
@@ -579,7 +568,6 @@ test('makes correct API call when Remove action is selected', async () => {
579
568
 
580
569
  assertNockRequest(hostCollectionsScope, false);
581
570
  assertNockRequest(autocompleteScope, false);
582
- assertNockRequest(hostsRefreshScope, false);
583
571
  });
584
572
 
585
573
  // Test for multiple host collections selected
@@ -600,11 +588,6 @@ test('makes correct API call with multiple host collections', async () => {
600
588
  .put('/api/v2/hosts/bulk/add_host_collections')
601
589
  .reply(200, { displayMessages: ['Host collections updated'] });
602
590
 
603
- const hostsRefreshScope = nockInstance
604
- .get('/api/hosts')
605
- .query(true)
606
- .reply(200, { results: [] });
607
-
608
591
  const { getAllByRole, getByText } = renderWithRedux(
609
592
  <BulkChangeHostCollectionsModal {...defaultProps} />,
610
593
  renderOptions(),
@@ -639,7 +622,6 @@ test('makes correct API call with multiple host collections', async () => {
639
622
 
640
623
  assertNockRequest(hostCollectionsScope, false);
641
624
  assertNockRequest(autocompleteScope, false);
642
- assertNockRequest(hostsRefreshScope, false);
643
625
  });
644
626
 
645
627
  const emptyHostCollections = {
@@ -52,7 +52,7 @@ BulkChangeHostCollectionsMenuItem.defaultProps = {
52
52
  // This component renders only the modal (for the _all-hosts-modals slot)
53
53
  const BulkChangeHostCollectionsModalScene = () => {
54
54
  const orgId = useForemanOrganization()?.id;
55
- const { selectedCount, fetchBulkParams } = useContext(ForemanActionsBarContext);
55
+ const { selectedCount, fetchBulkParams, refreshTableData } = useContext(ForemanActionsBarContext);
56
56
  const { isOpen, close: closeModal } = useBulkModalOpen('bulk-change-host-collections-modal');
57
57
 
58
58
  if (!orgId) return null;
@@ -64,6 +64,7 @@ const BulkChangeHostCollectionsModalScene = () => {
64
64
  selectedCount={selectedCount}
65
65
  isOpen={isOpen}
66
66
  closeModal={closeModal}
67
+ refreshTableData={refreshTableData}
67
68
  />
68
69
  );
69
70
  };
@@ -19,6 +19,7 @@ export const BulkErrataReviewFooter = () => {
19
19
  setFinishButtonLoading,
20
20
  selectedRexOption,
21
21
  closeModal,
22
+ refreshTableData,
22
23
  errataBulkSelect: {
23
24
  fetchBulkParams: getErrataBulkParams,
24
25
  selectedCount: errataSelectedCount,
@@ -55,6 +56,7 @@ export const BulkErrataReviewFooter = () => {
55
56
  const handleFinishButtonClick = () => {
56
57
  setFinishButtonLoading(true);
57
58
  triggerBulkErrataInstall();
59
+ refreshTableData();
58
60
  closeModal();
59
61
  };
60
62
 
@@ -54,7 +54,7 @@ export const useErrataHostsBulkSelect = ({ initialSelectedHosts, modalIsOpen })
54
54
  export const ERRATA_URL = `${katelloApi.getApiUrl('/errata')}?per_page=7&include_permissions=true&errata_restrict_installable=true`;
55
55
 
56
56
  const BulkErrataWizard = ({ isOpen: modalOpen, closeModal }) => {
57
- const { selectedCount: initialSelectedHostCount, fetchBulkParams }
57
+ const { selectedCount: initialSelectedHostCount, fetchBulkParams, refreshTableData }
58
58
  = useContext(ForemanActionsBarContext);
59
59
 
60
60
  const [shouldValidateStep2, setShouldValidateStep2] = useState(false);
@@ -112,6 +112,7 @@ const BulkErrataWizard = ({ isOpen: modalOpen, closeModal }) => {
112
112
  selectedRexOption,
113
113
  setSelectedRexOption,
114
114
  closeModal,
115
+ refreshTableData,
115
116
  errataBulkSelect,
116
117
  errataResults,
117
118
  errataMetadata,
@@ -73,6 +73,7 @@ const BulkManageTracesModal = ({
73
73
  selectedCount: hostsSelectedCount,
74
74
  orgId,
75
75
  fetchBulkParams,
76
+ refreshTableData,
76
77
  }) => {
77
78
  const dispatch = useDispatch();
78
79
  const [isBulkActionOpen, setIsBulkActionOpen] = useState(false);
@@ -193,6 +194,7 @@ const BulkManageTracesModal = ({
193
194
  },
194
195
  },
195
196
  }));
197
+ refreshTableData();
196
198
  handleModalClose();
197
199
  };
198
200
 
@@ -410,11 +412,13 @@ BulkManageTracesModal.propTypes = {
410
412
  selectedCount: PropTypes.number.isRequired,
411
413
  orgId: PropTypes.number.isRequired,
412
414
  fetchBulkParams: PropTypes.func.isRequired,
415
+ refreshTableData: PropTypes.func,
413
416
  };
414
417
 
415
418
  BulkManageTracesModal.defaultProps = {
416
419
  isOpen: false,
417
420
  closeModal: () => {},
421
+ refreshTableData: () => {},
418
422
  };
419
423
 
420
424
  export default BulkManageTracesModal;
@@ -7,7 +7,7 @@ import BulkManageTracesModal from './BulkManageTracesModal';
7
7
  const BulkManageTracesModalScene = () => {
8
8
  const orgId = useForemanOrganization()?.id;
9
9
  const contextValue = useContext(ForemanActionsBarContext);
10
- const { selectedCount, fetchBulkParams } = contextValue || {};
10
+ const { selectedCount, fetchBulkParams, refreshTableData } = contextValue || {};
11
11
  const { isOpen, close: closeModal } = useBulkModalOpen('bulk-manage-traces-modal');
12
12
 
13
13
  if (!orgId) return null;
@@ -25,6 +25,7 @@ const BulkManageTracesModalScene = () => {
25
25
  isOpen={isOpen}
26
26
  closeModal={closeModal}
27
27
  orgId={orgId}
28
+ refreshTableData={refreshTableData}
28
29
  />
29
30
  );
30
31
  };
@@ -19,6 +19,7 @@ export const BulkPackagesReviewFooter = () => {
19
19
  setFinishButtonLoading,
20
20
  selectedRexOption,
21
21
  closeModal,
22
+ refreshTableData,
22
23
  packagesBulkSelect: {
23
24
  fetchBulkParams: getPackagesBulkParams,
24
25
  selectedCount: packagesSelectedCount,
@@ -94,6 +95,7 @@ export const BulkPackagesReviewFooter = () => {
94
95
  if (selectedAction === REMOVE) {
95
96
  triggerBulkPackageRemove();
96
97
  }
98
+ refreshTableData();
97
99
  closeModal();
98
100
  };
99
101
 
@@ -77,7 +77,7 @@ const BulkPackagesWizard = () => {
77
77
 
78
78
  const [selectedAction, setSelectedAction] = useState(UPGRADE_ALL);
79
79
 
80
- const { selectedCount: initialSelectedHostCount, fetchBulkParams }
80
+ const { selectedCount: initialSelectedHostCount, fetchBulkParams, refreshTableData }
81
81
  = useContext(ForemanActionsBarContext);
82
82
 
83
83
  const [shouldValidateStep2, setShouldValidateStep2] = useState(false);
@@ -158,6 +158,7 @@ const BulkPackagesWizard = () => {
158
158
  selectedRexOption,
159
159
  setSelectedRexOption,
160
160
  closeModal,
161
+ refreshTableData,
161
162
  packagesBulkSelect,
162
163
  packagesResults,
163
164
  packagesMetadata,
@@ -18,6 +18,7 @@ export const BulkRepositorySetsReviewFooter = () => {
18
18
  finishButtonLoading,
19
19
  setFinishButtonLoading,
20
20
  closeModal,
21
+ refreshTableData,
21
22
  hostsBulkSelect,
22
23
  } = useContext(BulkRepositorySetsWizardContext);
23
24
 
@@ -45,6 +46,7 @@ export const BulkRepositorySetsReviewFooter = () => {
45
46
  const handleFinishButtonClick = () => {
46
47
  setFinishButtonLoading(true);
47
48
  saveContentOverrides();
49
+ refreshTableData();
48
50
  closeModal();
49
51
  };
50
52
  return (
@@ -43,7 +43,7 @@ const BulkRepositorySetsWizard = () => {
43
43
 
44
44
  const finishButtonText = __('Set content overrides');
45
45
  const replacementResponse = !modalOpen ? { response: {} } : false;
46
- const { selectedCount: initialSelectedHostCount, fetchBulkParams }
46
+ const { selectedCount: initialSelectedHostCount, fetchBulkParams, refreshTableData }
47
47
  = useContext(ForemanActionsBarContext);
48
48
  const repoSetsResponse = useTableIndexAPIResponse({
49
49
  replacementResponse, // don't fetch data if modal is closed
@@ -109,6 +109,7 @@ const BulkRepositorySetsWizard = () => {
109
109
  finishButtonLoading,
110
110
  setFinishButtonLoading,
111
111
  closeModal,
112
+ refreshTableData,
112
113
  repoSetsBulkSelect,
113
114
  repoSetsResults,
114
115
  repoSetsMetadata,
@@ -43,6 +43,7 @@ const BulkSystemPurposeModal = ({
43
43
  selectedCount,
44
44
  orgId,
45
45
  fetchBulkParams,
46
+ refreshTableData,
46
47
  }) => {
47
48
  const [selectedRole, setSelectedRole] = useState(NO_CHANGE);
48
49
  const [selectedUsage, setSelectedUsage] = useState(NO_CHANGE);
@@ -121,6 +122,7 @@ const BulkSystemPurposeModal = ({
121
122
  !releaseVersionDispatched || releaseVersionStatus !== STATUS.PENDING;
122
123
 
123
124
  if (sysPurposeComplete && releaseVersionComplete) {
125
+ refreshTableData();
124
126
  handleModalClose();
125
127
  }
126
128
  }, [
@@ -130,6 +132,7 @@ const BulkSystemPurposeModal = ({
130
132
  sysPurposeStatus,
131
133
  releaseVersionStatus,
132
134
  handleModalClose,
135
+ refreshTableData,
133
136
  ]);
134
137
 
135
138
  const roleOptions = buildSystemPurposeOptions(
@@ -348,10 +351,12 @@ BulkSystemPurposeModal.propTypes = {
348
351
  selectedCount: PropTypes.number.isRequired,
349
352
  orgId: PropTypes.number.isRequired,
350
353
  fetchBulkParams: PropTypes.func.isRequired,
354
+ refreshTableData: PropTypes.func,
351
355
  };
352
356
 
353
357
  BulkSystemPurposeModal.defaultProps = {
354
358
  isOpen: false,
359
+ refreshTableData: () => {},
355
360
  };
356
361
 
357
362
  export default BulkSystemPurposeModal;
@@ -6,7 +6,7 @@ import BulkSystemPurposeModal from './BulkSystemPurposeModal';
6
6
 
7
7
  const BulkSystemPurposeModalScene = () => {
8
8
  const orgId = useForemanOrganization()?.id;
9
- const { selectedCount, fetchBulkParams } = useContext(ForemanActionsBarContext);
9
+ const { selectedCount, fetchBulkParams, refreshTableData } = useContext(ForemanActionsBarContext);
10
10
  const { isOpen, close: closeModal } = useBulkModalOpen('bulk-system-purpose-modal');
11
11
 
12
12
  if (!orgId) return null;
@@ -19,6 +19,7 @@ const BulkSystemPurposeModalScene = () => {
19
19
  isOpen={isOpen}
20
20
  closeModal={closeModal}
21
21
  orgId={orgId}
22
+ refreshTableData={refreshTableData}
22
23
  />
23
24
  );
24
25
  };