@northern.tech/store 0.1.3 → 0.2.0

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 (188) hide show
  1. package/dist/actions.js +75 -13
  2. package/dist/actions.js.map +1 -1
  3. package/dist/actions.mjs +10 -10
  4. package/dist/api/general-api.js +64 -0
  5. package/dist/api/general-api.js.map +1 -1
  6. package/dist/api/general-api.mjs +4 -4
  7. package/dist/api/users-api.js +64 -0
  8. package/dist/api/users-api.js.map +1 -1
  9. package/dist/api/users-api.mjs +5 -5
  10. package/dist/appSlice/index.js +64 -0
  11. package/dist/appSlice/index.js.map +1 -1
  12. package/dist/appSlice/index.mjs +3 -3
  13. package/dist/appSlice/thunks.js +93 -15
  14. package/dist/appSlice/thunks.js.map +1 -1
  15. package/dist/appSlice/thunks.mjs +24 -24
  16. package/dist/auth.js +64 -0
  17. package/dist/auth.js.map +1 -1
  18. package/dist/auth.mjs +3 -3
  19. package/dist/{chunk-HVHZG2H4.mjs → chunk-2HCZYULZ.mjs} +3 -3
  20. package/dist/chunk-2HCZYULZ.mjs.map +1 -0
  21. package/dist/{chunk-R2GBNXLV.mjs → chunk-2P4VECEE.mjs} +3 -3
  22. package/dist/{chunk-HXPYJ6QN.mjs → chunk-4C6IY46N.mjs} +2 -2
  23. package/dist/{chunk-BRHSKNFC.mjs → chunk-4U4X4KAC.mjs} +4 -4
  24. package/dist/{chunk-DZBVTSIX.mjs → chunk-BWFTQHNM.mjs} +2 -2
  25. package/dist/{chunk-BJSH2G7W.mjs → chunk-EFHEROXZ.mjs} +2 -2
  26. package/dist/{chunk-6667TCAJ.mjs → chunk-EM2HUGUY.mjs} +3 -3
  27. package/dist/{chunk-IPPIKGIB.mjs → chunk-ENLZPHTQ.mjs} +8 -8
  28. package/dist/{chunk-IVSYYXTC.mjs → chunk-L4HIW3KB.mjs} +3 -3
  29. package/dist/{chunk-G7LATUT6.mjs → chunk-MJW4632R.mjs} +10 -10
  30. package/dist/{chunk-ZNST5R6O.mjs → chunk-MQIKQKSW.mjs} +61 -2
  31. package/dist/chunk-MQIKQKSW.mjs.map +1 -0
  32. package/dist/{chunk-7E7KJHY3.mjs → chunk-NCI6JV5R.mjs} +2 -2
  33. package/dist/{chunk-G3I53JGW.mjs → chunk-OGAMVFPS.mjs} +2 -1
  34. package/dist/{chunk-G3I53JGW.mjs.map → chunk-OGAMVFPS.mjs.map} +1 -1
  35. package/dist/{chunk-F37LUTBX.mjs → chunk-OWHFMKTA.mjs} +2 -2
  36. package/dist/{chunk-ZIYGEXSJ.mjs → chunk-QG4PT5WK.mjs} +3 -3
  37. package/dist/{chunk-XYVPYFSM.mjs → chunk-RWYS5MKN.mjs} +12 -12
  38. package/dist/{chunk-G32LAKW4.mjs → chunk-U6YTBIDT.mjs} +3 -3
  39. package/dist/{chunk-YNVSU3AA.mjs → chunk-UPMSYTWW.mjs} +22 -22
  40. package/dist/chunk-UPMSYTWW.mjs.map +1 -0
  41. package/dist/{chunk-TD45YTYK.mjs → chunk-WS3YYLTJ.mjs} +14 -16
  42. package/dist/chunk-WS3YYLTJ.mjs.map +1 -0
  43. package/dist/{chunk-HRWZJQMH.mjs → chunk-X65NMDPS.mjs} +3 -3
  44. package/dist/{chunk-O6O3D52B.mjs → chunk-XJNI62IP.mjs} +2 -2
  45. package/dist/{chunk-RQOE5OOT.mjs → chunk-Y47SYXII.mjs} +32 -12
  46. package/dist/chunk-Y47SYXII.mjs.map +1 -0
  47. package/dist/{chunk-N7G6QK2E.mjs → chunk-ZLRZO4EY.mjs} +10 -10
  48. package/dist/{chunk-RH6ONMG7.mjs → chunk-ZZ6VIQ3U.mjs} +3 -3
  49. package/dist/commonConstants.d.mts +18 -19
  50. package/dist/commonConstants.d.ts +18 -19
  51. package/dist/commonConstants.js +1 -0
  52. package/dist/commonConstants.js.map +1 -1
  53. package/dist/commonConstants.mjs +1 -1
  54. package/dist/commonSelectors.d.mts +42 -1
  55. package/dist/commonSelectors.d.ts +42 -1
  56. package/dist/commonSelectors.js +82 -0
  57. package/dist/commonSelectors.js.map +1 -1
  58. package/dist/commonSelectors.mjs +11 -9
  59. package/dist/constants.d.mts +3 -3
  60. package/dist/constants.d.ts +3 -3
  61. package/dist/constants.js +62 -0
  62. package/dist/constants.js.map +1 -1
  63. package/dist/constants.mjs +6 -2
  64. package/dist/deploymentsSlice/constants.js +64 -0
  65. package/dist/deploymentsSlice/constants.js.map +1 -1
  66. package/dist/deploymentsSlice/constants.mjs +2 -2
  67. package/dist/deploymentsSlice/index.js +64 -0
  68. package/dist/deploymentsSlice/index.js.map +1 -1
  69. package/dist/deploymentsSlice/index.mjs +3 -3
  70. package/dist/deploymentsSlice/selectors.js +64 -0
  71. package/dist/deploymentsSlice/selectors.js.map +1 -1
  72. package/dist/deploymentsSlice/selectors.mjs +3 -3
  73. package/dist/deploymentsSlice/thunks.js +93 -15
  74. package/dist/deploymentsSlice/thunks.js.map +1 -1
  75. package/dist/deploymentsSlice/thunks.mjs +24 -24
  76. package/dist/devicesSlice/constants.js +64 -0
  77. package/dist/devicesSlice/constants.js.map +1 -1
  78. package/dist/devicesSlice/constants.mjs +2 -2
  79. package/dist/devicesSlice/index.js +64 -0
  80. package/dist/devicesSlice/index.js.map +1 -1
  81. package/dist/devicesSlice/index.mjs +3 -3
  82. package/dist/devicesSlice/selectors.js +64 -0
  83. package/dist/devicesSlice/selectors.js.map +1 -1
  84. package/dist/devicesSlice/selectors.mjs +3 -3
  85. package/dist/devicesSlice/thunks.js +93 -15
  86. package/dist/devicesSlice/thunks.js.map +1 -1
  87. package/dist/devicesSlice/thunks.mjs +24 -24
  88. package/dist/monitorSlice/constants.js +64 -0
  89. package/dist/monitorSlice/constants.js.map +1 -1
  90. package/dist/monitorSlice/constants.mjs +2 -2
  91. package/dist/monitorSlice/index.js +64 -0
  92. package/dist/monitorSlice/index.js.map +1 -1
  93. package/dist/monitorSlice/index.mjs +3 -3
  94. package/dist/monitorSlice/thunks.js +91 -13
  95. package/dist/monitorSlice/thunks.js.map +1 -1
  96. package/dist/monitorSlice/thunks.mjs +21 -21
  97. package/dist/onboardingSlice/thunks.js +93 -15
  98. package/dist/onboardingSlice/thunks.js.map +1 -1
  99. package/dist/onboardingSlice/thunks.mjs +24 -24
  100. package/dist/organizationSlice/constants.d.mts +6 -1
  101. package/dist/organizationSlice/constants.d.ts +6 -1
  102. package/dist/organizationSlice/constants.js +60 -0
  103. package/dist/organizationSlice/constants.js.map +1 -1
  104. package/dist/organizationSlice/constants.mjs +4 -2
  105. package/dist/organizationSlice/index.d.mts +224 -246
  106. package/dist/organizationSlice/index.d.ts +224 -246
  107. package/dist/organizationSlice/index.js +75 -13
  108. package/dist/organizationSlice/index.js.map +1 -1
  109. package/dist/organizationSlice/index.mjs +3 -3
  110. package/dist/organizationSlice/selectors.js +65 -1
  111. package/dist/organizationSlice/selectors.js.map +1 -1
  112. package/dist/organizationSlice/selectors.mjs +3 -3
  113. package/dist/organizationSlice/thunks.js +93 -15
  114. package/dist/organizationSlice/thunks.js.map +1 -1
  115. package/dist/organizationSlice/thunks.mjs +24 -24
  116. package/dist/releasesSlice/index.js +64 -0
  117. package/dist/releasesSlice/index.js.map +1 -1
  118. package/dist/releasesSlice/index.mjs +3 -3
  119. package/dist/releasesSlice/selectors.js +64 -0
  120. package/dist/releasesSlice/selectors.js.map +1 -1
  121. package/dist/releasesSlice/selectors.mjs +4 -4
  122. package/dist/releasesSlice/thunks.js +91 -13
  123. package/dist/releasesSlice/thunks.js.map +1 -1
  124. package/dist/releasesSlice/thunks.mjs +21 -21
  125. package/dist/selectors.d.mts +1 -1
  126. package/dist/selectors.d.ts +1 -1
  127. package/dist/selectors.js +83 -1
  128. package/dist/selectors.js.map +1 -1
  129. package/dist/selectors.mjs +11 -9
  130. package/dist/store.d.mts +235 -135
  131. package/dist/store.d.ts +235 -135
  132. package/dist/store.js +75 -13
  133. package/dist/store.js.map +1 -1
  134. package/dist/store.mjs +13 -13
  135. package/dist/storehooks.d.mts +3 -1
  136. package/dist/storehooks.d.ts +3 -1
  137. package/dist/storehooks.js +125 -29
  138. package/dist/storehooks.js.map +1 -1
  139. package/dist/storehooks.mjs +59 -39
  140. package/dist/storehooks.mjs.map +1 -1
  141. package/dist/thunks.js +93 -15
  142. package/dist/thunks.js.map +1 -1
  143. package/dist/thunks.mjs +24 -24
  144. package/dist/usersSlice/constants.d.mts +192 -17
  145. package/dist/usersSlice/constants.d.ts +192 -17
  146. package/dist/usersSlice/constants.js +66 -0
  147. package/dist/usersSlice/constants.js.map +1 -1
  148. package/dist/usersSlice/constants.mjs +4 -2
  149. package/dist/usersSlice/index.d.mts +1628 -704
  150. package/dist/usersSlice/index.d.ts +1628 -704
  151. package/dist/usersSlice/index.js +64 -0
  152. package/dist/usersSlice/index.js.map +1 -1
  153. package/dist/usersSlice/index.mjs +3 -3
  154. package/dist/usersSlice/selectors.js +64 -0
  155. package/dist/usersSlice/selectors.js.map +1 -1
  156. package/dist/usersSlice/selectors.mjs +4 -4
  157. package/dist/usersSlice/thunks.js +93 -15
  158. package/dist/usersSlice/thunks.js.map +1 -1
  159. package/dist/usersSlice/thunks.mjs +24 -24
  160. package/dist/utils.d.mts +6 -5
  161. package/dist/utils.d.ts +6 -5
  162. package/dist/utils.js +64 -0
  163. package/dist/utils.js.map +1 -1
  164. package/dist/utils.mjs +3 -3
  165. package/package.json +1 -1
  166. package/dist/chunk-HVHZG2H4.mjs.map +0 -1
  167. package/dist/chunk-RQOE5OOT.mjs.map +0 -1
  168. package/dist/chunk-TD45YTYK.mjs.map +0 -1
  169. package/dist/chunk-YNVSU3AA.mjs.map +0 -1
  170. package/dist/chunk-ZNST5R6O.mjs.map +0 -1
  171. /package/dist/{chunk-R2GBNXLV.mjs.map → chunk-2P4VECEE.mjs.map} +0 -0
  172. /package/dist/{chunk-HXPYJ6QN.mjs.map → chunk-4C6IY46N.mjs.map} +0 -0
  173. /package/dist/{chunk-BRHSKNFC.mjs.map → chunk-4U4X4KAC.mjs.map} +0 -0
  174. /package/dist/{chunk-DZBVTSIX.mjs.map → chunk-BWFTQHNM.mjs.map} +0 -0
  175. /package/dist/{chunk-BJSH2G7W.mjs.map → chunk-EFHEROXZ.mjs.map} +0 -0
  176. /package/dist/{chunk-6667TCAJ.mjs.map → chunk-EM2HUGUY.mjs.map} +0 -0
  177. /package/dist/{chunk-IPPIKGIB.mjs.map → chunk-ENLZPHTQ.mjs.map} +0 -0
  178. /package/dist/{chunk-IVSYYXTC.mjs.map → chunk-L4HIW3KB.mjs.map} +0 -0
  179. /package/dist/{chunk-G7LATUT6.mjs.map → chunk-MJW4632R.mjs.map} +0 -0
  180. /package/dist/{chunk-7E7KJHY3.mjs.map → chunk-NCI6JV5R.mjs.map} +0 -0
  181. /package/dist/{chunk-F37LUTBX.mjs.map → chunk-OWHFMKTA.mjs.map} +0 -0
  182. /package/dist/{chunk-ZIYGEXSJ.mjs.map → chunk-QG4PT5WK.mjs.map} +0 -0
  183. /package/dist/{chunk-XYVPYFSM.mjs.map → chunk-RWYS5MKN.mjs.map} +0 -0
  184. /package/dist/{chunk-G32LAKW4.mjs.map → chunk-U6YTBIDT.mjs.map} +0 -0
  185. /package/dist/{chunk-HRWZJQMH.mjs.map → chunk-X65NMDPS.mjs.map} +0 -0
  186. /package/dist/{chunk-O6O3D52B.mjs.map → chunk-XJNI62IP.mjs.map} +0 -0
  187. /package/dist/{chunk-N7G6QK2E.mjs.map → chunk-ZLRZO4EY.mjs.map} +0 -0
  188. /package/dist/{chunk-RH6ONMG7.mjs.map → chunk-ZZ6VIQ3U.mjs.map} +0 -0
