@northern.tech/store 0.23.0 → 0.24.1

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 (155) hide show
  1. package/dist/actions.js +10 -10
  2. package/dist/api/general-api.cjs.map +1 -1
  3. package/dist/api/general-api.js +4 -4
  4. package/dist/api/users-api.cjs.map +1 -1
  5. package/dist/api/users-api.js +5 -5
  6. package/dist/appSlice/index.js +3 -3
  7. package/dist/appSlice/mocks.js +3 -3
  8. package/dist/appSlice/thunks.cjs +37 -0
  9. package/dist/appSlice/thunks.cjs.map +1 -1
  10. package/dist/appSlice/thunks.js +26 -26
  11. package/dist/auth.cjs.map +1 -1
  12. package/dist/auth.js +3 -3
  13. package/dist/{chunk-ZGRY42BZ.js → chunk-2AGBXDGF.js} +2 -2
  14. package/dist/{chunk-XJLZK4QY.js → chunk-3IXBQAMO.js} +3 -3
  15. package/dist/{chunk-YR65C62H.js → chunk-4NG7EGAG.js} +2 -2
  16. package/dist/{chunk-IRQRV552.js → chunk-6NLGT2LD.js} +3 -3
  17. package/dist/{chunk-WWED74SG.js → chunk-AERWBWRM.js} +3 -1
  18. package/dist/{chunk-WWED74SG.js.map → chunk-AERWBWRM.js.map} +1 -1
  19. package/dist/{chunk-WR6RQKF5.js → chunk-CXRORJR5.js} +2 -2
  20. package/dist/{chunk-SVSHXLCN.js → chunk-DOT4GDYO.js} +14 -14
  21. package/dist/{chunk-PL6RIFD5.js → chunk-E2X525PA.js} +2 -2
  22. package/dist/{chunk-AROYP5V5.js → chunk-E7PTHNNO.js} +18 -18
  23. package/dist/{chunk-FQ6CCYUU.js → chunk-EZRW3IQG.js} +17 -17
  24. package/dist/{chunk-OLKM53RL.js → chunk-F2ADELYA.js} +2 -2
  25. package/dist/{chunk-VODRLEDP.js → chunk-GLIQTGWN.js} +2 -2
  26. package/dist/{chunk-4ZYLGBJU.js → chunk-IDKMS5RA.js} +3 -3
  27. package/dist/{chunk-TIL2S3JA.js → chunk-IJ6KKUA2.js} +2 -2
  28. package/dist/{chunk-DYUOBPAI.js → chunk-JKLFEHCF.js} +2 -2
  29. package/dist/{chunk-TRKA7XYU.js → chunk-NRHTBY6E.js} +2 -2
  30. package/dist/{chunk-PVCHKW35.js → chunk-NYDBCHD7.js} +2 -2
  31. package/dist/{chunk-DDY7IFSE.js → chunk-PKPTJ6XM.js} +10 -10
  32. package/dist/{chunk-7WIISD2N.js → chunk-S7XYEGLR.js} +10 -3
  33. package/dist/{chunk-7WIISD2N.js.map → chunk-S7XYEGLR.js.map} +1 -1
  34. package/dist/{chunk-73JXR6WS.js → chunk-T2BICNAM.js} +9 -9
  35. package/dist/{chunk-UVTLZV34.js → chunk-WKXBJVZ7.js} +2 -2
  36. package/dist/{chunk-ML5CUAQD.js → chunk-X4TGUR22.js} +2 -2
  37. package/dist/{chunk-ZZQJWNQT.js → chunk-X6AM6P6X.js} +43 -4
  38. package/dist/chunk-X6AM6P6X.js.map +1 -0
  39. package/dist/{chunk-Y54UJUE4.js → chunk-XAAJ4NVG.js} +42 -39
  40. package/dist/chunk-XAAJ4NVG.js.map +1 -0
  41. package/dist/commonConstants.cjs +3 -0
  42. package/dist/commonConstants.cjs.map +1 -1
  43. package/dist/commonConstants.d.cts +2 -1
  44. package/dist/commonConstants.d.ts +2 -1
  45. package/dist/commonConstants.js +4 -2
  46. package/dist/commonSelectors.cjs +37 -0
  47. package/dist/commonSelectors.cjs.map +1 -1
  48. package/dist/commonSelectors.js +10 -10
  49. package/dist/constants.cjs +3 -0
  50. package/dist/constants.cjs.map +1 -1
  51. package/dist/constants.d.cts +1 -1
  52. package/dist/constants.d.ts +1 -1
  53. package/dist/constants.js +4 -2
  54. package/dist/deploymentsSlice/constants.js +2 -2
  55. package/dist/deploymentsSlice/index.js +3 -3
  56. package/dist/deploymentsSlice/mocks.js +3 -3
  57. package/dist/deploymentsSlice/selectors.js +3 -3
  58. package/dist/deploymentsSlice/thunks.cjs +37 -0
  59. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  60. package/dist/deploymentsSlice/thunks.js +26 -26
  61. package/dist/devicesSlice/constants.js +2 -2
  62. package/dist/devicesSlice/index.js +3 -3
  63. package/dist/devicesSlice/mocks.js +3 -3
  64. package/dist/devicesSlice/selectors.cjs.map +1 -1
  65. package/dist/devicesSlice/selectors.js +3 -3
  66. package/dist/devicesSlice/thunks.cjs +37 -0
  67. package/dist/devicesSlice/thunks.cjs.map +1 -1
  68. package/dist/devicesSlice/thunks.js +26 -26
  69. package/dist/liststatehook.cjs.map +1 -1
  70. package/dist/liststatehook.js +3 -3
  71. package/dist/locationutils.cjs.map +1 -1
  72. package/dist/locationutils.js +3 -3
  73. package/dist/monitorSlice/index.js +3 -3
  74. package/dist/monitorSlice/mocks.js +3 -3
  75. package/dist/monitorSlice/thunks.cjs +37 -0
  76. package/dist/monitorSlice/thunks.cjs.map +1 -1
  77. package/dist/monitorSlice/thunks.js +22 -22
  78. package/dist/onboardingSlice/thunks.cjs +37 -0
  79. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  80. package/dist/onboardingSlice/thunks.js +26 -26
  81. package/dist/organizationSlice/constants.js +2 -2
  82. package/dist/organizationSlice/index.js +3 -3
  83. package/dist/organizationSlice/mocks.js +3 -3
  84. package/dist/organizationSlice/selectors.cjs +42 -0
  85. package/dist/organizationSlice/selectors.cjs.map +1 -1
  86. package/dist/organizationSlice/selectors.d.cts +287 -3
  87. package/dist/organizationSlice/selectors.d.ts +287 -3
  88. package/dist/organizationSlice/selectors.js +9 -3
  89. package/dist/organizationSlice/thunks.cjs +53 -10
  90. package/dist/organizationSlice/thunks.cjs.map +1 -1
  91. package/dist/organizationSlice/thunks.d.cts +8 -8
  92. package/dist/organizationSlice/thunks.d.ts +8 -8
  93. package/dist/organizationSlice/thunks.js +28 -28
  94. package/dist/releasesSlice/index.js +3 -3
  95. package/dist/releasesSlice/mocks.js +3 -3
  96. package/dist/releasesSlice/selectors.cjs.map +1 -1
  97. package/dist/releasesSlice/selectors.js +4 -4
  98. package/dist/releasesSlice/thunks.cjs +37 -0
  99. package/dist/releasesSlice/thunks.cjs.map +1 -1
  100. package/dist/releasesSlice/thunks.js +23 -23
  101. package/dist/selectors.cjs +42 -0
  102. package/dist/selectors.cjs.map +1 -1
  103. package/dist/selectors.d.cts +1 -1
  104. package/dist/selectors.d.ts +1 -1
  105. package/dist/selectors.js +57 -51
  106. package/dist/sockethook.cjs.map +1 -1
  107. package/dist/sockethook.js +2 -2
  108. package/dist/store.js +12 -12
  109. package/dist/storehooks.cjs +51 -8
  110. package/dist/storehooks.cjs.map +1 -1
  111. package/dist/storehooks.js +28 -28
  112. package/dist/thunks.cjs +53 -10
  113. package/dist/thunks.cjs.map +1 -1
  114. package/dist/thunks.d.cts +1 -1
  115. package/dist/thunks.d.ts +1 -1
  116. package/dist/thunks.js +34 -34
  117. package/dist/useDeploymentDevice.cjs +37 -0
  118. package/dist/useDeploymentDevice.cjs.map +1 -1
  119. package/dist/useDeploymentDevice.js +26 -26
  120. package/dist/usersSlice/constants.js +2 -2
  121. package/dist/usersSlice/index.js +3 -3
  122. package/dist/usersSlice/mocks.js +3 -3
  123. package/dist/usersSlice/selectors.cjs.map +1 -1
  124. package/dist/usersSlice/selectors.js +4 -4
  125. package/dist/usersSlice/thunks.cjs +37 -0
  126. package/dist/usersSlice/thunks.cjs.map +1 -1
  127. package/dist/usersSlice/thunks.js +26 -26
  128. package/dist/utils.cjs +8 -0
  129. package/dist/utils.cjs.map +1 -1
  130. package/dist/utils.d.cts +2 -1
  131. package/dist/utils.d.ts +2 -1
  132. package/dist/utils.js +5 -3
  133. package/package.json +1 -1
  134. package/dist/chunk-Y54UJUE4.js.map +0 -1
  135. package/dist/chunk-ZZQJWNQT.js.map +0 -1
  136. /package/dist/{chunk-ZGRY42BZ.js.map → chunk-2AGBXDGF.js.map} +0 -0
  137. /package/dist/{chunk-XJLZK4QY.js.map → chunk-3IXBQAMO.js.map} +0 -0
  138. /package/dist/{chunk-YR65C62H.js.map → chunk-4NG7EGAG.js.map} +0 -0
  139. /package/dist/{chunk-IRQRV552.js.map → chunk-6NLGT2LD.js.map} +0 -0
  140. /package/dist/{chunk-WR6RQKF5.js.map → chunk-CXRORJR5.js.map} +0 -0
  141. /package/dist/{chunk-SVSHXLCN.js.map → chunk-DOT4GDYO.js.map} +0 -0
  142. /package/dist/{chunk-PL6RIFD5.js.map → chunk-E2X525PA.js.map} +0 -0
  143. /package/dist/{chunk-AROYP5V5.js.map → chunk-E7PTHNNO.js.map} +0 -0
  144. /package/dist/{chunk-FQ6CCYUU.js.map → chunk-EZRW3IQG.js.map} +0 -0
  145. /package/dist/{chunk-OLKM53RL.js.map → chunk-F2ADELYA.js.map} +0 -0
  146. /package/dist/{chunk-VODRLEDP.js.map → chunk-GLIQTGWN.js.map} +0 -0
  147. /package/dist/{chunk-4ZYLGBJU.js.map → chunk-IDKMS5RA.js.map} +0 -0
  148. /package/dist/{chunk-TIL2S3JA.js.map → chunk-IJ6KKUA2.js.map} +0 -0
  149. /package/dist/{chunk-DYUOBPAI.js.map → chunk-JKLFEHCF.js.map} +0 -0
  150. /package/dist/{chunk-TRKA7XYU.js.map → chunk-NRHTBY6E.js.map} +0 -0
  151. /package/dist/{chunk-PVCHKW35.js.map → chunk-NYDBCHD7.js.map} +0 -0
  152. /package/dist/{chunk-DDY7IFSE.js.map → chunk-PKPTJ6XM.js.map} +0 -0
  153. /package/dist/{chunk-73JXR6WS.js.map → chunk-T2BICNAM.js.map} +0 -0
  154. /package/dist/{chunk-UVTLZV34.js.map → chunk-WKXBJVZ7.js.map} +0 -0
  155. /package/dist/{chunk-ML5CUAQD.js.map → chunk-X4TGUR22.js.map} +0 -0
