@northern.tech/store 0.19.0 → 0.19.2

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 (125) hide show
  1. package/dist/actions.js +1 -1
  2. package/dist/api/general-api.cjs +13 -9
  3. package/dist/api/general-api.cjs.map +1 -1
  4. package/dist/api/general-api.js +3 -3
  5. package/dist/api/users-api.cjs +13 -9
  6. package/dist/api/users-api.cjs.map +1 -1
  7. package/dist/api/users-api.js +4 -4
  8. package/dist/appSlice/constants.cjs +8 -4
  9. package/dist/appSlice/constants.cjs.map +1 -1
  10. package/dist/appSlice/constants.d.cts +1 -1
  11. package/dist/appSlice/constants.d.ts +1 -1
  12. package/dist/appSlice/constants.js +1 -1
  13. package/dist/appSlice/index.js +1 -1
  14. package/dist/appSlice/mocks.js +1 -1
  15. package/dist/appSlice/thunks.cjs +37 -21
  16. package/dist/appSlice/thunks.cjs.map +1 -1
  17. package/dist/appSlice/thunks.js +12 -12
  18. package/dist/auth.cjs +7 -9
  19. package/dist/auth.cjs.map +1 -1
  20. package/dist/auth.js +2 -2
  21. package/dist/{chunk-GEQ2QQEE.js → chunk-42GZ6FGV.js} +2 -2
  22. package/dist/{chunk-QL6FN2JC.js → chunk-43ZBO3JW.js} +2 -2
  23. package/dist/{chunk-GAHFKM3N.js → chunk-45BHMNX6.js} +5 -5
  24. package/dist/{chunk-EL672W25.js → chunk-AJ6DIDO4.js} +9 -5
  25. package/dist/chunk-AJ6DIDO4.js.map +1 -0
  26. package/dist/{chunk-XC7DABLM.js → chunk-AV7SRATY.js} +6 -6
  27. package/dist/{chunk-U5TPV5X5.js → chunk-B3C6H2PR.js} +2 -2
  28. package/dist/{chunk-5M6EUVNO.js → chunk-IRQRV552.js} +8 -2
  29. package/dist/chunk-IRQRV552.js.map +1 -0
  30. package/dist/{chunk-QFYSFHAF.js → chunk-KJ2SUFAU.js} +19 -10
  31. package/dist/chunk-KJ2SUFAU.js.map +1 -0
  32. package/dist/{chunk-FDSMCFV5.js → chunk-UVTLZV34.js} +8 -10
  33. package/dist/chunk-UVTLZV34.js.map +1 -0
  34. package/dist/{chunk-Y3DJIMEN.js → chunk-XJLZK4QY.js} +3 -3
  35. package/dist/{chunk-TJBX7YHM.js → chunk-XOASGJZU.js} +5 -5
  36. package/dist/{chunk-RVAERI6U.js → chunk-ZAZTNDSY.js} +2 -2
  37. package/dist/commonConstants.js +1 -1
  38. package/dist/commonSelectors.cjs +8 -4
  39. package/dist/commonSelectors.cjs.map +1 -1
  40. package/dist/commonSelectors.js +5 -5
  41. package/dist/constants.cjs +8 -4
  42. package/dist/constants.cjs.map +1 -1
  43. package/dist/constants.js +1 -1
  44. package/dist/deploymentsSlice/constants.js +1 -1
  45. package/dist/deploymentsSlice/index.js +1 -1
  46. package/dist/deploymentsSlice/mocks.js +1 -1
  47. package/dist/deploymentsSlice/selectors.js +1 -1
  48. package/dist/deploymentsSlice/thunks.cjs +37 -21
  49. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  50. package/dist/deploymentsSlice/thunks.js +12 -12
  51. package/dist/devicesSlice/constants.js +1 -1
  52. package/dist/devicesSlice/index.js +1 -1
  53. package/dist/devicesSlice/mocks.js +1 -1
  54. package/dist/devicesSlice/selectors.js +1 -1
  55. package/dist/devicesSlice/thunks.cjs +39 -21
  56. package/dist/devicesSlice/thunks.cjs.map +1 -1
  57. package/dist/devicesSlice/thunks.d.cts +41 -3
  58. package/dist/devicesSlice/thunks.d.ts +41 -3
  59. package/dist/devicesSlice/thunks.js +14 -12
  60. package/dist/liststatehook.js +1 -1
  61. package/dist/locationutils.js +1 -1
  62. package/dist/monitorSlice/index.js +1 -1
  63. package/dist/monitorSlice/mocks.js +1 -1
  64. package/dist/monitorSlice/thunks.cjs +21 -13
  65. package/dist/monitorSlice/thunks.cjs.map +1 -1
  66. package/dist/monitorSlice/thunks.js +9 -9
  67. package/dist/onboardingSlice/thunks.cjs +40 -24
  68. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  69. package/dist/onboardingSlice/thunks.js +12 -12
  70. package/dist/organizationSlice/constants.js +1 -1
  71. package/dist/organizationSlice/index.js +1 -1
  72. package/dist/organizationSlice/mocks.js +1 -1
  73. package/dist/organizationSlice/selectors.js +1 -1
  74. package/dist/organizationSlice/thunks.cjs +43 -27
  75. package/dist/organizationSlice/thunks.cjs.map +1 -1
  76. package/dist/organizationSlice/thunks.js +12 -12
  77. package/dist/releasesSlice/index.js +1 -1
  78. package/dist/releasesSlice/mocks.js +1 -1
  79. package/dist/releasesSlice/selectors.js +3 -3
  80. package/dist/releasesSlice/thunks.cjs +21 -13
  81. package/dist/releasesSlice/thunks.cjs.map +1 -1
  82. package/dist/releasesSlice/thunks.js +9 -9
  83. package/dist/selectors.cjs +8 -4
  84. package/dist/selectors.cjs.map +1 -1
  85. package/dist/selectors.js +5 -5
  86. package/dist/sockethook.js +1 -1
  87. package/dist/store.cjs +7 -9
  88. package/dist/store.cjs.map +1 -1
  89. package/dist/store.js +3 -3
  90. package/dist/storehooks.cjs +50 -34
  91. package/dist/storehooks.cjs.map +1 -1
  92. package/dist/storehooks.js +12 -12
  93. package/dist/thunks.cjs +48 -30
  94. package/dist/thunks.cjs.map +1 -1
  95. package/dist/thunks.d.cts +1 -1
  96. package/dist/thunks.d.ts +1 -1
  97. package/dist/thunks.js +14 -12
  98. package/dist/useDeploymentDevice.cjs +37 -21
  99. package/dist/useDeploymentDevice.cjs.map +1 -1
  100. package/dist/useDeploymentDevice.js +12 -12
  101. package/dist/usersSlice/constants.js +1 -1
  102. package/dist/usersSlice/index.js +1 -1
  103. package/dist/usersSlice/mocks.js +1 -1
  104. package/dist/usersSlice/selectors.cjs +8 -4
  105. package/dist/usersSlice/selectors.cjs.map +1 -1
  106. package/dist/usersSlice/selectors.js +3 -3
  107. package/dist/usersSlice/thunks.cjs +37 -21
  108. package/dist/usersSlice/thunks.cjs.map +1 -1
  109. package/dist/usersSlice/thunks.js +12 -12
  110. package/dist/utils.cjs +8 -4
  111. package/dist/utils.cjs.map +1 -1
  112. package/dist/utils.js +2 -2
  113. package/package.json +3 -3
  114. package/dist/chunk-5M6EUVNO.js.map +0 -1
  115. package/dist/chunk-EL672W25.js.map +0 -1
  116. package/dist/chunk-FDSMCFV5.js.map +0 -1
  117. package/dist/chunk-QFYSFHAF.js.map +0 -1
  118. /package/dist/{chunk-GEQ2QQEE.js.map → chunk-42GZ6FGV.js.map} +0 -0
  119. /package/dist/{chunk-QL6FN2JC.js.map → chunk-43ZBO3JW.js.map} +0 -0
  120. /package/dist/{chunk-GAHFKM3N.js.map → chunk-45BHMNX6.js.map} +0 -0
  121. /package/dist/{chunk-XC7DABLM.js.map → chunk-AV7SRATY.js.map} +0 -0
  122. /package/dist/{chunk-U5TPV5X5.js.map → chunk-B3C6H2PR.js.map} +0 -0
  123. /package/dist/{chunk-Y3DJIMEN.js.map → chunk-XJLZK4QY.js.map} +0 -0
  124. /package/dist/{chunk-TJBX7YHM.js.map → chunk-XOASGJZU.js.map} +0 -0
  125. /package/dist/{chunk-RVAERI6U.js.map → chunk-ZAZTNDSY.js.map} +0 -0
