@northern.tech/store 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/actions.cjs +20 -17
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.js +8 -8
  4. package/dist/api/general-api.js +2 -2
  5. package/dist/api/types/Tenant.ts +17 -12
  6. package/dist/api/users-api.js +2 -2
  7. package/dist/appSlice/constants.cjs +18 -10
  8. package/dist/appSlice/constants.cjs.map +1 -1
  9. package/dist/appSlice/constants.d.cts +41 -84
  10. package/dist/appSlice/constants.d.ts +41 -84
  11. package/dist/appSlice/constants.js +1 -1
  12. package/dist/appSlice/index.js +2 -2
  13. package/dist/appSlice/thunks.cjs +140 -96
  14. package/dist/appSlice/thunks.cjs.map +1 -1
  15. package/dist/appSlice/thunks.js +19 -19
  16. package/dist/auth.js +2 -2
  17. package/dist/{chunk-Q6M5TTDQ.js → chunk-2CYOM4BK.js} +1 -1
  18. package/dist/chunk-2CYOM4BK.js.map +1 -0
  19. package/dist/{chunk-APHL4JZP.js → chunk-2JHFUQ6B.js} +141 -102
  20. package/dist/chunk-2JHFUQ6B.js.map +1 -0
  21. package/dist/{chunk-YETZPQFR.js → chunk-4XJMRVFI.js} +12 -11
  22. package/dist/chunk-4XJMRVFI.js.map +1 -0
  23. package/dist/{chunk-RX55KAKX.js → chunk-7JKWI5FK.js} +2 -2
  24. package/dist/{chunk-A6CT6GTI.js → chunk-C5NEDBJI.js} +17 -11
  25. package/dist/chunk-C5NEDBJI.js.map +1 -0
  26. package/dist/{chunk-NNADGHSL.js → chunk-DAPAXWA5.js} +8 -8
  27. package/dist/{chunk-ANB5BM5J.js → chunk-DCK2DBOA.js} +27 -20
  28. package/dist/chunk-DCK2DBOA.js.map +1 -0
  29. package/dist/{chunk-E5LEU5PF.js → chunk-HPBE6KYY.js} +2 -2
  30. package/dist/{chunk-2RJIDREZ.js → chunk-LEMVXAYP.js} +25 -16
  31. package/dist/chunk-LEMVXAYP.js.map +1 -0
  32. package/dist/{chunk-NI4SZOCF.js → chunk-LGNOTPUG.js} +9 -9
  33. package/dist/{chunk-MDC7Y3EX.js → chunk-LTKOV26W.js} +22 -20
  34. package/dist/chunk-LTKOV26W.js.map +1 -0
  35. package/dist/{chunk-YTQUNAZP.js → chunk-QRGTG4YB.js} +2 -2
  36. package/dist/{chunk-XTRPX7JZ.js → chunk-TI2RL5P2.js} +2 -2
  37. package/dist/chunk-TI2RL5P2.js.map +1 -0
  38. package/dist/{chunk-YGBFDXXA.js → chunk-TUACATJA.js} +2 -2
  39. package/dist/{chunk-25AKG5HH.js → chunk-UWMYZNUB.js} +19 -11
  40. package/dist/chunk-UWMYZNUB.js.map +1 -0
  41. package/dist/{chunk-UEP36GCI.js → chunk-VMNMD6KF.js} +2 -2
  42. package/dist/{chunk-KAQJH2YL.js → chunk-WXL7PVI5.js} +12 -4
  43. package/dist/chunk-WXL7PVI5.js.map +1 -0
  44. package/dist/{chunk-VOCOFE4I.js → chunk-X7IEZBM4.js} +2 -2
  45. package/dist/{chunk-XXHONFSQ.js → chunk-YDS36ALB.js} +3 -3
  46. package/dist/{chunk-XXHONFSQ.js.map → chunk-YDS36ALB.js.map} +1 -1
  47. package/dist/commonSelectors.cjs +40 -18
  48. package/dist/commonSelectors.cjs.map +1 -1
  49. package/dist/commonSelectors.d.cts +54 -46
  50. package/dist/commonSelectors.d.ts +54 -46
  51. package/dist/commonSelectors.js +9 -9
  52. package/dist/constants.cjs +35 -19
  53. package/dist/constants.cjs.map +1 -1
  54. package/dist/constants.d.cts +3 -3
  55. package/dist/constants.d.ts +3 -3
  56. package/dist/constants.js +6 -2
  57. package/dist/deploymentdevicehook.cjs +146 -101
  58. package/dist/deploymentdevicehook.cjs.map +1 -1
  59. package/dist/deploymentdevicehook.d.cts +1 -1
  60. package/dist/deploymentdevicehook.d.ts +1 -1
  61. package/dist/deploymentdevicehook.js +24 -22
  62. package/dist/deploymentdevicehook.js.map +1 -1
  63. package/dist/deploymentsSlice/constants.cjs +8 -8
  64. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  65. package/dist/deploymentsSlice/constants.js +2 -2
  66. package/dist/deploymentsSlice/index.cjs +8 -8
  67. package/dist/deploymentsSlice/index.cjs.map +1 -1
  68. package/dist/deploymentsSlice/index.js +3 -3
  69. package/dist/deploymentsSlice/selectors.cjs +8 -8
  70. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  71. package/dist/deploymentsSlice/selectors.js +3 -3
  72. package/dist/deploymentsSlice/thunks.cjs +140 -96
  73. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  74. package/dist/deploymentsSlice/thunks.js +19 -19
  75. package/dist/devicesSlice/constants.cjs +11 -8
  76. package/dist/devicesSlice/constants.cjs.map +1 -1
  77. package/dist/devicesSlice/constants.d.cts +2 -1
  78. package/dist/devicesSlice/constants.d.ts +2 -1
  79. package/dist/devicesSlice/constants.js +4 -2
  80. package/dist/devicesSlice/index.cjs +8 -8
  81. package/dist/devicesSlice/index.cjs.map +1 -1
  82. package/dist/devicesSlice/index.js +3 -3
  83. package/dist/devicesSlice/selectors.cjs +9 -9
  84. package/dist/devicesSlice/selectors.cjs.map +1 -1
  85. package/dist/devicesSlice/selectors.js +3 -3
  86. package/dist/devicesSlice/thunks.cjs +142 -96
  87. package/dist/devicesSlice/thunks.cjs.map +1 -1
  88. package/dist/devicesSlice/thunks.d.cts +12 -2
  89. package/dist/devicesSlice/thunks.d.ts +12 -2
  90. package/dist/devicesSlice/thunks.js +21 -19
  91. package/dist/flag-eu-5477R2P4.svg +130 -0
  92. package/dist/flag-us-HNQAF66I.svg +63 -0
  93. package/dist/monitorSlice/constants.cjs +8 -8
  94. package/dist/monitorSlice/constants.cjs.map +1 -1
  95. package/dist/monitorSlice/constants.js +2 -2
  96. package/dist/monitorSlice/index.cjs +8 -8
  97. package/dist/monitorSlice/index.cjs.map +1 -1
  98. package/dist/monitorSlice/index.js +3 -3
  99. package/dist/monitorSlice/thunks.cjs +59 -37
  100. package/dist/monitorSlice/thunks.cjs.map +1 -1
  101. package/dist/monitorSlice/thunks.js +17 -17
  102. package/dist/onboardingSlice/thunks.cjs +149 -102
  103. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  104. package/dist/onboardingSlice/thunks.d.cts +1 -32
  105. package/dist/onboardingSlice/thunks.d.ts +1 -32
  106. package/dist/onboardingSlice/thunks.js +19 -19
  107. package/dist/organizationSlice/constants.cjs +22 -17
  108. package/dist/organizationSlice/constants.cjs.map +1 -1
  109. package/dist/organizationSlice/constants.d.cts +33 -1
  110. package/dist/organizationSlice/constants.d.ts +33 -1
  111. package/dist/organizationSlice/constants.js +4 -2
  112. package/dist/organizationSlice/index.cjs +18 -15
  113. package/dist/organizationSlice/index.cjs.map +1 -1
  114. package/dist/organizationSlice/index.d.cts +26 -1012
  115. package/dist/organizationSlice/index.d.ts +26 -1012
  116. package/dist/organizationSlice/index.js +3 -3
  117. package/dist/organizationSlice/selectors.cjs.map +1 -1
  118. package/dist/organizationSlice/selectors.d.cts +9 -1
  119. package/dist/organizationSlice/selectors.d.ts +9 -1
  120. package/dist/organizationSlice/selectors.js +3 -3
  121. package/dist/organizationSlice/thunks.cjs +1608 -1540
  122. package/dist/organizationSlice/thunks.cjs.map +1 -1
  123. package/dist/organizationSlice/thunks.d.cts +61 -36
  124. package/dist/organizationSlice/thunks.d.ts +61 -36
  125. package/dist/organizationSlice/thunks.js +19 -19
  126. package/dist/organizationSlice/types.cjs +19 -0
  127. package/dist/organizationSlice/types.cjs.map +1 -0
  128. package/dist/organizationSlice/types.d.cts +114 -0
  129. package/dist/organizationSlice/types.d.ts +114 -0
  130. package/dist/organizationSlice/types.js +1 -0
  131. package/dist/organizationSlice/types.js.map +1 -0
  132. package/dist/releasesSlice/index.js +2 -2
  133. package/dist/releasesSlice/selectors.cjs +11 -0
  134. package/dist/releasesSlice/selectors.cjs.map +1 -1
  135. package/dist/releasesSlice/selectors.js +4 -4
  136. package/dist/releasesSlice/thunks.cjs +73 -49
  137. package/dist/releasesSlice/thunks.cjs.map +1 -1
  138. package/dist/releasesSlice/thunks.d.cts +1 -4
  139. package/dist/releasesSlice/thunks.d.ts +1 -4
  140. package/dist/releasesSlice/thunks.js +17 -17
  141. package/dist/selectors.cjs +46 -18
  142. package/dist/selectors.cjs.map +1 -1
  143. package/dist/selectors.d.cts +9 -1
  144. package/dist/selectors.d.ts +9 -1
  145. package/dist/selectors.js +36 -30
  146. package/dist/store.cjs +36 -23
  147. package/dist/store.cjs.map +1 -1
  148. package/dist/store.d.cts +12 -231
  149. package/dist/store.d.ts +12 -231
  150. package/dist/store.js +13 -11
  151. package/dist/storehooks.cjs +222 -141
  152. package/dist/storehooks.cjs.map +1 -1
  153. package/dist/storehooks.js +36 -24
  154. package/dist/storehooks.js.map +1 -1
  155. package/dist/thunks.cjs +199 -126
  156. package/dist/thunks.cjs.map +1 -1
  157. package/dist/thunks.d.cts +5 -1
  158. package/dist/thunks.d.ts +5 -1
  159. package/dist/thunks.js +21 -19
  160. package/dist/usersSlice/constants.cjs +10 -10
  161. package/dist/usersSlice/constants.cjs.map +1 -1
  162. package/dist/usersSlice/constants.js +2 -2
  163. package/dist/usersSlice/index.cjs +10 -10
  164. package/dist/usersSlice/index.cjs.map +1 -1
  165. package/dist/usersSlice/index.js +3 -3
  166. package/dist/usersSlice/selectors.cjs +35 -13
  167. package/dist/usersSlice/selectors.cjs.map +1 -1
  168. package/dist/usersSlice/selectors.d.cts +44 -1
  169. package/dist/usersSlice/selectors.d.ts +44 -1
  170. package/dist/usersSlice/selectors.js +12 -6
  171. package/dist/usersSlice/thunks.cjs +138 -96
  172. package/dist/usersSlice/thunks.cjs.map +1 -1
  173. package/dist/usersSlice/thunks.d.cts +10 -9
  174. package/dist/usersSlice/thunks.d.ts +10 -9
  175. package/dist/usersSlice/thunks.js +19 -19
  176. package/dist/utils.cjs +17 -16
  177. package/dist/utils.cjs.map +1 -1
  178. package/dist/utils.js +3 -3
  179. package/package.json +7 -7
  180. package/dist/chunk-25AKG5HH.js.map +0 -1
  181. package/dist/chunk-2RJIDREZ.js.map +0 -1
  182. package/dist/chunk-A6CT6GTI.js.map +0 -1
  183. package/dist/chunk-ANB5BM5J.js.map +0 -1
  184. package/dist/chunk-APHL4JZP.js.map +0 -1
  185. package/dist/chunk-KAQJH2YL.js.map +0 -1
  186. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  187. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  188. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  189. package/dist/chunk-YETZPQFR.js.map +0 -1
  190. /package/dist/{chunk-RX55KAKX.js.map → chunk-7JKWI5FK.js.map} +0 -0
  191. /package/dist/{chunk-NNADGHSL.js.map → chunk-DAPAXWA5.js.map} +0 -0
  192. /package/dist/{chunk-E5LEU5PF.js.map → chunk-HPBE6KYY.js.map} +0 -0
  193. /package/dist/{chunk-NI4SZOCF.js.map → chunk-LGNOTPUG.js.map} +0 -0
  194. /package/dist/{chunk-YTQUNAZP.js.map → chunk-QRGTG4YB.js.map} +0 -0
  195. /package/dist/{chunk-YGBFDXXA.js.map → chunk-TUACATJA.js.map} +0 -0
  196. /package/dist/{chunk-UEP36GCI.js.map → chunk-VMNMD6KF.js.map} +0 -0
  197. /package/dist/{chunk-VOCOFE4I.js.map → chunk-X7IEZBM4.js.map} +0 -0
