@northern.tech/store 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/dist/actions.cjs +20 -17
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.js +8 -8
  4. package/dist/api/general-api.js +2 -2
  5. package/dist/api/types/Tenant.ts +17 -12
  6. package/dist/api/users-api.js +2 -2
  7. package/dist/appSlice/constants.cjs +18 -10
  8. package/dist/appSlice/constants.cjs.map +1 -1
  9. package/dist/appSlice/constants.d.cts +41 -84
  10. package/dist/appSlice/constants.d.ts +41 -84
  11. package/dist/appSlice/constants.js +1 -1
  12. package/dist/appSlice/index.js +2 -2
  13. package/dist/appSlice/thunks.cjs +137 -94
  14. package/dist/appSlice/thunks.cjs.map +1 -1
  15. package/dist/appSlice/thunks.js +19 -19
  16. package/dist/auth.js +2 -2
  17. package/dist/{chunk-Q6M5TTDQ.js → chunk-2CYOM4BK.js} +1 -1
  18. package/dist/chunk-2CYOM4BK.js.map +1 -0
  19. package/dist/{chunk-74OJIKXF.js → chunk-2JHFUQ6B.js} +133 -96
  20. package/dist/chunk-2JHFUQ6B.js.map +1 -0
  21. package/dist/{chunk-YETZPQFR.js → chunk-4XJMRVFI.js} +12 -11
  22. package/dist/chunk-4XJMRVFI.js.map +1 -0
  23. package/dist/{chunk-RX55KAKX.js → chunk-7JKWI5FK.js} +2 -2
  24. package/dist/{chunk-A6CT6GTI.js → chunk-C5NEDBJI.js} +17 -11
  25. package/dist/chunk-C5NEDBJI.js.map +1 -0
  26. package/dist/{chunk-NNADGHSL.js → chunk-DAPAXWA5.js} +8 -8
  27. package/dist/{chunk-ANB5BM5J.js → chunk-DCK2DBOA.js} +27 -20
  28. package/dist/chunk-DCK2DBOA.js.map +1 -0
  29. package/dist/{chunk-E5LEU5PF.js → chunk-HPBE6KYY.js} +2 -2
  30. package/dist/{chunk-2RJIDREZ.js → chunk-LEMVXAYP.js} +25 -16
  31. package/dist/chunk-LEMVXAYP.js.map +1 -0
  32. package/dist/{chunk-NI4SZOCF.js → chunk-LGNOTPUG.js} +9 -9
  33. package/dist/{chunk-MDC7Y3EX.js → chunk-LTKOV26W.js} +22 -20
  34. package/dist/chunk-LTKOV26W.js.map +1 -0
  35. package/dist/{chunk-YTQUNAZP.js → chunk-QRGTG4YB.js} +2 -2
  36. package/dist/{chunk-XTRPX7JZ.js → chunk-TI2RL5P2.js} +2 -2
  37. package/dist/chunk-TI2RL5P2.js.map +1 -0
  38. package/dist/{chunk-YGBFDXXA.js → chunk-TUACATJA.js} +2 -2
  39. package/dist/{chunk-25AKG5HH.js → chunk-UWMYZNUB.js} +19 -11
  40. package/dist/chunk-UWMYZNUB.js.map +1 -0
  41. package/dist/{chunk-UEP36GCI.js → chunk-VMNMD6KF.js} +2 -2
  42. package/dist/{chunk-KAQJH2YL.js → chunk-WXL7PVI5.js} +12 -4
  43. package/dist/chunk-WXL7PVI5.js.map +1 -0
  44. package/dist/{chunk-VOCOFE4I.js → chunk-X7IEZBM4.js} +2 -2
  45. package/dist/{chunk-XXHONFSQ.js → chunk-YDS36ALB.js} +3 -3
  46. package/dist/{chunk-XXHONFSQ.js.map → chunk-YDS36ALB.js.map} +1 -1
  47. package/dist/commonSelectors.cjs +40 -18
  48. package/dist/commonSelectors.cjs.map +1 -1
  49. package/dist/commonSelectors.d.cts +54 -46
  50. package/dist/commonSelectors.d.ts +54 -46
  51. package/dist/commonSelectors.js +9 -9
  52. package/dist/constants.cjs +35 -19
  53. package/dist/constants.cjs.map +1 -1
  54. package/dist/constants.d.cts +3 -3
  55. package/dist/constants.d.ts +3 -3
  56. package/dist/constants.js +6 -2
  57. package/dist/deploymentdevicehook.cjs +143 -99
  58. package/dist/deploymentdevicehook.cjs.map +1 -1
  59. package/dist/deploymentdevicehook.d.cts +1 -1
  60. package/dist/deploymentdevicehook.d.ts +1 -1
  61. package/dist/deploymentdevicehook.js +24 -22
  62. package/dist/deploymentdevicehook.js.map +1 -1
  63. package/dist/deploymentsSlice/constants.cjs +8 -8
  64. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  65. package/dist/deploymentsSlice/constants.js +2 -2
  66. package/dist/deploymentsSlice/index.cjs +8 -8
  67. package/dist/deploymentsSlice/index.cjs.map +1 -1
  68. package/dist/deploymentsSlice/index.js +3 -3
  69. package/dist/deploymentsSlice/selectors.cjs +8 -8
  70. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  71. package/dist/deploymentsSlice/selectors.js +3 -3
  72. package/dist/deploymentsSlice/thunks.cjs +137 -94
  73. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  74. package/dist/deploymentsSlice/thunks.js +19 -19
  75. package/dist/devicesSlice/constants.cjs +11 -8
  76. package/dist/devicesSlice/constants.cjs.map +1 -1
  77. package/dist/devicesSlice/constants.d.cts +2 -1
  78. package/dist/devicesSlice/constants.d.ts +2 -1
  79. package/dist/devicesSlice/constants.js +4 -2
  80. package/dist/devicesSlice/index.cjs +8 -8
  81. package/dist/devicesSlice/index.cjs.map +1 -1
  82. package/dist/devicesSlice/index.js +3 -3
  83. package/dist/devicesSlice/selectors.cjs +9 -9
  84. package/dist/devicesSlice/selectors.cjs.map +1 -1
  85. package/dist/devicesSlice/selectors.js +3 -3
  86. package/dist/devicesSlice/thunks.cjs +139 -94
  87. package/dist/devicesSlice/thunks.cjs.map +1 -1
  88. package/dist/devicesSlice/thunks.d.cts +12 -2
  89. package/dist/devicesSlice/thunks.d.ts +12 -2
  90. package/dist/devicesSlice/thunks.js +21 -19
  91. package/dist/flag-eu-5477R2P4.svg +130 -0
  92. package/dist/flag-us-HNQAF66I.svg +63 -0
  93. package/dist/monitorSlice/constants.cjs +8 -8
  94. package/dist/monitorSlice/constants.cjs.map +1 -1
  95. package/dist/monitorSlice/constants.js +2 -2
  96. package/dist/monitorSlice/index.cjs +8 -8
  97. package/dist/monitorSlice/index.cjs.map +1 -1
  98. package/dist/monitorSlice/index.js +3 -3
  99. package/dist/monitorSlice/thunks.cjs +59 -37
  100. package/dist/monitorSlice/thunks.cjs.map +1 -1
  101. package/dist/monitorSlice/thunks.js +17 -17
  102. package/dist/onboardingSlice/thunks.cjs +146 -100
  103. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  104. package/dist/onboardingSlice/thunks.d.cts +1 -32
  105. package/dist/onboardingSlice/thunks.d.ts +1 -32
  106. package/dist/onboardingSlice/thunks.js +19 -19
  107. package/dist/organizationSlice/constants.cjs +22 -17
  108. package/dist/organizationSlice/constants.cjs.map +1 -1
  109. package/dist/organizationSlice/constants.d.cts +33 -1
  110. package/dist/organizationSlice/constants.d.ts +33 -1
  111. package/dist/organizationSlice/constants.js +4 -2
  112. package/dist/organizationSlice/index.cjs +18 -15
  113. package/dist/organizationSlice/index.cjs.map +1 -1
  114. package/dist/organizationSlice/index.d.cts +26 -1012
  115. package/dist/organizationSlice/index.d.ts +26 -1012
  116. package/dist/organizationSlice/index.js +3 -3
  117. package/dist/organizationSlice/selectors.cjs.map +1 -1
  118. package/dist/organizationSlice/selectors.d.cts +9 -1
  119. package/dist/organizationSlice/selectors.d.ts +9 -1
  120. package/dist/organizationSlice/selectors.js +3 -3
  121. package/dist/organizationSlice/thunks.cjs +1605 -1539
  122. package/dist/organizationSlice/thunks.cjs.map +1 -1
  123. package/dist/organizationSlice/thunks.d.cts +61 -36
  124. package/dist/organizationSlice/thunks.d.ts +61 -36
  125. package/dist/organizationSlice/thunks.js +19 -19
  126. package/dist/organizationSlice/types.cjs +19 -0
  127. package/dist/organizationSlice/types.cjs.map +1 -0
  128. package/dist/organizationSlice/types.d.cts +114 -0
  129. package/dist/organizationSlice/types.d.ts +114 -0
  130. package/dist/organizationSlice/types.js +1 -0
  131. package/dist/organizationSlice/types.js.map +1 -0
  132. package/dist/releasesSlice/index.js +2 -2
  133. package/dist/releasesSlice/selectors.cjs +11 -0
  134. package/dist/releasesSlice/selectors.cjs.map +1 -1
  135. package/dist/releasesSlice/selectors.js +4 -4
  136. package/dist/releasesSlice/thunks.cjs +73 -49
  137. package/dist/releasesSlice/thunks.cjs.map +1 -1
  138. package/dist/releasesSlice/thunks.d.cts +1 -4
  139. package/dist/releasesSlice/thunks.d.ts +1 -4
  140. package/dist/releasesSlice/thunks.js +17 -17
  141. package/dist/selectors.cjs +46 -18
  142. package/dist/selectors.cjs.map +1 -1
  143. package/dist/selectors.d.cts +9 -1
  144. package/dist/selectors.d.ts +9 -1
  145. package/dist/selectors.js +36 -30
  146. package/dist/store.cjs +36 -23
  147. package/dist/store.cjs.map +1 -1
  148. package/dist/store.d.cts +12 -231
  149. package/dist/store.d.ts +12 -231
  150. package/dist/store.js +13 -11
  151. package/dist/storehooks.cjs +216 -137
  152. package/dist/storehooks.cjs.map +1 -1
  153. package/dist/storehooks.js +36 -24
  154. package/dist/storehooks.js.map +1 -1
  155. package/dist/thunks.cjs +193 -122
  156. package/dist/thunks.cjs.map +1 -1
  157. package/dist/thunks.d.cts +5 -1
  158. package/dist/thunks.d.ts +5 -1
  159. package/dist/thunks.js +21 -19
  160. package/dist/usersSlice/constants.cjs +10 -10
  161. package/dist/usersSlice/constants.cjs.map +1 -1
  162. package/dist/usersSlice/constants.js +2 -2
  163. package/dist/usersSlice/index.cjs +10 -10
  164. package/dist/usersSlice/index.cjs.map +1 -1
  165. package/dist/usersSlice/index.js +3 -3
  166. package/dist/usersSlice/selectors.cjs +35 -13
  167. package/dist/usersSlice/selectors.cjs.map +1 -1
  168. package/dist/usersSlice/selectors.d.cts +44 -1
  169. package/dist/usersSlice/selectors.d.ts +44 -1
  170. package/dist/usersSlice/selectors.js +12 -6
  171. package/dist/usersSlice/thunks.cjs +135 -94
  172. package/dist/usersSlice/thunks.cjs.map +1 -1
  173. package/dist/usersSlice/thunks.d.cts +10 -9
  174. package/dist/usersSlice/thunks.d.ts +10 -9
  175. package/dist/usersSlice/thunks.js +19 -19
  176. package/dist/utils.cjs +17 -16
  177. package/dist/utils.cjs.map +1 -1
  178. package/dist/utils.js +3 -3
  179. package/package.json +7 -7
  180. package/dist/chunk-25AKG5HH.js.map +0 -1
  181. package/dist/chunk-2RJIDREZ.js.map +0 -1
  182. package/dist/chunk-74OJIKXF.js.map +0 -1
  183. package/dist/chunk-A6CT6GTI.js.map +0 -1
  184. package/dist/chunk-ANB5BM5J.js.map +0 -1
  185. package/dist/chunk-KAQJH2YL.js.map +0 -1
  186. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  187. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  188. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  189. package/dist/chunk-YETZPQFR.js.map +0 -1
  190. /package/dist/{chunk-RX55KAKX.js.map → chunk-7JKWI5FK.js.map} +0 -0
  191. /package/dist/{chunk-NNADGHSL.js.map → chunk-DAPAXWA5.js.map} +0 -0
  192. /package/dist/{chunk-E5LEU5PF.js.map → chunk-HPBE6KYY.js.map} +0 -0
  193. /package/dist/{chunk-NI4SZOCF.js.map → chunk-LGNOTPUG.js.map} +0 -0
  194. /package/dist/{chunk-YTQUNAZP.js.map → chunk-QRGTG4YB.js.map} +0 -0
  195. /package/dist/{chunk-YGBFDXXA.js.map → chunk-TUACATJA.js.map} +0 -0
  196. /package/dist/{chunk-UEP36GCI.js.map → chunk-VMNMD6KF.js.map} +0 -0
  197. /package/dist/{chunk-VOCOFE4I.js.map → chunk-X7IEZBM4.js.map} +0 -0
