@northern.tech/store 0.3.2 → 0.3.4

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 (251) hide show
  1. package/dist/BillingProfile-ChP2_Sqw.d.cts +45 -0
  2. package/dist/BillingProfile-ChP2_Sqw.d.ts +45 -0
  3. package/dist/actions.cjs +22 -23
  4. package/dist/actions.cjs.map +1 -1
  5. package/dist/actions.js +12 -12
  6. package/dist/api/general-api.cjs.map +1 -1
  7. package/dist/api/general-api.js +5 -5
  8. package/dist/api/types/Tenant.ts +17 -12
  9. package/dist/api/users-api.cjs.map +1 -1
  10. package/dist/api/users-api.js +6 -6
  11. package/dist/appSlice/constants.cjs +18 -10
  12. package/dist/appSlice/constants.cjs.map +1 -1
  13. package/dist/appSlice/constants.d.cts +41 -84
  14. package/dist/appSlice/constants.d.ts +41 -84
  15. package/dist/appSlice/constants.js +1 -1
  16. package/dist/appSlice/index.cjs +1 -3
  17. package/dist/appSlice/index.cjs.map +1 -1
  18. package/dist/appSlice/index.js +4 -4
  19. package/dist/appSlice/thunks.cjs +153 -120
  20. package/dist/appSlice/thunks.cjs.map +1 -1
  21. package/dist/appSlice/thunks.js +28 -27
  22. package/dist/auth.cjs.map +1 -1
  23. package/dist/auth.js +4 -4
  24. package/dist/{chunk-NI4SZOCF.js → chunk-4RWZR3BN.js} +23 -25
  25. package/dist/{chunk-NI4SZOCF.js.map → chunk-4RWZR3BN.js.map} +1 -1
  26. package/dist/{chunk-YGBFDXXA.js → chunk-7YZCUAXZ.js} +2 -2
  27. package/dist/{chunk-7PVGDMNM.js → chunk-AFICTIVU.js} +3 -5
  28. package/dist/{chunk-7PVGDMNM.js.map → chunk-AFICTIVU.js.map} +1 -1
  29. package/dist/{chunk-YT73QWCN.js → chunk-AUBJUUP3.js} +3 -3
  30. package/dist/{chunk-UEP36GCI.js → chunk-AVX7VVOK.js} +3 -3
  31. package/dist/{chunk-4B3IMP4I.js → chunk-BSN2TOQC.js} +1 -1
  32. package/dist/{chunk-4B3IMP4I.js.map → chunk-BSN2TOQC.js.map} +1 -1
  33. package/dist/{chunk-VOCOFE4I.js → chunk-DCEKU6UV.js} +2 -2
  34. package/dist/{chunk-E5LEU5PF.js → chunk-DGQKXSRI.js} +3 -3
  35. package/dist/{chunk-74OJIKXF.js → chunk-EQLHIPPR.js} +182 -142
  36. package/dist/chunk-EQLHIPPR.js.map +1 -0
  37. package/dist/{chunk-MDC7Y3EX.js → chunk-EYCORLYU.js} +44 -40
  38. package/dist/chunk-EYCORLYU.js.map +1 -0
  39. package/dist/{chunk-KAQJH2YL.js → chunk-FQDSV3NK.js} +13 -5
  40. package/dist/chunk-FQDSV3NK.js.map +1 -0
  41. package/dist/{chunk-XTRPX7JZ.js → chunk-FRSA2YB5.js} +3 -3
  42. package/dist/chunk-FRSA2YB5.js.map +1 -0
  43. package/dist/{chunk-ANB5BM5J.js → chunk-FVCYB5OP.js} +37 -32
  44. package/dist/chunk-FVCYB5OP.js.map +1 -0
  45. package/dist/{chunk-AMGWP7A4.js → chunk-GAI4VYRZ.js} +2 -2
  46. package/dist/{chunk-YETZPQFR.js → chunk-GWJIY56H.js} +19 -20
  47. package/dist/chunk-GWJIY56H.js.map +1 -0
  48. package/dist/{chunk-Q6M5TTDQ.js → chunk-JO33IORF.js} +2 -2
  49. package/dist/chunk-JO33IORF.js.map +1 -0
  50. package/dist/chunk-K4MMUDYT.js +391 -0
  51. package/dist/chunk-K4MMUDYT.js.map +1 -0
  52. package/dist/{chunk-XXHONFSQ.js → chunk-L3SY3J5M.js} +4 -4
  53. package/dist/{chunk-XXHONFSQ.js.map → chunk-L3SY3J5M.js.map} +1 -1
  54. package/dist/{chunk-JAROCU6M.js → chunk-NCSKCF2S.js} +3 -3
  55. package/dist/{chunk-CYV6632F.js → chunk-NOQR3TE7.js} +2 -2
  56. package/dist/{chunk-A6CT6GTI.js → chunk-OEP2D6QL.js} +18 -12
  57. package/dist/chunk-OEP2D6QL.js.map +1 -0
  58. package/dist/{chunk-2RJIDREZ.js → chunk-PAIB5V27.js} +32 -23
  59. package/dist/chunk-PAIB5V27.js.map +1 -0
  60. package/dist/{chunk-FGKMJS3B.js → chunk-RX32WLVJ.js} +2 -4
  61. package/dist/chunk-RX32WLVJ.js.map +1 -0
  62. package/dist/{chunk-YTQUNAZP.js → chunk-X3GZILYD.js} +3 -3
  63. package/dist/{chunk-25AKG5HH.js → chunk-Y575RZHR.js} +19 -11
  64. package/dist/chunk-Y575RZHR.js.map +1 -0
  65. package/dist/{chunk-RX55KAKX.js → chunk-ZWOAFHAR.js} +2 -2
  66. package/dist/{chunk-NNADGHSL.js → chunk-ZZMFXRQK.js} +14 -14
  67. package/dist/commonConstants.cjs.map +1 -1
  68. package/dist/commonConstants.d.cts +1 -1
  69. package/dist/commonConstants.d.ts +1 -1
  70. package/dist/commonConstants.js +1 -1
  71. package/dist/commonSelectors.cjs +47 -29
  72. package/dist/commonSelectors.cjs.map +1 -1
  73. package/dist/commonSelectors.d.cts +55 -46
  74. package/dist/commonSelectors.d.ts +55 -46
  75. package/dist/commonSelectors.js +11 -11
  76. package/dist/constants.cjs +35 -19
  77. package/dist/constants.cjs.map +1 -1
  78. package/dist/constants.d.cts +3 -3
  79. package/dist/constants.d.ts +3 -3
  80. package/dist/constants.js +7 -3
  81. package/dist/deploymentdevicehook.cjs +159 -125
  82. package/dist/deploymentdevicehook.cjs.map +1 -1
  83. package/dist/deploymentdevicehook.d.cts +1 -1
  84. package/dist/deploymentdevicehook.d.ts +1 -1
  85. package/dist/deploymentdevicehook.js +34 -31
  86. package/dist/deploymentdevicehook.js.map +1 -1
  87. package/dist/deploymentsSlice/constants.cjs +8 -8
  88. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  89. package/dist/deploymentsSlice/constants.js +3 -3
  90. package/dist/deploymentsSlice/index.cjs +8 -8
  91. package/dist/deploymentsSlice/index.cjs.map +1 -1
  92. package/dist/deploymentsSlice/index.js +4 -4
  93. package/dist/deploymentsSlice/selectors.cjs +8 -8
  94. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  95. package/dist/deploymentsSlice/selectors.js +4 -4
  96. package/dist/deploymentsSlice/thunks.cjs +153 -120
  97. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  98. package/dist/deploymentsSlice/thunks.js +28 -27
  99. package/dist/devicesSlice/constants.cjs +11 -8
  100. package/dist/devicesSlice/constants.cjs.map +1 -1
  101. package/dist/devicesSlice/constants.d.cts +2 -1
  102. package/dist/devicesSlice/constants.d.ts +2 -1
  103. package/dist/devicesSlice/constants.js +5 -3
  104. package/dist/devicesSlice/index.cjs +8 -8
  105. package/dist/devicesSlice/index.cjs.map +1 -1
  106. package/dist/devicesSlice/index.js +4 -4
  107. package/dist/devicesSlice/selectors.cjs +9 -9
  108. package/dist/devicesSlice/selectors.cjs.map +1 -1
  109. package/dist/devicesSlice/selectors.js +4 -4
  110. package/dist/devicesSlice/thunks.cjs +155 -120
  111. package/dist/devicesSlice/thunks.cjs.map +1 -1
  112. package/dist/devicesSlice/thunks.d.cts +12 -2
  113. package/dist/devicesSlice/thunks.d.ts +12 -2
  114. package/dist/devicesSlice/thunks.js +30 -27
  115. package/dist/flag-eu-5477R2P4.svg +130 -0
  116. package/dist/flag-us-HNQAF66I.svg +63 -0
  117. package/dist/liststatehook.cjs +971 -0
  118. package/dist/liststatehook.cjs.map +1 -0
  119. package/dist/liststatehook.d.cts +246 -0
  120. package/dist/liststatehook.d.ts +246 -0
  121. package/dist/liststatehook.js +88 -0
  122. package/dist/liststatehook.js.map +1 -0
  123. package/dist/locationutils.cjs +942 -0
  124. package/dist/locationutils.cjs.map +1 -0
  125. package/dist/locationutils.d.cts +113 -0
  126. package/dist/locationutils.d.ts +113 -0
  127. package/dist/locationutils.js +46 -0
  128. package/dist/locationutils.js.map +1 -0
  129. package/dist/monitorSlice/constants.cjs +8 -8
  130. package/dist/monitorSlice/constants.cjs.map +1 -1
  131. package/dist/monitorSlice/constants.js +3 -3
  132. package/dist/monitorSlice/index.cjs +8 -8
  133. package/dist/monitorSlice/index.cjs.map +1 -1
  134. package/dist/monitorSlice/index.js +4 -4
  135. package/dist/monitorSlice/thunks.cjs +74 -62
  136. package/dist/monitorSlice/thunks.cjs.map +1 -1
  137. package/dist/monitorSlice/thunks.js +24 -24
  138. package/dist/onboardingSlice/index.cjs +1 -3
  139. package/dist/onboardingSlice/index.cjs.map +1 -1
  140. package/dist/onboardingSlice/index.js +1 -1
  141. package/dist/onboardingSlice/thunks.cjs +157 -124
  142. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  143. package/dist/onboardingSlice/thunks.d.cts +2 -34
  144. package/dist/onboardingSlice/thunks.d.ts +2 -34
  145. package/dist/onboardingSlice/thunks.js +28 -29
  146. package/dist/organizationSlice/constants.cjs +22 -17
  147. package/dist/organizationSlice/constants.cjs.map +1 -1
  148. package/dist/organizationSlice/constants.d.cts +33 -1
  149. package/dist/organizationSlice/constants.d.ts +33 -1
  150. package/dist/organizationSlice/constants.js +5 -3
  151. package/dist/organizationSlice/index.cjs +18 -15
  152. package/dist/organizationSlice/index.cjs.map +1 -1
  153. package/dist/organizationSlice/index.d.cts +27 -1012
  154. package/dist/organizationSlice/index.d.ts +27 -1012
  155. package/dist/organizationSlice/index.js +4 -4
  156. package/dist/organizationSlice/selectors.cjs.map +1 -1
  157. package/dist/organizationSlice/selectors.d.cts +10 -1
  158. package/dist/organizationSlice/selectors.d.ts +10 -1
  159. package/dist/organizationSlice/selectors.js +4 -4
  160. package/dist/organizationSlice/thunks.cjs +1619 -1559
  161. package/dist/organizationSlice/thunks.cjs.map +1 -1
  162. package/dist/organizationSlice/thunks.d.cts +62 -37
  163. package/dist/organizationSlice/thunks.d.ts +62 -37
  164. package/dist/organizationSlice/thunks.js +28 -27
  165. package/dist/organizationSlice/types.cjs +19 -0
  166. package/dist/organizationSlice/types.cjs.map +1 -0
  167. package/dist/organizationSlice/types.d.cts +5 -0
  168. package/dist/organizationSlice/types.d.ts +5 -0
  169. package/dist/organizationSlice/types.js +1 -0
  170. package/dist/organizationSlice/types.js.map +1 -0
  171. package/dist/releasesSlice/index.cjs.map +1 -1
  172. package/dist/releasesSlice/index.js +4 -4
  173. package/dist/releasesSlice/selectors.cjs +17 -8
  174. package/dist/releasesSlice/selectors.cjs.map +1 -1
  175. package/dist/releasesSlice/selectors.js +5 -5
  176. package/dist/releasesSlice/thunks.cjs +123 -94
  177. package/dist/releasesSlice/thunks.cjs.map +1 -1
  178. package/dist/releasesSlice/thunks.d.cts +1 -4
  179. package/dist/releasesSlice/thunks.d.ts +1 -4
  180. package/dist/releasesSlice/thunks.js +25 -24
  181. package/dist/selectors.cjs +53 -29
  182. package/dist/selectors.cjs.map +1 -1
  183. package/dist/selectors.d.cts +10 -1
  184. package/dist/selectors.d.ts +10 -1
  185. package/dist/selectors.js +49 -43
  186. package/dist/sockethook.cjs +529 -0
  187. package/dist/sockethook.cjs.map +1 -0
  188. package/dist/sockethook.d.cts +10 -0
  189. package/dist/sockethook.d.ts +10 -0
  190. package/dist/sockethook.js +141 -0
  191. package/dist/sockethook.js.map +1 -0
  192. package/dist/store.cjs +38 -29
  193. package/dist/store.cjs.map +1 -1
  194. package/dist/store.d.cts +13 -231
  195. package/dist/store.d.ts +13 -231
  196. package/dist/store.js +18 -16
  197. package/dist/storehooks.cjs +273 -198
  198. package/dist/storehooks.cjs.map +1 -1
  199. package/dist/storehooks.js +38 -37
  200. package/dist/storehooks.js.map +1 -1
  201. package/dist/thunks.cjs +259 -184
  202. package/dist/thunks.cjs.map +1 -1
  203. package/dist/thunks.d.cts +6 -2
  204. package/dist/thunks.d.ts +6 -2
  205. package/dist/thunks.js +30 -29
  206. package/dist/types-DBj17FZO.d.cts +135 -0
  207. package/dist/types-DnfZa6xd.d.ts +135 -0
  208. package/dist/usersSlice/constants.cjs +10 -10
  209. package/dist/usersSlice/constants.cjs.map +1 -1
  210. package/dist/usersSlice/constants.d.cts +6 -6
  211. package/dist/usersSlice/constants.d.ts +6 -6
  212. package/dist/usersSlice/constants.js +3 -3
  213. package/dist/usersSlice/index.cjs +10 -10
  214. package/dist/usersSlice/index.cjs.map +1 -1
  215. package/dist/usersSlice/index.js +4 -4
  216. package/dist/usersSlice/selectors.cjs +35 -13
  217. package/dist/usersSlice/selectors.cjs.map +1 -1
  218. package/dist/usersSlice/selectors.d.cts +44 -1
  219. package/dist/usersSlice/selectors.d.ts +44 -1
  220. package/dist/usersSlice/selectors.js +13 -7
  221. package/dist/usersSlice/thunks.cjs +151 -120
  222. package/dist/usersSlice/thunks.cjs.map +1 -1
  223. package/dist/usersSlice/thunks.d.cts +10 -9
  224. package/dist/usersSlice/thunks.d.ts +10 -9
  225. package/dist/usersSlice/thunks.js +28 -27
  226. package/dist/utils.cjs +23 -24
  227. package/dist/utils.cjs.map +1 -1
  228. package/dist/utils.js +4 -4
  229. package/package.json +7 -6
  230. package/dist/chunk-25AKG5HH.js.map +0 -1
  231. package/dist/chunk-2RJIDREZ.js.map +0 -1
  232. package/dist/chunk-74OJIKXF.js.map +0 -1
  233. package/dist/chunk-A6CT6GTI.js.map +0 -1
  234. package/dist/chunk-ANB5BM5J.js.map +0 -1
  235. package/dist/chunk-FGKMJS3B.js.map +0 -1
  236. package/dist/chunk-KAQJH2YL.js.map +0 -1
  237. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  238. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  239. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  240. package/dist/chunk-YETZPQFR.js.map +0 -1
  241. /package/dist/{chunk-YGBFDXXA.js.map → chunk-7YZCUAXZ.js.map} +0 -0
  242. /package/dist/{chunk-YT73QWCN.js.map → chunk-AUBJUUP3.js.map} +0 -0
  243. /package/dist/{chunk-UEP36GCI.js.map → chunk-AVX7VVOK.js.map} +0 -0
  244. /package/dist/{chunk-VOCOFE4I.js.map → chunk-DCEKU6UV.js.map} +0 -0
  245. /package/dist/{chunk-E5LEU5PF.js.map → chunk-DGQKXSRI.js.map} +0 -0
  246. /package/dist/{chunk-AMGWP7A4.js.map → chunk-GAI4VYRZ.js.map} +0 -0
  247. /package/dist/{chunk-JAROCU6M.js.map → chunk-NCSKCF2S.js.map} +0 -0
  248. /package/dist/{chunk-CYV6632F.js.map → chunk-NOQR3TE7.js.map} +0 -0
  249. /package/dist/{chunk-YTQUNAZP.js.map → chunk-X3GZILYD.js.map} +0 -0
  250. /package/dist/{chunk-RX55KAKX.js.map → chunk-ZWOAFHAR.js.map} +0 -0
  251. /package/dist/{chunk-NNADGHSL.js.map → chunk-ZZMFXRQK.js.map} +0 -0
