@northern.tech/store 0.3.1 → 0.3.3

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 (197) hide show
  1. package/dist/actions.cjs +20 -17
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.js +8 -8
  4. package/dist/api/general-api.js +2 -2
  5. package/dist/api/types/Tenant.ts +17 -12
  6. package/dist/api/users-api.js +2 -2
  7. package/dist/appSlice/constants.cjs +18 -10
  8. package/dist/appSlice/constants.cjs.map +1 -1
  9. package/dist/appSlice/constants.d.cts +41 -84
  10. package/dist/appSlice/constants.d.ts +41 -84
  11. package/dist/appSlice/constants.js +1 -1
  12. package/dist/appSlice/index.js +2 -2
  13. package/dist/appSlice/thunks.cjs +140 -96
  14. package/dist/appSlice/thunks.cjs.map +1 -1
  15. package/dist/appSlice/thunks.js +19 -19
  16. package/dist/auth.js +2 -2
  17. package/dist/{chunk-Q6M5TTDQ.js → chunk-2CYOM4BK.js} +1 -1
  18. package/dist/chunk-2CYOM4BK.js.map +1 -0
  19. package/dist/{chunk-APHL4JZP.js → chunk-2JHFUQ6B.js} +141 -102
  20. package/dist/chunk-2JHFUQ6B.js.map +1 -0
  21. package/dist/{chunk-YETZPQFR.js → chunk-4XJMRVFI.js} +12 -11
  22. package/dist/chunk-4XJMRVFI.js.map +1 -0
  23. package/dist/{chunk-RX55KAKX.js → chunk-7JKWI5FK.js} +2 -2
  24. package/dist/{chunk-A6CT6GTI.js → chunk-C5NEDBJI.js} +17 -11
  25. package/dist/chunk-C5NEDBJI.js.map +1 -0
  26. package/dist/{chunk-NNADGHSL.js → chunk-DAPAXWA5.js} +8 -8
  27. package/dist/{chunk-ANB5BM5J.js → chunk-DCK2DBOA.js} +27 -20
  28. package/dist/chunk-DCK2DBOA.js.map +1 -0
  29. package/dist/{chunk-E5LEU5PF.js → chunk-HPBE6KYY.js} +2 -2
  30. package/dist/{chunk-2RJIDREZ.js → chunk-LEMVXAYP.js} +25 -16
  31. package/dist/chunk-LEMVXAYP.js.map +1 -0
  32. package/dist/{chunk-NI4SZOCF.js → chunk-LGNOTPUG.js} +9 -9
  33. package/dist/{chunk-MDC7Y3EX.js → chunk-LTKOV26W.js} +22 -20
  34. package/dist/chunk-LTKOV26W.js.map +1 -0
  35. package/dist/{chunk-YTQUNAZP.js → chunk-QRGTG4YB.js} +2 -2
  36. package/dist/{chunk-XTRPX7JZ.js → chunk-TI2RL5P2.js} +2 -2
  37. package/dist/chunk-TI2RL5P2.js.map +1 -0
  38. package/dist/{chunk-YGBFDXXA.js → chunk-TUACATJA.js} +2 -2
  39. package/dist/{chunk-25AKG5HH.js → chunk-UWMYZNUB.js} +19 -11
  40. package/dist/chunk-UWMYZNUB.js.map +1 -0
  41. package/dist/{chunk-UEP36GCI.js → chunk-VMNMD6KF.js} +2 -2
  42. package/dist/{chunk-KAQJH2YL.js → chunk-WXL7PVI5.js} +12 -4
  43. package/dist/chunk-WXL7PVI5.js.map +1 -0
  44. package/dist/{chunk-VOCOFE4I.js → chunk-X7IEZBM4.js} +2 -2
  45. package/dist/{chunk-XXHONFSQ.js → chunk-YDS36ALB.js} +3 -3
  46. package/dist/{chunk-XXHONFSQ.js.map → chunk-YDS36ALB.js.map} +1 -1
  47. package/dist/commonSelectors.cjs +40 -18
  48. package/dist/commonSelectors.cjs.map +1 -1
  49. package/dist/commonSelectors.d.cts +54 -46
  50. package/dist/commonSelectors.d.ts +54 -46
  51. package/dist/commonSelectors.js +9 -9
  52. package/dist/constants.cjs +35 -19
  53. package/dist/constants.cjs.map +1 -1
  54. package/dist/constants.d.cts +3 -3
  55. package/dist/constants.d.ts +3 -3
  56. package/dist/constants.js +6 -2
  57. package/dist/deploymentdevicehook.cjs +146 -101
  58. package/dist/deploymentdevicehook.cjs.map +1 -1
  59. package/dist/deploymentdevicehook.d.cts +1 -1
  60. package/dist/deploymentdevicehook.d.ts +1 -1
  61. package/dist/deploymentdevicehook.js +24 -22
  62. package/dist/deploymentdevicehook.js.map +1 -1
  63. package/dist/deploymentsSlice/constants.cjs +8 -8
  64. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  65. package/dist/deploymentsSlice/constants.js +2 -2
  66. package/dist/deploymentsSlice/index.cjs +8 -8
  67. package/dist/deploymentsSlice/index.cjs.map +1 -1
  68. package/dist/deploymentsSlice/index.js +3 -3
  69. package/dist/deploymentsSlice/selectors.cjs +8 -8
  70. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  71. package/dist/deploymentsSlice/selectors.js +3 -3
  72. package/dist/deploymentsSlice/thunks.cjs +140 -96
  73. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  74. package/dist/deploymentsSlice/thunks.js +19 -19
  75. package/dist/devicesSlice/constants.cjs +11 -8
  76. package/dist/devicesSlice/constants.cjs.map +1 -1
  77. package/dist/devicesSlice/constants.d.cts +2 -1
  78. package/dist/devicesSlice/constants.d.ts +2 -1
  79. package/dist/devicesSlice/constants.js +4 -2
  80. package/dist/devicesSlice/index.cjs +8 -8
  81. package/dist/devicesSlice/index.cjs.map +1 -1
  82. package/dist/devicesSlice/index.js +3 -3
  83. package/dist/devicesSlice/selectors.cjs +9 -9
  84. package/dist/devicesSlice/selectors.cjs.map +1 -1
  85. package/dist/devicesSlice/selectors.js +3 -3
  86. package/dist/devicesSlice/thunks.cjs +142 -96
  87. package/dist/devicesSlice/thunks.cjs.map +1 -1
  88. package/dist/devicesSlice/thunks.d.cts +12 -2
  89. package/dist/devicesSlice/thunks.d.ts +12 -2
  90. package/dist/devicesSlice/thunks.js +21 -19
  91. package/dist/flag-eu-5477R2P4.svg +130 -0
  92. package/dist/flag-us-HNQAF66I.svg +63 -0
  93. package/dist/monitorSlice/constants.cjs +8 -8
  94. package/dist/monitorSlice/constants.cjs.map +1 -1
  95. package/dist/monitorSlice/constants.js +2 -2
  96. package/dist/monitorSlice/index.cjs +8 -8
  97. package/dist/monitorSlice/index.cjs.map +1 -1
  98. package/dist/monitorSlice/index.js +3 -3
  99. package/dist/monitorSlice/thunks.cjs +59 -37
  100. package/dist/monitorSlice/thunks.cjs.map +1 -1
  101. package/dist/monitorSlice/thunks.js +17 -17
  102. package/dist/onboardingSlice/thunks.cjs +149 -102
  103. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  104. package/dist/onboardingSlice/thunks.d.cts +1 -32
  105. package/dist/onboardingSlice/thunks.d.ts +1 -32
  106. package/dist/onboardingSlice/thunks.js +19 -19
  107. package/dist/organizationSlice/constants.cjs +22 -17
  108. package/dist/organizationSlice/constants.cjs.map +1 -1
  109. package/dist/organizationSlice/constants.d.cts +33 -1
  110. package/dist/organizationSlice/constants.d.ts +33 -1
  111. package/dist/organizationSlice/constants.js +4 -2
  112. package/dist/organizationSlice/index.cjs +18 -15
  113. package/dist/organizationSlice/index.cjs.map +1 -1
  114. package/dist/organizationSlice/index.d.cts +26 -1012
  115. package/dist/organizationSlice/index.d.ts +26 -1012
  116. package/dist/organizationSlice/index.js +3 -3
  117. package/dist/organizationSlice/selectors.cjs.map +1 -1
  118. package/dist/organizationSlice/selectors.d.cts +9 -1
  119. package/dist/organizationSlice/selectors.d.ts +9 -1
  120. package/dist/organizationSlice/selectors.js +3 -3
  121. package/dist/organizationSlice/thunks.cjs +1608 -1540
  122. package/dist/organizationSlice/thunks.cjs.map +1 -1
  123. package/dist/organizationSlice/thunks.d.cts +61 -36
  124. package/dist/organizationSlice/thunks.d.ts +61 -36
  125. package/dist/organizationSlice/thunks.js +19 -19
  126. package/dist/organizationSlice/types.cjs +19 -0
  127. package/dist/organizationSlice/types.cjs.map +1 -0
  128. package/dist/organizationSlice/types.d.cts +114 -0
  129. package/dist/organizationSlice/types.d.ts +114 -0
  130. package/dist/organizationSlice/types.js +1 -0
  131. package/dist/organizationSlice/types.js.map +1 -0
  132. package/dist/releasesSlice/index.js +2 -2
  133. package/dist/releasesSlice/selectors.cjs +11 -0
  134. package/dist/releasesSlice/selectors.cjs.map +1 -1
  135. package/dist/releasesSlice/selectors.js +4 -4
  136. package/dist/releasesSlice/thunks.cjs +73 -49
  137. package/dist/releasesSlice/thunks.cjs.map +1 -1
  138. package/dist/releasesSlice/thunks.d.cts +1 -4
  139. package/dist/releasesSlice/thunks.d.ts +1 -4
  140. package/dist/releasesSlice/thunks.js +17 -17
  141. package/dist/selectors.cjs +46 -18
  142. package/dist/selectors.cjs.map +1 -1
  143. package/dist/selectors.d.cts +9 -1
  144. package/dist/selectors.d.ts +9 -1
  145. package/dist/selectors.js +36 -30
  146. package/dist/store.cjs +36 -23
  147. package/dist/store.cjs.map +1 -1
  148. package/dist/store.d.cts +12 -231
  149. package/dist/store.d.ts +12 -231
  150. package/dist/store.js +13 -11
  151. package/dist/storehooks.cjs +222 -141
  152. package/dist/storehooks.cjs.map +1 -1
  153. package/dist/storehooks.js +36 -24
  154. package/dist/storehooks.js.map +1 -1
  155. package/dist/thunks.cjs +199 -126
  156. package/dist/thunks.cjs.map +1 -1
  157. package/dist/thunks.d.cts +5 -1
  158. package/dist/thunks.d.ts +5 -1
  159. package/dist/thunks.js +21 -19
  160. package/dist/usersSlice/constants.cjs +10 -10
  161. package/dist/usersSlice/constants.cjs.map +1 -1
  162. package/dist/usersSlice/constants.js +2 -2
  163. package/dist/usersSlice/index.cjs +10 -10
  164. package/dist/usersSlice/index.cjs.map +1 -1
  165. package/dist/usersSlice/index.js +3 -3
  166. package/dist/usersSlice/selectors.cjs +35 -13
  167. package/dist/usersSlice/selectors.cjs.map +1 -1
  168. package/dist/usersSlice/selectors.d.cts +44 -1
  169. package/dist/usersSlice/selectors.d.ts +44 -1
  170. package/dist/usersSlice/selectors.js +12 -6
  171. package/dist/usersSlice/thunks.cjs +138 -96
  172. package/dist/usersSlice/thunks.cjs.map +1 -1
  173. package/dist/usersSlice/thunks.d.cts +10 -9
  174. package/dist/usersSlice/thunks.d.ts +10 -9
  175. package/dist/usersSlice/thunks.js +19 -19
  176. package/dist/utils.cjs +17 -16
  177. package/dist/utils.cjs.map +1 -1
  178. package/dist/utils.js +3 -3
  179. package/package.json +7 -7
  180. package/dist/chunk-25AKG5HH.js.map +0 -1
  181. package/dist/chunk-2RJIDREZ.js.map +0 -1
  182. package/dist/chunk-A6CT6GTI.js.map +0 -1
  183. package/dist/chunk-ANB5BM5J.js.map +0 -1
  184. package/dist/chunk-APHL4JZP.js.map +0 -1
  185. package/dist/chunk-KAQJH2YL.js.map +0 -1
  186. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  187. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  188. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  189. package/dist/chunk-YETZPQFR.js.map +0 -1
  190. /package/dist/{chunk-RX55KAKX.js.map → chunk-7JKWI5FK.js.map} +0 -0
  191. /package/dist/{chunk-NNADGHSL.js.map → chunk-DAPAXWA5.js.map} +0 -0
  192. /package/dist/{chunk-E5LEU5PF.js.map → chunk-HPBE6KYY.js.map} +0 -0
  193. /package/dist/{chunk-NI4SZOCF.js.map → chunk-LGNOTPUG.js.map} +0 -0
  194. /package/dist/{chunk-YTQUNAZP.js.map → chunk-QRGTG4YB.js.map} +0 -0
  195. /package/dist/{chunk-YGBFDXXA.js.map → chunk-TUACATJA.js.map} +0 -0
  196. /package/dist/{chunk-UEP36GCI.js.map → chunk-VMNMD6KF.js.map} +0 -0
  197. /package/dist/{chunk-VOCOFE4I.js.map → chunk-X7IEZBM4.js.map} +0 -0