@@ -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,6 +3770,13 @@ 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
3781
  const { start: startUnix, end: endUnix } = (0, import_helpers9.dateRangeToUnix)(startDate, endDate);
3719
3782
  const createdAfter = startDate ? `&created_after=${startUnix}` : "";
@@ -3816,12 +3879,12 @@ var deleteAuthset = (0, import_toolkit19.createAsyncThunk)(
3816
3879
  );
3817
3880
  var preauthDevice = (0, import_toolkit19.createAsyncThunk)(
3818
3881
  `${sliceName3}/preauthDevice`,
3819
- (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) => {
3820
3883
  if (err.response.status === 409) {
3821
- 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");
3822
3885
  }
3823
3886
  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))))
3887
+ })
3825
3888
  );
3826
3889
  var decommissionDevice = (0, import_toolkit19.createAsyncThunk)(
3827
3890
  `${sliceName3}/decommissionDevice`,
@@ -4050,18 +4113,20 @@ var changeNotificationSetting = (0, import_toolkit20.createAsyncThunk)(
4050
4113
 
4051
4114
  // src/onboardingSlice/thunks.ts
4052
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);
4053
4118
  var import_toolkit21 = require("@reduxjs/toolkit");
4054
4119
  var import_universal_cookie3 = __toESM(require("universal-cookie"), 1);
4055
4120
  var cookies3 = new import_universal_cookie3.default();
4056
4121
  var applyOnboardingFallbacks = (progress2) => {
4057
- const step = orderedOnboardingSteps[progress2];
4122
+ const step = import_onboardingManager.onboardingSteps[progress2];
4058
4123
  if (step && step.fallbackStep) {
4059
4124
  return step.fallbackStep;
4060
4125
  }
4061
4126
  return progress2;
4062
4127
  };
4063
4128
  var determineProgress = (acceptedDevices, pendingDevices, releases, pastDeployments) => {
4064
- const steps = orderedOnboardingSteps;
4129
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4065
4130
  let progress2 = -1;
4066
4131
  progress2 = pendingDevices.length > 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING) : progress2;
4067
4132
  progress2 = acceptedDevices.length >= 1 ? steps.findIndex((step) => step === onboardingSteps.DEVICES_ACCEPTED_ONBOARDING) : progress2;
@@ -4078,7 +4143,7 @@ var deductOnboardingState = ({ devicesById, devicesByStatus, onboardingState, pa
4078
4143
  const progress2 = applyOnboardingFallbacks(onboardingState.progress || determineProgress(acceptedDevices, pendingDevices, releases, pastDeployments));
4079
4144
  return {
4080
4145
  ...onboardingState,
4081
- 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)),
4082
4147
  showTips: onboardingState.showTips != null ? onboardingState.showTips : true,
4083
4148
  deviceType,
4084
4149
  approach: onboardingState.approach || (deviceType.some((type) => type.startsWith("qemu")) ? "virtual" : "physical"),
@@ -4131,10 +4196,10 @@ var setOnboardingCanceled = (0, import_toolkit21.createAsyncThunk)(
4131
4196
  Promise.resolve(dispatch(actions5.setShowOnboardingHelp(false))),
4132
4197
  Promise.resolve(dispatch(actions5.setShowDismissOnboardingTipsDialog(false))),
4133
4198
  Promise.resolve(dispatch(actions5.setOnboardingComplete(true)))
4134
- ]).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 }))
4135
4200
  );