package/dist/thunks.cjs CHANGED
@@ -38,7 +38,6 @@ __export(thunks_exports, {
38
38
  addUserToCurrentTenant: () => addUserToCurrentTenant,
39
39
  advanceOnboarding: () => advanceOnboarding,
40
40
  applyDeviceConfig: () => applyDeviceConfig,
41
- applyOnboardingFallbacks: () => applyOnboardingFallbacks,
42
41
  cancelFileUpload: () => cancelFileUpload,
43
42
  cancelRequest: () => cancelRequest,
44
43
  cancelUpgrade: () => cancelUpgrade,
@@ -182,6 +181,7 @@ __export(thunks_exports, {
182
181
  submitFeedback: () => submitFeedback,
183
182
  switchUserOrganization: () => switchUserOrganization,
184
183
  tenantDataDivergedMessage: () => tenantDataDivergedMessage,
184
+ triggerDeviceUpdate: () => triggerDeviceUpdate,
185
185
  updateDeploymentControlMap: () => updateDeploymentControlMap,
186
186
  updateDeviceAuth: () => updateDeviceAuth,
187
187
  updateDevicesAuth: () => updateDevicesAuth,
@@ -203,6 +203,14 @@ var import_universal_cookie = __toESM(require("universal-cookie"), 1);
203
203
 
204
204
  // src/appSlice/constants.ts
205
205
  var import_icons_material = require("@mui/icons-material");
206
+
207
+ // ../../assets/img/flag-eu.svg
208
+ var flag_eu_default = "./flag-eu-5477R2P4.svg";
209
+
210
+ // ../../assets/img/flag-us.svg
211
+ var flag_us_default = "./flag-us-HNQAF66I.svg";
212
+
213
+ // src/appSlice/constants.ts
206
214
  var startingDeviceCount = {
207
215
  os: "for first 50 devices",
208
216
  professional: "for first 250 devices"
@@ -225,36 +233,36 @@ var emptyChartSelection = { software: "", group: "", chartType: chartTypes.bar.k
225
233
  var defaultReportType = "distribution";
226
234
  var defaultReports = [{ ...emptyChartSelection, group: null, attribute: "artifact_name", type: defaultReportType }];
227
235
  var locations = {
228
- eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io" },
229
- us: { key: "us", title: "US", location: "hosted.mender.io" }
236
+ eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io", icon: flag_eu_default },
237
+ us: { key: "us", title: "US", location: "hosted.mender.io", icon: flag_us_default }
230
238
  };
231
239
  var PLANS = {
232
240
  os: {
233
241
  id: "os",
234
242
  name: "Basic",
235
243
  offer: true,
236
- price: "$32/month",
244
+ price: "$32 / month",
237
245
  deviceCount: startingDeviceCount.os,
238
- offerprice: "$23/month for first 50 devices",
246
+ offerprice: "$23 / month for first 50 devices",
239
247
  price2: "for first 6 months;\n$29/month thereafter",
240
- features: ["Basic OTA features"]
248
+ features: ["Access to core features of Mender", "Basic support"]
241
249
  },
242
250
  professional: {
243
251
  id: "professional",
244
252
  name: "Professional",
245
253
  offer: true,
246
- price: "$269/month",
254
+ price: "$269 / month",
247
255
  deviceCount: startingDeviceCount.professional,
248
- offerprice: "$200/month for first 50 devices",
256
+ offerprice: "$200 / month for first 50 devices",
249
257
  price2: "for first 6 months;\n$249/month thereafter",
250
- features: ["+ Advanced OTA features", "+ Standard support"]
258
+ features: ["Advanced OTA features", "Higher priority support"]
251
259
  },
252
260
  enterprise: {
253
261
  id: "enterprise",
254
262
  name: "Enterprise",
255
263
  price: "Custom pricing",
256
- deviceCount: "unlimited devices",
257
- features: ["+ Enterprise-grade OTA features", "+ Premium support"]
264
+ deviceCount: "Unlimited devices",
265
+ features: ["All Mender features", "Advanced security features", "SLA-backed support"]
258
266
  }
259
267
  };
260
268
  var ADDONS = {
@@ -725,6 +733,7 @@ var DEVICE_STATES = {
725
733
  rejected: "rejected"
726
734
  };
727
735
  var geoAttributes = ["geo-lat", "geo-lon"].map((attribute) => ({ attribute, scope: "inventory" }));
736
+ var REPORT_CHART_SIZE_LIMIT = 6;
728
737
 
729
738
  // src/monitorSlice/constants.ts
730
739
  var alertChannels = { email: "email" };
@@ -806,13 +815,16 @@ var SSO_TYPES = {
806
815
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
807
816
  }
808
817
  };
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" }];
818
+ var auditlogTypes = {
819
+ artifact: { title: "Artifact", queryParameter: "object_type", value: "artifact" },
820
+ deployment: { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
821
+ device: { title: "Device", queryParameter: "object_id", value: "device" },
822
+ user_access_token: { title: "Personal Access Token", queryParameter: "user_access_token", value: "user_access_token" },
823
+ user: { title: "User", queryParameter: "object_id", value: "user" },
824
+ tenant: { title: "Tenant", queryParameter: "object_id", value: "tenant" }
825
+ };
826
+ var AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];
827
+ var SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];
816
828
  var emptyWebhook = {
817
829
  description: "",
818
830
  enabled: true,
@@ -946,7 +958,7 @@ var uiPermissionsByArea = {
946
958
  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
959
  key: "auditlog",
948
960
  uiPermissions: [uiPermissionsById.read],
949
- title: "System audit log"
961
+ title: "System Audit Log"
950
962
  },
951
963
  deployments: {
952
964
  endpoints: [
@@ -1097,7 +1109,7 @@ var serviceProviderRolesById = {
1097
1109
  },
1098
1110
  readOnly: {
1099
1111
  name: "Read access",
1100
- value: staticRolesByName.admin,
1112
+ value: staticRolesByName.readOnly,
1101
1113
  description: "This role can see all linked organizations but cannot make any changes",
1102
1114
  permissions: [],
1103
1115
  uiPermissions: {
@@ -1429,7 +1441,7 @@ var getGroups = (0, import_toolkit3.createSelector)([getGroupsById], (groupsById
1429
1441
  (accu, [groupname, group]) => {
1430
1442
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
1431
1443
  const groupItem = { ...group, groupId: name, name: groupname };
1432
- if (group.filters.length > 0) {
1444
+ if (group.filters?.length > 0) {
1433
1445
  if (groupname !== UNGROUPED_GROUP.id) {
1434
1446
  accu.dynamic.push(groupItem);
1435
1447
  } else {
@@ -1504,14 +1516,15 @@ var getAuditLogEntry = (0, import_toolkit4.createSelector)([getAuditLog, getAudi
1504
1516
  // src/utils.ts
1505
1517
  var import_helpers3 = require("@northern.tech/utils/helpers");
1506
1518
  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
1519
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
1520
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
1521
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
1522
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
1523
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
1524
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
1525
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
1526
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers3.yes,
1527
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
1515
1528
  };
1516
1529
  var filterAliases = {
1517
1530
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -1555,14 +1568,12 @@ var filtersFilter = (item, index, array) => {
1555
1568
  const firstIndex = array.findIndex((filter) => filterCompare(filter, item));
1556
1569
  return firstIndex === index;
1557
1570
  };
1558
- var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => {
1559
- return ids.slice(0, cutOffSize).reduce((accu, id) => {
1560
- if (id && byId[id]) {
1561
- accu.push({ ...defaultObject, ...byId[id] });
1562
- }
1563
- return accu;
1564
- }, []);
1565
- };
1571
+ var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => ids.slice(0, cutOffSize).reduce((accu, id) => {
1572
+ if (id && byId[id]) {
1573
+ accu.push({ ...defaultObject, ...byId[id] });
1574
+ }
1575
+ return accu;
1576
+ }, []);
1566
1577
  var mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) => Object.entries(existingPermissions).reduce(
1567
1578
  (accu, [key, value]) => {
1568
1579
  let values;
@@ -1635,8 +1646,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
1635
1646
  var getGlobalSettings = (state) => state.users.globalSettings;
1636
1647
  var getCurrentUserId = (state) => state.users.currentUser;
1637
1648
  var getUsersById = (state) => state.users.byId;
1649
+ var getUsersList = (0, import_toolkit6.createSelector)([getUsersById], (usersById) => Object.values(usersById));
1638
1650
  var getCurrentUser = (0, import_toolkit6.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
1639
1651
  var getUserSettings = (state) => state.users.userSettings;
1652
+ var getSelectedDeviceAttribute = (0, import_toolkit6.createSelector)(
1653
+ [getUserSettings],
1654
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
1655
+ );
1640
1656
  var getIsDarkMode = (0, import_toolkit6.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
1641
1657
  var getShowHelptips = (0, import_toolkit6.createSelector)(
1642
1658
  [getTooltipsById],
@@ -1661,7 +1677,7 @@ var getOfflineThresholdSettings = (0, import_toolkit6.createSelector)([getGlobal
1661
1677
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
1662
1678
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
1663
1679
  }));
1664
- var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
1680
+ var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
1665
1681
  var getCurrentSession = (state) => state.users.currentSession;
1666
1682
 
1667
1683
  // src/commonSelectors.ts
@@ -1723,12 +1739,18 @@ var getUserCapabilities = (0, import_toolkit7.createSelector)([getUserRoles, get
1723
1739
  });
1724
1740
  var getTenantCapabilities = (0, import_toolkit7.createSelector)(
1725
1741
  [getFeatures, getOrganization, getIsEnterprise],
1726
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
1742
+ ({
1743
+ hasAuditlogs: isAuditlogEnabled,
1744
+ hasDeviceConfig: isDeviceConfigEnabled,
1745
+ hasDeviceConnect: isDeviceConnectEnabled,
1746
+ hasMonitor: isMonitorEnabled,
1747
+ isHosted
1748
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
1727
1749
  const canDelta = isEnterprise || plan === PLANS.professional.id;
1728
1750
  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));
1751
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
1752
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
1753
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
1732
1754
  return {
1733
1755
  canDelta,
1734
1756
  canRetry: canDelta,
@@ -1832,9 +1854,7 @@ var getGroupNames = (0, import_toolkit7.createSelector)([getGroupsById, getUserR
1832
1854
  });
1833
1855
  var getDeviceReportsForUser = (0, import_toolkit7.createSelector)(
1834
1856
  [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],
1835
- ({ reports }, { id: currentUserId }, globalSettings, devicesById) => {
1836
- return reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : []);
1837
- }
1857
+ ({ reports }, { id: currentUserId }, globalSettings, devicesById) => reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])
1838
1858
  );
1839
1859
  var listTypeDeviceIdMap = {
1840
1860
  deviceList: getListedDevices,
@@ -1858,7 +1878,7 @@ var getAuditlogDevice = (0, import_toolkit7.createSelector)([getAuditLogEntry, g
1858
1878
  var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
1859
1879
  if (service_provider) {
1860
1880
  return roles.reduce((accu, role) => {
1861
- if (rolesById[role.id]) {
1881
+ if (rolesById[role.value]) {
1862
1882
  return accu;
1863
1883
  }
1864
1884
  accu.push(role);
@@ -1866,7 +1886,7 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1866
1886
  }, Object.values(serviceProviderRolesById));
1867
1887
  }
1868
1888
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
1869
- const index = accu.findIndex(({ id }) => id === key);
1889
+ const index = accu.findIndex(({ value }) => value === key);
1870
1890
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
1871
1891
  return accu;
1872
1892
  }, roles);
@@ -2009,9 +2029,7 @@ var appSlice = (0, import_toolkit8.createSlice)({
2009
2029
  ...action.payload
2010
2030
  };
2011
2031
  },
2012
- setEnvironmentData: (state, action) => {
2013
- return { ...state, ...action.payload };
2014
- }
2032
+ setEnvironmentData: (state, action) => ({ ...state, ...action.payload })
2015
2033
  }
2016
2034
  });
2017
2035
  var actions = appSlice.actions;
@@ -2491,9 +2509,7 @@ var onboardingSlice = (0, import_toolkit13.createSlice)({
2491
2509
  name: sliceName5,
2492
2510
  initialState: initialState5,
2493
2511
  reducers: {
2494
- setOnboardingState: (state, action) => {
2495
- return { ...state, ...action.payload };
2496
- },
2512
+ setOnboardingState: (state, action) => ({ ...state, ...action.payload }),
2497
2513
  setDemoArtifactPort: (state, action) => {
2498
2514
  state.demoArtifactPort = action.payload;
2499
2515
  },
@@ -2852,13 +2868,12 @@ var actions_default = {
2852
2868
  };
2853
2869
 
2854
2870
  // src/store.ts
2871
+ var import_react_redux = require("react-redux");
2855
2872
  var import_helpers7 = require("@northern.tech/utils/helpers");
2856
2873
  var import_toolkit17 = require("@reduxjs/toolkit");
2857
2874
  var { setSnackbar, uploadProgress } = actions_default;
2858
2875
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2859
- var resetEnvironment = () => {
2860
- keys.map((key) => window.sessionStorage.removeItem(key));
2861
- };
2876
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2862
2877
  resetEnvironment();
2863
2878
  var commonErrorFallback = "Please check your connection.";
2864
2879
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2884,6 +2899,14 @@ var sessionReducer = (state, action) => {
2884
2899
  }
2885
2900
  return rootReducer(state, action);
2886
2901
  };
2902
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2903
+ if (action.type.endsWith("/rejected")) {
2904
+ const { error } = action;
2905
+ console.error("Rejection in action:", action);
2906
+ console.error(error.stack);
2907
+ }
2908
+ return next(action);
2909
+ };
2887
2910
  var getConfiguredStore = (options = {}) => {
2888
2911
  const { preloadedState = {}, ...config } = options;
2889
2912
  return (0, import_toolkit17.configureStore)({
@@ -2899,7 +2922,7 @@ var getConfiguredStore = (options = {}) => {
2899
2922
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2900
2923
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2901
2924
  }
2902
- })
2925
+ }).concat(rejectionLoggerMiddleware)
2903
2926
  });
2904
2927
  };
2905
2928
  var store = getConfiguredStore({
@@ -2908,12 +2931,13 @@ var store = getConfiguredStore({
2908
2931
 
2909
2932
  // src/deploymentsSlice/thunks.ts
2910
2933
  var import_helpers8 = require("@northern.tech/utils/helpers");
2934
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
2911
2935
  var import_toolkit18 = require("@reduxjs/toolkit");
2912
2936
  var import_validator = require("validator");
2913
2937
  var { receivedDevice, setSnackbar: setSnackbar2 } = actions_default;
2914
2938
  var { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;
2915
2939
  var deriveDeploymentGroup = ({ filter = {}, group, groups = [], name }) => group || groups.length === 1 && !(0, import_validator.isUUID)(name) ? groups[0] : filter.name;
2916
- var transformDeployments = (deployments, deploymentsById) => deployments.sort(import_helpers8.startTimeSort).reduce(
2940
+ var transformDeployments = (deployments, deploymentsById) => deployments.sort((0, import_helpers8.customSort)(true, "created")).reduce(
2917
2941
  (accu, item) => {
2918
2942
  const filter = item.filter ?? {};
2919
2943
  let deployment = {
@@ -2964,6 +2988,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceNam
2964
2988
  return Promise.all(tasks);
2965
2989
  });
2966
2990
  });
2991
+ var isWithinFirstMonth = (expirationDate) => {
2992
+ if (!expirationDate) {
2993
+ return false;
2994
+ }
2995
+ const endOfFirstMonth = new Date(expirationDate);
2996
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
2997
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
2998
+ };
2999
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
3000
+ import_tracking.default.event({ category: "deployments", action: "create" });
3001
+ if (!totalDeploymentCount) {
3002
+ if (!hasDeployments) {
3003
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
3004
+ if (isWithinFirstMonth(trial_expiration)) {
3005
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
3006
+ }
3007
+ }
3008
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
3009
+ }
3010
+ };
2967
3011
  var MAX_PREVIOUS_PHASES_COUNT = 5;
2968
3012
  var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
2969
3013
  let request;
@@ -2974,6 +3018,9 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2974
3018
  } else {
2975
3019
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
2976
3020
  }
3021
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
3022
+ const { hasDeployments } = getGlobalSettings(getState());
3023
+ const { trial_expiration } = getOrganization(getState());
2977
3024
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
2978
3025
  const lastslashindex = data.headers.location.lastIndexOf("/");
2979
3026
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -2988,6 +3035,7 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2988
3035
  dispatch(getSingleDeployment(deploymentId)),
2989
3036
  dispatch(setSnackbar2("Deployment created successfully", TIMEOUTS.fiveSeconds))
2990
3037
  ];
3038
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
2991
3039
  const { canManageUsers } = getUserCapabilities(getState());
2992
3040
  if (canManageUsers) {
2993
3041
  const { phases, retries } = newDeployment;
@@ -3662,7 +3710,7 @@ var getDevicesByStatus2 = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/
3662
3710
  page = defaultPage2,
3663
3711
  perPage = defaultPerPage2,
3664
3712
  sortOptions = [],
3665
- selectedAttributes = []
3713
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3666
3714
  } = options;
3667
3715
  const state = getState();
3668
3716
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3775,7 +3823,6 @@ var getReportingLimits = (0, import_toolkit19.createAsyncThunk)(
3775
3823
  })
3776
3824
  );
3777
3825
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3778
- var REPORT_CHART_SIZE_LIMIT = 6;
3779
3826
  var getSingleReportData = (reportConfig, groups) => {
3780
3827
  const { attribute, group, software = "" } = reportConfig;
3781
3828
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3855,6 +3902,13 @@ var getDeviceConnect = (0, import_toolkit19.createAsyncThunk)(
3855
3902
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3856
3903
  )
3857
3904
  );
3905
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3906
+ var triggerDeviceUpdate = (0, import_toolkit19.createAsyncThunk)(
3907
+ `${sliceName3}/triggerDeviceUpdate`,
3908
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3909
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3910
+ )
3911
+ );
3858
3912
  var getSessionDetails = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3859
3913
  const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3860
3914
  const createdAfter = startDate ? `&created_after=${startUnix}` : "";
@@ -3957,12 +4011,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3957
4011
  );
3958
4012
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3959
4013
  `${sliceName3}/preauthDevice`,
3960
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
4014
+ (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
4015
  if (err.response.status === 409) {
3962
- return Promise.reject("A device with a matching identity data set already exists");
4016
+ return rejectWithValue("A device with a matching identity data set already exists");
3963
4017
  }
3964
4018
  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))))
4019
+ })
3966
4020
  );
3967
4021
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3968
4022
  `${sliceName3}/decommissionDevice`,
@@ -4179,18 +4233,17 @@ var getDeviceMonitorConfig = (0, import_toolkit20.createAsyncThunk)(
4179
4233
  );
4180
4234
  var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4181
4235
  `${sliceName4}/changeNotificationSetting`,
4182
- ({ enabled, channel = alertChannels.email }, { dispatch }) => {
4183
- return general_api_default.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled }).catch((err) => commonErrorHandler(err, `${enabled ? "En" : "Dis"}abling ${channel} alerts failed:`, dispatch)).then(
4184
- () => Promise.all([
4185
- dispatch(actions4.changeAlertChannel({ channel, enabled })),
4186
- dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
4187
- ])
4188
- );
4189
- }
4236
+ ({ enabled, channel = alertChannels.email }, { dispatch }) => general_api_default.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled }).catch((err) => commonErrorHandler(err, `${enabled ? "En" : "Dis"}abling ${channel} alerts failed:`, dispatch)).then(
4237
+ () => Promise.all([
4238
+ dispatch(actions4.changeAlertChannel({ channel, enabled })),
4239
+ dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
4240
+ ])
4241
+ )
4190
4242
  );
4191
4243
 
4192
4244
  // src/onboardingSlice/thunks.ts
4193
4245
  var import_helpers10 = require("@northern.tech/utils/helpers");
4246
+ var import_tracking2 = __toESM(require("@northern.tech/utils/tracking"), 1);
4194
4247
  var import_toolkit21 = require("@reduxjs/toolkit");
4195
4248
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4196
4249
  var cookies3 = new import_universal_cookie3.default();
@@ -4272,7 +4325,7 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4272
4325
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4273
4326
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4274
4327
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4275
- ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))
4328
+ ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE))).then(() => import_tracking2.default.event({ category: "onboarding", action: onboardingSteps.ONBOARDING_CANCELED }))
4276
4329
  );