@@ -35,14 +35,23 @@ __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");
38
+ var import_react_redux2 = require("react-redux");
39
39
  var import_helpers14 = require("@northern.tech/utils/helpers");
40
+ var import_onboardingManager2 = require("@northern.tech/utils/onboardingManager");
40
41
  var import_dayjs = __toESM(require("dayjs"), 1);
41
- var import_duration = __toESM(require("dayjs/plugin/duration.js"), 1);
42
+ var import_duration = __toESM(require("dayjs/plugin/duration"), 1);
42
43
  var import_universal_cookie6 = __toESM(require("universal-cookie"), 1);
43
44
 
44
45
  // src/appSlice/constants.ts
45
46
  var import_icons_material = require("@mui/icons-material");
47
+
48
+ // ../../assets/img/flag-eu.svg
49
+ var flag_eu_default = "./flag-eu-5477R2P4.svg";
50
+
51
+ // ../../assets/img/flag-us.svg
52
+ var flag_us_default = "./flag-us-HNQAF66I.svg";
53
+
54
+ // src/appSlice/constants.ts
46
55
  var startingDeviceCount = {
47
56
  os: "for first 50 devices",
48
57
  professional: "for first 250 devices"
@@ -65,36 +74,36 @@ var emptyChartSelection = { software: "", group: "", chartType: chartTypes.bar.k
65
74
  var defaultReportType = "distribution";
66
75
  var defaultReports = [{ ...emptyChartSelection, group: null, attribute: "artifact_name", type: defaultReportType }];
67
76
  var locations = {
68
- eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io" },
69
- us: { key: "us", title: "US", location: "hosted.mender.io" }
77
+ eu: { key: "eu", title: "EU", location: "eu.hosted.mender.io", icon: flag_eu_default },
78
+ us: { key: "us", title: "US", location: "hosted.mender.io", icon: flag_us_default }
70
79
  };
71
80
  var PLANS = {
72
81
  os: {
73
82
  id: "os",
74
83
  name: "Basic",
75
84
  offer: true,
76
- price: "$32/month",
85
+ price: "$32 / month",
77
86
  deviceCount: startingDeviceCount.os,
78
- offerprice: "$23/month for first 50 devices",
87
+ offerprice: "$23 / month for first 50 devices",
79
88
  price2: "for first 6 months;\n$29/month thereafter",
80
- features: ["Basic OTA features"]
89
+ features: ["Access to core features of Mender", "Basic support"]
81
90
  },
82
91
  professional: {
83
92
  id: "professional",
84
93
  name: "Professional",
85
94
  offer: true,
86
- price: "$269/month",
95
+ price: "$269 / month",
87
96
  deviceCount: startingDeviceCount.professional,
88
- offerprice: "$200/month for first 50 devices",
97
+ offerprice: "$200 / month for first 50 devices",
89
98
  price2: "for first 6 months;\n$249/month thereafter",
90
- features: ["+ Advanced OTA features", "+ Standard support"]
99
+ features: ["Advanced OTA features", "Higher priority support"]
91
100
  },
92
101
  enterprise: {
93
102
  id: "enterprise",
94
103
  name: "Enterprise",
95
104
  price: "Custom pricing",
96
- deviceCount: "unlimited devices",
97
- features: ["+ Enterprise-grade OTA features", "+ Premium support"]
105
+ deviceCount: "Unlimited devices",
106
+ features: ["All Mender features", "Advanced security features", "SLA-backed support"]
98
107
  }
99
108
  };
100
109
  var ADDONS = {
@@ -565,6 +574,7 @@ var DEVICE_STATES = {
565
574
  rejected: "rejected"
566
575
  };
567
576
  var geoAttributes = ["geo-lat", "geo-lon"].map((attribute) => ({ attribute, scope: "inventory" }));
577
+ var REPORT_CHART_SIZE_LIMIT = 6;
568
578
 
569
579
  // src/monitorSlice/constants.ts
570
580
  var alertChannels = { email: "email" };
@@ -646,13 +656,16 @@ var SSO_TYPES = {
646
656
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
647
657
  }
648
658
  };
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" }];
659
+ var auditlogTypes = {
660
+ artifact: { title: "Artifact", queryParameter: "object_type", value: "artifact" },
661
+ deployment: { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
662
+ device: { title: "Device", queryParameter: "object_id", value: "device" },
663
+ user_access_token: { title: "Personal Access Token", queryParameter: "user_access_token", value: "user_access_token" },
664
+ user: { title: "User", queryParameter: "object_id", value: "user" },
665
+ tenant: { title: "Tenant", queryParameter: "object_id", value: "tenant" }
666
+ };
667
+ var AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];
668
+ var SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];
656
669
  var emptyWebhook = {
657
670
  description: "",
658
671
  enabled: true,
@@ -786,7 +799,7 @@ var uiPermissionsByArea = {
786
799
  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
800
  key: "auditlog",
788
801
  uiPermissions: [uiPermissionsById.read],
789
- title: "System audit log"
802
+ title: "System Audit Log"
790
803
  },
791
804
  deployments: {
792
805
  endpoints: [
@@ -937,7 +950,7 @@ var serviceProviderRolesById = {
937
950
  },
938
951
  readOnly: {
939
952
  name: "Read access",
940
- value: staticRolesByName.admin,
953
+ value: staticRolesByName.readOnly,
941
954
  description: "This role can see all linked organizations but cannot make any changes",
942
955
  permissions: [],
943
956
  uiPermissions: {
@@ -2102,7 +2115,7 @@ var getGroups = (0, import_toolkit11.createSelector)([getGroupsById], (groupsByI
2102
2115
  (accu, [groupname, group]) => {
2103
2116
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
2104
2117
  const groupItem = { ...group, groupId: name, name: groupname };
2105
- if (group.filters.length > 0) {
2118
+ if (group.filters?.length > 0) {
2106
2119
  if (groupname !== UNGROUPED_GROUP.id) {
2107
2120
  accu.dynamic.push(groupItem);
2108
2121
  } else {
@@ -2177,14 +2190,15 @@ var getAuditLogEntry = (0, import_toolkit12.createSelector)([getAuditLog, getAud
2177
2190
  // src/utils.ts
2178
2191
  var import_helpers4 = require("@northern.tech/utils/helpers");
2179
2192
  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
2193
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
2194
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
2195
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
2196
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
2197
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
2198
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2199
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2200
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers4.yes,
2201
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
2188
2202
  };
2189
2203
  var filterAliases = {
2190
2204
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -2327,8 +2341,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
2327
2341
  var getGlobalSettings = (state) => state.users.globalSettings;
2328
2342
  var getCurrentUserId = (state) => state.users.currentUser;
2329
2343
  var getUsersById = (state) => state.users.byId;
2344
+ var getUsersList = (0, import_toolkit14.createSelector)([getUsersById], (usersById) => Object.values(usersById));
2330
2345
  var getCurrentUser = (0, import_toolkit14.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
2331
2346
  var getUserSettings = (state) => state.users.userSettings;
2347
+ var getSelectedDeviceAttribute = (0, import_toolkit14.createSelector)(
2348
+ [getUserSettings],
2349
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
2350
+ );
2332
2351
  var getIsDarkMode = (0, import_toolkit14.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
2333
2352
  var getShowHelptips = (0, import_toolkit14.createSelector)(
2334
2353
  [getTooltipsById],
@@ -2353,7 +2372,7 @@ var getOfflineThresholdSettings = (0, import_toolkit14.createSelector)([getGloba
2353
2372
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
2354
2373
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
2355
2374
  }));
2356
- var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
2375
+ var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
2357
2376
  var getCurrentSession = (state) => state.users.currentSession;
2358
2377
 
2359
2378
  // src/commonSelectors.ts
@@ -2415,12 +2434,18 @@ var getUserCapabilities = (0, import_toolkit15.createSelector)([getUserRoles, ge
2415
2434
  });
2416
2435
  var getTenantCapabilities = (0, import_toolkit15.createSelector)(
2417
2436
  [getFeatures, getOrganization, getIsEnterprise],
2418
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2437
+ ({
2438
+ hasAuditlogs: isAuditlogEnabled,
2439
+ hasDeviceConfig: isDeviceConfigEnabled,
2440
+ hasDeviceConnect: isDeviceConnectEnabled,
2441
+ hasMonitor: isMonitorEnabled,
2442
+ isHosted
2443
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2419
2444
  const canDelta = isEnterprise || plan === PLANS.professional.id;
2420
2445
  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));
2446
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
2447
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
2448
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
2424
2449
  return {
2425
2450
  canDelta,
2426
2451
  canRetry: canDelta,
@@ -2550,7 +2575,7 @@ var getAuditlogDevice = (0, import_toolkit15.createSelector)([getAuditLogEntry,
2550
2575
  var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
2551
2576
  if (service_provider) {
2552
2577
  return roles.reduce((accu, role) => {
2553
- if (rolesById[role.id]) {
2578
+ if (rolesById[role.value]) {
2554
2579
  return accu;
2555
2580
  }
2556
2581
  accu.push(role);
@@ -2558,7 +2583,7 @@ var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, ge
2558
2583
  }, Object.values(serviceProviderRolesById));
2559
2584
  }
2560
2585
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
2561
- const index = accu.findIndex(({ id }) => id === key);
2586
+ const index = accu.findIndex(({ value }) => value === key);
2562
2587
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
2563
2588
  return accu;
2564
2589
  }, roles);
@@ -2711,13 +2736,12 @@ var setSearchState = (0, import_toolkit16.createAsyncThunk)(`${sliceName}/setSea
2711
2736
  });
2712
2737
 
2713
2738
  // src/store.ts
2739
+ var import_react_redux = require("react-redux");
2714
2740
  var import_helpers7 = require("@northern.tech/utils/helpers");
2715
2741
  var import_toolkit17 = require("@reduxjs/toolkit");
2716
2742
  var { setSnackbar, uploadProgress } = actions_default;
2717
2743
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2718
- var resetEnvironment = () => {
2719
- keys.map((key) => window.sessionStorage.removeItem(key));
2720
- };
2744
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2721
2745
  resetEnvironment();
2722
2746
  var commonErrorFallback = "Please check your connection.";
2723
2747
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2743,6 +2767,14 @@ var sessionReducer = (state, action) => {
2743
2767
  }
2744
2768
  return rootReducer(state, action);
2745
2769
  };
2770
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2771
+ if (action.type.endsWith("/rejected")) {
2772
+ const { error } = action;
2773
+ console.error("Rejection in action:", action);
2774
+ console.error(error.stack);
2775
+ }
2776
+ return next(action);
2777
+ };
2746
2778
  var getConfiguredStore = (options = {}) => {
2747
2779
  const { preloadedState = {}, ...config } = options;
2748
2780
  return (0, import_toolkit17.configureStore)({
@@ -2758,7 +2790,7 @@ var getConfiguredStore = (options = {}) => {
2758
2790
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2759
2791
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2760
2792
  }
2761
- })
2793
+ }).concat(rejectionLoggerMiddleware)
2762
2794
  });
2763
2795
  };
2764
2796
  var store = getConfiguredStore({
@@ -2767,6 +2799,7 @@ var store = getConfiguredStore({
2767
2799
 
2768
2800
  // src/deploymentsSlice/thunks.ts
2769
2801
  var import_helpers8 = require("@northern.tech/utils/helpers");
2802
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
2770
2803
  var import_toolkit18 = require("@reduxjs/toolkit");
2771
2804
  var import_validator = require("validator");
2772
2805
  var { receivedDevice, setSnackbar: setSnackbar2 } = actions_default;
@@ -2823,6 +2856,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceNam
2823
2856
  return Promise.all(tasks);
2824
2857
  });
2825
2858
  });
2859
+ var isWithinFirstMonth = (expirationDate) => {
2860
+ if (!expirationDate) {
2861
+ return false;
2862
+ }
2863
+ const endOfFirstMonth = new Date(expirationDate);
2864
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
2865
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
2866
+ };
2867
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
2868
+ import_tracking.default.event({ category: "deployments", action: "create" });
2869
+ if (!totalDeploymentCount) {
2870
+ if (!hasDeployments) {
2871
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
2872
+ if (isWithinFirstMonth(trial_expiration)) {
2873
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
2874
+ }
2875
+ }
2876
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
2877
+ }
2878
+ };
2826
2879
  var MAX_PREVIOUS_PHASES_COUNT = 5;
2827
2880
  var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
2828
2881
  let request;
@@ -2833,6 +2886,9 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2833
2886
  } else {
2834
2887
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
2835
2888
  }
2889
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
2890
+ const { hasDeployments } = getGlobalSettings(getState());
2891
+ const { trial_expiration } = getOrganization(getState());
2836
2892
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
2837
2893
  const lastslashindex = data.headers.location.lastIndexOf("/");
2838
2894
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -2847,6 +2903,7 @@ var createDeployment = (0, import_toolkit18.createAsyncThunk)(`${sliceName2}/cre
2847
2903
  dispatch(getSingleDeployment(deploymentId)),
2848
2904
  dispatch(setSnackbar2("Deployment created successfully", TIMEOUTS.fiveSeconds))
2849
2905
  ];
2906
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
2850
2907
  const { canManageUsers } = getUserCapabilities(getState());
2851
2908
  if (canManageUsers) {
2852
2909
  const { phases, retries } = newDeployment;
@@ -3521,7 +3578,7 @@ var getDevicesByStatus2 = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/
3521
3578
  page = defaultPage2,
3522
3579
  perPage = defaultPerPage2,
3523
3580
  sortOptions = [],
3524
- selectedAttributes = []
3581
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3525
3582
  } = options;
3526
3583
  const state = getState();
3527
3584
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3634,7 +3691,6 @@ var getReportingLimits = (0, import_toolkit19.createAsyncThunk)(
3634
3691
  })
3635
3692
  );
3636
3693
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3637
- var REPORT_CHART_SIZE_LIMIT = 6;
3638
3694
  var getSingleReportData = (reportConfig, groups) => {
3639
3695
  const { attribute, group, software = "" } = reportConfig;
3640
3696
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3714,9 +3770,17 @@ var getDeviceConnect = (0, import_toolkit19.createAsyncThunk)(
3714
3770
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3715
3771
  )
3716
3772
  );
3773
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3774
+ var triggerDeviceUpdate = (0, import_toolkit19.createAsyncThunk)(
3775
+ `${sliceName3}/triggerDeviceUpdate`,
3776
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3777
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3778
+ )
3779
+ );
3717
3780
  var getSessionDetails = (0, import_toolkit19.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3718
- const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1e3)}` : "";
3719
- const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1e3)}` : "";
3781
+ const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3782
+ const createdAfter = startDate ? `&created_after=${startUnix}` : "";
3783
+ const createdBefore = endDate ? `&created_before=${endUnix}` : "";
3720
3784
  const objectSearch = `&object_id=${deviceId}`;
3721
3785
  return general_api_default.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(
3722
3786
  ({ data: auditLogEntries }) => {
@@ -3815,12 +3879,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3815
3879
  );
3816
3880
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3817
3881
  `${sliceName3}/preauthDevice`,
3818
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
3882
+ (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) => {
3819
3883
  if (err.response.status === 409) {
3820
- return Promise.reject("A device with a matching identity data set already exists");
3884
+ return rejectWithValue("A device with a matching identity data set already exists");
3821
3885
  }
3822
3886
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3823
- }).then(() => Promise.resolve(dispatch(setSnackbar3("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
3887
+ })
3824
3888
  );
3825
3889
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3826
3890
  `${sliceName3}/decommissionDevice`,
@@ -4049,18 +4113,20 @@ var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4049
4113
 
4050
4114
  // src/onboardingSlice/thunks.ts
4051
4115
  var import_helpers10 = require("@northern.tech/utils/helpers");
4116
+ var import_onboardingManager = require("@northern.tech/utils/onboardingManager");
4117
+ var import_tracking2 = __toESM(require("@northern.tech/utils/tracking"), 1);
4052
4118
  var import_toolkit21 = require("@reduxjs/toolkit");
4053
4119
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4054
4120
  var cookies3 = new import_universal_cookie3.default();
4055
4121
  var applyOnboardingFallbacks = (progress2) => {
4056
- const step = orderedOnboardingSteps[progress2];
4122
+ const step = import_onboardingManager.onboardingSteps[progress2];
4057
4123
  if (step && step.fallbackStep) {
4058
4124
  return step.fallbackStep;
4059
4125
  }
4060
4126
  return progress2;
4061
4127
  };
4062
4128
  var determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {
4063
- const steps = orderedOnboardingSteps;
4129
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4064
4130
  let progress2 = -1;
4065
4131
  progress2 = pendingDevices.length > 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress2;
4066
4132
  progress2 = acceptedDevices.length >= 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_ACCEPTED_ONBOARDING) : progress2;
@@ -4077,7 +4143,7 @@ var deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pa
4077
4143
  const progress2 = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));
4078
4144
  return {
4079
4145
  ...onboardingState,
4080
- complete: !!(Boolean(userCookie) || onboardingState.complete || acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1 || acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2 || acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2 || orderedOnboardingSteps.findIndex((step) => step === progress2) >= orderedOnboardingSteps.length - 1 || onboardingState.disable || ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every((i) => i)),
4146
+ complete: !!(Boolean(userCookie) || onboardingState.complete || acceptedDevices.length > 1 && pendingDevices.length > 0 && releases.length > 1 && pastDeployments.length > 1 || acceptedDevices.length >= 1 && releases.length >= 2 && pastDeployments.length > 2 || acceptedDevices.length >= 1 && pendingDevices.length > 0 && releases.length >= 2 && pastDeployments.length >= 2 || Object.keys(import_onboardingManager.onboardingSteps).findIndex((step) => step === progress2) >= Object.keys(import_onboardingManager.onboardingSteps).length - 1 || onboardingState.disable || ![canDeploy, canManageDevices, canReadDeployments, canReadDevices, canReadReleases, canUploadReleases].every((i) => i)),
4081
4147
  showTips: onboardingState.showTips != null ? onboardingState.showTips : true,
4082
4148
  deviceType,
4083
4149
  approach: onboardingState.approach || (deviceType.some((type) => type.startsWith("qemu")) ? "virtual" : "physical"),
@@ -4130,10 +4196,10 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4130
4196
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4131
4197
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4132
4198
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4133
- ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE)))
4199
+ ]).then(() => dispatch(advanceOnboarding(onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE))).then(() => import_tracking2.default.event({ category: "onboarding", action: import_onboardingManager.onboardingSteps.ONBOARDING_CANCELED }))
4134
4200
  );
4135
4201
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4136
- const steps = orderedOnboardingSteps;
4202
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4137
4203
  const progress2 = steps.findIndex((step) => step === getState().onboarding.progress);
4138
4204
  const stepIndex = steps.findIndex((step) => step === stepId);
4139
4205
  if (progress2 > stepIndex || getState().onboarding.progress === null) {
@@ -4141,7 +4207,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4141
4207
  }
4142
4208
  const madeProgress = steps[stepIndex + 1];
4143
4209
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4144
- state.complete = stepIndex + 1 >= steps.findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4210
+ state.complete = stepIndex + 1 >= Object.keys(import_onboardingManager.onboardingSteps).findIndex((step) => step === onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE) ? true : state.complete;
4211
+ import_tracking2.default.event({ category: "onboarding", action: stepId });
4145
4212
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4146
4213
  });
4147
4214
 
@@ -4220,13 +4287,14 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4220
4287
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4221
4288
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4222
4289
  `${sliceName6}/completeUpgrade`,
4223
- ({ 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())))
4290
+ ({ 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())]))
4224
4291
  );
4225
4292
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4226
4293
  const userId = userFilter?.id || userFilter;
4227
4294
  const detail = detailFilter?.id || detailFilter;
4228
- const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1e3)}` : "";
4229
- const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1e3)}` : "";
4295
+ const { start: startUnix, end: endUnix } = (0, import_helpers11.dateRangeToUnix)(startDate, endDate);
4296
+ const createdAfter = startDate ? `&created_after=${startUnix}` : "";
4297
+ const createdBefore = endDate ? `&created_before=${endUnix}` : "";
4230
4298
  const typeSearch = type ? `&object_type=${type.value}`.toLowerCase() : "";
4231
4299
  const userSearch = userId ? `&actor_id=${userId}` : "";
4232
4300
  const objectSearch = type && detail ? `&${type.queryParameter}=${encodeURIComponent(detail)}` : "";
@@ -4268,7 +4336,12 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4268
4336
  });