@@ -13,12 +13,12 @@ import {
13
13
  saveDeltaDeploymentsConfig,
14
14
  setDeploymentsState,
15
15
  updateDeploymentControlMap
16
- } from "../chunk-QFYSFHAF.js";
17
- import "../chunk-XC7DABLM.js";
18
- import "../chunk-GAHFKM3N.js";
19
- import "../chunk-RVAERI6U.js";
20
- import "../chunk-Y3DJIMEN.js";
21
- import "../chunk-5M6EUVNO.js";
16
+ } from "../chunk-KJ2SUFAU.js";
17
+ import "../chunk-AV7SRATY.js";
18
+ import "../chunk-45BHMNX6.js";
19
+ import "../chunk-ZAZTNDSY.js";
20
+ import "../chunk-XJLZK4QY.js";
21
+ import "../chunk-IRQRV552.js";
22
22
  import "../chunk-RJRZXDVT.js";
23
23
  import "../chunk-TRKA7XYU.js";
24
24
  import "../chunk-YR65C62H.js";
@@ -28,24 +28,24 @@ import "../chunk-CQXDAXQF.js";
28
28
  import "../chunk-VODRLEDP.js";
29
29
  import "../chunk-6WJI4MOP.js";
30
30
  import "../chunk-OLKM53RL.js";