4277
4330
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4278
4331
  const steps = orderedOnboardingSteps;
@@ -4283,7 +4336,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4283
4336
  }
4284
4337
  const madeProgress = steps[stepIndex + 1];
4285
4338
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4286
- state.complete = stepIndex + 1 >= steps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4339
+ state.complete = stepIndex + 1 >= orderedOnboardingSteps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4340
+ import_tracking2.default.event({ category: "onboarding", action: stepId });
4287
4341
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4288
4342
  });
4289
4343
 
@@ -4362,7 +4416,7 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4362
4416
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4363
4417
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4364
4418
  `${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())))
4419
+ ({ 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
4420
  );
4367
4421
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4368
4422
  const userId = userFilter?.id || userFilter;
@@ -4410,9 +4464,15 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4410
4464
  return Promise.all(tasks);
4411
4465
  });
4412
4466
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4413
- 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));
4415
- });
4467
+ var addTenant = (0, import_toolkit22.createAsyncThunk)(
4468
+ `${sliceName6}/createTenant`,
4469
+ (selectionState, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants`, selectionState).then(
4470
+ () => Promise.all([
4471
+ dispatch(setSnackbar4("Tenant was created successfully.")),
4472
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4473
+ ])
4474
+ ).catch((err) => commonErrorHandler(err, "There was an error creating tenant", dispatch, commonErrorFallback))
4475
+ );
4416
4476
  var tenantListRetrieval = async (config) => {
4417
4477
  const { page, perPage } = config;
4418
4478
  const params = new URLSearchParams({ page, per_page: perPage }).toString();
@@ -4437,21 +4497,29 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4437
4497
  }