@@ -1,39 +1,39 @@
1
1
  import {
2
2
  actions_default
3
- } from "./chunk-SVSHXLCN.js";
4
- import {
5
- releasesSlice_default
6
- } from "./chunk-TRKA7XYU.js";
3
+ } from "./chunk-DOT4GDYO.js";
7
4
  import {
8
5
  actions as actions2,
9
6
  usersSlice_default
10
- } from "./chunk-YR65C62H.js";
7
+ } from "./chunk-4NG7EGAG.js";
8
+ import {
9
+ releasesSlice_default
10
+ } from "./chunk-NRHTBY6E.js";
11
11
  import {
12
12
  actions,
13
13
  organizationSlice_default
14
- } from "./chunk-TIL2S3JA.js";
15
- import {
16
- monitorSlice_default
17
- } from "./chunk-PVCHKW35.js";
14
+ } from "./chunk-IJ6KKUA2.js";
18
15
  import {
19
16
  onboardingSlice_default
20
17
  } from "./chunk-CQXDAXQF.js";
21
18
  import {
22
- deploymentsSlice_default
23
- } from "./chunk-OLKM53RL.js";
19
+ monitorSlice_default
20
+ } from "./chunk-NYDBCHD7.js";
21
+ import {
22
+ devicesSlice_default
23
+ } from "./chunk-GLIQTGWN.js";
24
24
  import {
25
25
  appSlice_default
26
- } from "./chunk-DYUOBPAI.js";
26
+ } from "./chunk-JKLFEHCF.js";
27
27
  import {
28
- devicesSlice_default
29
- } from "./chunk-VODRLEDP.js";
28
+ deploymentsSlice_default
29
+ } from "./chunk-F2ADELYA.js";
30
30
  import {
31
31
  getToken
32
- } from "./chunk-UVTLZV34.js";
32
+ } from "./chunk-WKXBJVZ7.js";
33
33
  import {
34
34
  USER_LOGOUT,
35
35
  settingsKeys
36
- } from "./chunk-WWED74SG.js";
36
+ } from "./chunk-AERWBWRM.js";
37
37
 
