@northern.tech/store 0.3.2 → 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 +137 -94
  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-74OJIKXF.js → chunk-2JHFUQ6B.js} +133 -96
  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 +143 -99
  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 +137 -94
  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 +139 -94
  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 +146 -100
  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 +1605 -1539
  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 +216 -137
  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 +193 -122
  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 +135 -94
  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-74OJIKXF.js.map +0 -1
  183. package/dist/chunk-A6CT6GTI.js.map +0 -1
  184. package/dist/chunk-ANB5BM5J.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,6 +3911,13 @@ 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
3922
  const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3860
3923
  const createdAfter = startDate ? `&created_after=${startUnix}` : "";
@@ -3957,12 +4020,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3957
4020
  );
3958
4021
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3959
4022
  `${sliceName3}/preauthDevice`,
3960
- (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) => {
3961
4024
  if (err.response.status === 409) {
3962
- 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");
3963
4026
  }
3964
4027
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3965
- }).then(() => Promise.resolve(dispatch(setSnackbar3("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
4028
+ })
3966
4029
  );
3967
4030
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3968
4031
  `${sliceName3}/decommissionDevice`,
@@ -4191,18 +4254,20 @@ var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4191
4254
 
4192
4255
  // src/onboardingSlice/thunks.ts
4193
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);
4194
4259
  var import_toolkit21 = require("@reduxjs/toolkit");
4195
4260
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4196
4261
  var cookies3 = new import_universal_cookie3.default();
4197
4262
  var applyOnboardingFallbacks = (progress2) => {
4198
- const step = orderedOnboardingSteps[progress2];
4263
+ const step = import_onboardingManager.onboardingSteps[progress2];
4199
4264
  if (step && step.fallbackStep) {
4200
4265
  return step.fallbackStep;
4201
4266
  }
4202
4267
  return progress2;
4203
4268
  };
4204
4269
  var determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {
4205
- const steps = orderedOnboardingSteps;
4270
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4206
4271
  let progress2 = -1;
4207
4272
  progress2 = pendingDevices.length > 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress2;
4208
4273
  progress2 = acceptedDevices.length >= 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_ACCEPTED_ONBOARDING) : progress2;
@@ -4219,7 +4284,7 @@ var deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pa
4219
4284
  const progress2 = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));
4220
4285
  return {
4221
4286
  ...onboardingState,
4222
- 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)),
4223
4288
  showTips: onboardingState.showTips != null ? onboardingState.showTips : true,
4224
4289
  deviceType,
4225
4290
  approach: onboardingState.approach || (deviceType.some((type) => type.startsWith("qemu")) ? "virtual" : "physical"),
@@ -4272,10 +4337,10 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4272
4337
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4273
4338
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4274
4339
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4275
- ]).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 }))
4276
4341
  );
4277
4342
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4278
- const steps = orderedOnboardingSteps;
4343
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4279
4344
  const progress2 = steps.findIndex((step) => step === getState().onboarding.progress);
4280
4345
  const stepIndex = steps.findIndex((step) => step === stepId);
4281
4346
  if (progress2 > stepIndex || getState().onboarding.progress === null) {
@@ -4283,7 +4348,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4283
4348
  }
4284
4349
  const madeProgress = steps[stepIndex + 1];
4285
4350
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4286
- 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 });
4287
4353
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4288
4354
  });
4289
4355
 
@@ -4362,7 +4428,7 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4362
4428
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4363
4429
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4364
4430
  `${sliceName6}/completeUpgrade`,
4365
- ({ 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())]))
4366
4432
  );
4367
4433
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4368
4434
  const userId = userFilter?.id || userFilter;
@@ -4411,7 +4477,12 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4411
4477
  });