4438
4498
  return dispatch(actions6.setTenantListState({ ...nextState }));
4439
4499
  });
4440
- var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4441
- 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);
4446
- });
4447
- });
4448
- var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4449
- 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())])
4451
- );
4452
- });
4453
- var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
4454
- return general_api_default.get(`${tenantadmApiUrlv1}/user/tenant`).then((res) => {
4500
+ var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(
4501
+ `${sliceName6}/editDeviceLimit`,
4502
+ ({ newLimit, id, name }, { dispatch }) => general_api_default.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name }).catch((err) => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(
4503
+ () => Promise.all([
4504
+ dispatch(setSnackbar4("Device Limit was changed successfully")),
4505
+ dispatch(getUserOrganization()),
4506
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4507
+ ])
4508
+ )
4509
+ );
4510
+ var removeTenant = (0, import_toolkit22.createAsyncThunk)(
4511
+ `${sliceName6}/editDeviceLimit`,
4512
+ ({ id }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4513
+ () => Promise.all([
4514
+ dispatch(setSnackbar4("The tenant was removed successfully")),
4515
+ dispatch(getUserOrganization()),
4516
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4517
+ ])
4518
+ )
4519
+ );
4520
+ var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(
4521
+ `${sliceName6}/getUserOrganization`,
4522
+ (_, { dispatch, getState }) => general_api_default.get(`${tenantadmApiUrlv1}/user/tenant`).then((res) => {
4455
4523
  let tasks = [dispatch(actions6.setOrganization(res.data))];
4456
4524
  const { addons, plan, trial } = res.data;
4457
4525
  const { token } = getCurrentSession(getState());
@@ -4463,15 +4531,18 @@ var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4463
4531
  tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));
4464
4532
  }
4465
4533
  return Promise.all(tasks);
4466
- });
4467
- });
4534
+ })
4535
+ );
4468
4536
  var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4469