package/dist/thunks.cjs CHANGED
@@ -182,6 +182,7 @@ __export(thunks_exports, {
182
182
  submitFeedback: () => submitFeedback,
183
183
  switchUserOrganization: () => switchUserOrganization,
184
184
  tenantDataDivergedMessage: () => tenantDataDivergedMessage,
185
+ triggerDeviceUpdate: () => triggerDeviceUpdate,
185
186
  updateDeploymentControlMap: () => updateDeploymentControlMap,
186
187
  updateDeviceAuth: () => updateDeviceAuth,
187
188
  updateDevicesAuth: () => updateDevicesAuth,
@@ -203,6 +204,14 @@ var import_universal_cookie = __toESM(require("universal-cookie"), 1);
203
204
 
204
205
  // src/appSlice/constants.ts
205
206
  var import_icons_material = require("@mui/icons-material");
207
+
208
+ // ../../assets/img/flag-eu.svg
209
+ var flag_eu_default = "./flag-eu-5477R2P4.svg";
210
+
211
+ // ../../assets/img/flag-us.svg
212
+ var flag_us_default = "./flag-us-HNQAF66I.svg";
213
+
214
+ // src/appSlice/constants.ts
206
215
  var startingDeviceCount = {
207
216
  os: "for first 50 devices",
208
217
  professional: "for first 250 devices"
@@ -225,36 +234,36 @@ var emptyChartSelection = { software: "", group: "", chartType: chartTypes.bar.k
225
234
  var defaultReportType = "distribution";
226
235
  var defaultReports = [{ ...emptyChartSelection, group: null, attribute: "artifact_name", type: defaultReportType }];
227
236
  var locations = {
228
- eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io" },
229
- us: { key: "us", title: "US", location: "hosted.mender.io" }
237
+ eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io", icon: flag_eu_default },
238
+ us: { key: "us", title: "US", location: "hosted.mender.io", icon: flag_us_default }
230
239
  };
231
240
  var PLANS = {
232
241
  os: {
233
242
  id: "os",
234
243
  name: "Basic",
235
244
  offer: true,
236
- price: "$32/month",
245
+ price: "$32 / month",
237
246
  deviceCount: startingDeviceCount.os,
238
- offerprice: "$23/month for first 50 devices",
247
+ offerprice: "$23 / month for first 50 devices",
239
248
  price2: "for first 6 months;\n$29/month thereafter",
240
- features: ["Basic OTA features"]
249
+ features: ["Access to core features of Mender", "Basic support"]
241
250
  },
242
251
  professional: {
243
252
  id: "professional",
244
253
  name: "Professional",
245
254
  offer: true,
246
- price: "$269/month",
255
+ price: "$269 / month",
247
256
  deviceCount: startingDeviceCount.professional,
248
- offerprice: "$200/month for first 50 devices",
257
+ offerprice: "$200 / month for first 50 devices",
249
258
  price2: "for first 6 months;\n$249/month thereafter",
250
- features: ["+ Advanced OTA features", "+ Standard support"]
259
+ features: ["Advanced OTA features", "Higher priority support"]
251
260
  },
252
261
  enterprise: {
253
262
  id: "enterprise",
254
263
  name: "Enterprise",
255
264
  price: "Custom pricing",
256
- deviceCount: "unlimited devices",
257
- features: ["+ Enterprise-grade OTA features", "+ Premium support"]
265
+ deviceCount: "Unlimited devices",
266
+ features: ["All Mender features", "Advanced security features", "SLA-backed support"]
258
267
  }
259
268
  };
260
269
  var ADDONS = {
@@ -725,6 +734,7 @@ var DEVICE_STATES = {
725
734
  rejected: "rejected"
726
735
  };
727
736
  var geoAttributes = ["geo-lat", "geo-lon"].map((attribute) => ({ attribute, scope: "inventory" }));
737
+ var REPORT_CHART_SIZE_LIMIT = 6;
728
738
 
729
739
  // src/monitorSlice/constants.ts
730
740
  var alertChannels = { email: "email" };
@@ -806,13 +816,16 @@ var SSO_TYPES = {
806
816
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
807
817
  }
808
818
  };
809
- var AUDIT_LOGS_TYPES = [
810
- { title: "Artifact", queryParameter: "object_type", value: "artifact" },
811
- { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
812
- { title: "Device", queryParameter: "object_id", value: "device" },
813
- { title: "User", queryParameter: "object_id", value: "user" }
814
- ];
815
- var SP_AUDIT_LOGS_TYPES = [AUDIT_LOGS_TYPES[3], { title: "Tenant", queryParameter: "object_id", value: "tenant" }];
819
+ var auditlogTypes = {
820
+ artifact: { title: "Artifact", queryParameter: "object_type", value: "artifact" },
821
+ deployment: { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
822
+ device: { title: "Device", queryParameter: "object_id", value: "device" },
823
+ user_access_token: { title: "Personal Access Token", queryParameter: "user_access_token", value: "user_access_token" },
824
+ user: { title: "User", queryParameter: "object_id", value: "user" },
825
+ tenant: { title: "Tenant", queryParameter: "object_id", value: "tenant" }
826
+ };
827
+ var AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];
828
+ var SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];
816
829
  var emptyWebhook = {
817
830
  description: "",
818
831
  enabled: true,
@@ -946,7 +959,7 @@ var uiPermissionsByArea = {
946
959
  explanation: "Granting access to the audit log will allow tracing changes to devices, releases and user accounts, as well as providing information about deployments.",
947
960
  key: "auditlog",
948
961
  uiPermissions: [uiPermissionsById.read],
949
- title: "System audit log"
962
+ title: "System Audit Log"
950
963
  },
951
964
  deployments: {
952
965
  endpoints: [
@@ -1097,7 +1110,7 @@ var serviceProviderRolesById = {
1097
1110
  },
1098
1111
  readOnly: {
1099
1112
  name: "Read access",
1100
- value: staticRolesByName.admin,
1113
+ value: staticRolesByName.readOnly,
1101
1114
  description: "This role can see all linked organizations but cannot make any changes",
1102
1115
  permissions: [],
1103
1116
  uiPermissions: {
@@ -1429,7 +1442,7 @@ var getGroups = (0, import_toolkit3.createSelector)([getGroupsById], (groupsById
1429
1442
  (accu, [groupname, group]) => {
1430
1443
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
1431
1444
  const groupItem = { ...group, groupId: name, name: groupname };
1432
- if (group.filters.length > 0) {
1445
+ if (group.filters?.length > 0) {
1433
1446
  if (groupname !== UNGROUPED_GROUP.id) {
1434
1447
  accu.dynamic.push(groupItem);
1435
1448
  } else {
@@ -1504,14 +1517,15 @@ var getAuditLogEntry = (0, import_toolkit4.createSelector)([getAuditLog, getAudi
1504
1517
  // src/utils.ts
1505
1518
  var import_helpers3 = require("@northern.tech/utils/helpers");
1506
1519
  var filterProcessors = {
1507
- $gt: (val) => Number(val) || val,
1508
- $gte: (val) => Number(val) || val,
1509
- $lt: (val) => Number(val) || val,
1510
- $lte: (val) => Number(val) || val,
1511
- $in: (val) => ("" + val).split(",").map((i) => i.trim()),
1512
- $nin: (val) => ("" + val).split(",").map((i) => i.trim()),
1513
- $exists: import_helpers3.yes,
1514
- $nexists: () => false
1520
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
1521
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
1522
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
1523
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
1524
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
1525
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
1526
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
1527
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers3.yes,
1528
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
1515
1529
  };
1516
1530
  var filterAliases = {
1517
1531
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -1635,8 +1649,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
1635
1649
  var getGlobalSettings = (state) => state.users.globalSettings;
1636
1650
  var getCurrentUserId = (state) => state.users.currentUser;
1637
1651
  var getUsersById = (state) => state.users.byId;
1652
+ var getUsersList = (0, import_toolkit6.createSelector)([getUsersById], (usersById) => Object.values(usersById));
1638
1653
  var getCurrentUser = (0, import_toolkit6.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
1639
1654
  var getUserSettings = (state) => state.users.userSettings;
1655
+ var getSelectedDeviceAttribute = (0, import_toolkit6.createSelector)(
1656
+ [getUserSettings],
1657
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
1658
+ );
1640
1659
  var getIsDarkMode = (0, import_toolkit6.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
1641
1660
  var getShowHelptips = (0, import_toolkit6.createSelector)(
1642
1661
  [getTooltipsById],
@@ -1661,7 +1680,7 @@ var getOfflineThresholdSettings = (0, import_toolkit6.createSelector)([getGlobal
1661
1680
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
1662
1681
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
1663
1682
  }));
1664
- var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
1683
+ var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
1665
1684
  var getCurrentSession = (state) => state.users.currentSession;
1666
1685
 
1667
1686
  // src/commonSelectors.ts
@@ -1723,12 +1742,18 @@ var getUserCapabilities = (0, import_toolkit7.createSelector)([getUserRoles, get
1723
1742
  });
1724
1743
  var getTenantCapabilities = (0, import_toolkit7.createSelector)(
1725
1744
  [getFeatures, getOrganization, getIsEnterprise],
1726
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
1745
+ ({
1746
+ hasAuditlogs: isAuditlogEnabled,
1747
+ hasDeviceConfig: isDeviceConfigEnabled,
1748
+ hasDeviceConnect: isDeviceConnectEnabled,
1749
+ hasMonitor: isMonitorEnabled,
1750
+ isHosted
1751
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
1727
1752
  const canDelta = isEnterprise || plan === PLANS.professional.id;
1728
1753
  const hasAuditlogs = isAuditlogEnabled && isEnterprise;
1729
- const hasDeviceConfig = isDeviceConfigEnabled && addons.some((addon) => addon.name === "configure" && Boolean(addon.enabled));
1730
- const hasDeviceConnect = isDeviceConnectEnabled && (!isEnterprise || addons.some((addon) => addon.name === "troubleshoot" && Boolean(addon.enabled)));
1731
- const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === "monitor" && Boolean(addon.enabled));
1754
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
1755
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
1756
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
1732
1757
  return {
1733
1758
  canDelta,
1734
1759
  canRetry: canDelta,
@@ -1858,7 +1883,7 @@ var getAuditlogDevice = (0, import_toolkit7.createSelector)([getAuditLogEntry, g
1858
1883
  var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
1859
1884
  if (service_provider) {
1860
1885
  return roles.reduce((accu, role) => {
1861
- if (rolesById[role.id]) {
1886
+ if (rolesById[role.value]) {
1862
1887
  return accu;
1863
1888
  }
1864
1889
  accu.push(role);
@@ -1866,7 +1891,7 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1866
1891
  }, Object.values(serviceProviderRolesById));
1867
1892
  }
1868
1893
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
1869
- const index = accu.findIndex(({ id }) => id === key);
1894
+ const index = accu.findIndex(({ value }) => value === key);
1870
1895
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
1871
1896
  return accu;
1872
1897
  }, roles);
@@ -2852,13 +2877,12 @@ var actions_default = {
2852
2877
  };
2853
2878
 
2854
2879
  // src/store.ts
2880
+ var import_react_redux = require("react-redux");
2855
2881
  var import_helpers7 = require("@northern.tech/utils/helpers");
2856
2882
  var import_toolkit17 = require("@reduxjs/toolkit");
2857
2883
  var { setSnackbar, uploadProgress } = actions_default;
2858
2884
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2859
- var resetEnvironment = () => {
2860
- keys.map((key) => window.sessionStorage.removeItem(key));
2861
- };
2885
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2862
2886
  resetEnvironment();
2863
2887
  var commonErrorFallback = "Please check your connection.";
2864
2888
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2884,6 +2908,14 @@ var sessionReducer = (state, action) => {
2884
2908
  }
2885
2909
  return rootReducer(state, action);
2886
2910
  };
2911
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2912
+ if (action.type.endsWith("/rejected")) {
2913
+ const { error } = action;
2914
+ console.error("Rejection in action:", action);
2915
+ console.error(error.stack);
2916
+ }
2917
+ return next(action);
2918
+ };
2887
2919
  var getConfiguredStore = (options = {}) => {
2888
2920
  const { preloadedState = {}, ...config } = options;
2889
2921
  return (0, import_toolkit17.configureStore)({
@@ -2899,7 +2931,7 @@ var getConfiguredStore = (options = {}) => {
2899
2931
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2900
2932
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2901
2933
  }
2902
- })
2934
+ }).concat(rejectionLoggerMiddleware)
2903
2935
  });
2904
2936
  };
2905
2937
  var store = getConfiguredStore({
@@ -2908,6 +2940,7 @@ var store = getConfiguredStore({
2908
2940
 
2909
2941
  // src/deploymentsSlice/thunks.ts
2910
2942
  var import_helpers8 = require("@northern.tech/utils/helpers");
2943
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
2911
2944
  var import_toolkit18 = require("@reduxjs/toolkit");
2912
2945
  var import_validator = require("validator");
2913
2946
  var { receivedDevice, setSnackbar: setSnackbar2 } = actions_default;
@@ -2964,6 +2997,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceNam
2964
2997
  return Promise.all(tasks);
2965
2998
  });
2966
2999
  });
3000
+ var isWithinFirstMonth = (expirationDate) => {
3001
+ if (!expirationDate) {
3002
+ return false;
3003
+ }
3004
+ const endOfFirstMonth = new Date(expirationDate);
3005
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
3006
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
3007
+ };
3008
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
3009
+ import_tracking.default.event({ category: "deployments", action: "create" });
3010
+ if (!totalDeploymentCount) {
3011
+ if (!hasDeployments) {
3012
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
3013
+ if (isWithinFirstMonth(trial_expiration)) {
3014
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
3015
+ }
3016
+ }
3017
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
3018
+ }
3019
+ };
2967
3020
  var MAX_PREVIOUS_PHASES_COUNT = 5;
2968
3021
  var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
2969
3022
  let request;
@@ -2974,6 +3027,9 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2974
3027
  } else {
2975
3028
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
2976
3029
  }
3030
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
3031
+ const { hasDeployments } = getGlobalSettings(getState());
3032
+ const { trial_expiration } = getOrganization(getState());
2977
3033
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
2978
3034
  const lastslashindex = data.headers.location.lastIndexOf("/");
2979
3035
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -2988,6 +3044,7 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2988
3044
  dispatch(getSingleDeployment(deploymentId)),
2989
3045
  dispatch(setSnackbar2("Deployment created successfully", TIMEOUTS.fiveSeconds))
2990
3046
  ];
3047
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
2991
3048
  const { canManageUsers } = getUserCapabilities(getState());
2992
3049
  if (canManageUsers) {
2993
3050
  const { phases, retries } = newDeployment;
@@ -3662,7 +3719,7 @@ var getDevicesByStatus2 = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/
3662
3719
  page = defaultPage2,
3663
3720
  perPage = defaultPerPage2,
3664
3721
  sortOptions = [],
3665
- selectedAttributes = []
3722
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3666
3723
  } = options;
3667
3724
  const state = getState();
3668
3725
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3775,7 +3832,6 @@ var getReportingLimits = (0, import_toolkit19.createAsyncThunk)(
3775
3832
  })
3776
3833
  );
3777
3834
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3778
- var REPORT_CHART_SIZE_LIMIT = 6;
3779
3835
  var getSingleReportData = (reportConfig, groups) => {
3780
3836
  const { attribute, group, software = "" } = reportConfig;
3781
3837
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3855,9 +3911,17 @@ var getDeviceConnect = (0, import_toolkit19.createAsyncThunk)(
3855
3911
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3856
3912
  )
3857
3913
  );
3914
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3915
+ var triggerDeviceUpdate = (0, import_toolkit19.createAsyncThunk)(
3916
+ `${sliceName3}/triggerDeviceUpdate`,
3917
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3918
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3919
+ )
3920
+ );
3858
3921
  var getSessionDetails = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3859
- const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1e3)}` : "";
3860
- const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1e3)}` : "";
3922
+ const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3923
+ const createdAfter = startDate ? `&created_after=${startUnix}` : "";
3924
+ const createdBefore = endDate ? `&created_before=${endUnix}` : "";
3861
3925
  const objectSearch = `&object_id=${deviceId}`;
3862
3926
  return general_api_default.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(
3863
3927
  ({ data: auditLogEntries }) => {
@@ -3956,12 +4020,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3956
4020
  );
3957
4021
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3958
4022
  `${sliceName3}/preauthDevice`,
3959
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
4023
+ (authset, { dispatch, rejectWithValue }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).then(() => Promise.resolve(dispatch(setSnackbar3("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds)))).catch((err) => {
3960
4024
  if (err.response.status === 409) {
3961
- return Promise.reject("A device with a matching identity data set already exists");
4025
+ return rejectWithValue("A device with a matching identity data set already exists");
3962
4026
  }
3963
4027
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3964
- }).then(() => Promise.resolve(dispatch(setSnackbar3("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
4028
+ })
3965
4029
  );
3966
4030
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3967
4031
  `${sliceName3}/decommissionDevice`,
@@ -4190,18 +4254,20 @@ var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4190
4254
 
4191
4255
  // src/onboardingSlice/thunks.ts
4192
4256
  var import_helpers10 = require("@northern.tech/utils/helpers");
4257
+ var import_onboardingManager = require("@northern.tech/utils/onboardingManager");
4258
+ var import_tracking2 = __toESM(require("@northern.tech/utils/tracking"), 1);
4193
4259
  var import_toolkit21 = require("@reduxjs/toolkit");
4194
4260
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4195
4261
  var cookies3 = new import_universal_cookie3.default();
4196
4262
  var applyOnboardingFallbacks = (progress2) => {
4197
- const step = orderedOnboardingSteps[progress2];
4263
+ const step = import_onboardingManager.onboardingSteps[progress2];
4198
4264
  if (step && step.fallbackStep) {
4199
4265
  return step.fallbackStep;
4200
4266
  }
4201
4267
  return progress2;
4202
4268
  };
4203
4269
  var determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {
4204
- const steps = orderedOnboardingSteps;
4270
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4205
4271
  let progress2 = -1;
4206
4272
  progress2 = pendingDevices.length > 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress2;
4207
4273
  progress2 = acceptedDevices.length >= 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_ACCEPTED_ONBOARDING) : progress2;
@@ -4218,7 +4284,7 @@ var deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pa
4218
4284
  const progress2 = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));
4219
4285
  return {
4220
4286
  ...onboardingState,
4221
- complete: !!(Boolean(userCookie) || onboardingState.complete || acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1 || acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2 || acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2 || orderedOnboardingSteps.findIndex((step) => step === progress2) >= orderedOnboardingSteps.length - 1 || onboardingState.disable || ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every((i) => i)),
4287
+ complete: !!(Boolean(userCookie) || onboardingState.complete || acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1 || acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2 || acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2 || Object.keys(import_onboardingManager.onboardingSteps).findIndex((step) => step === progress2) >= Object.keys(import_onboardingManager.onboardingSteps).length - 1 || onboardingState.disable || ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every((i) => i)),
4222
4288
  showTips: onboardingState.showTips != null ? onboardingState.showTips : true,
4223
4289
  deviceType,
4224
4290
  approach: onboardingState.approach || (deviceType.some((type) => type.startsWith("qemu")) ? "virtual" : "physical"),
@@ -4271,10 +4337,10 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4271
4337
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4272
4338
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4273
4339
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4274
- ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))
4340
+ ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE))).then(() => import_tracking2.default.event({ category: "onboarding", action: import_onboardingManager.onboardingSteps.ONBOARDING_CANCELED }))
4275
4341
  );
4276
4342
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4277
- const steps = orderedOnboardingSteps;
4343
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4278
4344
  const progress2 = steps.findIndex((step) => step === getState().onboarding.progress);
4279
4345
  const stepIndex = steps.findIndex((step) => step === stepId);
4280
4346
  if (progress2 > stepIndex || getState().onboarding.progress === null) {
@@ -4282,7 +4348,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4282
4348
  }
4283
4349
  const madeProgress = steps[stepIndex + 1];
4284
4350
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4285
- state.complete = stepIndex + 1 >= steps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4351
+ state.complete = stepIndex + 1 >= Object.keys(import_onboardingManager.onboardingSteps).findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4352
+ import_tracking2.default.event({ category: "onboarding", action: stepId });
4286
4353
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4287
4354
  });
4288
4355
 
@@ -4361,13 +4428,14 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4361
4428
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4362
4429
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4363
4430
  `${sliceName6}/completeUpgrade`,
4364
- ({ tenantId, plan }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan }).catch((err) => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch)).then(() => Promise.resolve(dispatch(getUserOrganization())))
4431
+ ({ tenantId, plan, billing_profile }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/complete`, { plan, billing_profile }).catch((err) => commonErrorHandler(err, `There was an error upgrading your account:`, dispatch)).then(() => Promise.all([dispatch(getDeviceLimit2()), dispatch(getUserOrganization())]))
4365
4432
  );
4366
4433
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4367
4434
  const userId = userFilter?.id || userFilter;
4368
4435
  const detail = detailFilter?.id || detailFilter;
4369
- const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1e3)}` : "";
4370
- const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1e3)}` : "";
4436
+ const { start: startUnix, end: endUnix } = (0, import_helpers11.dateRangeToUnix)(startDate, endDate);
4437
+ const createdAfter = startDate ? `&created_after=${startUnix}` : "";
4438
+ const createdBefore = endDate ? `&created_before=${endUnix}` : "";
4371
4439
  const typeSearch = type ? `&object_type=${type.value}`.toLowerCase() : "";
4372
4440
  const userSearch = userId ? `&actor_id=${userId}` : "";
4373
4441
  const objectSearch = type && detail ? `&${type.queryParameter}=${encodeURIComponent(detail)}` : "";
@@ -4409,7 +4477,12 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4409
4477
  });
4410
4478
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4411
4479
  var addTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/createTenant`, (selectionState, { dispatch }) => {
4412
- return general_api_default.post(`${tenantadmApiUrlv2}/tenants`, selectionState).then(() => Promise.all([dispatch(getTenants()), dispatch(setSnackbar4("Tenant was created successfully."))])).catch((err) => commonErrorHandler(err, "There was an error creating tenant", dispatch, commonErrorFallback));
4480
+ return general_api_default.post(`${tenantadmApiUrlv2}/tenants`, selectionState).then(
4481
+ () => Promise.all([
4482
+ dispatch(setSnackbar4("Tenant was created successfully.")),
4483
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4484
+ ])
4485
+ ).catch((err) => commonErrorHandler(err, "There was an error creating tenant", dispatch, commonErrorFallback));
4413
4486
  });
4414
4487
  var tenantListRetrieval = async (config) => {
4415
4488
  const { page, perPage } = config;
@@ -4437,15 +4510,20 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4437
4510
  });