38
38
  // src/store.ts
39
39
  import { useDispatch } from "react-redux";
@@ -139,4 +139,4 @@ export {
139
139
  useAppDispatch,
140
140
  createAppAsyncThunk
141
141
  };
142
- //# sourceMappingURL=chunk-FQ6CCYUU.js.map
142
+ //# sourceMappingURL=chunk-EZRW3IQG.js.map
@@ -5,7 +5,7 @@ import {
5
5
  DEVICE_LIST_DEFAULTS,
6
6
  deploymentPrototype,
7
7
  limitDefault
8
- } from "./chunk-WWED74SG.js";
8
+ } from "./chunk-AERWBWRM.js";
9
9
 
10
10
  // src/deploymentsSlice/index.ts
11
11
  import { createSlice } from "@reduxjs/toolkit";
@@ -140,4 +140,4 @@ export {
140
140
  actions,
141
141
  deploymentsSlice_default
142
142
  };
143
- //# sourceMappingURL=chunk-OLKM53RL.js.map
143
+ //# sourceMappingURL=chunk-F2ADELYA.js.map
@@ -2,7 +2,7 @@ import {
2
2
  DEVICE_LIST_DEFAULTS,
3
3
  DEVICE_STATES,
4
4
  SORTING_OPTIONS
5
- } from "./chunk-WWED74SG.js";
5
+ } from "./chunk-AERWBWRM.js";
6
6
 