4537
  `${sliceName6}/sendSupportMessage`,
4470
4538
  (content, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, 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 }))))
4471
4539
  );
4472
4540
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4473
4541
  `${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 }))))
4542
+ ({ content, tenantId }, { dispatch, rejectWithValue }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content).catch(async (err) => {
4543
+ await commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback);
4544
+ rejectWithValue(err);
4545
+ }).then(() => Promise.resolve(dispatch(setSnackbar4({ message: "Your request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))))
4475
4546
  );
4476
4547
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4477
4548
  `${sliceName6}/downloadLicenseReport`,
@@ -4563,9 +4634,22 @@ var getSsoConfigs = (0, import_toolkit22.createAsyncThunk)(
4563
4634
  )
4564
4635
  );
4565
4636
 
4566
- // src/releasesSlice/thunks.ts
4637
+ // src/locationutils.ts
4567
4638
  var import_helpers12 = require("@northern.tech/utils/helpers");
4568
- var import_locationutils = require("@northern.tech/utils/locationutils");
4639
+ var defaultSelector = (result) => result[0];
4640
+ var commonFields = {
4641
+ ...Object.keys(DEVICE_LIST_DEFAULTS).reduce((accu, key) => ({ ...accu, [key]: { parse: Number, select: defaultSelector, target: key } }), {}),
4642
+ id: { parse: String, select: (i) => i, target: "id" },
4643
+ issues: { parse: void 0, select: defaultSelector, target: "selectedIssues" },
4644
+ open: { parse: Boolean, select: defaultSelector, target: "open" }
4645
+ };
4646
+ var formatReleases = ({ pageState: { searchTerm, selectedTags = [], tab, type } }) => Object.entries({ name: searchTerm, tab, type }).reduce(
4647
+ (accu, [key, value]) => value ? [...accu, `${key}=${value}`] : accu,
4648
+ selectedTags.map((tag) => `tag=${tag}`)
4649
+ ).join("&");
4650
+
4651
+ // src/releasesSlice/thunks.ts
4652
+ var import_helpers13 = require("@northern.tech/utils/helpers");
4569
4653
  var import_toolkit23 = require("@reduxjs/toolkit");
4570
4654
  var import_axios3 = require("axios");
4571
4655
  var import_uuid2 = require("uuid");
@@ -4573,7 +4657,7 @@ var { setSnackbar: setSnackbar5, initUpload: initUpload2, uploadProgress: upload
4573
4657
  var { page: defaultPage5, perPage: defaultPerPage5 } = DEVICE_LIST_DEFAULTS;
4574
4658
  var sortingDefaults = { direction: SORTING_OPTIONS.desc, key: "modified" };
4575
4659
  var flattenRelease = (release, stateRelease) => {
4576
- const updatedArtifacts = release.artifacts?.sort((0, import_helpers12.customSort)(1, "modified")) || [];
4660
+ const updatedArtifacts = release.artifacts?.sort((0, import_helpers13.customSort)(true, "modified")) || [];
4577
4661
  const { artifacts, deviceTypes, modified } = updatedArtifacts.reduce(
4578
4662
  (accu, item) => {
4579
4663
  accu.deviceTypes.push(...item.device_types_compatible);
@@ -4587,7 +4671,7 @@ var flattenRelease = (release, stateRelease) => {
4587
4671
  },
4588
4672
  { artifacts: [], deviceTypes: [], modified: void 0 }
4589
4673
  );
4590
- return { ...stateRelease, ...release, artifacts, device_types_compatible: deviceTypes.filter(import_helpers12.duplicateFilter), modified };
4674
+ return { ...stateRelease, ...release, artifacts, device_types_compatible: deviceTypes.filter(import_helpers13.duplicateFilter), modified };
4591
4675
  };
4592
4676
  var reduceReceivedReleases = (releases, stateReleasesById) => releases.reduce((accu, release) => {
4593
4677
  const stateRelease = stateReleasesById[release.name] || {};
@@ -4611,7 +4695,7 @@ var getArtifactInstallCount = (0, import_toolkit23.createAsyncThunk)(`${sliceNam
4611
4695
  }