4438
4511
  var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4439
4512
  return general_api_default.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name }).catch((err) => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(() => {
4440
- const tasks = [Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully")))];
4441
- tasks.push(dispatch(getTenants()));
4442
- tasks.push(dispatch(getUserOrganization()));
4443
- return Promise.all(tasks);
4513
+ return Promise.all([
4514
+ dispatch(setSnackbar4("Device Limit was changed successfully")),
4515
+ dispatch(getUserOrganization()),
4516
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4517
+ ]);
4444
4518
  });
4445
4519
  });
4446
4520
  var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4447
4521
  return general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4448
- () => Promise.all([Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully"))), dispatch(getTenants()), dispatch(getUserOrganization())])
4522
+ () => Promise.all([
4523
+ dispatch(setSnackbar4("The tenant was removed successfully")),
4524
+ dispatch(getUserOrganization()),
4525
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4526
+ ])
4449
4527
  );
4450
4528
  });
4451
4529
  var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
@@ -4469,7 +4547,10 @@ var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4469
4547
  );
4470
4548
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4471
4549
  `${sliceName6}/requestPlanChange`,
4472
- ({ content, tenantId }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content).catch((err) => commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback)).then(() => Promise.resolve(dispatch(setSnackbar4({ message: "Your request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))))
4550
+ ({ content, tenantId }, { dispatch, rejectWithValue }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content).catch(async (err) => {
4551
+ await commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback);
4552
+ rejectWithValue(err);
4553
+ }).then(() => Promise.resolve(dispatch(setSnackbar4({ message: "Your request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))))
4473
4554
  );
4474
4555
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4475
4556
  `${sliceName6}/downloadLicenseReport`,
@@ -4727,9 +4808,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4727
4808
  if (!release || index === -1) {
4728
4809
  return dispatch(getReleases());
4729
4810
  }
4730
- release.artifacts[index].description = body.description;
4811
+ const updatedRelease = {
4812
+ ...release,
4813
+ artifacts: release.artifacts.map((artifact, i) => i === index ? { ...artifact, description: body.description } : artifact)
4814
+ };
4731
4815
  return Promise.all([
4732
- dispatch(actions7.receiveRelease(release)),
4816
+ dispatch(actions7.receiveRelease(updatedRelease)),
4733
4817
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4734
4818
  dispatch(getRelease(release.name)),
4735
4819
  dispatch(selectRelease(release.name))
@@ -4830,16 +4914,15 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4830
4914
  return Promise.all(tasks);
4831
4915
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4832
4916
  });
4833
- var getRelease = (0, import_toolkit23.createAsyncThunk)(
4834
- `${sliceName7}/getReleases`,
4835
- (name, { dispatch, getState }) => releaseListRetrieval({ searchTerm: name, page: 1, perPage: 1 }).then(({ data: releases }) => {
4836
- if (releases.length) {
4837
- const stateRelease = getReleasesById(getState())[releases[0].name] || {};
4838
- return Promise.resolve(dispatch(actions7.receiveRelease(flattenRelease(releases[0], stateRelease))));
4839
- }
4840
- return Promise.resolve(null);
4841
- })
4842
- );
4917
+ var getRelease = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getReleases`, async (name, { dispatch, getState }) => {
4918
+ const releaseResponse = await general_api_default.get(`${deploymentsApiUrlV2}/deployments/releases/${name}`);
4919
+ const { data: release } = releaseResponse;
4920
+ if (release) {
4921
+ const stateRelease = getReleasesById(getState())[release.name] || {};
4922
+ await dispatch(actions7.receiveRelease(flattenRelease(release, stateRelease)));
4923
+ }
4924
+ return Promise.resolve(null);
4925
+ });
4843
4926
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4844
4927
  `${sliceName7}/updateReleaseInfo`,
4845
4928
  ({ name, info }, { dispatch, getState }) => general_api_default.patch(`${deploymentsApiUrlV2}/deployments/releases/${name}`, info).catch((err) => commonErrorHandler(err, `Release details couldn't be updated.`, dispatch)).then(() => {
@@ -4867,6 +4950,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4867
4950
  (_, { dispatch }) => general_api_default.get(`${deploymentsApiUrlV2}/releases/all/types`).catch((err) => commonErrorHandler(err, `Existing update types couldn't be retrieved.`, dispatch)).then(({ data: types }) => Promise.resolve(dispatch(actions7.receiveReleaseTypes(types))))
4868
4951
  );
4869
4952
 
4953
+ // src/usersSlice/thunks.ts
4954
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4955
+
4870
4956
  // src/api/users-api.ts
4871
4957
  var import_axios4 = __toESM(require("axios"), 1);
4872
4958
  var Api2 = {
@@ -4900,7 +4986,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4900
4986
  }
4901
4987
  const twoFAError = is2FABackend ? " and verification code" : "";
4902
4988
  const errorMessage = `There was a problem logging in. Please check your email${twoFAError ? "," : " and"} password${twoFAError}. If you still have problems, contact an administrator.`;
4903
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.preformatWithRequestID)(err.response, errorMessage), null, "Copy to clipboard")));
4989
+ return Promise.reject(dispatch(setSnackbar6({ message: (0, import_helpers13.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
4904
4990
  };
4905
4991
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4906
4992
  `${sliceName8}/loginUser`,
@@ -4924,19 +5010,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4924
5010
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4925
5011
  setSessionInfo({ token, expiresAt });
4926
5012
  cookies5.remove("JWT", { path: "/" });
4927
- return (
4928
- // @ts-ignore
4929
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
4930
- cleanUp();
4931
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
4932
- }).then(() => {
4933
- window.sessionStorage.removeItem("pendings-redirect");
4934
- if (window.location.pathname !== "/ui/") {
4935
- window.location.replace("/ui/");
4936
- }
4937
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4938
- })
4939
- );
5013
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
5014
+ cleanUp();
5015
+ return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
5016
+ }).then(() => {
5017
+ window.sessionStorage.removeItem("pendings-redirect");
5018
+ if (window.location.pathname !== "/ui/") {
5019
+ window.location.replace("/ui/");
5020
+ }
5021
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
5022
+ });
4940
5023
  })
4941
5024
  );