4412
4478
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4413
4479
  var addTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/createTenant`, (selectionState, { dispatch }) => {
4414
- 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));
4415
4486
  });
4416
4487
  var tenantListRetrieval = async (config) => {
4417
4488
  const { page, perPage } = config;
@@ -4439,15 +4510,20 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4439
4510
  });
4440
4511
  var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4441
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(() => {
4442
- const tasks = [Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully")))];
4443
- tasks.push(dispatch(getTenants()));
4444
- tasks.push(dispatch(getUserOrganization()));
4445
- 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
+ ]);
4446
4518
  });
4447
4519
  });
4448
4520
  var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4449
4521
  return general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4450
- () => 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
+ ])
4451
4527
  );
4452
4528
  });
4453
4529
  var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
@@ -4471,7 +4547,10 @@ var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4471
4547
  );
4472
4548
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4473
4549
  `${sliceName6}/requestPlanChange`,
4474
- ({ 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 }))))
4475
4554
  );
4476
4555
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4477
4556
  `${sliceName6}/downloadLicenseReport`,
@@ -4729,9 +4808,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4729
4808
  if (!release || index === -1) {
4730
4809
  return dispatch(getReleases());
4731
4810
  }
4732
- 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
+ };
4733
4815
  return Promise.all([
4734
- dispatch(actions7.receiveRelease(release)),
4816
+ dispatch(actions7.receiveRelease(updatedRelease)),
4735
4817
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4736
4818
  dispatch(getRelease(release.name)),
4737
4819
  dispatch(selectRelease(release.name))
@@ -4832,16 +4914,15 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4832
4914
  return Promise.all(tasks);
4833
4915
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4834
4916
  });
4835
- var getRelease = (0, import_toolkit23.createAsyncThunk)(
4836
- `${sliceName7}/getReleases`,
4837
- (name, { dispatch, getState }) => releaseListRetrieval({ searchTerm: name, page: 1, perPage: 1 }).then(({ data: releases }) => {
4838
- if (releases.length) {
4839
- const stateRelease = getReleasesById(getState())[releases[0].name] || {};
4840
- return Promise.resolve(dispatch(actions7.receiveRelease(flattenRelease(releases[0], stateRelease))));
4841
- }
4842
- return Promise.resolve(null);
4843
- })
4844
- );
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
+ });
4845
4926
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4846
4927
  `${sliceName7}/updateReleaseInfo`,
4847
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(() => {
@@ -4869,6 +4950,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4869
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))))
4870
4951
  );
4871
4952
 
4953
+ // src/usersSlice/thunks.ts
4954
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4955
+
4872
4956
  // src/api/users-api.ts
4873
4957
  var import_axios4 = __toESM(require("axios"), 1);
4874
4958
  var Api2 = {
@@ -4902,7 +4986,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4902
4986
  }
4903
4987
  const twoFAError = is2FABackend ? " and verification code" : "";
4904
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.`;
4905
- 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" })));
4906
4990
  };
4907
4991
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4908
4992
  `${sliceName8}/loginUser`,
@@ -4926,19 +5010,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4926
5010
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4927
5011
  setSessionInfo({ token, expiresAt });
4928
5012
  cookies5.remove("JWT", { path: "/" });
4929
- return (
4930
- // @ts-ignore
4931
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
4932
- cleanUp();
4933
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
4934
- }).then(() => {
4935
- window.sessionStorage.removeItem("pendings-redirect");
4936
- if (window.location.pathname !== "/ui/") {
4937
- window.location.replace("/ui/");
4938
- }
4939
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4940
- })
4941
- );
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
+ });
4942
5023
  })
4943
5024
  );
4944
5025
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4956,6 +5037,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4956
5037
  return Promise.reject();
4957
5038
  }
4958
5039
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
5040
+ window.sessionStorage.setItem("tenantChanged", "true");
4959
5041
  setSessionInfo({ ...getSessionInfo(), token });
4960
5042
  window.location.reload();
4961
5043
  });
@@ -4996,11 +5078,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4996
5078
  );
4997
5079
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4998
5080
  `${sliceName8}/getUserList`,
4999
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
5000
- const users = res.data.reduce((accu, item) => {
5001
- accu[item.id] = item;
5002
- return accu;
5003
- }, {});
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
+ );
5004
5093
  return dispatch(actions8.receivedUserList(users));
5005
5094
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
5006
5095
  );