4612
4696
  const releaseArtifacts = [...release.artifacts];
4613
4697
  const artifact = releaseArtifacts[index];
4614
- const { key, name, version } = (0, import_helpers12.extractSoftwareItem)(artifact.artifact_provides) ?? {};
4698
+ const { key, name, version } = (0, import_helpers13.extractSoftwareItem)(artifact.artifact_provides) ?? {};
4615
4699
  const attribute = `${key}${name ? `.${name}` : ""}.version`;
4616
4700
  const { filterTerms } = convertDeviceListStateToFilters({
4617
4701
  filters: [{ ...emptyFilter, key: attribute, value: version, scope: "inventory" }]
@@ -4729,9 +4813,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4729
4813
  if (!release || index === -1) {
4730
4814
  return dispatch(getReleases());
4731
4815
  }
4732
- release.artifacts[index].description = body.description;
4816
+ const updatedRelease = {
4817
+ ...release,
4818
+ artifacts: release.artifacts.map((artifact, i) => i === index ? { ...artifact, description: body.description } : artifact)
4819
+ };
4733
4820
  return Promise.all([
4734
- dispatch(actions7.receiveRelease(release)),
4821
+ dispatch(actions7.receiveRelease(updatedRelease)),
4735
4822
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4736
4823
  dispatch(getRelease(release.name)),
4737
4824
  dispatch(selectRelease(release.name))
@@ -4784,7 +4871,7 @@ var setReleasesListState = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}
4784
4871
  let tasks = [];
4785
4872
  const { isLoading: currentLoading, ...currentRequestState } = currentState;
4786
4873
  const { isLoading: selectionLoading, ...selectionRequestState } = nextState;
4787
- if (!(0, import_helpers12.deepCompare)(currentRequestState, selectionRequestState)) {
4874
+ if (!(0, import_helpers13.deepCompare)(currentRequestState, selectionRequestState)) {
4788
4875
  nextState.isLoading = true;
4789
4876
  tasks.push(dispatch(getReleases(nextState)).finally(() => dispatch(setReleasesListState({ isLoading: false }))));
4790
4877
  }
@@ -4794,7 +4881,7 @@ var setReleasesListState = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}
4794
4881
  var releaseListRetrieval = (config) => {
4795
4882
  const { searchTerm = "", page = defaultPage5, perPage = defaultPerPage5, sort = sortingDefaults, selectedTags = [], type = "" } = config;
4796
4883
  const { key: attribute, direction } = sort;
4797
- const filterQuery = (0, import_locationutils.formatReleases)({ pageState: { searchTerm, selectedTags } });
4884
+ const filterQuery = formatReleases({ pageState: { searchTerm, selectedTags } });
4798
4885
  const updateType = type ? `update_type=${type}` : "";
4799
4886
  const sorting = attribute ? `sort=${attribute}:${direction}`.toLowerCase() : "";
4800
4887
  return general_api_default.get(
@@ -4804,7 +4891,7 @@ var releaseListRetrieval = (config) => {
4804
4891
  var deductSearchState = (receivedReleases, config, total, state) => {
4805
4892
  let releaseListState = { ...state.releasesList };
4806
4893
  const { searchTerm, searchOnly, sort = {}, selectedTags = [], type } = config;
4807
- const flattenedReleases = Object.values(receivedReleases).sort((0, import_helpers12.customSort)(sort.direction === SORTING_OPTIONS.desc, sort.key));
4894
+ const flattenedReleases = Object.values(receivedReleases).sort((0, import_helpers13.customSort)(sort.direction === SORTING_OPTIONS.desc, sort.key));
4808
4895
  const releaseIds = flattenedReleases.map((item) => item.name);
4809
4896
  const isFiltering = !!(selectedTags.length || type || searchTerm);
4810
4897
  if (searchOnly) {
@@ -4832,33 +4919,32 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4832
4919
  return Promise.all(tasks);
4833
4920
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4834
4921
  });
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
- );
4922
+ var getRelease = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getReleases`, async (name, { dispatch, getState }) => {
4923
+ const releaseResponse = await general_api_default.get(`${deploymentsApiUrlV2}/deployments/releases/${name}`);
4924
+ const { data: release } = releaseResponse;
4925
+ if (release) {
4926
+ const stateRelease = getReleasesById(getState())[release.name] || {};
4927
+ await dispatch(actions7.receiveRelease(flattenRelease(release, stateRelease)));
4928
+ }
4929
+ return Promise.resolve(null);
4930
+ });
4845
4931
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4846
4932
  `${sliceName7}/updateReleaseInfo`,
4847
- ({ 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(() => {
4848
- return Promise.all([
4933
+ ({ 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(
4934
+ () => Promise.all([
4849
4935
  dispatch(actions7.receiveRelease({ ...getReleasesById(getState())[name], ...info, name })),
4850
4936
  dispatch(setSnackbar5("Release details were updated successfully.", TIMEOUTS.fiveSeconds, ""))
4851
- ]);
4852
- })
4937
+ ])
4938
+ )
4853
4939
  );
4854
4940
  var setReleaseTags = (0, import_toolkit23.createAsyncThunk)(
4855
4941
  `${sliceName7}/setReleaseTags`,
4856
- ({ name, tags = [] }, { dispatch, getState }) => general_api_default.put(`${deploymentsApiUrlV2}/deployments/releases/${name}/tags`, tags).catch((err) => commonErrorHandler(err, `Release tags couldn't be set.`, dispatch)).then(() => {
4857
- return Promise.all([
4942
+ ({ name, tags = [] }, { dispatch, getState }) => general_api_default.put(`${deploymentsApiUrlV2}/deployments/releases/${name}/tags`, tags).catch((err) => commonErrorHandler(err, `Release tags couldn't be set.`, dispatch)).then(
4943
+ () => Promise.all([
4858
4944
  dispatch(actions7.receiveRelease({ ...getReleasesById(getState())[name], name, tags })),
4859
4945
  dispatch(setSnackbar5("Release tags were set successfully.", TIMEOUTS.fiveSeconds, ""))
4860
- ]);
4861
- })
4946
+ ])
4947
+ )
4862
4948
  );
4863
4949
  var getExistingReleaseTags = (0, import_toolkit23.createAsyncThunk)(
4864
4950
  `${sliceName7}/getReleaseTags`,
@@ -4869,6 +4955,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4869
4955
  (_, { 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
4956
  );
4871
4957
 
4958
+ // src/usersSlice/thunks.ts
4959
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4960
+
4872
4961
  // src/api/users-api.ts
4873
4962
  var import_axios4 = __toESM(require("axios"), 1);
4874
4963
  var Api2 = {
@@ -4884,7 +4973,7 @@ var Api2 = {
4884
4973
  var users_api_default = Api2;
4885
4974
 
4886
4975
  // src/usersSlice/thunks.ts
4887
- var import_helpers13 = require("@northern.tech/utils/helpers");
4976
+ var import_helpers14 = require("@northern.tech/utils/helpers");
4888
4977
  var import_retrytimer = require("@northern.tech/utils/retrytimer");
4889
4978
  var import_toolkit24 = require("@reduxjs/toolkit");
4890
4979
  var import_md52 = __toESM(require("md5"), 1);
@@ -4892,7 +4981,7 @@ var import_universal_cookie5 = __toESM(require("universal-cookie"), 1);
4892
4981
  var cookies5 = new import_universal_cookie5.default();
4893
4982
  var { setAnnouncement: setAnnouncement2, setSnackbar: setSnackbar6 } = actions_default;
4894
4983
  var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) => (dispatch) => {
4895
- const errorText = (0, import_helpers13.extractErrorMessage)(err);
4984
+ const errorText = (0, import_helpers14.extractErrorMessage)(err);
4896
4985
  const is2FABackend = errorText.includes("2fa");
4897
4986
  if (is2FABackend && !has2FA) {
4898
4987
  return rejectWithValue({ error: "2fa code missing" });
@@ -4902,7 +4991,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4902
4991
  }
4903
4992
  const twoFAError = is2FABackend ? " and verification code" : "";
4904
4993
  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")));
4994
+ return Promise.reject(dispatch(setSnackbar6({ message: (0, import_helpers14.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
4906
4995
  };
4907
4996
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4908
4997
  `${sliceName8}/loginUser`,
@@ -4926,19 +5015,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4926
5015
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4927
5016
  setSessionInfo({ token, expiresAt });
4928
5017
  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
- );
5018
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
5019
+ cleanUp();
5020
+ return Promise.reject(dispatch(setSnackbar6((0, import_helpers14.extractErrorMessage)(e))));
5021
+ }).then(() => {
5022
+ window.sessionStorage.removeItem("pendings-redirect");
5023
+ if (window.location.pathname !== "/ui/") {
5024
+ window.location.replace("/ui/");
5025
+ }
5026
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
5027
+ });
4942
5028
  })
4943
5029
  );
4944
5030
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4956,6 +5042,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4956
5042
  return Promise.reject();
4957
5043
  }
4958
5044
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
5045
+ window.sessionStorage.setItem("tenantChanged", "true");
4959
5046
  setSessionInfo({ ...getSessionInfo(), token });
4960
5047
  window.location.reload();
4961
5048
  });
@@ -4996,11 +5083,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4996
5083
  );