@@ -15,74 +15,76 @@ import {
15
15
  getUserSettings as getUserSettings2,
16
16
  saveGlobalSettings,
17
17
  saveUserSettings
18
- } from "./chunk-YNVSU3AA.mjs";
18
+ } from "./chunk-UPMSYTWW.mjs";
19
19
  import {
20
20
  getReleases
21
- } from "./chunk-N7G6QK2E.mjs";
22
- import "./chunk-G7LATUT6.mjs";
23
- import "./chunk-IVSYYXTC.mjs";
24
- import "./chunk-R2GBNXLV.mjs";
21
+ } from "./chunk-ZLRZO4EY.mjs";
22
+ import "./chunk-MJW4632R.mjs";
23
+ import "./chunk-L4HIW3KB.mjs";
24
+ import "./chunk-2P4VECEE.mjs";
25
25
  import "./chunk-V32GTKOS.mjs";
26
26
  import {
27
27
  getIsEnterprise,
28
28
  getOnboardingState,
29
29
  getUserCapabilities
30
- } from "./chunk-RQOE5OOT.mjs";
30
+ } from "./chunk-Y47SYXII.mjs";
31
31
  import {
32
32
  getGlobalSettings,
33
33
  getOfflineThresholdSettings,
34
34
  getUserSettings
35
- } from "./chunk-BRHSKNFC.mjs";
36
- import "./chunk-HVHZG2H4.mjs";
37
- import "./chunk-O6O3D52B.mjs";
35
+ } from "./chunk-4U4X4KAC.mjs";
36
+ import {
37
+ getIsServiceProvider
38
+ } from "./chunk-2HCZYULZ.mjs";
39
+ import "./chunk-XJNI62IP.mjs";
38
40
  import "./chunk-H2PQQMRY.mjs";