7
7
  // src/devicesSlice/index.ts
8
8
  import { deepCompare, duplicateFilter } from "@northern.tech/utils/helpers";
@@ -201,4 +201,4 @@ export {
201
201
  actions,
202
202
  devicesSlice_default
203
203
  };
204
- //# sourceMappingURL=chunk-VODRLEDP.js.map
204
+ //# sourceMappingURL=chunk-GLIQTGWN.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  isDarkMode
3
- } from "./chunk-7WIISD2N.js";
3
+ } from "./chunk-S7XYEGLR.js";
4
4
  import {
5
5
  DEVICE_ONLINE_CUTOFF,
6
6
  READ_STATES,
7
7
  defaultIdAttribute,
8
8
  twoFAStates
9
- } from "./chunk-WWED74SG.js";
9
+ } from "./chunk-AERWBWRM.js";
10
10
 
11
11
  // src/usersSlice/selectors.ts
12
12
  import { createSelector } from "@reduxjs/toolkit";
@@ -79,4 +79,4 @@ export {
79
79
  getRolesInitialized,
80
80
  getSecurityAlertDismissedTimestamp
81
81
  };
82
- //# sourceMappingURL=chunk-4ZYLGBJU.js.map
82
+ //# sourceMappingURL=chunk-IDKMS5RA.js.map
@@ -2,7 +2,7 @@ import {
2
2
  DEVICE_LIST_DEFAULTS,
3
3
  SORTING_OPTIONS,
4
4
  TENANT_LIST_DEFAULT
5
- } from "./chunk-WWED74SG.js";
5
+ } from "./chunk-AERWBWRM.js";
6
6
 