4136
4201
  var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/advanceOnboarding`, (stepId, { dispatch, getState }) => {
4137
- const steps = orderedOnboardingSteps;
4202
+ const steps = Object.keys(import_onboardingManager.onboardingSteps);
4138
4203
  const progress2 = steps.findIndex((step) => step === getState().onboarding.progress);
4139
4204
  const stepIndex = steps.findIndex((step) => step === stepId);
4140
4205
  if (progress2 > stepIndex || getState().onboarding.progress === null) {
@@ -4142,7 +4207,8 @@ var advanceOnboarding = (0, import_toolkit21.createAsyncThunk)(`${sliceName5}/ad
4142
4207
  }
4143
4208
  const madeProgress = steps[stepIndex + 1];
4144
4209
  const state = { ...getOnboardingState(getState()), progress: madeProgress };
4145
- 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 });
4146
4212
  return Promise.all([dispatch(actions5.setOnboardingProgress(madeProgress)), dispatch(saveUserSettings({ onboarding: state }))]);
4147
4213
  });
4148
4214
 
@@ -4221,7 +4287,7 @@ var startUpgrade = (0, import_toolkit22.createAsyncThunk)(
4221
4287
  var cancelUpgrade = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/cancelUpgrade`, (tenantId) => general_api_default.post(`${tenantadmApiUrlv2}/tenants/${tenantId}/upgrade/cancel`));
4222
4288
  var completeUpgrade = (0, import_toolkit22.createAsyncThunk)(
4223
4289
  `${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())))
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())]))
4225
4291
  );