4997
5084
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4998
5085
  `${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
- }, {});
5086
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
5087
+ const currentUsersById = getUsersById(getState());
5088
+ const users = res.data.reduce(
5089
+ (accu, item) => {
5090
+ accu[item.id] = {
5091
+ ...accu[item.id],
5092
+ ...item
5093
+ };
5094
+ return accu;
5095
+ },
5096
+ { ...currentUsersById }
5097
+ );
5004
5098
  return dispatch(actions8.receivedUserList(users));
5005
5099
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
5006
5100
  );
@@ -5009,9 +5103,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
5009
5103
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
5010
5104
  ({ data: user }) => Promise.all([
5011
5105
  dispatch(actions8.receivedUser(user)),
5012
- // @ts-ignore
5013
5106
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
5014
- // @ts-ignore
5015
5107
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
5016
5108
  user
5017
5109
  ])
@@ -5058,10 +5150,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
5058
5150
  );
5059
5151
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
5060
5152
  `${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
- )
5153
+ (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
5154
  );
5066
5155
  var editUser = (0, import_toolkit24.createAsyncThunk)(
5067
5156
  `${sliceName8}/editUser`,
@@ -5082,7 +5171,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5082
5171
  );
5083
5172
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
5084
5173
  `${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))))
5174
+ (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
5175
  );
5087
5176
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
5088
5177
  (accu, [area, definition]) => {
@@ -5096,9 +5185,9 @@ var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).redu
5096
5185
  permissionsAccu.push(uiPermission.value);
5097
5186
  }
5098
5187
  return permissionsAccu;
5099
- }, []).filter(import_helpers13.duplicateFilter);
5188
+ }, []).filter(import_helpers14.duplicateFilter);
5100
5189
  if (Array.isArray(accu[area])) {
5101
- accu[area] = [...accu[area], ...collector].filter(import_helpers13.duplicateFilter);
5190
+ accu[area] = [...accu[area], ...collector].filter(import_helpers14.duplicateFilter);
5102
5191
  } else {
5103
5192
  accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });
5104
5193
  }
@@ -5123,7 +5212,7 @@ var permissionActionTypes = {
5123
5212
  };
5124
5213
  var combinePermissions = (existingPermissions, additionalPermissions = {}) => Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {
5125
5214
  let maybeExistingPermissions = accu[name] || [];
5126
- accu[name] = [...permissions, ...maybeExistingPermissions].filter(import_helpers13.duplicateFilter);
5215
+ accu[name] = [...permissions, ...maybeExistingPermissions].filter(import_helpers14.duplicateFilter);
5127
5216
  return accu;
5128
5217
  }, existingPermissions);
5129
5218
  var tryParseCustomPermission = (permission) => {
@@ -5148,7 +5237,7 @@ var isEmptyPermissionSet = (permissionSet) => !Object.values(permissionSet).redu
5148
5237
  if (Array.isArray(permissions)) {
5149
5238
  return accu || !!permissions.length;
5150
5239
  }
5151
- return accu || !(0, import_helpers13.isEmpty)(permissions);
5240
+ return accu || !(0, import_helpers14.isEmpty)(permissions);
5152
5241
  }, false);
5153
5242
  var parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }, permissionSets) => {
5154
5243
  const preliminaryResult = permission_sets_with_scope.reduce(
@@ -5216,7 +5305,7 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5216
5305
  return collector;
5217
5306
  }
5218
5307
  if (permissionSet2 === permissionSetObject.name) {
5219
- collector[area] = [...collector[area], item.value].filter(import_helpers13.duplicateFilter);
5308
+ collector[area] = [...collector[area], item.value].filter(import_helpers14.duplicateFilter);
5220
5309
  }
5221
5310
  return collector;
5222
5311
  }, accu2),
@@ -5235,7 +5324,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5235
5324
  accu[permissionSet.name] = permissionSetObject;
5236
5325
  return accu;
5237
5326
  },
5238
- // @ts-ignore
5239
5327
  { ...getState().users.permissionSetsById }
5240
5328
  );
5241
5329
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5285,7 +5373,7 @@ var transformAreaRoleDataToScopedPermissionsSets = (area, areaPermissions, exces
5285
5373
  if (value.includes(excessiveAccessSelector)) {
5286
5374
  return { name };
5287
5375
  }
5288
- return { name, scope: { ...scope, value: value.filter(import_helpers13.duplicateFilter) } };
5376
+ return { name, scope: { ...scope, value: value.filter(import_helpers14.duplicateFilter) } };
5289
5377
  });
5290
5378
  };
5291
5379
  var transformRoleDataToRole = (roleData, roleState = {}) => {
@@ -5328,7 +5416,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5328
5416
  role: {
5329
5417
  ...emptyRole,
5330
5418
  name,
5331
- // @ts-ignore
5332
5419
  description: description ? description : roleState.description,
5333
5420
  uiPermissions: {
5334
5421
  ...emptyUiPermissions,
@@ -5371,10 +5458,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5371
5458
  });
5372
5459
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5373
5460
  `${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
- )
5461
+ (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
5462
  );