39
41
  import "./chunk-QBKCUIWO.mjs";
40
- import "./chunk-DZBVTSIX.mjs";
42
+ import "./chunk-BWFTQHNM.mjs";
41
43
  import {
42
44
  getDevicesByStatus,
43
45
  getSortedFilteringAttributes
44
- } from "./chunk-ZIYGEXSJ.mjs";
46
+ } from "./chunk-QG4PT5WK.mjs";
45
47
  import {
46
48
  getFeatures
47
49
  } from "./chunk-C2YZYTJ6.mjs";
48
- import "./chunk-XYVPYFSM.mjs";
50
+ import "./chunk-RWYS5MKN.mjs";
49
51
  import {
50
52
  actions_default
51
- } from "./chunk-IPPIKGIB.mjs";
52
- import "./chunk-BJSH2G7W.mjs";
53
- import "./chunk-TD45YTYK.mjs";
54
- import "./chunk-7E7KJHY3.mjs";
55
- import "./chunk-RH6ONMG7.mjs";
53
+ } from "./chunk-ENLZPHTQ.mjs";
54
+ import "./chunk-EFHEROXZ.mjs";
55
+ import "./chunk-WS3YYLTJ.mjs";
56
+ import "./chunk-NCI6JV5R.mjs";
57
+ import "./chunk-ZZ6VIQ3U.mjs";
56
58
  import "./chunk-M4U5R7A4.mjs";