7
7
  // src/organizationSlice/index.ts
8
8
  import { createSlice } from "@reduxjs/toolkit";
@@ -112,4 +112,4 @@ export {
112
112
  actions,
113
113
  organizationSlice_default
114
114
  };
115
- //# sourceMappingURL=chunk-TIL2S3JA.js.map
115
+ //# sourceMappingURL=chunk-IJ6KKUA2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SORTING_OPTIONS
3
- } from "./chunk-WWED74SG.js";
3
+ } from "./chunk-AERWBWRM.js";
4
4
 
5
5
  // src/appSlice/index.ts
6
6
  import { createSlice } from "@reduxjs/toolkit";
@@ -154,4 +154,4 @@ export {
154
154
  actions,
155
155
  appSlice_default
156
156
  };
157
- //# sourceMappingURL=chunk-DYUOBPAI.js.map
157
+ //# sourceMappingURL=chunk-JKLFEHCF.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEVICE_LIST_DEFAULTS,
3
3
  SORTING_OPTIONS
4
- } from "./chunk-WWED74SG.js";
4
+ } from "./chunk-AERWBWRM.js";
5
5
 
6
6
  // src/releasesSlice/index.ts
7
7
  import { createSlice } from "@reduxjs/toolkit";
@@ -154,4 +154,4 @@ export {
154
154
  actions,
155
155
  releasesSlice_default
156
156
  };
157
- //# sourceMappingURL=chunk-TRKA7XYU.js.map
157
+ //# sourceMappingURL=chunk-NRHTBY6E.js.map
@@ -2,7 +2,7 @@ import {
2
2
  DEVICE_ISSUE_OPTIONS,
3
3
  DEVICE_LIST_DEFAULTS,
4
4
  alertChannels
5
- } from "./chunk-WWED74SG.js";
5
+ } from "./chunk-AERWBWRM.js";
6
6
 
7
7
  // src/monitorSlice/index.ts
8
8
  import { createSlice } from "@reduxjs/toolkit";
@@ -58,4 +58,4 @@ export {
58
58
  actions,
59
59
  monitorSlice_default
60
60
  };
61
- //# sourceMappingURL=chunk-PVCHKW35.js.map
61
+ //# sourceMappingURL=chunk-NYDBCHD7.js.map
@@ -2,30 +2,30 @@ import {
2
2
  commonErrorFallback,
3
3
  commonErrorHandler,
4
4
  createAppAsyncThunk
5
- } from "./chunk-FQ6CCYUU.js";
5
+ } from "./chunk-EZRW3IQG.js";
6
6
  import {
7
7
  general_api_default
8
- } from "./chunk-IRQRV552.js";
8
+ } from "./chunk-6NLGT2LD.js";
9
9
  import {
10
10
  actions_default
11
- } from "./chunk-SVSHXLCN.js";
11
+ } from "./chunk-DOT4GDYO.js";
12
12
  import {
13
13
  actions,
14
14
  sliceName
15
- } from "./chunk-TRKA7XYU.js";
15
+ } from "./chunk-NRHTBY6E.js";
16
16
  import {
17
17
  formatReleases
18
- } from "./chunk-ML5CUAQD.js";
18
+ } from "./chunk-X4TGUR22.js";
19
19
  import {
20
20
  getSearchEndpoint
21
- } from "./chunk-AROYP5V5.js";
21
+ } from "./chunk-E7PTHNNO.js";
22
22
  import {
23
23
  getReleasesById
24
- } from "./chunk-PL6RIFD5.js";
24
+ } from "./chunk-E2X525PA.js";
25
25
  import {
26
26
  convertDeviceListStateToFilters,
27
27
  progress
28
- } from "./chunk-7WIISD2N.js";
28
+ } from "./chunk-S7XYEGLR.js";
29
29
  import {
30
30
  DEVICE_LIST_DEFAULTS,
31
31
  SORTING_OPTIONS,
@@ -34,7 +34,7 @@ import {
34
34
  deploymentsApiUrlV2,
35
35
  emptyFilter,
36
36
  headerNames
37
- } from "./chunk-WWED74SG.js";
37
+ } from "./chunk-AERWBWRM.js";
38
38
  import {
39
39
  ARTIFACT_GENERATION_TYPE
40
40
  } from "./chunk-2DYA3X77.js";