5379
5463
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5380
5464
  `${sliceName8}/getGlobalSettings`,
@@ -5385,7 +5469,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5385
5469
  );
5386
5470
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5387
5471
  `${sliceName8}/saveGlobalSettings`,
5388
- // @ts-ignore
5389
5472
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5390
5473
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5391
5474
  return;
@@ -5431,11 +5514,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5431
5514
  const tooltipState = getTooltipsState(getState());
5432
5515
  const updatedSettings = {
5433
5516
  ...userSettings,
5434
- // @ts-ignore
5435
5517
  ...settings,
5436
5518
  onboarding: {
5437
5519
  ...onboardingState,
5438
- // @ts-ignore
5439
5520
  ...settings.onboarding
5440
5521
  },
5441
5522
  tooltips: tooltipState
@@ -5479,10 +5560,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5479
5560
  );
5480
5561
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5481
5562
  `${sliceName8}/revokeToken`,
5482
- (token, { dispatch }) => (
5483
- // @ts-ignore
5484
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5485
- )
5563
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5486
5564
  );
5487
5565
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5488
5566
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5491,23 +5569,20 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5491
5569
  }
5492
5570
  return Promise.all(tasks);
5493
5571
  });
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 } }), {});
5572
+ var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
5573
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5496
5574
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5497
5575
  });
5498
5576
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5499
5577
  `${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
- }
5578
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5579
+ subject: "feedback submission",
5580
+ body: JSON.stringify({ feedback, satisfaction, meta })
5581
+ }).then(() => {
5582
+ const today = /* @__PURE__ */ new Date();
5583
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5584
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5585
+ })
5511
5586
  );
5512
5587
  // Annotate the CommonJS export names for ESM import in node:
5513
5588
  0 && (module.exports = {
@@ -5519,7 +5594,6 @@ var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5519
5594
  addUserToCurrentTenant,
5520
5595
  advanceOnboarding,
5521
5596
  applyDeviceConfig,
5522
- applyOnboardingFallbacks,
5523
5597
  cancelFileUpload,
5524
5598
  cancelRequest,
5525
5599
  cancelUpgrade,
@@ -5663,6 +5737,7 @@ var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5663
5737
  submitFeedback,
5664
5738
  switchUserOrganization,
5665
5739
  tenantDataDivergedMessage,
5740
+ triggerDeviceUpdate,
5666
5741
  updateDeploymentControlMap,
5667
5742
  updateDeviceAuth,
5668
5743
  updateDevicesAuth,