4226
4292
  var prepareAuditlogQuery = ({ startDate, endDate, user: userFilter, type, detail: detailFilter, sort = {} }) => {
4227
4293
  const userId = userFilter?.id || userFilter;
@@ -4270,7 +4336,12 @@ var setAuditlogsState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/se
4270
4336
  });
4271
4337
  var tenantDataDivergedMessage = "The system detected there is a change in your plan or purchased add-ons. Please log out and log in again";
4272
4338
  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));
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));
4274
4345
  });
4275
4346
  var tenantListRetrieval = async (config) => {
4276
4347
  const { page, perPage } = config;
@@ -4298,15 +4369,20 @@ var setTenantsListState = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/
4298
4369
  });
4299
4370
  var editTenantDeviceLimit = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ newLimit, id, name }, { dispatch }) => {
4300
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(() => {
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);
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
+ ]);
4305
4377
  });
4306
4378
  });
4307
4379
  var removeTenant = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/editDeviceLimit`, ({ id }, { dispatch }) => {
4308
4380
  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())])
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
+ ])
4310
4386
  );
4311
4387
  });
4312
4388
  var getUserOrganization = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getUserOrganization`, (_, { dispatch, getState }) => {
@@ -4330,7 +4406,10 @@ var sendSupportMessage = (0, import_toolkit22.createAsyncThunk)(
4330
4406
  );
4331
4407
  var requestPlanChange = (0, import_toolkit22.createAsyncThunk)(
4332
4408
  `${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 }))))
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 }))))
4334
4413
  );
4335
4414
  var downloadLicenseReport = (0, import_toolkit22.createAsyncThunk)(
4336
4415
  `${sliceName6}/downloadLicenseReport`,
@@ -4588,9 +4667,12 @@ var editArtifact = (0, import_toolkit23.createAsyncThunk)(
4588
4667
  if (!release || index === -1) {
4589
4668
  return dispatch(getReleases());
4590
4669
  }
4591
- 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
+ };
4592
4674
  return Promise.all([
4593
- dispatch(actions7.receiveRelease(release)),
4675
+ dispatch(actions7.receiveRelease(updatedRelease)),
4594
4676
  dispatch(setSnackbar5("Artifact details were updated successfully.", TIMEOUTS.fiveSeconds, "")),
4595
4677
  dispatch(getRelease(release.name)),
4596
4678
  dispatch(selectRelease(release.name))
@@ -4691,16 +4773,15 @@ var getReleases = (0, import_toolkit23.createAsyncThunk)(`${sliceName7}/getRelea
4691
4773
  return Promise.all(tasks);
4692
4774
  }).catch((err) => commonErrorHandler(err, `Please check your connection`, dispatch));