@@ -442,4 +442,4 @@ export {
442
442
  getDeltaGenerationJobs,
443
443
  getDeltaGenerationJobDetails
444
444
  };
445
- //# sourceMappingURL=chunk-DDY7IFSE.js.map
445
+ //# sourceMappingURL=chunk-PKPTJ6XM.js.map
@@ -10,7 +10,7 @@ import {
10
10
  deploymentStatesToSubstatesWithSkipped,
11
11
  emptyFilter,
12
12
  emptyUiPermissions
13
- } from "./chunk-WWED74SG.js";
13
+ } from "./chunk-AERWBWRM.js";
14
14
  import {
15
15
  softwareIndicator
16
16
  } from "./chunk-2DYA3X77.js";
@@ -213,6 +213,12 @@ var parseSubscriptionPreview = (lines) => lines.reduce((acc, { addon, amount, pr
213
213
  }
214
214
  return acc;
215
215
  }, {});
216
+ var convertToBackendSPLimits = (limits, spLimits) => Object.fromEntries(
217
+ Object.entries(limits).filter(([key]) => !!spLimits[key]).map(([key, limit]) => {
218
+ const { backendId } = spLimits[key];
219
+ return [backendId, { Name: backendId, value: Number(limit) || 0 }];
220
+ })
221
+ );
216
222
 
217
223
  export {
218
224
  mapFiltersToTerms,
@@ -234,6 +240,7 @@ export {
234
240
  generateDeploymentGroupDetails,
235
241
  mapDeviceAttributes,
236
242
  isDarkMode,
237
- parseSubscriptionPreview
243
+ parseSubscriptionPreview,
244
+ convertToBackendSPLimits
238
245
  };
239
- //# sourceMappingURL=chunk-7WIISD2N.js.map
246
+ //# sourceMappingURL=chunk-S7XYEGLR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.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 type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n"],"mappings":"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","names":["filter"]}
1
+ {"version":3,"sources":["../src/utils.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 type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (limits, spLimits) =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const { backendId } = spLimits[key];\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n"],"mappings":"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","names":["filter"]}
@@ -2,33 +2,33 @@ import {
2
2
  commonErrorFallback,
3
3
  commonErrorHandler,
4
4
  createAppAsyncThunk
5
- } from "./chunk-FQ6CCYUU.js";
5
+ } from "./chunk-EZRW3IQG.js";
6
6
  import {
7
7
  general_api_default
8
- } from "./chunk-IRQRV552.js";
8
+ } from "./chunk-6NLGT2LD.js";
9
9
  import {
10
10
  actions_default
11
- } from "./chunk-SVSHXLCN.js";
11
+ } from "./chunk-DOT4GDYO.js";
12
12
  import {
13
13
  actions,
14
14
  sliceName
15
- } from "./chunk-PVCHKW35.js";
15
+ } from "./chunk-NYDBCHD7.js";
16
16
  import {
17
17
  getSearchEndpoint
18
- } from "./chunk-AROYP5V5.js";
18
+ } from "./chunk-E7PTHNNO.js";
19
19
  import {
20
20
  getDeviceFilters
21
- } from "./chunk-ZGRY42BZ.js";
21
+ } from "./chunk-2AGBXDGF.js";
22
22
  import {
23
23
  convertDeviceListStateToFilters
24
- } from "./chunk-7WIISD2N.js";
24
+ } from "./chunk-S7XYEGLR.js";
25
25
  import {
26
26
  DEVICE_LIST_DEFAULTS,
27
27
  TIMEOUTS,
28
28
  alertChannels,
29
29
  headerNames,
30
30
  monitorApiUrlv1
31
- } from "./chunk-WWED74SG.js";
31
+ } from "./chunk-AERWBWRM.js";
32
32
 
33
33
  // src/monitorSlice/thunks.ts
