@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
@@ -35,14 +35,22 @@ __export(storehooks_exports, {
35
35
  });
36
36
  module.exports = __toCommonJS(storehooks_exports);
37
37
  var import_react = require("react");
38
- var import_react_redux = require("react-redux");
39
- var import_helpers14 = require("@northern.tech/utils/helpers");
38
+ var import_react_redux2 = require("react-redux");
39
+ var import_helpers15 = require("@northern.tech/utils/helpers");
40
40
  var import_dayjs = __toESM(require("dayjs"), 1);
41
- var import_duration = __toESM(require("dayjs/plugin/duration.js"), 1);
41
+ var import_duration = __toESM(require("dayjs/plugin/duration"), 1);
42
42
  var import_universal_cookie6 = __toESM(require("universal-cookie"), 1);
43
43
 
44
44
  // src/appSlice/constants.ts
45
45
  var import_icons_material = require("@mui/icons-material");
46
+
47
+ // ../../assets/img/flag-eu.svg
48
+ var flag_eu_default = "./flag-eu-5477R2P4.svg";
49
+
50
+ // ../../assets/img/flag-us.svg
51
+ var flag_us_default = "./flag-us-HNQAF66I.svg";
52
+
53
+ // src/appSlice/constants.ts
46
54
  var startingDeviceCount = {
47
55
  os: "for first 50 devices",
48
56
  professional: "for first 250 devices"
@@ -65,36 +73,36 @@ var emptyChartSelection = { software: "", group: "", chartType: chartTypes.bar.k
65
73
  var defaultReportType = "distribution";
66
74
  var defaultReports = [{ ...emptyChartSelection, group: null, attribute: "artifact_name", type: defaultReportType }];
67
75
  var locations = {
68
- eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io" },
69
- us: { key: "us", title: "US", location: "hosted.mender.io" }
76
+ eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io", icon: flag_eu_default },
77
+ us: { key: "us", title: "US", location: "hosted.mender.io", icon: flag_us_default }
70
78
  };
71
79
  var PLANS = {
72
80
  os: {
73
81
  id: "os",
74
82
  name: "Basic",
75
83
  offer: true,
76
- price: "$32/month",
84
+ price: "$32 / month",
77
85
  deviceCount: startingDeviceCount.os,
78
- offerprice: "$23/month for first 50 devices",
86
+ offerprice: "$23 / month for first 50 devices",
79
87
  price2: "for first 6 months;\n$29/month thereafter",
80
- features: ["Basic OTA features"]
88
+ features: ["Access to core features of Mender", "Basic support"]
81
89
  },
82
90
  professional: {
83
91
  id: "professional",
84
92
  name: "Professional",
85
93
  offer: true,
86
- price: "$269/month",
94
+ price: "$269 / month",
87
95
  deviceCount: startingDeviceCount.professional,
88
- offerprice: "$200/month for first 50 devices",
96
+ offerprice: "$200 / month for first 50 devices",
89
97
  price2: "for first 6 months;\n$249/month thereafter",
90
- features: ["+ Advanced OTA features", "+ Standard support"]
98
+ features: ["Advanced OTA features", "Higher priority support"]
91
99
  },
92
100
  enterprise: {
93
101
  id: "enterprise",
94
102
  name: "Enterprise",
95
103
  price: "Custom pricing",
96
- deviceCount: "unlimited devices",
97
- features: ["+ Enterprise-grade OTA features", "+ Premium support"]
104
+ deviceCount: "Unlimited devices",
105
+ features: ["All Mender features", "Advanced security features", "SLA-backed support"]
98
106
  }
99
107
  };
100
108
  var ADDONS = {
@@ -565,6 +573,7 @@ var DEVICE_STATES = {
565
573
  rejected: "rejected"
566
574
  };
567
575
  var geoAttributes = ["geo-lat", "geo-lon"].map((attribute) => ({ attribute, scope: "inventory" }));
576
+ var REPORT_CHART_SIZE_LIMIT = 6;
568
577
 
569
578
  // src/monitorSlice/constants.ts
570
579
  var alertChannels = { email: "email" };
@@ -646,13 +655,16 @@ var SSO_TYPES = {
646
655
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
647
656
  }
648
657
  };
649
- var AUDIT_LOGS_TYPES = [
650
- { title: "Artifact", queryParameter: "object_type", value: "artifact" },
651
- { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
652
- { title: "Device", queryParameter: "object_id", value: "device" },
653
- { title: "User", queryParameter: "object_id", value: "user" }
654
- ];
655
- var SP_AUDIT_LOGS_TYPES = [AUDIT_LOGS_TYPES[3], { title: "Tenant", queryParameter: "object_id", value: "tenant" }];
658
+ var auditlogTypes = {
659
+ artifact: { title: "Artifact", queryParameter: "object_type", value: "artifact" },
660
+ deployment: { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
661
+ device: { title: "Device", queryParameter: "object_id", value: "device" },
662
+ user_access_token: { title: "Personal Access Token", queryParameter: "user_access_token", value: "user_access_token" },
663
+ user: { title: "User", queryParameter: "object_id", value: "user" },
664
+ tenant: { title: "Tenant", queryParameter: "object_id", value: "tenant" }
665
+ };
666
+ var AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];
667
+ var SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];
656
668
  var emptyWebhook = {
657
669
  description: "",
658
670
  enabled: true,
@@ -786,7 +798,7 @@ var uiPermissionsByArea = {
786
798
  explanation: "Granting access to the audit log will allow tracing changes to devices, releases and user accounts, as well as providing information about deployments.",
787
799
  key: "auditlog",
788
800
  uiPermissions: [uiPermissionsById.read],
789
- title: "System audit log"
801
+ title: "System Audit Log"
790
802
  },
791
803
  deployments: {
792
804
  endpoints: [
@@ -937,7 +949,7 @@ var serviceProviderRolesById = {
937
949
  },
938
950
  readOnly: {
939
951
  name: "Read access",
940
- value: staticRolesByName.admin,
952
+ value: staticRolesByName.readOnly,
941
953
  description: "This role can see all linked organizations but cannot make any changes",
942
954
  permissions: [],
943
955
  uiPermissions: {
@@ -1195,9 +1207,7 @@ var appSlice = (0, import_toolkit.createSlice)({
1195
1207
  ...action.payload
1196
1208
  };
1197
1209
  },
1198
- setEnvironmentData: (state, action) => {
1199
- return { ...state, ...action.payload };
1200
- }
1210
+ setEnvironmentData: (state, action) => ({ ...state, ...action.payload })
1201
1211
  }
1202
1212
  });
1203
1213
  var actions = appSlice.actions;
@@ -1572,9 +1582,7 @@ var onboardingSlice = (0, import_toolkit5.createSlice)({
1572
1582
  name: sliceName5,
1573
1583
  initialState: initialState5,
1574
1584
  reducers: {
1575
- setOnboardingState: (state, action) => {
1576
- return { ...state, ...action.payload };
1577
- },
1585
+ setOnboardingState: (state, action) => ({ ...state, ...action.payload }),
1578
1586
  setDemoArtifactPort: (state, action) => {
1579
1587
  state.demoArtifactPort = action.payload;
1580
1588
  },
@@ -2102,7 +2110,7 @@ var getGroups = (0, import_toolkit11.createSelector)([getGroupsById], (groupsByI
2102
2110
  (accu, [groupname, group]) => {
2103
2111
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
2104
2112
  const groupItem = { ...group, groupId: name, name: groupname };
2105
- if (group.filters.length > 0) {
2113
+ if (group.filters?.length > 0) {
2106
2114
  if (groupname !== UNGROUPED_GROUP.id) {
2107
2115
  accu.dynamic.push(groupItem);
2108
2116
  } else {
@@ -2177,14 +2185,15 @@ var getAuditLogEntry = (0, import_toolkit12.createSelector)([getAuditLog, getAud
2177
2185
  // src/utils.ts
2178
2186
  var import_helpers4 = require("@northern.tech/utils/helpers");
2179
2187
  var filterProcessors = {
2180
- $gt: (val) => Number(val) || val,
2181
- $gte: (val) => Number(val) || val,
2182
- $lt: (val) => Number(val) || val,
2183
- $lte: (val) => Number(val) || val,
2184
- $in: (val) => ("" + val).split(",").map((i) => i.trim()),
2185
- $nin: (val) => ("" + val).split(",").map((i) => i.trim()),
2186
- $exists: import_helpers4.yes,
2187
- $nexists: () => false
2188
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
2189
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
2190
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
2191
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
2192
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
2193
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2194
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2195
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers4.yes,
2196
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
2188
2197
  };
2189
2198
  var filterAliases = {
2190
2199
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -2228,14 +2237,12 @@ var filtersFilter = (item, index, array) => {
2228
2237
  const firstIndex = array.findIndex((filter) => filterCompare(filter, item));
2229
2238
  return firstIndex === index;
2230
2239
  };
2231
- var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => {
2232
- return ids.slice(0, cutOffSize).reduce((accu, id) => {
2233
- if (id && byId[id]) {
2234
- accu.push({ ...defaultObject, ...byId[id] });
2235
- }
2236
- return accu;
2237
- }, []);
2238
- };
2240
+ var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => ids.slice(0, cutOffSize).reduce((accu, id) => {
2241
+ if (id && byId[id]) {
2242
+ accu.push({ ...defaultObject, ...byId[id] });
2243
+ }
2244
+ return accu;
2245
+ }, []);
2239
2246
  var mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) => Object.entries(existingPermissions).reduce(
2240
2247
  (accu, [key, value]) => {
2241
2248
  let values;
@@ -2327,8 +2334,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
2327
2334
  var getGlobalSettings = (state) => state.users.globalSettings;
2328
2335
  var getCurrentUserId = (state) => state.users.currentUser;
2329
2336
  var getUsersById = (state) => state.users.byId;
2337
+ var getUsersList = (0, import_toolkit14.createSelector)([getUsersById], (usersById) => Object.values(usersById));
2330
2338
  var getCurrentUser = (0, import_toolkit14.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
2331
2339
  var getUserSettings = (state) => state.users.userSettings;
2340
+ var getSelectedDeviceAttribute = (0, import_toolkit14.createSelector)(
2341
+ [getUserSettings],
2342
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
2343
+ );
2332
2344
  var getIsDarkMode = (0, import_toolkit14.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
2333
2345
  var getShowHelptips = (0, import_toolkit14.createSelector)(
2334
2346
  [getTooltipsById],
@@ -2353,7 +2365,7 @@ var getOfflineThresholdSettings = (0, import_toolkit14.createSelector)([getGloba
2353
2365
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
2354
2366
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
2355
2367
  }));
2356
- var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
2368
+ var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
2357
2369
  var getCurrentSession = (state) => state.users.currentSession;
2358
2370
 
2359
2371
  // src/commonSelectors.ts
@@ -2415,12 +2427,18 @@ var getUserCapabilities = (0, import_toolkit15.createSelector)([getUserRoles, ge
2415
2427
  });
2416
2428
  var getTenantCapabilities = (0, import_toolkit15.createSelector)(
2417
2429
  [getFeatures, getOrganization, getIsEnterprise],
2418
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2430
+ ({
2431
+ hasAuditlogs: isAuditlogEnabled,
2432
+ hasDeviceConfig: isDeviceConfigEnabled,
2433
+ hasDeviceConnect: isDeviceConnectEnabled,
2434
+ hasMonitor: isMonitorEnabled,
2435
+ isHosted
2436
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2419
2437
  const canDelta = isEnterprise || plan === PLANS.professional.id;
2420
2438
  const hasAuditlogs = isAuditlogEnabled && isEnterprise;
2421
- const hasDeviceConfig = isDeviceConfigEnabled && addons.some((addon) => addon.name === "configure" && Boolean(addon.enabled));
2422
- const hasDeviceConnect = isDeviceConnectEnabled && (!isEnterprise || addons.some((addon) => addon.name === "troubleshoot" && Boolean(addon.enabled)));
2423
- const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === "monitor" && Boolean(addon.enabled));
2439
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
2440
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
2441
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
2424
2442
  return {
2425
2443
  canDelta,
2426
2444
  canRetry: canDelta,
@@ -2524,9 +2542,7 @@ var getGroupNames = (0, import_toolkit15.createSelector)([getGroupsById, getUser
2524
2542
  });
2525
2543
  var getDeviceReportsForUser = (0, import_toolkit15.createSelector)(
2526
2544
  [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],
2527
- ({ reports }, { id: currentUserId }, globalSettings, devicesById) => {
2528
- return reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : []);
2529
- }
2545
+ ({ reports }, { id: currentUserId }, globalSettings, devicesById) => reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])
2530
2546
  );
2531
2547
  var listTypeDeviceIdMap = {
2532
2548
  deviceList: getListedDevices,
@@ -2550,7 +2566,7 @@ var getAuditlogDevice = (0, import_toolkit15.createSelector)([getAuditLogEntry,
2550
2566
  var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
2551
2567
  if (service_provider) {
2552
2568
  return roles.reduce((accu, role) => {
2553
- if (rolesById[role.id]) {
2569
+ if (rolesById[role.value]) {
2554
2570
  return accu;
2555
2571
  }
2556
2572
  accu.push(role);
@@ -2558,7 +2574,7 @@ var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, ge
2558
2574
  }, Object.values(serviceProviderRolesById));
2559
2575
  }
2560
2576
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
2561
- const index = accu.findIndex(({ id }) => id === key);
2577
+ const index = accu.findIndex(({ value }) => value === key);
2562
2578
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
2563
2579
  return accu;
2564
2580
  }, roles);
@@ -2711,13 +2727,12 @@ var setSearchState = (0, import_toolkit16.createAsyncThunk)(`${sliceName}/setSea
2711
2727
  });
2712
2728
 
2713
2729
  // src/store.ts
2730
+ var import_react_redux = require("react-redux");
2714
2731
  var import_helpers7 = require("@northern.tech/utils/helpers");
2715
2732
  var import_toolkit17 = require("@reduxjs/toolkit");
2716
2733
  var { setSnackbar, uploadProgress } = actions_default;
2717
2734
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2718
- var resetEnvironment = () => {
2719
- keys.map((key) => window.sessionStorage.removeItem(key));
2720
- };
2735
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2721
2736
  resetEnvironment();
2722
2737
  var commonErrorFallback = "Please check your connection.";
2723
2738
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2743,6 +2758,14 @@ var sessionReducer = (state, action) => {
2743
2758
  }
2744
2759
  return rootReducer(state, action);
2745
2760
  };
2761
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2762
+ if (action.type.endsWith("/rejected")) {
2763
+ const { error } = action;
2764
+ console.error("Rejection in action:", action);
2765
+ console.error(error.stack);
2766
+ }
2767
+ return next(action);
2768
+ };
2746
2769
  var getConfiguredStore = (options = {}) => {
2747
2770
  const { preloadedState = {}, ...config } = options;
2748
2771
  return (0, import_toolkit17.configureStore)({
@@ -2758,7 +2781,7 @@ var getConfiguredStore = (options = {}) => {
2758
2781
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2759
2782
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2760
2783
  }
2761
- })
2784
+ }).concat(rejectionLoggerMiddleware)
2762
2785
  });
2763
2786
  };
2764
2787
  var store = getConfiguredStore({
@@ -2767,12 +2790,13 @@ var store = getConfiguredStore({
2767
2790
 
2768
2791
  // src/deploymentsSlice/thunks.ts
2769
2792
  var import_helpers8 = require("@northern.tech/utils/helpers");
2793
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
2770
2794
  var import_toolkit18 = require("@reduxjs/toolkit");
2771
2795
  var import_validator = require("validator");
2772
2796
  var { receivedDevice, setSnackbar: setSnackbar2 } = actions_default;
2773
2797
  var { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;
2774
2798
  var deriveDeploymentGroup = ({ filter = {}, group, groups = [], name }) => group || groups.length === 1 && !(0, import_validator.isUUID)(name) ? groups[0] : filter.name;
2775
- var transformDeployments = (deployments, deploymentsById) => deployments.sort(import_helpers8.startTimeSort).reduce(
2799
+ var transformDeployments = (deployments, deploymentsById) => deployments.sort((0, import_helpers8.customSort)(true, "created")).reduce(
2776
2800
  (accu, item) => {
2777
2801
  const filter = item.filter ?? {};
2778
2802
  let deployment = {
@@ -2823,6 +2847,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceNam
2823
2847
  return Promise.all(tasks);
2824
2848
  });
2825
2849
  });
2850
+ var isWithinFirstMonth = (expirationDate) => {
2851
+ if (!expirationDate) {
2852
+ return false;
2853
+ }
2854
+ const endOfFirstMonth = new Date(expirationDate);
2855
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
2856
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
2857
+ };
2858
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
2859
+ import_tracking.default.event({ category: "deployments", action: "create" });
2860
+ if (!totalDeploymentCount) {
2861
+ if (!hasDeployments) {
2862
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
2863
+ if (isWithinFirstMonth(trial_expiration)) {
2864
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
2865
+ }
2866
+ }
2867
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
2868
+ }
2869
+ };
2826
2870
  var MAX_PREVIOUS_PHASES_COUNT = 5;
2827
2871
  var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
2828
2872
  let request;
@@ -2833,6 +2877,9 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2833
2877
  } else {
2834
2878
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
2835
2879
  }
2880
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
2881
+ const { hasDeployments } = getGlobalSettings(getState());
2882
+ const { trial_expiration } = getOrganization(getState());
2836
2883
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
2837
2884
  const lastslashindex = data.headers.location.lastIndexOf("/");
2838
2885
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -2847,6 +2894,7 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2847
2894
  dispatch(getSingleDeployment(deploymentId)),
2848
2895
  dispatch(setSnackbar2("Deployment created successfully", TIMEOUTS.fiveSeconds))
2849
2896
  ];
2897
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
2850
2898
  const { canManageUsers } = getUserCapabilities(getState());
2851
2899
  if (canManageUsers) {
2852
2900
  const { phases, retries } = newDeployment;
@@ -3521,7 +3569,7 @@ var getDevicesByStatus2 = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/
3521
3569
  page = defaultPage2,
3522
3570
  perPage = defaultPerPage2,
3523
3571
  sortOptions = [],
3524
- selectedAttributes = []
3572
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3525
3573
  } = options;
3526
3574
  const state = getState();
3527
3575
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3634,7 +3682,6 @@ var getReportingLimits = (0, import_toolkit19.createAsyncThunk)(
3634
3682
  })
3635
3683
  );
3636
3684
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3637
- var REPORT_CHART_SIZE_LIMIT = 6;
3638
3685
  var getSingleReportData = (reportConfig, groups) => {
3639
3686
  const { attribute, group, software = "" } = reportConfig;
3640
3687
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3714,6 +3761,13 @@ var getDeviceConnect = (0, import_toolkit19.createAsyncThunk)(
3714
3761
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3715
3762
  )
3716
3763
  );
3764
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3765
+ var triggerDeviceUpdate = (0, import_toolkit19.createAsyncThunk)(
3766
+ `${sliceName3}/triggerDeviceUpdate`,
3767
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3768
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3769
+ )
3770
+ );
3717
3771
  var getSessionDetails = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3718
3772
  const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3719
3773
  const createdAfter = startDate ? `&created_after=${startUnix}` : "";
@@ -3816,12 +3870,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3816
3870
  );
3817
3871
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3818
3872
  `${sliceName3}/preauthDevice`,
3819
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
3873
+ (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) => {
3820
3874
  if (err.response.status === 409) {
3821
- return Promise.reject("A device with a matching identity data set already exists");
3875
+ return rejectWithValue("A device with a matching identity data set already exists");
3822
3876
  }
3823
3877
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3824
- }).then(() => Promise.resolve(dispatch(setSnackbar3("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
3878
+ })
3825
3879
  );
3826
3880
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3827
3881
  `${sliceName3}/decommissionDevice`,
@@ -4038,18 +4092,17 @@ var getDeviceMonitorConfig = (0, import_toolkit20.createAsyncThunk)(
4038
4092
  );
4039
4093
  var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4040
4094
  `${sliceName4}/changeNotificationSetting`,
4041
- ({ enabled, channel = alertChannels.email }, { dispatch }) => {
4042
- 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(
4043
- () => Promise.all([
4044
- dispatch(actions4.changeAlertChannel({ channel, enabled })),
4045
- dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
4046
- ])
4047
- );
4048
- }
4095
+ ({ 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(
4096
+ () => Promise.all([
4097
+ dispatch(actions4.changeAlertChannel({ channel, enabled })),
4098
+ dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
4099
+ ])
4100
+ )
4049
4101
  );
4050
4102
 
4051
4103
  // src/onboardingSlice/thunks.ts
4052
4104
  var import_helpers10 = require("@northern.tech/utils/helpers");
4105
+ var import_tracking2 = __toESM(require("@northern.tech/utils/tracking"), 1);
4053
4106
  var import_toolkit21 = require("@reduxjs/toolkit");
4054
4107
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4055
4108
  var cookies3 = new import_universal_cookie3.default();
@@ -4131,7 +4184,7 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4131
4184
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4132
4185
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4133
4186
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4134
- ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))
4187
+ ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE))).then(() => import_tracking2.default.event({ category: "onboarding", action: onboardingSteps.ONBOARDING_CANCELED }))
4135
4188
  );
4136
4189
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4137
4190
  const steps = orderedOnboardingSteps;
@@ -4142,7 +4195,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4142
4195
  }
4143
4196
  const madeProgress = steps[stepIndex + 1];
4144
4197
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4145
- state.complete = stepIndex + 1 >= steps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4198
+ state.complete = stepIndex + 1 >= orderedOnboardingSteps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4199
+ import_tracking2.default.event({ category: "onboarding", action: stepId });
4146
4200
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4147
4201
  });
4148
4202
 
@@ -4221,7 +4275,7 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4221
4275
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4222
4276
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4223
4277
  `${sliceName6}/completeUpgrade`,
4224
- ({ 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())))
4278
+ ({ 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())]))
4225
4279
  );
4226
4280
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4227
4281
  const userId = userFilter?.id || userFilter;
@@ -4269,9 +4323,15 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4269
4323
  return Promise.all(tasks);
4270
4324
  });
4271
4325
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4272
- var addTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/createTenant`, (selectionState, { dispatch }) => {
4273
- 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));
4274
- });
4326
+ var addTenant = (0, import_toolkit22.createAsyncThunk)(
4327
+ `${sliceName6}/createTenant`,
4328
+ (selectionState, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants`, selectionState).then(
4329
+ () => Promise.all([
4330
+ dispatch(setSnackbar4("Tenant was created successfully.")),
4331
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4332
+ ])
4333
+ ).catch((err) => commonErrorHandler(err, "There was an error creating tenant", dispatch, commonErrorFallback))
4334
+ );
4275
4335
  var tenantListRetrieval = async (config) => {
4276
4336
  const { page, perPage } = config;
4277
4337
  const params = new URLSearchParams({ page, per_page: perPage }).toString();
@@ -4296,21 +4356,29 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4296
4356
  }
4297
4357
  return dispatch(actions6.setTenantListState({ ...nextState }));
4298
4358
  });
4299
- var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4300
- return general_api_default.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name }).catch((err) => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(() => {
4301
- const tasks = [Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully")))];
4302
- tasks.push(dispatch(getTenants()));
4303
- tasks.push(dispatch(getUserOrganization()));
4304
- return Promise.all(tasks);
4305
- });
4306
- });
4307
- var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4308
- return general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4309
- () => Promise.all([Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully"))), dispatch(getTenants()), dispatch(getUserOrganization())])
4310
- );
4311
- });
4312
- var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
4313
- return general_api_default.get(`${tenantadmApiUrlv1}/user/tenant`).then((res) => {
4359
+ var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(
4360
+ `${sliceName6}/editDeviceLimit`,
4361
+ ({ 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(
4362
+ () => Promise.all([
4363
+ dispatch(setSnackbar4("Device Limit was changed successfully")),
4364
+ dispatch(getUserOrganization()),
4365
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4366
+ ])
4367
+ )
4368
+ );
4369
+ var removeTenant = (0, import_toolkit22.createAsyncThunk)(
4370
+ `${sliceName6}/editDeviceLimit`,
4371
+ ({ id }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4372
+ () => Promise.all([
4373
+ dispatch(setSnackbar4("The tenant was removed successfully")),
4374
+ dispatch(getUserOrganization()),
4375
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4376
+ ])
4377
+ )
4378
+ );
4379
+ var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(
4380
+ `${sliceName6}/getUserOrganization`,
4381
+ (_, { dispatch, getState }) => general_api_default.get(`${tenantadmApiUrlv1}/user/tenant`).then((res) => {
4314
4382
  let tasks = [dispatch(actions6.setOrganization(res.data))];
4315
4383
  const { addons, plan, trial } = res.data;
4316
4384
  const { token } = getCurrentSession(getState());
@@ -4322,15 +4390,18 @@ var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4322
4390
  tasks.push(dispatch(setAnnouncement(tenantDataDivergedMessage)));
4323
4391
  }
4324
4392
  return Promise.all(tasks);
4325
- });
4326
- });
4393
+ })
4394
+ );
4327
4395
  var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4328
4396
  `${sliceName6}/sendSupportMessage`,
4329
4397
  (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 }))))
4330
4398
  );
4331
4399
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4332
4400
  `${sliceName6}/requestPlanChange`,
4333
- ({ 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 }))))
4401
+ ({ content, tenantId }, { dispatch, rejectWithValue }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content).catch(async (err) => {
4402
+ await commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback);
4403
+ rejectWithValue(err);
4404
+ }).then(() => Promise.resolve(dispatch(setSnackbar4({ message: "Your request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))))
4334
4405
  );
4335
4406
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4336
4407
  `${sliceName6}/downloadLicenseReport`,
@@ -4422,9 +4493,22 @@ var getSsoConfigs = (0, import_toolkit22.createAsyncThunk)(
4422
4493
  )
4423
4494
  );
4424
4495
 
4425
- // src/releasesSlice/thunks.ts
4496
+ // src/locationutils.ts
4426
4497
  var import_helpers12 = require("@northern.tech/utils/helpers");
4427
- var import_locationutils = require("@northern.tech/utils/locationutils");
4498
+ var defaultSelector = (result) => result[0];
4499
+ var commonFields = {
4500
+ ...Object.keys(DEVICE_LIST_DEFAULTS).reduce((accu, key) => ({ ...accu, [key]: { parse: Number, select: defaultSelector, target: key } }), {}),
4501
+ id: { parse: String, select: (i) => i, target: "id" },
4502
+ issues: { parse: void 0, select: defaultSelector, target: "selectedIssues" },
4503
+ open: { parse: Boolean, select: defaultSelector, target: "open" }
4504
+ };
4505
+ var formatReleases = ({ pageState: { searchTerm, selectedTags = [], tab, type } }) => Object.entries({ name: searchTerm, tab, type }).reduce(
4506
+ (accu, [key, value]) => value ? [...accu, `${key}=${value}`] : accu,
4507
+ selectedTags.map((tag) => `tag=${tag}`)
4508
+ ).join("&");
4509
+
4510
+ // src/releasesSlice/thunks.ts
4511
+ var import_helpers13 = require("@northern.tech/utils/helpers");
4428
4512
  var import_toolkit23 = require("@reduxjs/toolkit");
4429
4513
  var import_axios3 = require("axios");
4430
4514
  var import_uuid2 = require("uuid");
@@ -4432,7 +4516,7 @@ var { setSnackbar: setSnackbar5, initUpload: initUpload2, uploadProgress: upload
4432
4516
  var { page: defaultPage5, perPage: defaultPerPage5 } = DEVICE_LIST_DEFAULTS;
4433
4517
  var sortingDefaults = { direction: SORTING_OPTIONS.desc, key: "modified" };
4434
4518
  var flattenRelease = (release, stateRelease) => {
4435
- const updatedArtifacts = release.artifacts?.sort((0, import_helpers12.customSort)(1, "modified")) || [];
4519
+ const updatedArtifacts = release.artifacts?.sort((0, import_helpers13.customSort)(true, "modified")) || [];
4436
4520
  const { artifacts, deviceTypes, modified } = updatedArtifacts.reduce(
4437
4521
  (accu, item) => {
4438
4522
  accu.deviceTypes.push(...item.device_types_compatible);
@@ -4446,7 +4530,7 @@ var flattenRelease = (release, stateRelease) => {
4446
4530
  },
4447
4531
  { artifacts: [], deviceTypes: [], modified: void 0 }
4448
4532
  );
4449
- return { ...stateRelease, ...release, artifacts, device_types_compatible: deviceTypes.filter(import_helpers12.duplicateFilter), modified };
4533
+ return { ...stateRelease, ...release, artifacts, device_types_compatible: deviceTypes.filter(import_helpers13.duplicateFilter), modified };
4450
4534
  };
4451
4535
  var reduceReceivedReleases = (releases, stateReleasesById) => releases.reduce((accu, release) => {
4452
4536
  const stateRelease = stateReleasesById[release.name] || {};
@@ -4470,7 +4554,7 @@ var getArtifactInstallCount = (0, import_toolkit23.createAsyncThunk)(`${sliceNam
4470
4554
  }
4471
4555
  const releaseArtifacts = [...release.artifacts];
4472
4556
  const artifact = releaseArtifacts[index];
4473
- const { key, name, version } = (0, import_helpers12.extractSoftwareItem)(artifact.artifact_provides) ?? {};
4557
+ const { key, name, version } = (0, import_helpers13.extractSoftwareItem)(artifact.artifact_provides) ?? {};
4474
4558
  const attribute = `${key}${name ? `.${name}` : ""}.version`;
4475
4559
  const { filterTerms } = convertDeviceListStateToFilters({
4476
4560
  filters: [{ ...emptyFilter, key: attribute, value: version, scope: "inventory" }]
@@ -4588,9 +4672,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4588
4672
  if (!release || index === -1) {
4589
4673
  return dispatch(getReleases());
4590
4674
  }
4591
- release.artifacts[index].description = body.description;
4675
+ const updatedRelease = {
4676
+ ...release,
4677
+ artifacts: release.artifacts.map((artifact, i) => i === index ? { ...artifact, description: body.description } : artifact)
4678
+ };
4592
4679
  return Promise.all([
4593
- dispatch(actions7.receiveRelease(release)),
4680
+ dispatch(actions7.receiveRelease(updatedRelease)),
4594
4681
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4595
4682
  dispatch(getRelease(release.name)),
4596
4683
  dispatch(selectRelease(release.name))
@@ -4643,7 +4730,7 @@ var setReleasesListState = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}
4643
4730
  let tasks = [];
4644
4731
  const { isLoading: currentLoading, ...currentRequestState } = currentState;
4645
4732
  const { isLoading: selectionLoading, ...selectionRequestState } = nextState;
4646
- if (!(0, import_helpers12.deepCompare)(currentRequestState, selectionRequestState)) {
4733
+ if (!(0, import_helpers13.deepCompare)(currentRequestState, selectionRequestState)) {
4647
4734
  nextState.isLoading = true;
4648
4735
  tasks.push(dispatch(getReleases(nextState)).finally(() => dispatch(setReleasesListState({ isLoading: false }))));
4649
4736
  }
@@ -4653,7 +4740,7 @@ var setReleasesListState = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}
4653
4740
  var releaseListRetrieval = (config) => {
4654
4741
  const { searchTerm = "", page = defaultPage5, perPage = defaultPerPage5, sort = sortingDefaults, selectedTags = [], type = "" } = config;
4655
4742
  const { key: attribute, direction } = sort;
4656
- const filterQuery = (0, import_locationutils.formatReleases)({ pageState: { searchTerm, selectedTags } });
4743
+ const filterQuery = formatReleases({ pageState: { searchTerm, selectedTags } });
4657
4744
  const updateType = type ? `update_type=${type}` : "";
4658
4745
  const sorting = attribute ? `sort=${attribute}:${direction}`.toLowerCase() : "";
4659
4746
  return general_api_default.get(
@@ -4663,7 +4750,7 @@ var releaseListRetrieval = (config) => {
4663
4750
  var deductSearchState = (receivedReleases, config, total, state) => {
4664
4751
  let releaseListState = { ...state.releasesList };
4665
4752
  const { searchTerm, searchOnly, sort = {}, selectedTags = [], type } = config;
4666
- const flattenedReleases = Object.values(receivedReleases).sort((0, import_helpers12.customSort)(sort.direction === SORTING_OPTIONS.desc, sort.key));
4753
+ const flattenedReleases = Object.values(receivedReleases).sort((0, import_helpers13.customSort)(sort.direction === SORTING_OPTIONS.desc, sort.key));
4667
4754
  const releaseIds = flattenedReleases.map((item) => item.name);
4668
4755
  const isFiltering = !!(selectedTags.length || type || searchTerm);
4669
4756
  if (searchOnly) {
@@ -4691,33 +4778,32 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4691
4778
  return Promise.all(tasks);
4692
4779
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4693
4780
  });
4694
- var getRelease = (0, import_toolkit23.createAsyncThunk)(
4695
- `${sliceName7}/getReleases`,
4696
- (name, { dispatch, getState }) => releaseListRetrieval({ searchTerm: name, page: 1, perPage: 1 }).then(({ data: releases }) => {
4697
- if (releases.length) {
4698
- const stateRelease = getReleasesById(getState())[releases[0].name] || {};
4699
- return Promise.resolve(dispatch(actions7.receiveRelease(flattenRelease(releases[0], stateRelease))));
4700
- }
4701
- return Promise.resolve(null);
4702
- })
4703
- );
4781
+ var getRelease = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getReleases`, async (name, { dispatch, getState }) => {
4782
+ const releaseResponse = await general_api_default.get(`${deploymentsApiUrlV2}/deployments/releases/${name}`);
4783
+ const { data: release } = releaseResponse;
4784
+ if (release) {
4785
+ const stateRelease = getReleasesById(getState())[release.name] || {};
4786
+ await dispatch(actions7.receiveRelease(flattenRelease(release, stateRelease)));
4787
+ }
4788
+ return Promise.resolve(null);
4789
+ });
4704
4790
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4705
4791
  `${sliceName7}/updateReleaseInfo`,
4706
- ({ 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(() => {
4707
- return Promise.all([
4792
+ ({ 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(
4793
+ () => Promise.all([
4708
4794
  dispatch(actions7.receiveRelease({ ...getReleasesById(getState())[name], ...info, name })),
4709
4795
  dispatch(setSnackbar5("Release details were updated successfully.", TIMEOUTS.fiveSeconds, ""))
4710
- ]);
4711
- })
4796
+ ])
4797
+ )
4712
4798
  );
4713
4799
  var setReleaseTags = (0, import_toolkit23.createAsyncThunk)(
4714
4800
  `${sliceName7}/setReleaseTags`,
4715
- ({ 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(() => {
4716
- return Promise.all([
4801
+ ({ 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(
4802
+ () => Promise.all([
4717
4803
  dispatch(actions7.receiveRelease({ ...getReleasesById(getState())[name], name, tags })),
4718
4804
  dispatch(setSnackbar5("Release tags were set successfully.", TIMEOUTS.fiveSeconds, ""))
4719
- ]);
4720
- })
4805
+ ])
4806
+ )
4721
4807
  );
4722
4808
  var getExistingReleaseTags = (0, import_toolkit23.createAsyncThunk)(
4723
4809
  `${sliceName7}/getReleaseTags`,
@@ -4728,6 +4814,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4728
4814
  (_, { 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))))
4729
4815
  );
4730
4816
 
4817
+ // src/usersSlice/thunks.ts
4818
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4819
+
4731
4820
  // src/api/users-api.ts
4732
4821
  var import_axios4 = __toESM(require("axios"), 1);
4733
4822
  var Api2 = {
@@ -4743,7 +4832,7 @@ var Api2 = {
4743
4832
  var users_api_default = Api2;
4744
4833
 
4745
4834
  // src/usersSlice/thunks.ts
4746
- var import_helpers13 = require("@northern.tech/utils/helpers");
4835
+ var import_helpers14 = require("@northern.tech/utils/helpers");
4747
4836
  var import_retrytimer = require("@northern.tech/utils/retrytimer");
4748
4837
  var import_toolkit24 = require("@reduxjs/toolkit");
4749
4838
  var import_md52 = __toESM(require("md5"), 1);
@@ -4751,7 +4840,7 @@ var import_universal_cookie5 = __toESM(require("universal-cookie"), 1);
4751
4840
  var cookies5 = new import_universal_cookie5.default();
4752
4841
  var { setAnnouncement: setAnnouncement2, setSnackbar: setSnackbar6 } = actions_default;
4753
4842
  var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) => (dispatch) => {
4754
- const errorText = (0, import_helpers13.extractErrorMessage)(err);
4843
+ const errorText = (0, import_helpers14.extractErrorMessage)(err);
4755
4844
  const is2FABackend = errorText.includes("2fa");
4756
4845
  if (is2FABackend && !has2FA) {
4757
4846
  return rejectWithValue({ error: "2fa code missing" });
@@ -4761,7 +4850,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4761
4850
  }
4762
4851
  const twoFAError = is2FABackend ? " and verification code" : "";
4763
4852
  const errorMessage = `There was a problem logging in. Please check your email${twoFAError ? "," : " and"} password${twoFAError}. If you still have problems, contact an administrator.`;
4764
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.preformatWithRequestID)(err.response, errorMessage), null, "Copy to clipboard")));
4853
+ return Promise.reject(dispatch(setSnackbar6({ message: (0, import_helpers14.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
4765
4854
  };
4766
4855
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4767
4856
  `${sliceName8}/loginUser`,
@@ -4785,19 +4874,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4785
4874
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4786
4875
  setSessionInfo({ token, expiresAt });
4787
4876
  cookies5.remove("JWT", { path: "/" });
4788
- return (
4789
- // @ts-ignore
4790
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
4791
- cleanUp();
4792
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
4793
- }).then(() => {
4794
- window.sessionStorage.removeItem("pendings-redirect");
4795
- if (window.location.pathname !== "/ui/") {
4796
- window.location.replace("/ui/");
4797
- }
4798
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4799
- })
4800
- );
4877
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
4878
+ cleanUp();
4879
+ return Promise.reject(dispatch(setSnackbar6((0, import_helpers14.extractErrorMessage)(e))));
4880
+ }).then(() => {
4881
+ window.sessionStorage.removeItem("pendings-redirect");
4882
+ if (window.location.pathname !== "/ui/") {
4883
+ window.location.replace("/ui/");
4884
+ }
4885
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4886
+ });
4801
4887
  })
4802
4888
  );
4803
4889
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4815,6 +4901,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4815
4901
  return Promise.reject();
4816
4902
  }
4817
4903
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
4904
+ window.sessionStorage.setItem("tenantChanged", "true");
4818
4905
  setSessionInfo({ ...getSessionInfo(), token });
4819
4906
  window.location.reload();
4820
4907
  });
@@ -4855,11 +4942,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4855
4942
  );
4856
4943
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4857
4944
  `${sliceName8}/getUserList`,
4858
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
4859
- const users = res.data.reduce((accu, item) => {
4860
- accu[item.id] = item;
4861
- return accu;
4862
- }, {});
4945
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
4946
+ const currentUsersById = getUsersById(getState());
4947
+ const users = res.data.reduce(
4948
+ (accu, item) => {
4949
+ accu[item.id] = {
4950
+ ...accu[item.id],
4951
+ ...item
4952
+ };
4953
+ return accu;
4954
+ },
4955
+ { ...currentUsersById }
4956
+ );
4863
4957
  return dispatch(actions8.receivedUserList(users));
4864
4958
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
4865
4959
  );
@@ -4868,9 +4962,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
4868
4962
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
4869
4963
  ({ data: user }) => Promise.all([
4870
4964
  dispatch(actions8.receivedUser(user)),
4871
- // @ts-ignore
4872
4965
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
4873
- // @ts-ignore
4874
4966
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
4875
4967
  user
4876
4968
  ])
@@ -4917,10 +5009,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
4917
5009
  );
4918
5010
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
4919
5011
  `${sliceName8}/removeUser`,
4920
- (userId, { dispatch }) => (
4921
- // @ts-ignore
4922
- 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))
4923
- )
5012
+ (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))
4924
5013
  );
4925
5014
  var editUser = (0, import_toolkit24.createAsyncThunk)(
4926
5015
  `${sliceName8}/editUser`,
@@ -4941,7 +5030,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4941
5030
  );
4942
5031
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4943
5032
  `${sliceName8}/disableUser2fa`,
4944
- (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))))
5033
+ (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))]))
4945
5034
  );
4946
5035
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
4947
5036
  (accu, [area, definition]) => {
@@ -4955,9 +5044,9 @@ var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).redu
4955
5044
  permissionsAccu.push(uiPermission.value);
4956
5045
  }
4957
5046
  return permissionsAccu;
4958
- }, []).filter(import_helpers13.duplicateFilter);
5047
+ }, []).filter(import_helpers14.duplicateFilter);
4959
5048
  if (Array.isArray(accu[area])) {
4960
- accu[area] = [...accu[area], ...collector].filter(import_helpers13.duplicateFilter);
5049
+ accu[area] = [...accu[area], ...collector].filter(import_helpers14.duplicateFilter);
4961
5050
  } else {
4962
5051
  accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });
4963
5052
  }
@@ -4982,7 +5071,7 @@ var permissionActionTypes = {
4982
5071
  };
4983
5072
  var combinePermissions = (existingPermissions, additionalPermissions = {}) => Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {
4984
5073
  let maybeExistingPermissions = accu[name] || [];
4985
- accu[name] = [...permissions, ...maybeExistingPermissions].filter(import_helpers13.duplicateFilter);
5074
+ accu[name] = [...permissions, ...maybeExistingPermissions].filter(import_helpers14.duplicateFilter);
4986
5075
  return accu;
4987
5076
  }, existingPermissions);
4988
5077
  var tryParseCustomPermission = (permission) => {
@@ -5007,7 +5096,7 @@ var isEmptyPermissionSet = (permissionSet) => !Object.values(permissionSet).redu
5007
5096
  if (Array.isArray(permissions)) {
5008
5097
  return accu || !!permissions.length;
5009
5098
  }
5010
- return accu || !(0, import_helpers13.isEmpty)(permissions);
5099
+ return accu || !(0, import_helpers14.isEmpty)(permissions);
5011
5100
  }, false);
5012
5101
  var parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }, permissionSets) => {
5013
5102
  const preliminaryResult = permission_sets_with_scope.reduce(
@@ -5075,7 +5164,7 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5075
5164
  return collector;
5076
5165
  }
5077
5166
  if (permissionSet2 === permissionSetObject.name) {
5078
- collector[area] = [...collector[area], item.value].filter(import_helpers13.duplicateFilter);
5167
+ collector[area] = [...collector[area], item.value].filter(import_helpers14.duplicateFilter);
5079
5168
  }
5080
5169
  return collector;
5081
5170
  }, accu2),
@@ -5094,7 +5183,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5094
5183
  accu[permissionSet.name] = permissionSetObject;
5095
5184
  return accu;
5096
5185
  },
5097
- // @ts-ignore
5098
5186
  { ...getState().users.permissionSetsById }
5099
5187
  );
5100
5188
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5144,7 +5232,7 @@ var transformAreaRoleDataToScopedPermissionsSets = (area, areaPermissions, exces
5144
5232
  if (value.includes(excessiveAccessSelector)) {
5145
5233
  return { name };
5146
5234
  }
5147
- return { name, scope: { ...scope, value: value.filter(import_helpers13.duplicateFilter) } };
5235
+ return { name, scope: { ...scope, value: value.filter(import_helpers14.duplicateFilter) } };
5148
5236
  });
5149
5237
  };
5150
5238
  var transformRoleDataToRole = (roleData, roleState = {}) => {
@@ -5187,7 +5275,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5187
5275
  role: {
5188
5276
  ...emptyRole,
5189
5277
  name,
5190
- // @ts-ignore
5191
5278
  description: description ? description : roleState.description,
5192
5279
  uiPermissions: {
5193
5280
  ...emptyUiPermissions,
@@ -5230,10 +5317,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5230
5317
  });
5231
5318
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5232
5319
  `${sliceName8}/removeRole`,
5233
- (roleId, { dispatch }) => (
5234
- // @ts-ignore
5235
- 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))
5236
- )
5320
+ (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))
5237
5321
  );
5238
5322
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5239
5323
  `${sliceName8}/getGlobalSettings`,
@@ -5244,7 +5328,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5244
5328
  );
5245
5329
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5246
5330
  `${sliceName8}/saveGlobalSettings`,
5247
- // @ts-ignore
5248
5331
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5249
5332
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5250
5333
  return;
@@ -5290,11 +5373,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5290
5373
  const tooltipState = getTooltipsState(getState());
5291
5374
  const updatedSettings = {
5292
5375
  ...userSettings,
5293
- // @ts-ignore
5294
5376
  ...settings,
5295
5377
  onboarding: {
5296
5378
  ...onboardingState,
5297
- // @ts-ignore
5298
5379
  ...settings.onboarding
5299
5380
  },
5300
5381
  tooltips: tooltipState
@@ -5338,10 +5419,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5338
5419
  );
5339
5420
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5340
5421
  `${sliceName8}/revokeToken`,
5341
- (token, { dispatch }) => (
5342
- // @ts-ignore
5343
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5344
- )
5422
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5345
5423
  );
5346
5424
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5347
5425
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5350,23 +5428,20 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5350
5428
  }
5351
5429
  return Promise.all(tasks);
5352
5430
  });
5353
- var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
5354
- const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5431
+ var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
5432
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5355
5433
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5356
5434
  });
5357
5435
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5358
5436
  `${sliceName8}/submitFeedback`,
5359
- // @ts-ignore
5360
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
5361
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5362
- subject: "feedback submission",
5363
- body: JSON.stringify({ feedback, satisfaction, meta })
5364
- }).then(() => {
5365
- const today = /* @__PURE__ */ new Date();
5366
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5367
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5368
- });
5369
- }
5437
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5438
+ subject: "feedback submission",
5439
+ body: JSON.stringify({ feedback, satisfaction, meta })
5440
+ }).then(() => {
5441
+ const today = /* @__PURE__ */ new Date();
5442
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5443
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5444
+ })
5370
5445
  );
5371
5446
 
5372
5447
  // src/storehooks.ts
@@ -5404,7 +5479,6 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5404
5479
  metaMenderVersion,
5405
5480
  services = {}
5406
5481
  } = mender_environment;
5407
- onboardingComplete = stringToBoolean(features.isEnterprise) || stringToBoolean(disableOnboarding) || onboardingComplete;
5408
5482
  demoArtifactPort = port || demoArtifactPort;
5409
5483
  environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});
5410
5484
  environmentFeatures = {
@@ -5412,6 +5486,7 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5412
5486
  isHosted: features.isHosted || window.location.hostname.includes("hosted.mender.io"),
5413
5487
  isDemoMode: stringToBoolean(isDemoMode || features.isDemoMode)
5414
5488
  };
5489
+ onboardingComplete = !stringToBoolean(features.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;
5415
5490
  versionInfo = {
5416
5491
  docs: isNaN(integrationVersion.charAt(0)) ? "" : integrationVersion.split(".").slice(0, 2).join("."),
5417
5492
  remainder: {
@@ -5446,18 +5521,18 @@ var maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tas
5446
5521
  }, tasks);
5447
5522
  };
5448
5523
  var useAppInit = (userId) => {
5449
- const dispatch = (0, import_react_redux.useDispatch)();
5524
+ const dispatch = (0, import_react_redux2.useDispatch)();
5450
5525
  const [coreInitDone, setCoreInitDone] = (0, import_react.useState)(false);
5451
- const isEnterprise = (0, import_react_redux.useSelector)(getIsEnterprise);
5452
- const { hasMultitenancy, isHosted } = (0, import_react_redux.useSelector)(getFeatures);
5453
- const devicesByStatus = (0, import_react_redux.useSelector)(getDevicesByStatus);
5454
- const onboardingState = (0, import_react_redux.useSelector)(getOnboardingState);
5455
- let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = (0, import_react_redux.useSelector)(getUserSettings);
5456
- const { canManageUsers } = (0, import_react_redux.useSelector)(getUserCapabilities);
5457
- const { interval, intervalUnit } = (0, import_react_redux.useSelector)(getOfflineThresholdSettings);
5458
- const { id_attribute } = (0, import_react_redux.useSelector)(getGlobalSettings);
5459
- const { identityAttributes } = (0, import_react_redux.useSelector)(getSortedFilteringAttributes);
5460
- const isServiceProvider = (0, import_react_redux.useSelector)(getIsServiceProvider);
5526
+ const isEnterprise = (0, import_react_redux2.useSelector)(getIsEnterprise);
5527
+ const { hasMultitenancy, isHosted } = (0, import_react_redux2.useSelector)(getFeatures);
5528
+ const devicesByStatus = (0, import_react_redux2.useSelector)(getDevicesByStatus);
5529
+ const onboardingState = (0, import_react_redux2.useSelector)(getOnboardingState);
5530
+ let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = (0, import_react_redux2.useSelector)(getUserSettings);
5531
+ const { canManageUsers } = (0, import_react_redux2.useSelector)(getUserCapabilities);
5532
+ const { interval, intervalUnit } = (0, import_react_redux2.useSelector)(getOfflineThresholdSettings);
5533
+ const { id_attribute } = (0, import_react_redux2.useSelector)(getGlobalSettings);
5534
+ const { identityAttributes } = (0, import_react_redux2.useSelector)(getSortedFilteringAttributes);
5535
+ const isServiceProvider = (0, import_react_redux2.useSelector)(getIsServiceProvider);
5461
5536
  const coreInitRunning = (0, import_react.useRef)(false);
5462
5537
  const fullInitRunning = (0, import_react.useRef)(false);
5463
5538
  const retrieveCoreData = (0, import_react.useCallback)(() => {
@@ -5540,7 +5615,7 @@ var useAppInit = (userId) => {
5540
5615
  tooltips
5541
5616
  ]);
5542
5617
  const initializeAppData = (0, import_react.useCallback)(
5543
- () => retrieveAppData().then(interpretAppData).catch((err) => console.log((0, import_helpers14.extractErrorMessage)(err))).then(() => dispatch(getOnboardingState2())),
5618
+ () => retrieveAppData().then(interpretAppData).catch((err) => console.log((0, import_helpers15.extractErrorMessage)(err))).then(() => dispatch(getOnboardingState2())),
5544
5619
  [dispatch, retrieveAppData, interpretAppData]
5545
5620
  );
5546
5621
  (0, import_react.useEffect)(() => {