4693
4775
  });
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
- );
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
+ });
4704
4785
  var updateReleaseInfo = (0, import_toolkit23.createAsyncThunk)(
4705
4786
  `${sliceName7}/updateReleaseInfo`,
4706
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(() => {
@@ -4728,6 +4809,9 @@ var getUpdateTypes = (0, import_toolkit23.createAsyncThunk)(
4728
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))))
4729
4810
  );
4730
4811
 
4812
+ // src/usersSlice/thunks.ts
4813
+ var import_helptips = require("@northern.tech/common-ui/helptips");
4814
+
4731
4815
  // src/api/users-api.ts
4732
4816
  var import_axios4 = __toESM(require("axios"), 1);
4733
4817
  var Api2 = {
@@ -4761,7 +4845,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
4761
4845
  }
4762
4846
  const twoFAError = is2FABackend ? " and verification code" : "";
4763
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.`;
4764
- 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" })));
4765
4849
  };
4766
4850
  var loginUser = (0, import_toolkit24.createAsyncThunk)(
4767
4851
  `${sliceName8}/loginUser`,
@@ -4785,19 +4869,16 @@ var loginUser = (0, import_toolkit24.createAsyncThunk)(
4785
4869
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
4786
4870
  setSessionInfo({ token, expiresAt });
4787
4871
  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
- );
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
+ });
4801
4882
  })
4802
4883
  );
4803
4884
  var logoutUser = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -4815,6 +4896,7 @@ var switchUserOrganization = (0, import_toolkit24.createAsyncThunk)(`${sliceName
4815
4896
  return Promise.reject();
4816
4897
  }