34
34
  var { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;
@@ -107,4 +107,4 @@ export {
107
107
  getDeviceMonitorConfig,
108
108
  changeNotificationSetting
109
109
  };
110
- //# sourceMappingURL=chunk-73JXR6WS.js.map
110
+ //# sourceMappingURL=chunk-T2BICNAM.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TIMEOUTS,
3
3
  maxSessionAge
4
- } from "./chunk-WWED74SG.js";
4
+ } from "./chunk-AERWBWRM.js";
5
5
 
6
6
  // src/auth.ts
7
7
  import Cookies from "universal-cookie";
@@ -65,4 +65,4 @@ export {
65
65
  cleanUp,
66
66
  updateMaxAge
67
67
  };
68
- //# sourceMappingURL=chunk-UVTLZV34.js.map
68
+ //# sourceMappingURL=chunk-WKXBJVZ7.js.map
@@ -9,7 +9,7 @@ import {
9
9
  DEVICE_LIST_DEFAULTS,
10
10
  UNGROUPED_GROUP,
11
11
  emptyFilter
12
- } from "./chunk-WWED74SG.js";
12
+ } from "./chunk-AERWBWRM.js";
13
13
 
14
14
  // src/locationutils.ts
15
15
  import { deepCompare, getISOStringBoundaries } from "@northern.tech/utils/helpers";
@@ -393,4 +393,4 @@ export {
393
393
  parseTenantsQuery,
394
394
  formatTenants
395
395
  };
396
- //# sourceMappingURL=chunk-ML5CUAQD.js.map
396
+ //# sourceMappingURL=chunk-X4TGUR22.js.map
@@ -1,6 +1,7 @@
1
1
  import {
2
- EXTERNAL_PROVIDER
3
- } from "./chunk-WWED74SG.js";
2
+ EXTERNAL_PROVIDER,
3
+ productOrder
4
+ } from "./chunk-AERWBWRM.js";
4
5
 
5
6
  // src/organizationSlice/selectors.ts
6
7
  import { createSelector } from "@reduxjs/toolkit";
@@ -37,6 +38,41 @@ var getAuditLogEntry = createSelector([getAuditLog, getAuditLogSelectionState],
37
38
  const [eventAction, eventTime] = atob(selectedId).split("|");
38
39
  return events.find((item) => item.action === eventAction && item.time === eventTime);
39
40
  });
41
+ var toTierName = (key) => key.replace(/max_|_?devices/g, "") || "standard";
42
+ var processDeviceLimits = (deviceLimits, skipFilter = false) => {
43
+ const result = { limits: {}, disabled: [] };
44
+ if (!deviceLimits) return result;
45
+ const tiersByName = Object.fromEntries(Object.entries(deviceLimits).map(([key, limit]) => [toTierName(key), { key, limit }]));
46
+ return productOrder.reduce((accu, tierName) => {
47
+ const entry = tiersByName[tierName];
48
+ if (!entry) return accu;
49
+ const { key, limit } = entry;
50
+ if (limit.value === 0) {
51
+ accu.disabled.push(tierName);
52
+ if (!skipFilter) return accu;
53
+ }
54
+ accu.limits[tierName] = {
55
+ id: tierName,
56
+ backendId: key,
57
+ limit: limit.value,
58
+ current: limit.current_value,
59
+ name: tierName,
60
+ quotaLeft: Math.max(limit.value - limit.current_value, 0),
61
+ limitReached: limit.value !== -1 && limit.value <= limit.current_value
62
+ };
63
+ return accu;
64
+ }, result);
65
+ };
66
+ var getDeviceLimitsInfo = createSelector([getOrganization], ({ device_limits }) => processDeviceLimits(device_limits));
67
+ var getDisabledTiers = createSelector([getDeviceLimitsInfo], ({ disabled }) => disabled);
68
+ var getSpLimits = createSelector([getDeviceLimitsInfo], ({ limits }) => limits);
69
+ var getTenantListWithLimits = createSelector([getTenantsList], (tenantList) => ({
70
+ ...tenantList,
71
+ tenants: tenantList.tenants.map((tenant) => ({
72
+ ...tenant,
73
+ device_limits: processDeviceLimits(tenant.device_limits, true).limits
74
+ }))
75
+ }));
40
76
 