31
- import "../chunk-FDSMCFV5.js";
31
+ import "../chunk-UVTLZV34.js";
32
32
  import "../chunk-53W2NRSL.js";
33
33
  import "../chunk-NMAXZ3ZY.js";
34
- import "../chunk-TJBX7YHM.js";
35
- import "../chunk-GEQ2QQEE.js";
36
- import "../chunk-QL6FN2JC.js";
34
+ import "../chunk-XOASGJZU.js";
35
+ import "../chunk-42GZ6FGV.js";
36
+ import "../chunk-43ZBO3JW.js";
37
37
  import "../chunk-3NOV7X4M.js";
38
38
  import "../chunk-YO22XLHI.js";
39
39
  import "../chunk-JIS4PA3R.js";
40
40
  import "../chunk-WR6RQKF5.js";
41
41
  import "../chunk-O7DR57RN.js";
42
42
  import "../chunk-4BHM6WVX.js";
43
- import "../chunk-U5TPV5X5.js";
43
+ import "../chunk-B3C6H2PR.js";
44
44
  import "../chunk-WWED74SG.js";
45
45
  import "../chunk-2DYA3X77.js";
46
46
  import "../chunk-FAJ3I2UQ.js";
47
47
  import "../chunk-ZKAH3APE.js";
48
- import "../chunk-EL672W25.js";
48
+ import "../chunk-AJ6DIDO4.js";
49
49
  export {
50
50
  abortDeployment,
51
51
  createDeployment,
@@ -10,7 +10,7 @@ import {
10
10
  import "../chunk-2DYA3X77.js";
11
11
  import "../chunk-FAJ3I2UQ.js";
12
12
  import "../chunk-ZKAH3APE.js";
13
- import "../chunk-EL672W25.js";
13
+ import "../chunk-AJ6DIDO4.js";
14
14
  export {
15
15
  DEVICE_CONNECT_STATES,
16
16
  DEVICE_DISMISSAL_STATE,
@@ -9,7 +9,7 @@ import "../chunk-WWED74SG.js";
9
9
  import "../chunk-2DYA3X77.js";
10
10
  import "../chunk-FAJ3I2UQ.js";
11
11
  import "../chunk-ZKAH3APE.js";
12
- import "../chunk-EL672W25.js";
12
+ import "../chunk-AJ6DIDO4.js";
13
13
  export {
14
14
  actions,
15
15
  devicesSlice_default as default,
@@ -8,7 +8,7 @@ import {
8
8
  import "../chunk-2DYA3X77.js";
9
9
  import "../chunk-FAJ3I2UQ.js";
10
10
  import "../chunk-ZKAH3APE.js";
11
- import "../chunk-EL672W25.js";
11
+ import "../chunk-AJ6DIDO4.js";
12
12
 
13
13
  // src/devicesSlice/mocks.ts
14
14
  var deviceTypes = { qemu: "qemux86-64" };
@@ -28,7 +28,7 @@ import "../chunk-WWED74SG.js";
28
28
  import "../chunk-2DYA3X77.js";
29
29
  import "../chunk-FAJ3I2UQ.js";
30
30
  import "../chunk-ZKAH3APE.js";
31
- import "../chunk-EL672W25.js";
31
+ import "../chunk-AJ6DIDO4.js";
32
32
  export {
33
33
  getAcceptedDevices,
34
34
  getAttributesList,
@@ -62,6 +62,7 @@ __export(thunks_exports, {
62
62
  preauthDevice: () => preauthDevice,
63
63
  removeDevicesFromGroup: () => removeDevicesFromGroup,
64
64
  removeDynamicGroup: () => removeDynamicGroup,
65
+ removeReportsByGroupName: () => removeReportsByGroupName,
65
66
  removeStaticGroup: () => removeStaticGroup,
66
67
  searchDevices: () => searchDevices,
67
68
  selectGroup: () => selectGroup,
@@ -138,7 +139,7 @@ var ADDONS = {
138
139
  configure: {
139
140
  id: "configure",
140
141
  title: "Configure",
141
- description: "Expand your plan with device configuration features",
142
+ description: "Seamlessly configure applications and devices remotely \u2013 configure each device to its environment.",
142
143
  needs: ["hasDeviceConfig"],
143
144
  os: {
144
145
  price: "$11/month",
@@ -153,7 +154,7 @@ var ADDONS = {
153
154
  monitor: {
154
155
  id: "monitor",
155
156
  title: "Monitor",
156
- description: "Expand your plan with device monitoring features",
157
+ description: "Detect and analyze health issues of devices, services and applications. Set up alerts so you can act quickly.",
157
158
  needs: ["hasMonitor"],
158
159
  os: {
159
160
  price: "-",
@@ -168,7 +169,7 @@ var ADDONS = {
168
169
  troubleshoot: {
169
170
  id: "troubleshoot",
170
171
  title: "Troubleshoot",
171
- description: "Expand your plan with device troubleshooting features",
172
+ description: "Secure, remote access to your devices \u2013 quickly diagnose and fix issues in real time.",
172
173
  needs: ["hasDeviceConnect"],
173
174
  os: {
174
175
  price: "$27/month",
@@ -182,7 +183,11 @@ var ADDONS = {
182
183
  }
183
184
  };
184
185
  var BENEFITS = {
185
- auditlog: { id: "auditlog", benefit: "trace change across your devices and access troubleshooting session replay", requiredPlan: PLANS.professional.id },
186
+ auditlog: {
187
+ id: "auditlog",
188
+ benefit: "gain access to logs for important events such as changes to devices, deployments and user management, as well as remote terminal session replays",
189
+ requiredPlan: PLANS.enterprise.id
190
+ },
186
191
  dashboard: { id: "dashboard", benefit: "actionable insights into the devices you are updating with Mender", requiredPlan: PLANS.enterprise.id },
187
192
  deltaGeneration: {
188
193
  id: "deltaGeneration",
@@ -1739,6 +1744,7 @@ var actions_default = {
1739
1744
 
1740
1745
  // src/api/general-api.ts
1741
1746
  var import_axios = __toESM(require("axios"), 1);
1747
+ var import_universal_cookie2 = __toESM(require("universal-cookie"), 1);
1742
1748
 
1743
1749
  // src/auth.ts
1744
1750
  var import_universal_cookie = __toESM(require("universal-cookie"), 1);
@@ -1751,19 +1757,17 @@ var getSessionInfo = () => {
1751
1757
  sessionInfo = JSON.parse(window.localStorage.getItem("JWT") ?? "");
1752
1758
  } catch {
1753
1759
  }
1760
+ const jwtTokenFromCookie = cookies.get("JWT", { doNotParse: true }) ?? "";
1761
+ if (jwtTokenFromCookie) {
1762
+ setSessionInfo({ token: jwtTokenFromCookie });
1763
+ cookies.remove("JWT");
1764
+ cookies.remove("JWT", { path: "/" });
1765
+ return { token: jwtTokenFromCookie, expiresAt: void 0 };
1766
+ }
1754
1767
  if (sessionInfo.expiresAt && new Date(sessionInfo.expiresAt) < /* @__PURE__ */ new Date()) {
1755
1768
  cleanUp();
1756
1769
  return { ...emptySession };
1757
1770
  }
1758
- if (!sessionInfo.token) {
1759
- const jwtTokenFromCookie = cookies.get("JWT", { doNotParse: true }) ?? "";
1760
- if (jwtTokenFromCookie) {
1761
- setSessionInfo({ token: jwtTokenFromCookie });
1762
- sessionInfo.token = jwtTokenFromCookie;
1763
- cookies.remove("JWT");
1764
- cookies.remove("JWT", { path: "/" });
1765
- }
1766
- }
1767
1771
  sessionInfo.token = sessionInfo.token || "";
1768
1772
  tokenCache = sessionInfo.token;
1769
1773
  return sessionInfo;
@@ -1782,8 +1786,13 @@ var cleanUp = () => {
1782
1786
  };
1783
1787
 
1784
1788
  // src/api/general-api.ts
1789
+ var cookies2 = new import_universal_cookie2.default();
1785
1790
  var unauthorizedRedirect = (error) => {
1786
1791
  if (!(0, import_axios.isCancel)(error) && error.response?.status === 401 && getToken() && !window.location.pathname.endsWith("/subscription")) {
1792
+ if (cookies2.get("JWT", { doNotParse: true })) {
1793
+ window.location.reload();
1794
+ return Promise.reject(error);
1795
+ }
1787
1796
  cleanUp();
1788
1797
  window.location.replace("/ui/");
1789
1798
  }
@@ -2553,10 +2562,10 @@ var createAppAsyncThunk = import_toolkit16.createAsyncThunk.withTypes();
2553
2562
 
2554
2563
  // src/appSlice/thunks.ts
2555
2564
  var import_helpers7 = require("@northern.tech/utils/helpers");
2556
- var import_universal_cookie2 = __toESM(require("universal-cookie"), 1);
2557
- var cookies2 = new import_universal_cookie2.default();
2565
+ var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
2566
+ var cookies3 = new import_universal_cookie3.default();
2558
2567
  var setFirstLoginAfterSignup = createAppAsyncThunk(`${sliceName2}/setFirstLoginAfterSignup`, (firstLoginAfterSignup, { dispatch }) => {
2559
- cookies2.set("firstLoginAfterSignup", !!firstLoginAfterSignup, { maxAge: 60, path: "/", domain: ".mender.io", sameSite: false });
2568
+ cookies3.set("firstLoginAfterSignup", !!firstLoginAfterSignup, { maxAge: 60, path: "/", domain: ".mender.io", sameSite: false });
2560
2569
  dispatch(actions2.setFirstLoginAfterSignup(!!firstLoginAfterSignup));
2561
2570
  });
2562
2571
  var dateFunctionMap = {
@@ -3101,7 +3110,7 @@ var import_helpers9 = require("@northern.tech/utils/helpers");
3101
3110
  var import_retrytimer = require("@northern.tech/utils/retrytimer");
3102
3111
  var import_dayjs2 = __toESM(require("dayjs"), 1);
3103
3112
  var import_md5 = __toESM(require("md5"), 1);
3104
- var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
3113
+ var import_universal_cookie4 = __toESM(require("universal-cookie"), 1);
3105
3114
 
3106
3115
  // src/api/users-api.ts
3107
3116
  var import_axios2 = __toESM(require("axios"), 1);
@@ -3118,7 +3127,7 @@ var Api2 = {
3118
3127
  var users_api_default = Api2;
3119
3128
 
3120
3129
  // src/usersSlice/thunks.ts
3121
- var cookies3 = new import_universal_cookie3.default();
3130
+ var cookies4 = new import_universal_cookie4.default();
3122
3131
  var { setAnnouncement, setSnackbar: setSnackbar3 } = actions_default;
3123
3132
  var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) => () => {
3124
3133
  const errorText = (0, import_helpers9.extractErrorMessage)(err);
@@ -3153,7 +3162,7 @@ var loginUser = createAppAsyncThunk(
3153
3162
  now.setSeconds(now.getSeconds() + import_constants5.maxSessionAge);
3154
3163
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
3155
3164
  setSessionInfo({ token, expiresAt });
3156
- cookies3.remove("JWT", { path: "/" });
3165
+ cookies4.remove("JWT", { path: "/" });
3157
3166
  return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
3158
3167
  cleanUp();
3159
3168
  return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.extractErrorMessage)(e))));
@@ -3708,9 +3717,9 @@ var setHideAnnouncement = createAppAsyncThunk(
3708
3717
  ({ shouldHide, userId }, { dispatch, getState }) => {
3709
3718
  const currentUserId = userId || getCurrentUser(getState()).id;
3710
3719
  const hash = getState().app.hostedAnnouncement ? (0, import_md5.default)(getState().app.hostedAnnouncement) : "";
3711
- const announceCookie = cookies3.get(`${currentUserId}${hash}`);
3720
+ const announceCookie = cookies4.get(`${currentUserId}${hash}`);
3712
3721
  if (shouldHide || hash.length && typeof announceCookie !== "undefined") {
3713
- cookies3.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });
3722
+ cookies4.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });
3714
3723
  dispatch(setAnnouncement(""));
3715
3724
  }
3716
3725
  }
@@ -3870,11 +3879,18 @@ var addStaticGroup = createAppAsyncThunk(
3870
3879
  )
3871
3880
  ).catch((err) => commonErrorHandler(err, `Group could not be updated:`, dispatch))
3872
3881
  );
3882
+ var removeReportsByGroupName = createAppAsyncThunk(`${sliceName}/removeReportsByGroupName`, (groupName, { dispatch, getState }) => {
3883
+ if (!groupName) return Promise.resolve();
3884
+ const reports = getDeviceReportsForUser(getState());
3885
+ const filteredReports = reports.filter((report) => report.group !== groupName);
3886
+ dispatch(saveUserSettings({ reports: filteredReports }));
3887
+ });
3873
3888
  var removeStaticGroup = createAppAsyncThunk(
3874
3889
  `${sliceName}/removeStaticGroup`,
3875
3890
  (groupName, { dispatch }) => general_api_default.delete(`${import_constants5.inventoryApiUrl}/groups/${groupName}`).then(
3876
3891
  () => Promise.all([
3877
3892
  dispatch(actions.removeGroup(groupName)),
3893
+ dispatch(removeReportsByGroupName(groupName)),
3878
3894
  dispatch(getGroups2()),
3879
3895
  dispatch(setSnackbar4({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
3880
3896
  ])
@@ -3940,6 +3956,7 @@ var removeDynamicGroup = createAppAsyncThunk(`${sliceName}/removeDynamicGroup`,
3940
3956
  return general_api_default.delete(`${import_constants5.inventoryApiUrlV2}/filters/${filterId}`).then(
3941
3957
  () => Promise.all([
3942
3958
  dispatch(actions.removeGroup(groupName)),
3959
+ dispatch(removeReportsByGroupName(groupName)),
3943
3960
  dispatch(setSnackbar4({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
3944
3961
  ])
3945
3962
  );
@@ -4668,6 +4685,7 @@ var getGatewayDevices = createAppAsyncThunk(`${sliceName}/getGatewayDevices`, (d
4668
4685
  preauthDevice,
4669
4686
  removeDevicesFromGroup,
4670
4687
  removeDynamicGroup,
4688
+ removeReportsByGroupName,
4671
4689
  removeStaticGroup,
4672
4690
  searchDevices,
4673
4691
  selectGroup,