4817
4898
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
4899
+ window.sessionStorage.setItem("tenantChanged", "true");
4818
4900
  setSessionInfo({ ...getSessionInfo(), token });
4819
4901
  window.location.reload();
4820
4902
  });
@@ -4855,11 +4937,18 @@ var verify2FA = (0, import_toolkit24.createAsyncThunk)(
4855
4937
  );
4856
4938
  var getUserList = (0, import_toolkit24.createAsyncThunk)(
4857
4939
  `${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
- }, {});
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
+ );
4863
4952
  return dispatch(actions8.receivedUserList(users));
4864
4953
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
4865
4954
  );
@@ -4868,9 +4957,7 @@ var getUser = (0, import_toolkit24.createAsyncThunk)(
4868
4957
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
4869
4958
  ({ data: user }) => Promise.all([
4870
4959
  dispatch(actions8.receivedUser(user)),
4871
- // @ts-ignore
4872
4960
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
4873
- // @ts-ignore
4874
4961
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
4875
4962
  user
4876
4963
  ])
@@ -4917,10 +5004,7 @@ var createUser = (0, import_toolkit24.createAsyncThunk)(
4917
5004
  );
4918
5005
  var removeUser = (0, import_toolkit24.createAsyncThunk)(
4919
5006
  `${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
- )
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))
4924
5008
  );
4925
5009
  var editUser = (0, import_toolkit24.createAsyncThunk)(
4926
5010
  `${sliceName8}/editUser`,
@@ -4941,7 +5025,7 @@ var enableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4941
5025
  );
4942
5026
  var disableUser2fa = (0, import_toolkit24.createAsyncThunk)(
4943
5027
  `${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))))
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))]))
4945
5029
  );
4946
5030
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
4947
5031
  (accu, [area, definition]) => {
@@ -5094,7 +5178,6 @@ var getPermissionSets = (0, import_toolkit24.createAsyncThunk)(
5094
5178
  accu[permissionSet.name] = permissionSetObject;
5095
5179
  return accu;
5096
5180
  },
5097
- // @ts-ignore
5098
5181
  { ...getState().users.permissionSetsById }
5099
5182
  );
5100
5183
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -5187,7 +5270,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
5187
5270
  role: {
5188
5271
  ...emptyRole,
5189
5272
  name,
5190
- // @ts-ignore
5191
5273
  description: description ? description : roleState.description,
5192
5274
  uiPermissions: {
5193
5275
  ...emptyUiPermissions,
@@ -5230,10 +5312,7 @@ var editRole = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/editRole`,
5230
5312
  });