4942
5025
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4954,6 +5037,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4954
5037
  return Promise.reject();
4955
5038
  }
4956
5039
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
5040
+ window.sessionStorage.setItem("tenantChanged", "true");
4957
5041
  setSessionInfo({ ...getSessionInfo(), token });
4958
5042
  window.location.reload();
4959
5043
  });
@@ -4994,11 +5078,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4994
5078
  );
4995
5079
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4996
5080
  `${sliceName8}/getUserList`,
4997
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
4998
- const users = res.data.reduce((accu, item) => {
4999
- accu[item.id] = item;
5000
- return accu;
5001
- }, {});
5081
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
5082
+ const currentUsersById = getUsersById(getState());
5083
+ const users = res.data.reduce(
5084
+ (accu, item) => {
5085
+ accu[item.id] = {
5086
+ ...accu[item.id],
5087
+ ...item
5088
+ };
5089
+ return accu;
5090
+ },
5091
+ { ...currentUsersById }
5092
+ );
5002
5093
  return dispatch(actions8.receivedUserList(users));
5003
5094
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
5004
5095
  );
@@ -5007,9 +5098,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
5007
5098
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
5008
5099
  ({ data: user }) => Promise.all([
5009
5100
  dispatch(actions8.receivedUser(user)),
5010
- // @ts-ignore
5011
5101
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
5012
- // @ts-ignore
5013
5102
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
5014
5103
  user
5015
5104
  ])