41
77
  export {
42
78
  getOrganization,
@@ -56,6 +92,9 @@ export {
56
92
  getIsServiceProvider,
57
93
  getWebhooks,
58
94
  getWebhookEventInfo,
59
- getAuditLogEntry
95
+ getAuditLogEntry,
96
+ getDisabledTiers,
97
+ getSpLimits,
98
+ getTenantListWithLimits
60
99
  };
61
- //# sourceMappingURL=chunk-ZZQJWNQT.js.map
100
+ //# sourceMappingURL=chunk-X6AM6P6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/organizationSlice/selectors.ts"],"sourcesContent":["// Copyright 2023 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.\nimport type { Tenant } from '@northern.tech/types/MenderTypes';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { EXTERNAL_PROVIDER, productOrder } from '../constants';\nimport type { RootState } from '../store';\n\nexport const getOrganization = (state: RootState) => state.organization.organization;\nexport const getProducts = (state: RootState) => state.organization.products;\nexport const getExternalIntegrations = (state: RootState) => state.organization.externalDeviceIntegrations;\nexport const getAuditlogState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getAuditLog = (state: RootState) => state.organization.auditlog.events;\nexport const getAuditLogSelectionState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getBillingProfile = (state: RootState) => state.organization.organization.billing_profile;\nexport const getSubscription = (state: RootState) => state.organization.organization.subscription;\nexport const getCard = (state: RootState) => state.organization.card;\nexport const getSsoConfig = ({ organization: { ssoConfigs = [] } }: RootState) => ssoConfigs[0];\nexport const getTenantsList = (state: RootState) => state.organization.tenantList;\nexport const getWebhookEvents = (state: RootState) => state.organization.webhooks.events;\nexport const getWebhookEventTotal = (state: RootState) => state.organization.webhooks.eventsTotal;\n\nexport const getDeviceTwinIntegrations = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && EXTERNAL_PROVIDER[integration.provider]?.deviceTwin)\n);\nexport const getIsServiceProvider = (state: RootState) => state.organization.organization.service_provider;\n\nexport const getWebhooks = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && integration.provider === EXTERNAL_PROVIDER.webhook.provider)\n);\nexport const getWebhookEventInfo = createSelector([getWebhooks, getWebhookEvents, getWebhookEventTotal], (webhooks, events, eventTotal) =>\n webhooks.length ? { events, eventTotal } : { events: [], eventTotal: 0 }\n);\n\nexport const getAuditLogEntry = createSelector([getAuditLog, getAuditLogSelectionState], (events, { selectedId }) => {\n if (!selectedId) {\n return;\n }\n const [eventAction, eventTime] = atob(selectedId).split('|');\n return events.find(item => item.action === eventAction && item.time === eventTime);\n});\n\nconst toTierName = (key: string) => key.replace(/max_|_?devices/g, '') || 'standard';\nconst processDeviceLimits = (deviceLimits: Tenant['device_limits'], skipFilter = false) => {\n const result: { disabled: string[]; limits: Record<string, object> } = { limits: {}, disabled: [] };\n if (!deviceLimits) return result;\n const tiersByName = Object.fromEntries(Object.entries(deviceLimits).map(([key, limit]) => [toTierName(key), { key, limit }]));\n return productOrder.reduce((accu, tierName) => {\n const entry = tiersByName[tierName];\n if (!entry) return accu;\n const { key, limit } = entry;\n if (limit.value === 0) {\n accu.disabled.push(tierName);\n if (!skipFilter) return accu;\n }\n accu.limits[tierName] = {\n id: tierName,\n backendId: key,\n limit: limit.value,\n current: limit.current_value,\n name: tierName,\n quotaLeft: Math.max(limit.value - limit.current_value, 0),\n limitReached: limit.value !== -1 && limit.value <= limit.current_value\n };\n return accu;\n }, result);\n};\nconst getDeviceLimitsInfo = createSelector([getOrganization], ({ device_limits }) => processDeviceLimits(device_limits));\nexport const getDisabledTiers = createSelector([getDeviceLimitsInfo], ({ disabled }) => disabled);\nexport const getSpLimits = createSelector([getDeviceLimitsInfo], ({ limits }) => limits);\nexport const getTenantListWithLimits = createSelector([getTenantsList], tenantList => ({\n ...tenantList,\n tenants: tenantList.tenants.map(tenant => ({\n ...tenant,\n device_limits: processDeviceLimits(tenant.device_limits, true).limits\n }))\n}));\n"],"mappings":"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","names":[]}