57
- import "./chunk-6667TCAJ.mjs";
58
- import "./chunk-HRWZJQMH.mjs";
59
- import "./chunk-F37LUTBX.mjs";
59
+ import "./chunk-EM2HUGUY.mjs";
60
+ import "./chunk-X65NMDPS.mjs";
61
+ import "./chunk-OWHFMKTA.mjs";
60
62
  import {
61
63
  getSessionInfo
62
- } from "./chunk-HXPYJ6QN.mjs";
64
+ } from "./chunk-4C6IY46N.mjs";
63
65
  import {
64
66
  extractErrorMessage,
65
67
  getComparisonCompatibleVersion,
66
68
  stringToBoolean
67
- } from "./chunk-G32LAKW4.mjs";
69
+ } from "./chunk-U6YTBIDT.mjs";
68
70
  import {
69
71
  DEPLOYMENT_STATES,
70
72
  DEVICE_STATES
71
- } from "./chunk-ZNST5R6O.mjs";
73
+ } from "./chunk-MQIKQKSW.mjs";
72
74
  import "./chunk-G4FGNSV3.mjs";
73
75
  import "./chunk-IU4OXOPA.mjs";
74
76
  import "./chunk-BOSBROA3.mjs";
75
77
  import {
76
78
  TIMEOUTS,
77
79
  timeUnits
78
- } from "./chunk-G3I53JGW.mjs";
80
+ } from "./chunk-OGAMVFPS.mjs";
79
81
  import {
80
82
  __spreadProps,
81
83
  __spreadValues
82
84
  } from "./chunk-XWBD7VOK.mjs";
83
85
 
84
86
  // src/storehooks.ts
85
- import { useCallback, useEffect, useRef } from "react";
87
+ import { useCallback, useEffect, useRef, useState } from "react";
86
88
  import { useDispatch, useSelector } from "react-redux";