5231
5313
  var removeRole = (0, import_toolkit24.createAsyncThunk)(
5232
5314
  `${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
- )
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))
5237
5316
  );
5238
5317
  var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5239
5318
  `${sliceName8}/getGlobalSettings`,
@@ -5244,7 +5323,6 @@ var getGlobalSettings2 = (0, import_toolkit24.createAsyncThunk)(
5244
5323
  );
5245
5324
  var saveGlobalSettings = (0, import_toolkit24.createAsyncThunk)(
5246
5325
  `${sliceName8}/saveGlobalSettings`,
5247
- // @ts-ignore
5248
5326
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
5249
5327
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
5250
5328
  return;
@@ -5290,11 +5368,9 @@ var saveUserSettings = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/sav
5290
5368
  const tooltipState = getTooltipsState(getState());
5291
5369
  const updatedSettings = {
5292
5370
  ...userSettings,
5293
- // @ts-ignore
5294
5371
  ...settings,
5295
5372
  onboarding: {
5296
5373
  ...onboardingState,
5297
- // @ts-ignore
5298
5374
  ...settings.onboarding
5299
5375
  },
5300
5376
  tooltips: tooltipState
@@ -5338,10 +5414,7 @@ var generateToken = (0, import_toolkit24.createAsyncThunk)(
5338
5414
  );
5339
5415
  var revokeToken = (0, import_toolkit24.createAsyncThunk)(
5340
5416
  `${sliceName8}/revokeToken`,
5341
- (token, { dispatch }) => (
5342
- // @ts-ignore
5343
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5344
- )
5417
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
5345
5418
  );
5346
5419
  var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
5347
5420
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -5350,29 +5423,26 @@ var setTooltipReadState = (0, import_toolkit24.createAsyncThunk)(`${sliceName8}/
5350
5423
  }
5351
5424
  return Promise.all(tasks);
5352
5425
  });
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 } }), {});
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 } }), {});
5355
5428
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
5356
5429
  });
5357
5430
  var submitFeedback = (0, import_toolkit24.createAsyncThunk)(
5358
5431
  `${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
- }
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
+ })
5370
5440
  );
5371
5441
 
5372
5442
  // src/storehooks.ts
5373
5443
  var cookies6 = new import_universal_cookie6.default();
5374
5444
  import_dayjs.default.extend(import_duration.default);
5375
- var { setDeviceListState: setDeviceListState2, setFirstLoginAfterSignup: setFirstLoginAfterSignup2, setTooltipsState, setShowStartupNotification } = actions_default;
5445
+ var { setSnackbar: setSnackbar7, setDeviceListState: setDeviceListState2, setFirstLoginAfterSignup: setFirstLoginAfterSignup2, setTooltipsState, setShowStartupNotification } = actions_default;
5376
5446
  var featureFlags = [
5377
5447
  "hasAuditlogs",
5378
5448
  "hasMultitenancy",
@@ -5404,7 +5474,6 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5404
5474
  metaMenderVersion,
5405
5475
  services = {}
5406
5476
  } = mender_environment;
5407
- onboardingComplete = stringToBoolean(features.isEnterprise) || stringToBoolean(disableOnboarding) || onboardingComplete;
5408
5477
  demoArtifactPort = port || demoArtifactPort;
5409
5478
  environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});
5410
5479
  environmentFeatures = {
@@ -5412,6 +5481,7 @@ var parseEnvironmentInfo = () => (dispatch, getState) => {
5412
5481
  isHosted: features.isHosted || window.location.hostname.includes("hosted.mender.io"),
5413
5482
  isDemoMode: stringToBoolean(isDemoMode || features.isDemoMode)
5414
5483
  };
5484
+ onboardingComplete = !stringToBoolean(features.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;
5415
5485
  versionInfo = {
5416
5486
  docs: isNaN(integrationVersion.charAt(0)) ? "" : integrationVersion.split(".").slice(0, 2).join("."),
5417
5487
  remainder: {
@@ -5440,24 +5510,33 @@ var maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tas
5440
5510
  if (!onboardingState.showTips || onboardingState.complete) {
5441
5511
  return tasks;
5442
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
+ }
5443
5522
  return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {
5444
5523
  accu.push(dispatch(getDeviceById2(id)));
5445
5524
  return accu;
5446
5525
  }, tasks);
5447
5526
  };
5448
5527
  var useAppInit = (userId) => {
5449
- const dispatch = (0, import_react_redux.useDispatch)();
5528
+ const dispatch = (0, import_react_redux2.useDispatch)();
5450
5529
  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);
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);
5461
5540
  const coreInitRunning = (0, import_react.useRef)(false);
5462
5541
  const fullInitRunning = (0, import_react.useRef)(false);
5463
5542
  const retrieveCoreData = (0, import_react.useCallback)(() => {