@@ -5009,9 +5098,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
5009
5098
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
5010
5099
  ({ data: user }) => Promise.all([
5011
5100
  dispatch(actions8.receivedUser(user)),
5012
- // @ts-ignore
5013
5101
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
5014
- // @ts-ignore
5015
5102
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
5016
5103
  user
5017
5104
  ])
@@ -5058,10 +5145,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
5058
5145
  );
5059
5146
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
5060
5147
  `${sliceName8}/removeUser`,
5061
- (userId, { dispatch }) => (
5062
- // @ts-ignore
5063
- 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))
5064
- )
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))
5065
5149
  );
5066
5150
  var editUser = (0, import_toolkit24.createAsyncThunk)(
5067
5151
  `${sliceName8}/editUser`,
@@ -5082,7 +5166,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5082
5166
  );
5083
5167
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5084
5168
  `${sliceName8}/disableUser2fa`,
5085
- (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))]))
5086
5170
  );
5087
5171
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
5088
5172
  (accu, [area, definition]) => {
@@ -5235,7 +5319,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5235
5319
  accu[permissionSet.name] = permissionSetObject;
5236
5320
  return accu;
5237
5321
  },
5238
- // @ts-ignore
5239
5322
  { ...getState().users.permissionSetsById }
5240
5323
  );
5241
5324
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5328,7 +5411,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5328
5411
  role: {
5329
5412
  ...emptyRole,
5330
5413
  name,
5331
- // @ts-ignore
5332
5414
  description: description ? description : roleState.description,
5333
5415
  uiPermissions: {
5334
5416
  ...emptyUiPermissions,
@@ -5371,10 +5453,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5371
5453
  });
5372
5454
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5373
5455
  `${sliceName8}/removeRole`,
5374
- (roleId, { dispatch }) => (
5375
- // @ts-ignore
5376
- 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))
5377
- )
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))
5378
5457
  );
5379
5458
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5380
5459
  `${sliceName8}/getGlobalSettings`,
@@ -5385,7 +5464,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5385
5464
  );
5386
5465
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5387
5466
  `${sliceName8}/saveGlobalSettings`,
5388
- // @ts-ignore
5389
5467
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5390
5468
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5391
5469
  return;
@@ -5431,11 +5509,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5431
5509
  const tooltipState = getTooltipsState(getState());
5432
5510
  const updatedSettings = {
5433
5511
  ...userSettings,
5434
- // @ts-ignore
5435
5512
  ...settings,
5436
5513
  onboarding: {
5437
5514
  ...onboardingState,
5438
- // @ts-ignore
5439
5515
  ...settings.onboarding
5440
5516
  },
5441
5517
  tooltips: tooltipState
@@ -5479,10 +5555,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5479
5555
  );
5480
5556
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5481
5557
  `${sliceName8}/revokeToken`,
5482
- (token, { dispatch }) => (
5483
- // @ts-ignore
5484
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5485
- )
5558
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5486
5559
  );
5487
5560
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5488
5561
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5491,23 +5564,20 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5491
5564
  }
5492
5565
  return Promise.all(tasks);
5493
5566
  });
5494
- var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
5495
- 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 } }), {});
5496
5569
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5497
5570
  });
5498
5571
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5499
5572
  `${sliceName8}/submitFeedback`,
5500
- // @ts-ignore
5501
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
5502
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5503
- subject: "feedback submission",
5504
- body: JSON.stringify({ feedback, satisfaction, meta })
5505
- }).then(() => {
5506
- const today = /* @__PURE__ */ new Date();
5507
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5508
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5509
- });
5510
- }
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
+ })
5511
5581
  );
5512
5582
  // Annotate the CommonJS export names for ESM import in node:
5513
5583
  0 && (module.exports = {
@@ -5663,6 +5733,7 @@ var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5663
5733
  submitFeedback,
5664
5734
  switchUserOrganization,
5665
5735
  tenantDataDivergedMessage,
5736
+ triggerDeviceUpdate,
5666
5737
  updateDeploymentControlMap,
5667
5738
  updateDeviceAuth,
5668
5739
  updateDevicesAuth,