87
89
  import dayjs from "dayjs";
88
90
  import durationDayJs from "dayjs/plugin/duration";
@@ -164,6 +166,7 @@ var maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tas
164
166
  };
165
167
  var useAppInit = (userId) => {
166
168
  const dispatch = useDispatch();
169
+ const [coreInitDone, setCoreInitDone] = useState(false);
167
170
  const isEnterprise = useSelector(getIsEnterprise);
168
171
  const { hasMultitenancy, isHosted } = useSelector(getFeatures);
169
172
  const devicesByStatus = useSelector(getDevicesByStatus);
@@ -173,12 +176,27 @@ var useAppInit = (userId) => {
173
176
  const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);
174
177
  const { id_attribute } = useSelector(getGlobalSettings);
175
178
  const { identityAttributes } = useSelector(getSortedFilteringAttributes);
176
- const initRunning = useRef(false);
177
- const retrieveAppData = useCallback(() => {
179
+ const isServiceProvider = useSelector(getIsServiceProvider);
180
+ const coreInitRunning = useRef(false);
181
+ const fullInitRunning = useRef(false);
182
+ const retrieveCoreData = useCallback(() => {
178
183
  let tasks = [
179
184
  dispatch(parseEnvironmentInfo()),
180
185
  dispatch(getUserSettings2()),
181
186
  dispatch(getGlobalSettings2()),
187
+ dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get("firstLoginAfterSignup"))))
188
+ ];
189
+ const multitenancy = hasMultitenancy || isHosted || isEnterprise;
190
+ if (multitenancy) {
191
+ tasks.push(dispatch(getUserOrganization()));
192
+ }
193
+ return Promise.all(tasks);
194
+ }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);
195
+ const retrieveAppData = useCallback(() => {
196
+ if (isServiceProvider) {
197
+ return Promise.resolve(dispatch(getRoles()));
198
+ }
199
+ return Promise.all([
182
200
  dispatch(getDeviceAttributes()),
183
201
  dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),
184
202
  dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),
@@ -191,15 +209,9 @@ var useAppInit = (userId) => {
191
209
  dispatch(getIntegrations()),
192
210
  dispatch(getReleases()),
193
211
  dispatch(getDeviceLimit()),
194
- dispatch(getRoles()),
195
- dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get("firstLoginAfterSignup"))))
196
- ];
197
- const multitenancy = hasMultitenancy || isHosted || isEnterprise;
198
- if (multitenancy) {
199
- tasks.push(dispatch(getUserOrganization()));
200
- }
201
- return Promise.all(tasks);
202
- }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);
212
+ dispatch(getRoles())
213
+ ]);
214
+ }, [dispatch, isServiceProvider]);
203
215
  const interpretAppData = useCallback(() => {
204
216
  let settings = {};
205
217
  if (cookies.get("_ga") && typeof hasTrackingEnabled === "undefined") {
@@ -251,12 +263,20 @@ var useAppInit = (userId) => {
251
263
  [dispatch, retrieveAppData, interpretAppData]
252
264
  );
253
265
  useEffect(() => {
254
- if (!userId || initRunning.current) {
266
+ if (!userId || coreInitRunning.current) {
267
+ return;
268
+ }
269
+ coreInitRunning.current = true;
270
+ retrieveCoreData().then(() => setCoreInitDone(true));
271
+ }, [userId, retrieveCoreData]);
272
+ useEffect(() => {
273
+ if (fullInitRunning.current || !coreInitDone) {
255
274
  return;
256
275
  }
257
- initRunning.current = true;
276
+ fullInitRunning.current = true;
258
277
  initializeAppData();
259
- }, [userId, initializeAppData]);
278
+ }, [initializeAppData, coreInitDone]);
279
+ return { coreInitDone };
260
280
  };
261
281
  export {
262
282
  parseEnvironmentInfo,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimit,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { extractErrorMessage, getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasReporting',\n 'hasMonitor',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n isDemoMode,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion,\n services = {}\n } = mender_environment;\n onboardingComplete = stringToBoolean(features.isEnterprise) || stringToBoolean(disableOnboarding) || onboardingComplete;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: features.isHosted || window.location.hostname.includes('hosted.mender.io'),\n isDemoMode: stringToBoolean(isDemoMode || features.isDemoMode)\n };\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion,\n Deployments: services.deploymentsVersion,\n Deviceauth: services.deviceauthVersion,\n Inventory: services.inventoryVersion,\n GUI: services.guiVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ docsVersion: versionInfo.docs, value: versionInfo.remainder })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const initRunning = useRef(false);\n\n const retrieveAppData = useCallback(() => {\n let tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getDeviceLimit()),\n dispatch(getRoles()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const interpretAppData = useCallback(() => {\n let settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || initRunning.current) {\n return;\n }\n initRunning.current = true;\n initializeAppData();\n }, [userId, initializeAppData]);\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
1
+ {"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimit,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { extractErrorMessage, getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasReporting',\n 'hasMonitor',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n isDemoMode,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion,\n services = {}\n } = mender_environment;\n onboardingComplete = stringToBoolean(features.isEnterprise) || stringToBoolean(disableOnboarding) || onboardingComplete;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: features.isHosted || window.location.hostname.includes('hosted.mender.io'),\n isDemoMode: stringToBoolean(isDemoMode || features.isDemoMode)\n };\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion,\n Deployments: services.deploymentsVersion,\n Deviceauth: services.deviceauthVersion,\n Inventory: services.inventoryVersion,\n GUI: services.guiVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ docsVersion: versionInfo.docs, value: versionInfo.remainder })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n let { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const isServiceProvider = useSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback(() => {\n let tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback(() => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n return Promise.all([\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getDeviceLimit()),\n dispatch(getRoles())\n ]);\n }, [dispatch, isServiceProvider]);\n\n const interpretAppData = useCallback(() => {\n let settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
package/dist/thunks.js CHANGED
@@ -954,6 +954,7 @@ var emptyUiPermissions = Object.freeze({
954
954
  deployments: [],
955
955
  groups: Object.freeze({}),
956
956
  releases: Object.freeze({}),
957
+ tenantManagement: [],
957
958
  userManagement: []
958
959
  });
959
960
  var emptyRole = Object.freeze({
@@ -1201,6 +1202,13 @@ var SSO_TYPES = {
1201
1202
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
1202
1203
  }
1203
1204
  };
1205
+ var AUDIT_LOGS_TYPES = [
1206
+ { title: "Artifact", queryParameter: "object_type", value: "artifact" },
1207
+ { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
1208
+ { title: "Device", queryParameter: "object_id", value: "device" },
1209
+ { title: "User", queryParameter: "object_id", value: "user" }
1210
+ ];
1211
+ var SP_AUDIT_LOGS_TYPES = [AUDIT_LOGS_TYPES[3], { title: "Tenant", queryParameter: "object_id", value: "tenant" }];
1204
1212
  var emptyWebhook = {
1205
1213
  description: "",
1206
1214
  enabled: true,
@@ -1249,10 +1257,12 @@ var permissionSetIds = {
1249
1257
  DeployToDevices: "DeployToDevices",
1250
1258
  ManageDevices: "ManageDevices",
1251
1259
  ManageReleases: "ManageReleases",
1260
+ ManageTenants: "ManageTenants",
1252
1261
  ManageUsers: "ManageUsers",
1253
1262
  ReadAuditLogs: "ReadAuditLogs",
1254
1263
  ReadDevices: "ReadDevices",
1255
1264
  ReadReleases: "ReadReleases",
1265
+ ReadTenants: "ReadTenants",
1256
1266
  ReadUsers: "ReadUsers",
1257
1267
  SuperUser: "SuperUser",
1258
1268
  UploadArtifacts: "UploadArtifacts"
@@ -1291,6 +1301,7 @@ var uiPermissionsById = {
1291
1301
  permissionSets: {
1292
1302
  groups: permissionSetIds.ManageDevices,
1293
1303
  releases: permissionSetIds.ManageReleases,
1304
+ tenantManagement: permissionSetIds.ManageTenants,
1294
1305
  userManagement: permissionSetIds.ManageUsers
1295
1306
  },
1296
1307
  title: "Manage",
@@ -1304,6 +1315,7 @@ var uiPermissionsById = {
1304
1315
  auditlog: permissionSetIds.ReadAuditLogs,
1305
1316
  groups: permissionSetIds.ReadDevices,
1306
1317
  releases: permissionSetIds.ReadReleases,
1318
+ tenantManagement: permissionSetIds.ReadTenants,
1307
1319
  userManagement: permissionSetIds.ReadUsers
1308
1320
  },
1309
1321
  title: "Read",
@@ -1328,6 +1340,7 @@ var uiPermissionsByArea = {
1328
1340
  auditlog: {
1329
1341
  endpoints: [{ path: /\/(auditlog)/i, types: [PermissionTypes.Get], uiPermissions: [uiPermissionsById.read] }],
1330
1342
  explanation: "Granting access to the audit log will allow tracing changes to devices, releases and user accounts, as well as providing information about deployments.",
1343
+ key: "auditlog",
1331
1344
  uiPermissions: [uiPermissionsById.read],
1332
1345
  title: "System audit log"
1333
1346
  },
@@ -1338,6 +1351,7 @@ var uiPermissionsByArea = {
1338
1351
  { path: /\/(deployments\/config)/i, types: [PermissionTypes.Get, PermissionTypes.Put], uiPermissions: [uiPermissionsById.manage] }
1339
1352
  ],
1340
1353
  explanation: "Providing deploy permissions will allow deployments to be created using the releases and devices a user has access to.",
1354
+ key: "deployments",
1341
1355
  uiPermissions: [uiPermissionsById.read, uiPermissionsById.deploy],
1342
1356
  title: "Deployments"
1343
1357
  },
@@ -1353,6 +1367,7 @@ var uiPermissionsByArea = {
1353
1367
  { path: /\/(deviceconnect\/devices)/i, types: [PermissionTypes.Get, PermissionTypes.Post], uiPermissions: [uiPermissionsById.connect] }
1354
1368
  ],
1355
1369
  explanation: "Device group management permissions control the degree to which devices in a group can be accessed and moved to other groups.",
1370
+ key: "groups",
1356
1371
  scope: scopedPermissionAreas.groups.scopeType,
1357
1372
  uiPermissions: [uiPermissionsById.read, uiPermissionsById.manage, uiPermissionsById.deploy, uiPermissionsById.configure, uiPermissionsById.connect],
1358
1373
  title: "Group Management"
@@ -1372,16 +1387,29 @@ var uiPermissionsByArea = {
1372
1387
  }
1373
1388
  ],
1374
1389
  explanation: "Release permissions can be granted to allow artifact & release modifications, as well as the creation of new releases.",
1390
+ key: "releases",
1375
1391
  scope: "ReleaseTags",
1376
1392
  uiPermissions: [uiPermissionsById.read, uiPermissionsById.manage, uiPermissionsById.upload],
1377
1393
  title: "Release Management"
1378
1394
  },
1395
+ tenantManagement: {
1396
+ endpoints: [
1397
+ { path: /\/(tenantadm\/tenants)/i, types: [PermissionTypes.Get], uiPermissions: [uiPermissionsById.read] },
1398
+ { path: /\/(tenantadm\/tenants)/i, types: [PermissionTypes.Post, PermissionTypes.Put], uiPermissions: [uiPermissionsById.manage] },
1399
+ { path: /\/(users\/exists)/i, types: [PermissionTypes.Get], uiPermissions: [uiPermissionsById.manage] }
1400
+ ],
1401
+ explanation: "Tenant management permissions allow listing, creating and modifying child tenants",
1402
+ key: "tenantManagement",
1403
+ uiPermissions: [uiPermissionsById.read, uiPermissionsById.manage],
1404
+ title: "Tenant Management"
1405
+ },
1379
1406
  userManagement: {
1380
1407
  endpoints: [
1381
1408
  { path: /\/(useradm)/i, types: [PermissionTypes.Get], uiPermissions: [uiPermissionsById.read] },
1382
1409
  { path: /\/(useradm)/i, types: [PermissionTypes.Post], uiPermissions: [uiPermissionsById.manage] }
1383
1410
  ],
1384
1411
  explanation: "User management permissions should be granted carefully, as these allow privilege increases for any users managed by a user with user management permissions",
1412
+ key: "userManagement",
1385
1413
  uiPermissions: [uiPermissionsById.read, uiPermissionsById.manage],
1386
1414
  title: "User Management"
1387
1415
  }
@@ -1445,6 +1473,30 @@ var rolesById = Object.freeze({
1445
1473
  })
1446
1474
  }
1447
1475
  });
1476
+ var serviceProviderRolesById = {
1477
+ admin: {
1478
+ name: "Admin",
1479
+ value: staticRolesByName.admin,
1480
+ description: "Full access",
1481
+ permissions: [],
1482
+ uiPermissions: __spreadProps(__spreadValues({}, emptyUiPermissions), {
1483
+ auditlog: uiPermissionsByArea.auditlog.uiPermissions.map(permissionMapper),
1484
+ userManagement: uiPermissionsByArea.userManagement.uiPermissions.map(permissionMapper),
1485
+ tenantManagement: uiPermissionsByArea.tenantManagement.uiPermissions.map(permissionMapper)
1486
+ })
1487
+ },
1488
+ readOnly: {
1489
+ name: "Read access",
1490
+ value: staticRolesByName.admin,
1491
+ description: "This role can see all linked organizations but cannot make any changes",
1492
+ permissions: [],
1493
+ uiPermissions: __spreadProps(__spreadValues({}, emptyUiPermissions), {
1494
+ auditlog: [uiPermissionsById.read.value],
1495
+ userManagement: [uiPermissionsById.read.value],
1496
+ tenantManagement: [uiPermissionsById.read.value]
1497
+ })
1498
+ }
1499
+ };
1448
1500
  var defaultPermissionSets = {
1449
1501
  [permissionSetIds.Basic]: {
1450
1502
  name: permissionSetIds.Basic,
@@ -1475,6 +1527,18 @@ var defaultPermissionSets = {
1475
1527
  releases: { [ALL_RELEASES]: [uiPermissionsById.read.value] }
1476
1528
  }
1477
1529
  },
1530
+ [permissionSetIds.ReadTenants]: {
1531
+ name: permissionSetIds.ReadTenants,
1532
+ result: {
1533
+ tenantManagement: [uiPermissionsById.read.value]
1534
+ }
1535
+ },
1536
+ [permissionSetIds.ManageTenants]: {
1537
+ name: permissionSetIds.ManageTenants,
1538
+ result: {
1539
+ tenantManagement: [uiPermissionsById.manage.value]
1540
+ }
1541
+ },
1478
1542
  [permissionSetIds.ReadUsers]: {
1479
1543
  name: permissionSetIds.ReadUsers,
1480
1544
  result: {
@@ -1811,7 +1875,7 @@ var getExternalIntegrations = (state) => state.organization.externalDeviceIntegr
1811
1875
  var getAuditlogState = (state) => state.organization.auditlog.selectionState;
1812
1876
  var getAuditLog = (state) => state.organization.auditlog.events;
1813
1877
  var getAuditLogSelectionState = (state) => state.organization.auditlog.selectionState;
1814
- var getTenantsList = (state) => state.organization.organization.tenantList;
1878
+ var getTenantsList = (state) => state.organization.tenantList;
1815
1879
  var getWebhookEvents = (state) => state.organization.webhooks.events;
1816
1880
  var getWebhookEventTotal = (state) => state.organization.webhooks.eventTotal;
1817
1881
  var getDeviceTwinIntegrations = (0, import_toolkit4.createSelector)(
@@ -2220,6 +2284,22 @@ var getAuditlogDevice = (0, import_toolkit7.createSelector)([getAuditLogEntry, g
2220
2284
  }
2221
2285
  return __spreadValues(__spreadValues({}, auditlogDevice), devicesById[auditlogDevice.id]);
2222
2286
  });
2287
+ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
2288
+ if (service_provider) {
2289
+ return roles.reduce((accu, role) => {
2290
+ if (rolesById[role.id]) {
2291
+ return accu;
2292
+ }
2293
+ accu.push(role);
2294
+ return accu;
2295
+ }, Object.values(serviceProviderRolesById));
2296
+ }
2297
+ return Object.keys(rolesById).reverse().reduce((accu, key) => {
2298
+ const index = accu.findIndex(({ id }) => id === key);
2299
+ accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
2300
+ return accu;
2301
+ }, roles);
2302
+ });
2223
2303
 
2224
2304
  // src/appSlice/thunks.ts
2225
2305
  var import_helpers5 = require("@northern.tech/utils/helpers");
@@ -2832,16 +2912,16 @@ var initialState6 = {
2832
2912
  brand: ""
2833
2913
  },
2834
2914
  intentId: null,
2915
+ tenantList: __spreadProps(__spreadValues({}, TENANT_LIST_DEFAULT), {
2916
+ total: 0,
2917
+ tenants: [],
2918
+ selectedTenant: null,
2919
+ sort: {
2920
+ direction: SORTING_OPTIONS.desc,
2921
+ key: "name"
2922
+ }
2923
+ }),
2835
2924
  organization: {
2836
- tenantList: __spreadProps(__spreadValues({}, TENANT_LIST_DEFAULT), {
2837
- total: 0,
2838
- tenants: [],
2839
- selectedTenant: null,
2840
- sort: {
2841
- direction: SORTING_OPTIONS.desc,
2842
- key: "name"
2843
- }
2844
- })
2845
2925
  // id, name, status, tenant_token, plan
2846
2926
  },
2847
2927
  auditlog: {
@@ -2887,12 +2967,10 @@ var organizationSlice = (0, import_toolkit14.createSlice)({
2887
2967
  state.intentId = action.payload;
2888
2968
  },
2889
2969
  setOrganization: (state, action) => {
2890
- state.organization = __spreadProps(__spreadValues(__spreadValues({}, state.organization), action.payload), {
2891
- tenantList: __spreadValues(__spreadValues({}, state.organization.tenantList), action.payload.tenantList)
2892
- });
2970
+ state.organization = __spreadValues(__spreadValues({}, state.organization), action.payload);
2893
2971
  },
2894
2972
  setTenantListState: (state, action) => {
2895
- state.organization.tenantList = action.payload;
2973
+ state.tenantList = action.payload;
2896
2974
  },
2897
2975
  receiveExternalDeviceIntegrations: (state, action) => {
2898
2976
  state.externalDeviceIntegrations = action.payload;
@@ -4713,7 +4791,7 @@ var tenantListRetrieval = (config) => __async(void 0, null, function* () {
4713
4791
  const params = new URLSearchParams({ page, per_page: perPage }).toString();
4714
4792
  const tenantList = yield general_api_default.get(`${tenantadmApiUrlv2}/tenants?${params}`);
4715
4793
  const totalCount = tenantList.headers[headerNames.total] || TENANT_LIST_DEFAULT.perPage;
4716
- return [tenantList.data, totalCount];
4794
+ return [tenantList.data, Number(totalCount)];
4717
4795
  });
4718
4796
  var getTenants = (0, import_toolkit22.createAsyncThunk)(`${sliceName6}/getTenants`, (_0, _1) => __async(void 0, [_0, _1], function* (_, { dispatch, getState }) {
4719
4797
  const currentState = getTenantsList(getState());