@@ -5056,10 +5145,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
5056
5145
  );
5057
5146
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
5058
5147
  `${sliceName8}/removeUser`,
5059
- (userId, { dispatch }) => (
5060
- // @ts-ignore
5061
- general_api_default.delete(`${useradmApiUrlv1}/users/${userId}`).then(() => Promise.all([dispatch(actions8.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar6(userActions.remove.successMessage))])).catch((err) => userActionErrorHandler(err, "remove", dispatch))
5062
- )
5148
+ (userId, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/users/${userId}`).then(() => Promise.all([dispatch(actions8.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar6(userActions.remove.successMessage))])).catch((err) => userActionErrorHandler(err, "remove", dispatch))
5063
5149
  );
5064
5150
  var editUser = (0, import_toolkit24.createAsyncThunk)(
5065
5151
  `${sliceName8}/editUser`,
@@ -5080,7 +5166,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5080
5166
  );
5081
5167
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5082
5168
  `${sliceName8}/disableUser2fa`,
5083
- (userId = OWN_USER_ID, { dispatch }) => general_api_default.post(`${useradmApiUrlv1}/users/${userId}/2fa/disable`).catch((err) => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch)).then(() => Promise.resolve(dispatch(getUser(userId))))
5169
+ (userId = OWN_USER_ID, { dispatch }) => general_api_default.post(`${useradmApiUrlv1}/users/${userId}/2fa/disable`).catch((err) => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch)).then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions8.receivedQrCode(null))]))
5084
5170
  );
5085
5171
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
5086
5172
  (accu, [area, definition]) => {
@@ -5233,7 +5319,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5233
5319
  accu[permissionSet.name] = permissionSetObject;
5234
5320
  return accu;
5235
5321
  },
5236
- // @ts-ignore
5237
5322
  { ...getState().users.permissionSetsById }
5238
5323
  );
5239
5324
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5326,7 +5411,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5326
5411
  role: {
5327
5412
  ...emptyRole,
5328
5413
  name,
5329
- // @ts-ignore
5330
5414
  description: description ? description : roleState.description,
5331
5415
  uiPermissions: {
5332
5416
  ...emptyUiPermissions,
@@ -5369,10 +5453,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5369
5453
  });
5370
5454
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5371
5455
  `${sliceName8}/removeRole`,
5372
- (roleId, { dispatch }) => (
5373
- // @ts-ignore
5374
- general_api_default.delete(`${useradmApiUrlv2}/roles/${roleId}`).then(() => Promise.all([dispatch(actions8.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar6(roleActions.remove.successMessage))])).catch((err) => roleActionErrorHandler(err, "remove", dispatch))
5375
- )
5456
+ (roleId, { dispatch }) => general_api_default.delete(`${useradmApiUrlv2}/roles/${roleId}`).then(() => Promise.all([dispatch(actions8.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar6(roleActions.remove.successMessage))])).catch((err) => roleActionErrorHandler(err, "remove", dispatch))
5376
5457
  );
5377
5458
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5378
5459
  `${sliceName8}/getGlobalSettings`,
@@ -5383,7 +5464,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5383
5464
  );
5384
5465
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5385
5466
  `${sliceName8}/saveGlobalSettings`,
5386
- // @ts-ignore
5387
5467
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5388
5468
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5389
5469
  return;
@@ -5429,11 +5509,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5429
5509
  const tooltipState = getTooltipsState(getState());
5430
5510
  const updatedSettings = {
5431
5511
  ...userSettings,
5432
- // @ts-ignore
5433
5512
  ...settings,
5434
5513
  onboarding: {
5435
5514
  ...onboardingState,
5436
- // @ts-ignore
5437
5515
  ...settings.onboarding
5438
5516
  },
5439
5517
  tooltips: tooltipState
@@ -5477,10 +5555,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5477
5555
  );
5478
5556
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5479
5557
  `${sliceName8}/revokeToken`,
5480
- (token, { dispatch }) => (
5481
- // @ts-ignore
5482
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5483
- )
5558
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5484
5559
  );
5485
5560
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5486
5561
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5489,23 +5564,20 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5489
5564
  }
5490
5565
  return Promise.all(tasks);
5491
5566
  });
5492
- var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
5493
- const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5567
+ var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
5568
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5494
5569
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5495
5570
  });
5496
5571
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5497
5572
  `${sliceName8}/submitFeedback`,
5498
- // @ts-ignore
5499
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
5500
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5501
- subject: "feedback submission",
5502
- body: JSON.stringify({ feedback, satisfaction, meta })
5503
- }).then(() => {
5504
- const today = /* @__PURE__ */ new Date();
5505
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5506
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5507
- });
5508
- }
5573
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5574
+ subject: "feedback submission",
5575
+ body: JSON.stringify({ feedback, satisfaction, meta })
5576
+ }).then(() => {
5577
+ const today = /* @__PURE__ */ new Date();
5578
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5579
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5580
+ })
5509
5581
  );
5510
5582
  // Annotate the CommonJS export names for ESM import in node:
5511
5583
  0 && (module.exports = {
@@ -5661,6 +5733,7 @@ var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5661
5733
  submitFeedback,
5662
5734
  switchUserOrganization,
5663
5735
  tenantDataDivergedMessage,
5736
+ triggerDeviceUpdate,
5664
5737
  updateDeploymentControlMap,
5665
5738
  updateDeviceAuth,
5666
5739
  updateDevicesAuth,