4269
4337
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4270
4338
  var addTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/createTenant`, (selectionState, { dispatch }) => {
4271
- 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));
4339
+ return general_api_default.post(`${tenantadmApiUrlv2}/tenants`, selectionState).then(
4340
+ () => Promise.all([
4341
+ dispatch(setSnackbar4("Tenant was created successfully.")),
4342
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4343
+ ])
4344
+ ).catch((err) => commonErrorHandler(err, "There was an error creating tenant", dispatch, commonErrorFallback));
4272
4345
  });
4273
4346
  var tenantListRetrieval = async (config) => {
4274
4347
  const { page, perPage } = config;
@@ -4296,15 +4369,20 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4296
4369
  });
4297
4370
  var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4298
4371
  return general_api_default.put(`${tenantadmApiUrlv2}/tenants/${id}/child`, { device_limit: newLimit, name }).catch((err) => commonErrorHandler(err, `Device Limit cannot be changed`, dispatch)).then(() => {
4299
- const tasks = [Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully")))];
4300
- tasks.push(dispatch(getTenants()));
4301
- tasks.push(dispatch(getUserOrganization()));
4302
- return Promise.all(tasks);
4372
+ return Promise.all([
4373
+ dispatch(setSnackbar4("Device Limit was changed successfully")),
4374
+ dispatch(getUserOrganization()),
4375
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4376
+ ]);
4303
4377
  });
4304
4378
  });
4305
4379
  var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4306
4380
  return general_api_default.post(`${tenantadmApiUrlv2}/tenants/${id}/remove/start`).catch((err) => commonErrorHandler(err, `There was an error removing the tenant`, dispatch)).then(
4307
- () => Promise.all([Promise.resolve(dispatch(setSnackbar4("Device Limit was changed successfully"))), dispatch(getTenants()), dispatch(getUserOrganization())])
4381
+ () => Promise.all([
4382
+ dispatch(setSnackbar4("The tenant was removed successfully")),
4383
+ dispatch(getUserOrganization()),
4384
+ new Promise((resolve) => setTimeout(() => resolve(dispatch(getTenants())), TIMEOUTS.oneSecond))
4385
+ ])
4308
4386
  );
4309
4387
  });
4310
4388
  var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
@@ -4328,7 +4406,10 @@ var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4328
4406
  );
4329
4407
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4330
4408
  `${sliceName6}/requestPlanChange`,
4331
- ({ 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 }))))
4409
+ ({ content, tenantId }, { dispatch, rejectWithValue }) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/plan`, content).catch(async (err) => {
4410
+ await commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback);
4411
+ rejectWithValue(err);
4412
+ }).then(() => Promise.resolve(dispatch(setSnackbar4({ message: "Your request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))))
4332
4413
  );
4333
4414
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4334
4415
  `${sliceName6}/downloadLicenseReport`,
@@ -4586,9 +4667,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4586
4667
  if (!release || index === -1) {
4587
4668
  return dispatch(getReleases());
4588
4669
  }
4589
- release.artifacts[index].description = body.description;
4670
+ const updatedRelease = {
4671
+ ...release,
4672
+ artifacts: release.artifacts.map((artifact, i) => i === index ? { ...artifact, description: body.description } : artifact)
4673
+ };
4590
4674
  return Promise.all([
4591
- dispatch(actions7.receiveRelease(release)),
4675
+ dispatch(actions7.receiveRelease(updatedRelease)),
4592
4676
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4593
4677
  dispatch(getRelease(release.name)),
4594
4678
  dispatch(selectRelease(release.name))
@@ -4689,16 +4773,15 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4689
4773
  return Promise.all(tasks);
4690
4774
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4691
4775
  });
4692
- var getRelease = (0, import_toolkit23.createAsyncThunk)(
4693
- `${sliceName7}/getReleases`,
4694
- (name, { dispatch, getState }) => releaseListRetrieval({ searchTerm: name, page: 1, perPage: 1 }).then(({ data: releases }) => {
4695
- if (releases.length) {
4696
- const stateRelease = getReleasesById(getState())[releases[0].name] || {};
4697
- return Promise.resolve(dispatch(actions7.receiveRelease(flattenRelease(releases[0], stateRelease))));
4698
- }
4699
- return Promise.resolve(null);
4700
- })
4701
- );
4776
+ var getRelease = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getReleases`, async (name, { dispatch, getState }) => {
4777
+ const releaseResponse = await general_api_default.get(`${deploymentsApiUrlV2}/deployments/releases/${name}`);
4778
+ const { data: release } = releaseResponse;
4779
+ if (release) {
4780
+ const stateRelease = getReleasesById(getState())[release.name] || {};
4781
+ await dispatch(actions7.receiveRelease(flattenRelease(release, stateRelease)));
4782
+ }
4783
+ return Promise.resolve(null);
4784
+ });
4702
4785
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4703
4786
  `${sliceName7}/updateReleaseInfo`,
4704
4787
  ({ 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(() => {
@@ -4726,6 +4809,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4726
4809
  (_, { 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))))
4727
4810
  );
4728
4811
 
4812
+ // src/usersSlice/thunks.ts
4813
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4814
+
4729
4815
  // src/api/users-api.ts
4730
4816
  var import_axios4 = __toESM(require("axios"), 1);
4731
4817
  var Api2 = {
@@ -4759,7 +4845,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4759
4845
  }
4760
4846
  const twoFAError = is2FABackend ? " and verification code" : "";
4761
4847
  const errorMessage = `There was a problem logging in. Please check your email${twoFAError ? "," : " and"} password${twoFAError}. If you still have problems, contact an administrator.`;
4762
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.preformatWithRequestID)(err.response, errorMessage), null, "Copy to clipboard")));
4848
+ return Promise.reject(dispatch(setSnackbar6({ message: (0, import_helpers13.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
4763
4849
  };
4764
4850
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4765
4851
  `${sliceName8}/loginUser`,
@@ -4783,19 +4869,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4783
4869
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4784
4870
  setSessionInfo({ token, expiresAt });
4785
4871
  cookies5.remove("JWT", { path: "/" });
4786
- return (
4787
- // @ts-ignore
4788
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
4789
- cleanUp();
4790
- return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
4791
- }).then(() => {
4792
- window.sessionStorage.removeItem("pendings-redirect");
4793
- if (window.location.pathname !== "/ui/") {
4794
- window.location.replace("/ui/");
4795
- }
4796
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4797
- })
4798
- );
4872
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
4873
+ cleanUp();
4874
+ return Promise.reject(dispatch(setSnackbar6((0, import_helpers13.extractErrorMessage)(e))));
4875
+ }).then(() => {
4876
+ window.sessionStorage.removeItem("pendings-redirect");
4877
+ if (window.location.pathname !== "/ui/") {
4878
+ window.location.replace("/ui/");
4879
+ }
4880
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
4881
+ });
4799
4882
  })
4800
4883
  );
4801
4884
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4813,6 +4896,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4813
4896
  return Promise.reject();
4814
4897
  }
4815
4898
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
4899
+ window.sessionStorage.setItem("tenantChanged", "true");
4816
4900
  setSessionInfo({ ...getSessionInfo(), token });
4817
4901
  window.location.reload();
4818
4902
  });
@@ -4853,11 +4937,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4853
4937
  );
4854
4938
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4855
4939
  `${sliceName8}/getUserList`,
4856
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
4857
- const users = res.data.reduce((accu, item) => {
4858
- accu[item.id] = item;
4859
- return accu;
4860
- }, {});
4940
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
4941
+ const currentUsersById = getUsersById(getState());
4942
+ const users = res.data.reduce(
4943
+ (accu, item) => {
4944
+ accu[item.id] = {
4945
+ ...accu[item.id],
4946
+ ...item
4947
+ };
4948
+ return accu;
4949
+ },
4950
+ { ...currentUsersById }
4951
+ );
4861
4952
  return dispatch(actions8.receivedUserList(users));
4862
4953
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
4863
4954
  );
@@ -4866,9 +4957,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
4866
4957
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
4867
4958
  ({ data: user }) => Promise.all([
4868
4959
  dispatch(actions8.receivedUser(user)),
4869
- // @ts-ignore
4870
4960
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
4871
- // @ts-ignore
4872
4961
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
4873
4962
  user
4874
4963
  ])
@@ -4915,10 +5004,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
4915
5004
  );
4916
5005
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
4917
5006
  `${sliceName8}/removeUser`,
4918
- (userId, { dispatch }) => (
4919
- // @ts-ignore
4920
- 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))
4921
- )
5007
+ (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))
4922
5008
  );
4923
5009
  var editUser = (0, import_toolkit24.createAsyncThunk)(
4924
5010
  `${sliceName8}/editUser`,
@@ -4939,7 +5025,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4939
5025
  );
4940
5026
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4941
5027
  `${sliceName8}/disableUser2fa`,
4942
- (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))))
5028
+ (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))]))
4943
5029
  );
4944
5030
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
4945
5031
  (accu, [area, definition]) => {
@@ -5092,7 +5178,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5092
5178
  accu[permissionSet.name] = permissionSetObject;
5093
5179
  return accu;
5094
5180
  },
5095
- // @ts-ignore
5096
5181
  { ...getState().users.permissionSetsById }
5097
5182
  );
5098
5183
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5185,7 +5270,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5185
5270
  role: {
5186
5271
  ...emptyRole,
5187
5272
  name,
5188
- // @ts-ignore
5189
5273
  description: description ? description : roleState.description,
5190
5274
  uiPermissions: {
5191
5275
  ...emptyUiPermissions,
@@ -5228,10 +5312,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5228
5312
  });
5229
5313
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5230
5314
  `${sliceName8}/removeRole`,
5231
- (roleId, { dispatch }) => (
5232
- // @ts-ignore
5233
- 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))
5234
- )
5315
+ (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))
5235
5316
  );
5236
5317
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5237
5318
  `${sliceName8}/getGlobalSettings`,
@@ -5242,7 +5323,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5242
5323
  );
5243
5324
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5244
5325
  `${sliceName8}/saveGlobalSettings`,
5245
- // @ts-ignore
5246
5326
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5247
5327
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5248
5328
  return;
@@ -5288,11 +5368,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5288
5368
  const tooltipState = getTooltipsState(getState());
5289
5369
  const updatedSettings = {
5290
5370
  ...userSettings,
5291
- // @ts-ignore
5292
5371
  ...settings,
5293
5372
  onboarding: {
5294
5373
  ...onboardingState,
5295
- // @ts-ignore
5296
5374
  ...settings.onboarding
5297
5375
  },
5298
5376
  tooltips: tooltipState
@@ -5336,10 +5414,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5336
5414
  );
5337
5415
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5338
5416
  `${sliceName8}/revokeToken`,
5339
- (token, { dispatch }) => (
5340
- // @ts-ignore
5341
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5342
- )
5417
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5343
5418
  );
5344
5419
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5345
5420
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5348,29 +5423,26 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5348
5423
  }
5349
5424
  return Promise.all(tasks);
5350
5425
  });
5351
- var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
5352
- const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5426
+ var setAllTooltipsReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
5427
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
5353
5428
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5354
5429
  });
5355
5430
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5356
5431
  `${sliceName8}/submitFeedback`,
5357
- // @ts-ignore
5358
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
5359
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5360
- subject: "feedback submission",
5361
- body: JSON.stringify({ feedback, satisfaction, meta })
5362
- }).then(() => {
5363
- const today = /* @__PURE__ */ new Date();
5364
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5365
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5366
- });
5367
- }
5432
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
5433
+ subject: "feedback submission",
5434
+ body: JSON.stringify({ feedback, satisfaction, meta })
5435
+ }).then(() => {
5436
+ const today = /* @__PURE__ */ new Date();
5437
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
5438
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
5439
+ })
5368
5440
  );
5369
5441
 
5370
5442
  // src/storehooks.ts
5371
5443
  var cookies6 = new import_universal_cookie6.default();
5372
5444
  import_dayjs.default.extend(import_duration.default);
5373
- var { setDeviceListState: setDeviceListState2, setFirstLoginAfterSignup: setFirstLoginAfterSignup2, setTooltipsState, setShowStartupNotification } = actions_default;
5445
+ var { setSnackbar: setSnackbar7, setDeviceListState: setDeviceListState2, setFirstLoginAfterSignup: setFirstLoginAfterSignup2, setTooltipsState, setShowStartupNotification } = actions_default;
5374
5446
  var featureFlags = [
5375
5447
  "hasAuditlogs",
5376
5448
  "hasMultitenancy",
@@ -5402,7 +5474,6 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5402
5474
  metaMenderVersion,
5403
5475
  services = {}
5404
5476
  } = mender_environment;
5405
- onboardingComplete = stringToBoolean(features.isEnterprise) || stringToBoolean(disableOnboarding) || onboardingComplete;
5406
5477
  demoArtifactPort = port || demoArtifactPort;
5407
5478
  environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});
5408
5479
  environmentFeatures = {
@@ -5410,6 +5481,7 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5410
5481
  isHosted: features.isHosted || window.location.hostname.includes("hosted.mender.io"),
5411
5482
  isDemoMode: stringToBoolean(isDemoMode || features.isDemoMode)
5412
5483
  };
5484
+ onboardingComplete = !stringToBoolean(features.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;
5413
5485
  versionInfo = {
5414
5486
  docs: isNaN(integrationVersion.charAt(0)) ? "" : integrationVersion.split(".").slice(0, 2).join("."),
5415
5487
  remainder: {
@@ -5438,24 +5510,33 @@ var maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tas
5438
5510
  if (!onboardingState.showTips || onboardingState.complete) {
5439
5511
  return tasks;
5440
5512
  }
5513
+ const welcomeTip = (0, import_onboardingManager2.getOnboardingComponentFor)(onboardingSteps.ONBOARDING_START, {
5514
+ progress: onboardingState.progress,
5515
+ complete: onboardingState.complete,
5516
+ showTips: onboardingState.showTips
5517
+ });
5518
+ if (welcomeTip) {
5519
+ tasks.push(dispatch(setSnackbar7({ message: "open", autoHideDuration: TIMEOUTS.refreshDefault, children: welcomeTip, onClick: () => {
5520
+ }, onClose: true })));
5521
+ }
5441
5522
  return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {
5442
5523
  accu.push(dispatch(getDeviceById2(id)));
5443
5524
  return accu;
5444
5525
  }, tasks);
5445
5526
  };
5446
5527
  var useAppInit = (userId) => {
5447
- const dispatch = (0, import_react_redux.useDispatch)();
5528
+ const dispatch = (0, import_react_redux2.useDispatch)();
5448
5529
  const [coreInitDone, setCoreInitDone] = (0, import_react.useState)(false);
5449
- const isEnterprise = (0, import_react_redux.useSelector)(getIsEnterprise);
5450
- const { hasMultitenancy, isHosted } = (0, import_react_redux.useSelector)(getFeatures);
5451
- const devicesByStatus = (0, import_react_redux.useSelector)(getDevicesByStatus);
5452
- const onboardingState = (0, import_react_redux.useSelector)(getOnboardingState);
5453
- let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = (0, import_react_redux.useSelector)(getUserSettings);
5454
- const { canManageUsers } = (0, import_react_redux.useSelector)(getUserCapabilities);
5455
- const { interval, intervalUnit } = (0, import_react_redux.useSelector)(getOfflineThresholdSettings);
5456
- const { id_attribute } = (0, import_react_redux.useSelector)(getGlobalSettings);
5457
- const { identityAttributes } = (0, import_react_redux.useSelector)(getSortedFilteringAttributes);
5458
- const isServiceProvider = (0, import_react_redux.useSelector)(getIsServiceProvider);
5530
+ const isEnterprise = (0, import_react_redux2.useSelector)(getIsEnterprise);
5531
+ const { hasMultitenancy, isHosted } = (0, import_react_redux2.useSelector)(getFeatures);
5532
+ const devicesByStatus = (0, import_react_redux2.useSelector)(getDevicesByStatus);
5533
+ const onboardingState = (0, import_react_redux2.useSelector)(getOnboardingState);
5534
+ let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = (0, import_react_redux2.useSelector)(getUserSettings);
5535
+ const { canManageUsers } = (0, import_react_redux2.useSelector)(getUserCapabilities);
5536
+ const { interval, intervalUnit } = (0, import_react_redux2.useSelector)(getOfflineThresholdSettings);
5537
+ const { id_attribute } = (0, import_react_redux2.useSelector)(getGlobalSettings);
5538
+ const { identityAttributes } = (0, import_react_redux2.useSelector)(getSortedFilteringAttributes);
5539
+ const isServiceProvider = (0, import_react_redux2.useSelector)(getIsServiceProvider);
5459
5540
  const coreInitRunning = (0, import_react.useRef)(false);
5460
5541
  const fullInitRunning = (0, import_react.useRef)(false);
5461
5542
  const retrieveCoreData = (0, import_react.useCallback)(() => {