@northern.tech/store 0.41.1 → 0.41.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/actions.d.cts +6 -6
  2. package/dist/actions.d.ts +6 -6
  3. package/dist/api/general-api.cjs +1 -1
  4. package/dist/api/general-api.js +1 -1
  5. package/dist/appSlice/index.d.cts +1 -1
  6. package/dist/appSlice/index.d.ts +1 -1
  7. package/dist/appSlice/index.js +1 -1
  8. package/dist/appSlice/mocks.d.cts +1 -1
  9. package/dist/appSlice/mocks.d.ts +1 -1
  10. package/dist/appSlice/selectors.d.cts +7 -7
  11. package/dist/appSlice/selectors.d.ts +7 -7
  12. package/dist/appSlice/thunks.d.cts +2 -2
  13. package/dist/appSlice/thunks.d.ts +2 -2
  14. package/dist/auth.cjs +1 -1
  15. package/dist/auth.d.cts +1 -1
  16. package/dist/auth.d.ts +1 -1
  17. package/dist/auth.js +1 -1
  18. package/dist/commonConstants.cjs +3 -1
  19. package/dist/commonConstants.d.cts +2 -2
  20. package/dist/commonConstants.d.ts +2 -2
  21. package/dist/commonConstants.js +2 -2
  22. package/dist/commonSelectors.cjs +18 -12
  23. package/dist/commonSelectors.cjs.map +1 -1
  24. package/dist/commonSelectors.d.cts +13 -13
  25. package/dist/commonSelectors.d.ts +13 -13
  26. package/dist/commonSelectors.js +19 -13
  27. package/dist/commonSelectors.js.map +1 -1
  28. package/dist/{constants-CNZ5L0A0.cjs → constants-C_SC_VKE.cjs} +18 -1
  29. package/dist/constants-C_SC_VKE.cjs.map +1 -0
  30. package/dist/{constants-OcdoVk6f.d.ts → constants-CzjK2gV-.d.ts} +7 -2
  31. package/dist/{constants-_p6w8uEp.d.cts → constants-DAi2zOZN.d.cts} +7 -2
  32. package/dist/{constants-Cj2kp3Iy.js → constants-xpheFFkA.js} +7 -2
  33. package/dist/constants-xpheFFkA.js.map +1 -0
  34. package/dist/constants.cjs +3 -1
  35. package/dist/constants.d.cts +2 -2
  36. package/dist/constants.d.ts +2 -2
  37. package/dist/constants.js +2 -2
  38. package/dist/deploymentsSlice/constants.cjs +1 -1
  39. package/dist/deploymentsSlice/constants.js +1 -1
  40. package/dist/deploymentsSlice/index.cjs +1 -1
  41. package/dist/deploymentsSlice/index.js +1 -1
  42. package/dist/deploymentsSlice/selectors.cjs +1 -1
  43. package/dist/deploymentsSlice/selectors.d.cts +7 -7
  44. package/dist/deploymentsSlice/selectors.d.ts +7 -7
  45. package/dist/deploymentsSlice/selectors.js +1 -1
  46. package/dist/deploymentsSlice/thunks.d.cts +4 -4
  47. package/dist/deploymentsSlice/thunks.d.ts +4 -4
  48. package/dist/devicesSlice/constants.cjs +1 -1
  49. package/dist/devicesSlice/constants.d.cts +1 -1
  50. package/dist/devicesSlice/constants.d.ts +1 -1
  51. package/dist/devicesSlice/constants.js +1 -1
  52. package/dist/devicesSlice/index.d.cts +1 -1
  53. package/dist/devicesSlice/index.d.ts +1 -1
  54. package/dist/devicesSlice/index.js +1 -1
  55. package/dist/devicesSlice/mocks.js +1 -1
  56. package/dist/devicesSlice/selectors.cjs +1 -1
  57. package/dist/devicesSlice/selectors.d.cts +7 -7
  58. package/dist/devicesSlice/selectors.d.ts +7 -7
  59. package/dist/devicesSlice/selectors.js +1 -1
  60. package/dist/devicesSlice/thunks.d.cts +4 -4
  61. package/dist/devicesSlice/thunks.d.ts +4 -4
  62. package/dist/{index-Cf81vLTi.d.ts → index-BCErsO5h.d.ts} +2 -2
  63. package/dist/{index-5Q-iI4EB.d.cts → index-BQCnJ5gh.d.cts} +2 -2
  64. package/dist/{index-BqJuhvO_.d.ts → index-BtGhTFBc.d.ts} +2 -2
  65. package/dist/{index-ByfjrTdH.d.ts → index-C5oQrJGU.d.ts} +2 -2
  66. package/dist/{index-Bj3OArhr.d.cts → index-CSOj22xK.d.cts} +2 -2
  67. package/dist/{index-CSk4ENmk.d.cts → index-CgPgKMve.d.cts} +2 -2
  68. package/dist/{index-BLvjQfGj.d.ts → index-CnH51JfB.d.ts} +2 -2
  69. package/dist/{index-C8QadAm7.d.cts → index-Dn1SqQYh.d.cts} +2 -2
  70. package/dist/{index-BBsUj1a8.d.ts → index-H9zg_3UV.d.ts} +2 -2
  71. package/dist/{index-Zs9RnVoR.d.cts → index-VEayiYkv.d.cts} +2 -2
  72. package/dist/{index-DLDY7bNT.d.ts → index-m1c0qk2s.d.ts} +2 -2
  73. package/dist/{index-Doc_1P_Y.d.cts → index-vXsWdis1.d.cts} +2 -2
  74. package/dist/locationutils.cjs +1 -1
  75. package/dist/locationutils.d.cts +2 -2
  76. package/dist/locationutils.d.ts +2 -2
  77. package/dist/locationutils.js +1 -1
  78. package/dist/monitorSlice/constants.d.cts +1 -1
  79. package/dist/monitorSlice/constants.d.ts +1 -1
  80. package/dist/monitorSlice/index.d.cts +1 -1
  81. package/dist/monitorSlice/index.d.ts +1 -1
  82. package/dist/monitorSlice/index.js +1 -1
  83. package/dist/monitorSlice/mocks.d.cts +1 -1
  84. package/dist/monitorSlice/mocks.d.ts +1 -1
  85. package/dist/monitorSlice/mocks.js +1 -1
  86. package/dist/monitorSlice/selectors.d.cts +1 -1
  87. package/dist/monitorSlice/selectors.d.ts +1 -1
  88. package/dist/monitorSlice/thunks.cjs +1 -1
  89. package/dist/monitorSlice/thunks.d.cts +4 -4
  90. package/dist/monitorSlice/thunks.d.ts +4 -4
  91. package/dist/monitorSlice/thunks.js +1 -1
  92. package/dist/onboardingSlice/selectors.d.cts +1 -1
  93. package/dist/onboardingSlice/selectors.d.ts +1 -1
  94. package/dist/onboardingSlice/thunks.d.cts +2 -2
  95. package/dist/onboardingSlice/thunks.d.ts +2 -2
  96. package/dist/organizationSlice/constants.cjs +1 -1
  97. package/dist/organizationSlice/constants.js +1 -1
  98. package/dist/organizationSlice/index.cjs +1 -1
  99. package/dist/organizationSlice/index.d.cts +1 -1
  100. package/dist/organizationSlice/index.d.ts +1 -1
  101. package/dist/organizationSlice/index.js +1 -1
  102. package/dist/organizationSlice/mocks.d.cts +1 -1
  103. package/dist/organizationSlice/mocks.d.ts +1 -1
  104. package/dist/organizationSlice/mocks.js +1 -1
  105. package/dist/organizationSlice/selectors.cjs +1 -1
  106. package/dist/organizationSlice/selectors.d.cts +8 -8
  107. package/dist/organizationSlice/selectors.d.ts +8 -8
  108. package/dist/organizationSlice/selectors.js +1 -1
  109. package/dist/organizationSlice/thunks.d.cts +4 -4
  110. package/dist/organizationSlice/thunks.d.ts +4 -4
  111. package/dist/organizationSlice/types.d.cts +1 -1
  112. package/dist/organizationSlice/types.d.ts +1 -1
  113. package/dist/releasesSlice/index.d.cts +1 -1
  114. package/dist/releasesSlice/index.d.ts +1 -1
  115. package/dist/releasesSlice/index.js +1 -1
  116. package/dist/releasesSlice/mocks.js +1 -1
  117. package/dist/releasesSlice/selectors.d.cts +7 -7
  118. package/dist/releasesSlice/selectors.d.ts +7 -7
  119. package/dist/releasesSlice/thunks.cjs +1 -1
  120. package/dist/releasesSlice/thunks.d.cts +4 -4
  121. package/dist/releasesSlice/thunks.d.ts +4 -4
  122. package/dist/releasesSlice/thunks.js +1 -1
  123. package/dist/sockethook.cjs +8 -6
  124. package/dist/sockethook.cjs.map +1 -1
  125. package/dist/sockethook.js +8 -5
  126. package/dist/sockethook.js.map +1 -1
  127. package/dist/{store-B5-0USDz.d.cts → store-CGP5pCH8.d.cts} +18 -10
  128. package/dist/{store-CmiiLjxd.d.ts → store-CkgokFlk.d.ts} +18 -10
  129. package/dist/store.cjs +1 -1
  130. package/dist/store.d.cts +1 -1
  131. package/dist/store.d.ts +1 -1
  132. package/dist/store.js +1 -1
  133. package/dist/storehooks.cjs +1 -1
  134. package/dist/storehooks.d.cts +2 -2
  135. package/dist/storehooks.d.ts +2 -2
  136. package/dist/storehooks.js +1 -1
  137. package/dist/thunks.cjs +1 -1
  138. package/dist/thunks.js +1 -1
  139. package/dist/{types-BjtmX60L.d.ts → types-uHmaedGU.d.ts} +2 -2
  140. package/dist/{types-B33vKVhi.d.cts → types-yQ0ypHMZ.d.cts} +2 -2
  141. package/dist/usersSlice/constants.cjs +1 -1
  142. package/dist/usersSlice/constants.js +1 -1
  143. package/dist/usersSlice/index.cjs +1 -1
  144. package/dist/usersSlice/index.d.cts +1 -1
  145. package/dist/usersSlice/index.d.ts +1 -1
  146. package/dist/usersSlice/index.js +1 -1
  147. package/dist/usersSlice/mocks.d.cts +1 -1
  148. package/dist/usersSlice/mocks.d.ts +1 -1
  149. package/dist/usersSlice/mocks.js +1 -1
  150. package/dist/usersSlice/selectors.cjs +1 -1
  151. package/dist/usersSlice/selectors.d.cts +7 -7
  152. package/dist/usersSlice/selectors.d.ts +7 -7
  153. package/dist/usersSlice/selectors.js +1 -1
  154. package/dist/usersSlice/thunks.d.cts +4 -4
  155. package/dist/usersSlice/thunks.d.ts +4 -4
  156. package/dist/utils.cjs +9 -1
  157. package/dist/utils.cjs.map +1 -1
  158. package/dist/utils.d.cts +2 -2
  159. package/dist/utils.d.ts +2 -2
  160. package/dist/utils.js +8 -2
  161. package/dist/utils.js.map +1 -1
  162. package/package.json +2 -2
  163. package/dist/constants-CNZ5L0A0.cjs.map +0 -1
  164. package/dist/constants-Cj2kp3Iy.js.map +0 -1
package/dist/store.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as commonErrorHandler, c as sessionReducer, d as useAppSelector, i as commonErrorFallback, l as store, n as MenderEnvironment, o as createAppAsyncThunk, p as ErrorWithResponse, r as RootState, s as getConfiguredStore, t as AppDispatch, u as useAppDispatch } from "./store-CmiiLjxd.js";
1
+ import { a as commonErrorHandler, c as sessionReducer, d as useAppSelector, i as commonErrorFallback, l as store, n as MenderEnvironment, o as createAppAsyncThunk, p as ErrorWithResponse, r as RootState, s as getConfiguredStore, t as AppDispatch, u as useAppDispatch } from "./store-CkgokFlk.js";
2
2
  export { AppDispatch, type ErrorWithResponse, MenderEnvironment, RootState, commonErrorFallback, commonErrorHandler, createAppAsyncThunk, getConfiguredStore, sessionReducer, store, useAppDispatch, useAppSelector };
package/dist/store.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Z as settingsKeys } from "./constants-Cj2kp3Iy.js";
1
+ import { Z as settingsKeys } from "./constants-xpheFFkA.js";
2
2
  import appSlice_default from "./appSlice/index.js";
3
3
  import deploymentsSlice_default from "./deploymentsSlice/index.js";
4
4
  import devicesSlice_default from "./devicesSlice/index.js";
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-D6vf50IK.cjs");
3
- const require_constants = require("./constants-CNZ5L0A0.cjs");
3
+ const require_constants = require("./constants-C_SC_VKE.cjs");
4
4
  const require_actions = require("./actions.cjs");
5
5
  const require_auth = require("./auth.cjs");
6
6
  const require_appSlice_selectors = require("./appSlice/selectors.cjs");
@@ -1,5 +1,5 @@
1
- import { i as UserSession } from "./index-CSk4ENmk.cjs";
2
- import { r as RootState, t as AppDispatch } from "./store-B5-0USDz.cjs";
1
+ import { i as UserSession } from "./index-CgPgKMve.cjs";
2
+ import { r as RootState, t as AppDispatch } from "./store-CGP5pCH8.cjs";
3
3
 
4
4
  //#region src/storehooks.d.ts
5
5
  declare const parseEnvironmentInfo: import("@reduxjs/toolkit").AsyncThunk<[{
@@ -1,5 +1,5 @@
1
- import { i as UserSession } from "./index-Cf81vLTi.js";
2
- import { r as RootState, t as AppDispatch } from "./store-CmiiLjxd.js";
1
+ import { i as UserSession } from "./index-BCErsO5h.js";
2
+ import { r as RootState, t as AppDispatch } from "./store-CkgokFlk.js";
3
3
 
4
4
  //#region src/storehooks.d.ts
5
5
  declare const parseEnvironmentInfo: import("@reduxjs/toolkit").AsyncThunk<[{
@@ -1,4 +1,4 @@
1
- import { Rt as timeUnits, gt as DEPLOYMENT_STATES, jt as TIMEOUTS, u as DEVICE_STATES } from "./constants-Cj2kp3Iy.js";
1
+ import { Bt as timeUnits, Nt as TIMEOUTS, gt as DEPLOYMENT_STATES, u as DEVICE_STATES } from "./constants-xpheFFkA.js";
2
2
  import actions_default from "./actions.js";
3
3
  import { getSessionInfo } from "./auth.js";
4
4
  import { getFeatures } from "./appSlice/selectors.js";
package/dist/thunks.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-D6vf50IK.cjs");
3
3
  const require_appSlice_constants = require("./appSlice/constants.cjs");
4
- const require_constants = require("./constants-CNZ5L0A0.cjs");
4
+ const require_constants = require("./constants-C_SC_VKE.cjs");
5
5
  const require_onboardingSlice_constants = require("./onboardingSlice/constants.cjs");
6
6
  const require_releasesSlice_constants = require("./releasesSlice/constants.cjs");
7
7
  const require_appSlice_index = require("./appSlice/index.cjs");
package/dist/thunks.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ADDONS, PLANS, locations } from "./appSlice/constants.js";
2
- import { B as twoFAStates, C as deviceConnect, D as inventoryApiUrl, E as headerNames, F as scopedPermissionAreas, G as useradmApiUrlv2, H as uiPermissionsById, J as USER_LOGOUT, L as ssoIdpApiUrlv1, Mt as UNGROUPED_GROUP, N as rolesById, O as inventoryApiUrlV2, R as tenantadmApiUrlv1, S as deviceConfig, T as emptyUiPermissions, U as useradmApiUrl, V as uiPermissionsByArea, X as itemUiPermissionsReducer, Z as settingsKeys, _ as defaultPermissionSets, _t as DEPLOYMENT_TYPES, a as APPLICATION_JWT_CONTENT_TYPE, b as deploymentsApiUrlV2, bt as deploymentPrototype, d as PermissionTypes, f as SORTING_OPTIONS, ft as emptyFilter, g as auditLogsApiUrl, gt as DEPLOYMENT_STATES, ht as DEPLOYMENT_ROUTES, i as APPLICATION_JSON_CONTENT_TYPE, j as maxSessionAge, jt as TIMEOUTS, k as iotManagerBaseURL, kt as EXTERNAL_PROVIDER, l as DEVICE_LIST_DEFAULTS, m as apiRoot, n as ALL_DEVICE_STATES, nt as TENANT_LIST_DEFAULT, q as READ_STATES, r as ALL_RELEASES, s as DEVICE_FILTERING_OPTIONS, tt as SSO_TYPES, u as DEVICE_STATES, v as deploymentsApiUrl, w as emptyRole, x as deviceAuthV2, z as tenantadmApiUrlv2 } from "./constants-Cj2kp3Iy.js";
2
+ import { At as EXTERNAL_PROVIDER, B as twoFAStates, C as deviceConnect, D as inventoryApiUrl, E as headerNames, F as scopedPermissionAreas, G as useradmApiUrlv2, H as uiPermissionsById, J as USER_LOGOUT, L as ssoIdpApiUrlv1, N as rolesById, Nt as TIMEOUTS, O as inventoryApiUrlV2, Pt as UNGROUPED_GROUP, R as tenantadmApiUrlv1, S as deviceConfig, T as emptyUiPermissions, U as useradmApiUrl, V as uiPermissionsByArea, X as itemUiPermissionsReducer, Z as settingsKeys, _ as defaultPermissionSets, _t as DEPLOYMENT_TYPES, a as APPLICATION_JWT_CONTENT_TYPE, b as deploymentsApiUrlV2, bt as deploymentPrototype, d as PermissionTypes, f as SORTING_OPTIONS, ft as emptyFilter, g as auditLogsApiUrl, gt as DEPLOYMENT_STATES, ht as DEPLOYMENT_ROUTES, i as APPLICATION_JSON_CONTENT_TYPE, j as maxSessionAge, k as iotManagerBaseURL, l as DEVICE_LIST_DEFAULTS, m as apiRoot, n as ALL_DEVICE_STATES, nt as TENANT_LIST_DEFAULT, q as READ_STATES, r as ALL_RELEASES, s as DEVICE_FILTERING_OPTIONS, tt as SSO_TYPES, u as DEVICE_STATES, v as deploymentsApiUrl, w as emptyRole, x as deviceAuthV2, z as tenantadmApiUrlv2 } from "./constants-xpheFFkA.js";
3
3
  import { onboardingSteps, orderedOnboardingSteps } from "./onboardingSlice/constants.js";
4
4
  import { rootfsImageVersion } from "./releasesSlice/constants.js";
5
5
  import { actions } from "./appSlice/index.js";
@@ -1,5 +1,5 @@
1
1
  import { n as Addon } from "./constants-B_7FCJQX.js";
2
- import { T as SortOptions } from "./constants-OcdoVk6f.js";
2
+ import { T as SortOptions } from "./constants-CzjK2gV-.js";
3
3
  import { a as SSO_TYPES } from "./constants-OZiiFKiA.js";
4
4
  import { AuditLog, BillingInfo, BillingProfile, ConstraintsInfo, Event, SamlMetadata, Tenant } from "@northern.tech/types/MenderTypes";
5
5
 
@@ -85,4 +85,4 @@ type PricePreview = {
85
85
  };
86
86
  //#endregion
87
87
  export { PricePreview as a, ProductTier as c, TenantList as d, Webhook as f, Organization as i, SSOConfig as l, AuditLogSelectionState as n, ProductConfig as o, Card as r, ProductPlan as s, AuditLog$1 as t, Tenant$1 as u };
88
- //# sourceMappingURL=types-BjtmX60L.d.ts.map
88
+ //# sourceMappingURL=types-uHmaedGU.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { n as Addon } from "./constants-B_7FCJQX.cjs";
2
- import { T as SortOptions } from "./constants-_p6w8uEp.cjs";
2
+ import { T as SortOptions } from "./constants-DAi2zOZN.cjs";
3
3
  import { a as SSO_TYPES } from "./constants-OZiiFKiA.cjs";
4
4
  import { AuditLog, BillingInfo, BillingProfile, ConstraintsInfo, Event, SamlMetadata, Tenant } from "@northern.tech/types/MenderTypes";
5
5
 
@@ -85,4 +85,4 @@ type PricePreview = {
85
85
  };
86
86
  //#endregion
87
87
  export { PricePreview as a, ProductTier as c, TenantList as d, Webhook as f, Organization as i, SSOConfig as l, AuditLogSelectionState as n, ProductConfig as o, Card as r, ProductPlan as s, AuditLog$1 as t, Tenant$1 as u };
88
- //# sourceMappingURL=types-B33vKVhi.d.cts.map
88
+ //# sourceMappingURL=types-yQ0ypHMZ.d.cts.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_constants = require("../constants-CNZ5L0A0.cjs");
3
+ const require_constants = require("../constants-C_SC_VKE.cjs");
4
4
  exports.OWN_USER_ID = require_constants.OWN_USER_ID;
5
5
  exports.READ_STATES = require_constants.READ_STATES;
6
6
  exports.USER_LOGOUT = require_constants.USER_LOGOUT;
@@ -1,2 +1,2 @@
1
- import { J as USER_LOGOUT, K as OWN_USER_ID, X as itemUiPermissionsReducer, Y as checkPermissionsObject, Z as settingsKeys, q as READ_STATES } from "../constants-Cj2kp3Iy.js";
1
+ import { J as USER_LOGOUT, K as OWN_USER_ID, X as itemUiPermissionsReducer, Y as checkPermissionsObject, Z as settingsKeys, q as READ_STATES } from "../constants-xpheFFkA.js";
2
2
  export { OWN_USER_ID, READ_STATES, USER_LOGOUT, checkPermissionsObject, itemUiPermissionsReducer, settingsKeys };
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_constants = require("../constants-CNZ5L0A0.cjs");
5
+ const require_constants = require("../constants-C_SC_VKE.cjs");
6
6
  let _reduxjs_toolkit = require("@reduxjs/toolkit");
7
7
  let _northern_tech_utils_constants = require("@northern.tech/utils/constants");
8
8
  //#region src/usersSlice/index.ts
@@ -1,2 +1,2 @@
1
- import { a as UserSettings, c as actions, d as usersSlice, i as UserSession, l as initialState, n as GlobalSettings, o as UserSliceType, r as User, s as _default, t as CustomColumn, u as sliceName } from "../index-CSk4ENmk.cjs";
1
+ import { a as UserSettings, c as actions, d as usersSlice, i as UserSession, l as initialState, n as GlobalSettings, o as UserSliceType, r as User, s as _default, t as CustomColumn, u as sliceName } from "../index-CgPgKMve.cjs";
2
2
  export { CustomColumn, GlobalSettings, User, UserSession, UserSettings, UserSliceType, actions, _default as default, initialState, sliceName, usersSlice };
@@ -1,2 +1,2 @@
1
- import { a as UserSettings, c as actions, d as usersSlice, i as UserSession, l as initialState, n as GlobalSettings, o as UserSliceType, r as User, s as _default, t as CustomColumn, u as sliceName } from "../index-Cf81vLTi.js";
1
+ import { a as UserSettings, c as actions, d as usersSlice, i as UserSession, l as initialState, n as GlobalSettings, o as UserSliceType, r as User, s as _default, t as CustomColumn, u as sliceName } from "../index-BCErsO5h.js";
2
2
  export { CustomColumn, GlobalSettings, User, UserSession, UserSettings, UserSliceType, actions, _default as default, initialState, sliceName, usersSlice };
@@ -1,4 +1,4 @@
1
- import { N as rolesById, _ as defaultPermissionSets, q as READ_STATES } from "../constants-Cj2kp3Iy.js";
1
+ import { N as rolesById, _ as defaultPermissionSets, q as READ_STATES } from "../constants-xpheFFkA.js";
2
2
  import { createSlice } from "@reduxjs/toolkit";
3
3
  //#region src/usersSlice/index.ts
4
4
  const sliceName = "users";
@@ -1,5 +1,5 @@
1
1
  import { i as ReadState } from "../constants-Sn4gnNA3.cjs";
2
- import { i as UserSession, t as CustomColumn } from "../index-CSk4ENmk.cjs";
2
+ import { i as UserSession, t as CustomColumn } from "../index-CgPgKMve.cjs";
3
3
 
4
4
  //#region src/usersSlice/mocks.d.ts
5
5
  declare const mockState: {
@@ -1,5 +1,5 @@
1
1
  import { i as ReadState } from "../constants-Sn4gnNA3.js";
2
- import { i as UserSession, t as CustomColumn } from "../index-Cf81vLTi.js";
2
+ import { i as UserSession, t as CustomColumn } from "../index-BCErsO5h.js";
3
3
 
4
4
  //#region src/usersSlice/mocks.d.ts
5
5
  declare const mockState: {
@@ -1,4 +1,4 @@
1
- import { B as twoFAStates, H as uiPermissionsById, N as rolesById, P as rolesByName, T as emptyUiPermissions, w as emptyRole } from "../constants-Cj2kp3Iy.js";
1
+ import { B as twoFAStates, H as uiPermissionsById, N as rolesById, P as rolesByName, T as emptyUiPermissions, w as emptyRole } from "../constants-xpheFFkA.js";
2
2
  import { initialState } from "./index.js";
3
3
  //#region src/usersSlice/mocks.ts
4
4
  const userId = "a30a780b-b843-5344-80e3-0fd95a4f6fc3";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_constants = require("../constants-CNZ5L0A0.cjs");
2
+ const require_constants = require("../constants-C_SC_VKE.cjs");
3
3
  const require_utils = require("../utils.cjs");
4
4
  let _reduxjs_toolkit = require("@reduxjs/toolkit");
5
5
  let _northern_tech_utils_constants = require("@northern.tech/utils/constants");
@@ -1,13 +1,13 @@
1
1
  import { i as ReadState } from "../constants-Sn4gnNA3.cjs";
2
- import { a as UserSettings, i as UserSession, n as GlobalSettings, o as UserSliceType, r as User } from "../index-CSk4ENmk.cjs";
3
- import { i as ReleaseSliceType } from "../index-Zs9RnVoR.cjs";
2
+ import { a as UserSettings, i as UserSession, n as GlobalSettings, o as UserSliceType, r as User } from "../index-CgPgKMve.cjs";
3
+ import { i as ReleaseSliceType } from "../index-VEayiYkv.cjs";
4
4
  import { n as OnboardingSliceType } from "../index-DBUt8xVc.cjs";
5
5
  import { o as DeploymentsSliceType } from "../index-EPmsL6Lb.cjs";
6
- import { s as DeviceSliceType } from "../index-Doc_1P_Y.cjs";
7
- import { t as AppSliceType } from "../index-C8QadAm7.cjs";
8
- import { t as MonitorSliceType } from "../index-5Q-iI4EB.cjs";
9
- import { t as OrganizationSliceType } from "../index-Bj3OArhr.cjs";
10
- import { r as RootState } from "../store-B5-0USDz.cjs";
6
+ import { s as DeviceSliceType } from "../index-vXsWdis1.cjs";
7
+ import { t as AppSliceType } from "../index-Dn1SqQYh.cjs";
8
+ import { t as MonitorSliceType } from "../index-BQCnJ5gh.cjs";
9
+ import { t as OrganizationSliceType } from "../index-CSOj22xK.cjs";
10
+ import { r as RootState } from "../store-CGP5pCH8.cjs";
11
11
 
12
12
  //#region src/usersSlice/selectors.d.ts
13
13
  declare const getRolesById: (state: RootState) => Record<string, import("@northern.tech/utils/constants").Role>;
@@ -1,13 +1,13 @@
1
1
  import { i as ReadState } from "../constants-Sn4gnNA3.js";
2
- import { a as UserSettings, i as UserSession, n as GlobalSettings, o as UserSliceType, r as User } from "../index-Cf81vLTi.js";
3
- import { i as ReleaseSliceType } from "../index-DLDY7bNT.js";
2
+ import { a as UserSettings, i as UserSession, n as GlobalSettings, o as UserSliceType, r as User } from "../index-BCErsO5h.js";
3
+ import { i as ReleaseSliceType } from "../index-m1c0qk2s.js";
4
4
  import { n as OnboardingSliceType } from "../index-DBUt8xVc.js";
5
5
  import { o as DeploymentsSliceType } from "../index-Bb4yvvgG.js";
6
- import { s as DeviceSliceType } from "../index-BqJuhvO_.js";
7
- import { t as AppSliceType } from "../index-BLvjQfGj.js";
8
- import { t as MonitorSliceType } from "../index-ByfjrTdH.js";
9
- import { t as OrganizationSliceType } from "../index-BBsUj1a8.js";
10
- import { r as RootState } from "../store-CmiiLjxd.js";
6
+ import { s as DeviceSliceType } from "../index-BtGhTFBc.js";
7
+ import { t as AppSliceType } from "../index-CnH51JfB.js";
8
+ import { t as MonitorSliceType } from "../index-C5oQrJGU.js";
9
+ import { t as OrganizationSliceType } from "../index-H9zg_3UV.js";
10
+ import { r as RootState } from "../store-CkgokFlk.js";
11
11
 
12
12
  //#region src/usersSlice/selectors.d.ts
13
13
  declare const getRolesById: (state: RootState) => Record<string, import("@northern.tech/utils/constants").Role>;
@@ -1,4 +1,4 @@
1
- import { B as twoFAStates, Ft as defaultIdAttribute, Ot as DEVICE_ONLINE_CUTOFF, q as READ_STATES } from "../constants-Cj2kp3Iy.js";
1
+ import { B as twoFAStates, Lt as defaultIdAttribute, kt as DEVICE_ONLINE_CUTOFF, q as READ_STATES } from "../constants-xpheFFkA.js";
2
2
  import { isDarkMode } from "../utils.js";
3
3
  import { createSelector } from "@reduxjs/toolkit";
4
4
  //#region src/usersSlice/selectors.ts
@@ -1,8 +1,8 @@
1
- import { S as Role, c as AuditLogPermission, h as GroupsPermission, k as UserManagementPermission, p as DeploymentPermission, v as PermissionSet, x as ReleasesPermission } from "../constants-_p6w8uEp.cjs";
1
+ import { S as Role, c as AuditLogPermission, h as GroupsPermission, k as UserManagementPermission, p as DeploymentPermission, v as PermissionSet, x as ReleasesPermission } from "../constants-DAi2zOZN.cjs";
2
2
  import { i as ReadState } from "../constants-Sn4gnNA3.cjs";
3
- import { a as UserSettings, i as UserSession, n as GlobalSettings, r as User$1, t as CustomColumn } from "../index-CSk4ENmk.cjs";
4
- import { i as SnackbarContent } from "../index-C8QadAm7.cjs";
5
- import { r as RootState, t as AppDispatch } from "../store-B5-0USDz.cjs";
3
+ import { a as UserSettings, i as UserSession, n as GlobalSettings, r as User$1, t as CustomColumn } from "../index-CgPgKMve.cjs";
4
+ import { i as SnackbarContent } from "../index-Dn1SqQYh.cjs";
5
+ import { r as RootState, t as AppDispatch } from "../store-CGP5pCH8.cjs";
6
6
  import { EmailUpdateRequest, PendingEmailChange, PersonalAccessToken } from "@northern.tech/types/MenderTypes";
7
7
 
8
8
  //#region src/usersSlice/thunks.d.ts
@@ -1,8 +1,8 @@
1
- import { S as Role, c as AuditLogPermission, h as GroupsPermission, k as UserManagementPermission, p as DeploymentPermission, v as PermissionSet, x as ReleasesPermission } from "../constants-OcdoVk6f.js";
1
+ import { S as Role, c as AuditLogPermission, h as GroupsPermission, k as UserManagementPermission, p as DeploymentPermission, v as PermissionSet, x as ReleasesPermission } from "../constants-CzjK2gV-.js";
2
2
  import { i as ReadState } from "../constants-Sn4gnNA3.js";
3
- import { a as UserSettings, i as UserSession, n as GlobalSettings, r as User$1, t as CustomColumn } from "../index-Cf81vLTi.js";
4
- import { i as SnackbarContent } from "../index-BLvjQfGj.js";
5
- import { r as RootState, t as AppDispatch } from "../store-CmiiLjxd.js";
3
+ import { a as UserSettings, i as UserSession, n as GlobalSettings, r as User$1, t as CustomColumn } from "../index-BCErsO5h.js";
4
+ import { i as SnackbarContent } from "../index-CnH51JfB.js";
5
+ import { r as RootState, t as AppDispatch } from "../store-CkgokFlk.js";
6
6
  import { EmailUpdateRequest, PendingEmailChange, PersonalAccessToken } from "@northern.tech/types/MenderTypes";
7
7
 
8
8
  //#region src/usersSlice/thunks.d.ts
package/dist/utils.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_appSlice_constants = require("./appSlice/constants.cjs");
3
- const require_constants = require("./constants-CNZ5L0A0.cjs");
3
+ const require_constants = require("./constants-C_SC_VKE.cjs");
4
4
  const require_releasesSlice_constants = require("./releasesSlice/constants.cjs");
5
5
  let _northern_tech_utils_helpers = require("@northern.tech/utils/helpers");
6
6
  let _northern_tech_utils_constants = require("@northern.tech/utils/constants");
@@ -75,6 +75,12 @@ const filterCompare = (filter, item) => Object.keys(require_constants.emptyFilte
75
75
  const filtersFilter = (item, index, array) => {
76
76
  return array.findIndex((filter) => filterCompare(filter, item)) === index;
77
77
  };
78
+ const stripOrchestratorManifestPrefix = (key) => key.startsWith("mender-orchestrator-manifest.") ? key.substring(require_constants.ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX.length) : key;
79
+ const getAttributeScopeLabel = ({ key = "", scope }) => {
80
+ if (scope === _northern_tech_utils_constants.ATTRIBUTE_SCOPES.system) return require_constants.ATTRIBUTE_SCOPE_LABELS.default;
81
+ if (scope === _northern_tech_utils_constants.ATTRIBUTE_SCOPES.inventory && key.startsWith("mender-orchestrator-manifest.")) return require_constants.ATTRIBUTE_SCOPE_LABELS.system;
82
+ return scope ?? "";
83
+ };
78
84
  const stripUndefined = (obj) => Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
79
85
  const listItemMapper = (byId, ids, { cutOffSize = 50, defaultObject = {} }) => ids.slice(0, cutOffSize).reduce((accu, id) => {
80
86
  if (id && byId[id]) accu.push({
@@ -207,6 +213,7 @@ exports.ensureVersionString = ensureVersionString;
207
213
  exports.extractErrorMessage = extractErrorMessage;
208
214
  exports.filtersFilter = filtersFilter;
209
215
  exports.generateDeploymentGroupDetails = generateDeploymentGroupDetails;
216
+ exports.getAttributeScopeLabel = getAttributeScopeLabel;
210
217
  exports.getDeploymentState = getDeploymentState;
211
218
  exports.groupDeploymentDevicesStats = groupDeploymentDevicesStats;
212
219
  exports.groupDeploymentStats = groupDeploymentStats;
@@ -221,6 +228,7 @@ exports.parseSubscriptionPreview = parseSubscriptionPreview;
221
228
  exports.progress = progress;
222
229
  exports.statCollector = statCollector;
223
230
  exports.stringToBoolean = stringToBoolean;
231
+ exports.stripOrchestratorManifestPrefix = stripOrchestratorManifestPrefix;
224
232
  exports.stripUndefined = stripUndefined;
225
233
 
226
234
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["DEVICE_FILTERING_OPTIONS","yes","DEVICE_ISSUE_OPTIONS","ATTRIBUTE_SCOPES","emptyFilter","emptyUiPermissions","duplicateFilter","softwareIndicator","deploymentStatesToSubstates","defaultStats","deploymentStatesToSubstatesWithSkipped","DEPLOYMENT_STATES","deploymentDisplayStates","DARK_MODE","TIMEOUTS"],"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.\nimport type { AttributeFilterPredicate, AttributeResponse, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } 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 TIMEOUTS,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\nimport type { AppDispatch } from './store';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\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) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\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(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && 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: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\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] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\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 }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\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 type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((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: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n const groupStates = withSkipped ? deploymentStatesToSubstatesWithSkipped : deploymentStatesToSubstates;\n const result: DeploymentStats = {\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 if (withSkipped) {\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\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\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\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\nexport const mapDeviceAttributes = (attributes: AttributeResponse[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\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 = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n\nexport const dispatchDelayed = ({ action, delay = TIMEOUTS.threeSeconds, dispatch }: { action: any; delay?: number; dispatch: AppDispatch }) =>\n setTimeout(() => dispatch(action), delay);\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["DEVICE_FILTERING_OPTIONS","yes","DEVICE_ISSUE_OPTIONS","ATTRIBUTE_SCOPES","emptyFilter","ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX","ATTRIBUTE_SCOPE_LABELS","emptyUiPermissions","duplicateFilter","softwareIndicator","deploymentStatesToSubstates","defaultStats","deploymentStatesToSubstatesWithSkipped","DEPLOYMENT_STATES","deploymentDisplayStates","DARK_MODE","TIMEOUTS"],"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.\nimport type { AttributeFilterPredicate, AttributeResponse, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n ATTRIBUTE_SCOPE_LABELS,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX,\n TIMEOUTS,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\nimport type { AppDispatch } from './store';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\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) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\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(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && 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: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripOrchestratorManifestPrefix = (key: string) =>\n key.startsWith(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX) ? key.substring(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX.length) : key;\n\nexport const getAttributeScopeLabel = ({ key = '', scope }: { key?: string; scope?: string }) => {\n if (scope === ATTRIBUTE_SCOPES.system) {\n return ATTRIBUTE_SCOPE_LABELS.default;\n }\n if (scope === ATTRIBUTE_SCOPES.inventory && key.startsWith(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX)) {\n return ATTRIBUTE_SCOPE_LABELS.system;\n }\n return scope ?? '';\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\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] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\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 }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\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 type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((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: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n const groupStates = withSkipped ? deploymentStatesToSubstatesWithSkipped : deploymentStatesToSubstates;\n const result: DeploymentStats = {\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 if (withSkipped) {\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\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\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\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\nexport const mapDeviceAttributes = (attributes: AttributeResponse[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\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 = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n\nexport const dispatchDelayed = ({ action, delay = TIMEOUTS.threeSeconds, dispatch }: { action: any; delay?: number; dispatch: AppDispatch }) =>\n setTimeout(() => dispatch(action), delay);\n"],"mappings":";;;;;;;AA6CA,MAAM,mBAAoD;EACvDA,+BAAAA,yBAAyB,IAAI,OAAO,QAAgB,OAAO,GAAG,KAAK;EACnEA,+BAAAA,yBAAyB,KAAK,OAAO,QAAgB,OAAO,GAAG,KAAK;EACpEA,+BAAAA,yBAAyB,IAAI,OAAO,QAAgB,OAAO,GAAG,KAAK;EACnEA,+BAAAA,yBAAyB,KAAK,OAAO,QAAgB,OAAO,GAAG,KAAK;EACpEA,+BAAAA,yBAAyB,MAAM,OAAO,QAAgB,OAAO,GAAG,KAAK;EACrEA,+BAAAA,yBAAyB,IAAI,OAAO,SAAiB,KAAK,IAAA,CAAK,MAAM,GAAG,CAAC,CAAC,KAAI,MAAK,EAAE,KAAK,CAAC;EAC3FA,+BAAAA,yBAAyB,KAAK,OAAO,SAAiB,KAAK,IAAA,CAAK,MAAM,GAAG,CAAC,CAAC,KAAI,MAAK,EAAE,KAAK,CAAC;EAC5FA,+BAAAA,yBAAyB,QAAQ,MAAMC,6BAAAA;EACvCD,+BAAAA,yBAAyB,SAAS,YAAY;AACjD;AAGA,MAAM,gBAA6C,EACjD,UAAU;CAAE,OAAOA,+BAAAA,yBAAyB,QAAQ;CAAK,OAAO;AAAM,EACxE;AASA,MAAa,qBAAqB,YAChC,QAAQ,KAAI,YAAW;CACrB,OAAO,OAAO;CACd,WAAW,OAAO;CAClB,MAAM,cAAc,OAAO,SAAS,EAAE,SAAS,OAAO;CACtD,OAAO,OAAO,OAAO,kBAAkB,OAAO,QAAQ,IAAI,iBAAiB,OAAO,SAAS,CAAC,OAAO,KAAe,IAAI,OAAO;AAC/H,EAAE;AACJ,MAAa,qBAAqB,UAChC,MAAM,KAAI,SAAQ;CAChB,MAAM,gBAAgB,OAAO,QAAQ,aAAa,CAAC,CAAC,MAClD,oBAAmB,gBAAgB,EAAE,CAAC,UAAU,KAAK,QAAQ,gBAAgB,EAAE,CAAC,UAAU,KAAK,KACjG;CACA,MAAM,WAAY,gBAAgB,cAAc,KAAK,KAAK;CAC1D,OAAO;EAAE,OAAO,KAAK;EAAgB,KAAK,KAAK;EAAW;EAAU,OAAO,KAAK;CAAM;AACxF,CAAC;AAWH,MAAM,gCAAgC,iBAAyC,eAAiC,CAAC,MAC/G,gBAAgB,KAAI,SAAQ;CAC1B,MAAM,aAAaE,+BAAAA,qBAAqB,KAAK,CAAC;CAC9C,MAAM,QAAQ,OAAO,WAAW,UAAU,aAAa,WAAW,MAAM,YAAY,IAAI,WAAW;CACnG,OAAO;EAAE,KAAK,WAAW;EAAK,UAAU,WAAW;EAAU,OAAO,WAAW;EAAO;CAAM;AAC9F,CAAC;AAEH,MAAa,mCAAmC,EAC9C,UAAU,CAAC,GACX,OACA,SAAS,EAAE,MAAM,CAAC,EAAE,GACpB,kBACA,iBAAiB,CAAC,GAClB,aAQI;CACJ,IAAI,oBAAoB,CAAC,GAAG,OAAO;CACnC,IAAI,OAAO,UAAU,YAAY,EAAE,OAAO,KAAK,MAAM,EAAE,WAAW,kBAAA,CAAmB,QACnF,kBAAkB,KAAK;EAAE,KAAK;EAAS,OAAO;EAAO,UAAUF,+BAAAA,yBAAyB,IAAI;EAAK,OAAO;CAAS,CAAC;CAEpH,MAAM,oBAAoB,kBAAkB,QAC1C,WACE,CAAC,OAAO,OAAOE,+BAAAA,oBAAoB,CAAC,CAAC,MAAM,EAAE,iBAAiB;EAC5D,MAAM,EAAE,MAAM,IAAI,QAAQ,OAAO;EACjC,OAAO,OAAO,UAAU,eAAe,UAAU,OAAO,SAAS,QAAQ,OAAO;CAClF,CAAC,CACL;CACA,MAAM,qBAAqB,6BAA6B,gBAAgB,EAAE,iBAAiB,CAAC;CAC5F,oBAAoB,CAAC,GAAG,mBAAmB,GAAG,kBAAkB;CAChE,MAAM,mBAAmB,SACrB,CAAC,GAAG,mBAAmB;EAAE,KAAK;EAAU,OAAO;EAAQ,UAAUF,+BAAAA,yBAAyB,IAAI;EAAK,OAAOG,+BAAAA,iBAAiB;CAAS,CAAC,IACrI;CACJ,OAAO;EAAE,mBAAmB;EAAmB,aAAa,kBAAkB,gBAAgB;CAAE;AAClG;AAEA,MAAM,iBAAiB,QAAsB,SAC3C,OAAO,KAAKC,kBAAAA,WAAW,CAAC,CAAC,OAAM,QAAO,KAAK,IAA0B,EAAE,SAAS,MAAM,OAAO,IAA0B,EAAE,SAAS,CAAC;AAErI,MAAa,iBAAiB,MAAoB,OAAe,UAAmC;CAElG,OADmB,MAAM,WAAU,WAAU,cAAc,QAAQ,IAAI,CACvD,MAAM;AACxB;AAEA,MAAa,mCAAmC,QAC9C,IAAI,WAAA,+BAAiD,IAAI,IAAI,UAAUC,kBAAAA,uCAAuC,MAAM,IAAI;AAE1H,MAAa,0BAA0B,EAAE,MAAM,IAAI,YAA8C;CAC/F,IAAI,UAAUF,+BAAAA,iBAAiB,QAC7B,OAAOG,kBAAAA,uBAAuB;CAEhC,IAAI,UAAUH,+BAAAA,iBAAiB,aAAa,IAAI,WAAA,+BAAiD,GAC/F,OAAOG,kBAAAA,uBAAuB;CAEhC,OAAO,SAAS;AAClB;AAEA,MAAa,kBAAqD,QAChE,OAAO,YAAY,OAAO,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,OAAO,MAAM,KAAA,CAAS,CAAC;AAE3E,MAAa,kBACX,MACA,KACA,EAAE,aAAA,IAAyC,gBAAgB,CAAC,QAE5D,IAAI,MAAM,GAAG,UAAU,CAAC,CAAC,QAAa,MAAM,OAAO;CACjD,IAAI,MAAM,KAAK,KACb,KAAK,KAAK;EAAE,GAAG;EAAe,GAAG,KAAK;CAAI,CAAC;CAE7C,OAAO;AACT,GAAG,CAAC,CAAC;AAKP,MAAa,oBAAoB,sBAAqC,EAAE,GAAGC,+BAAAA,mBAAmB,GAAG,qBAC/F,OAAO,QAAQ,mBAAmB,CAAC,CAAC,QACjC,MAAM,CAAC,KAAK,WAAW;CACtB,IAAI;CACJ,IAAI,CAAC,KAAK,MAAM;EACd,KAAK,OAAO;EACZ,OAAO;CACT;CACA,IAAI,MAAM,QAAQ,KAAK,GACrB,SAAS,CAAC,GAAG,OAAO,GAAI,KAAK,IAAiB,CAAC,CAAC,OAAOC,6BAAAA,eAAe;MAEtE,SAAS,iBAAiB,KAAK,MAAM,EAAE,GAAG,MAAM,CAA6B;CAE/E,KAAK,OAAO;CACZ,OAAO;AACT,GACA,EAAE,GAAG,iBAAiB,CACxB;AAEF,MAAa,+BAA+B,WAAqB,UAC/D,UAAU,QACP,MAAM,WAAW;CAChB,IAAI,EAAE,UAAU,MAAM,UACpB,OAAO;CAET,OAAO,iBAAiB,MAAM,MAAM,OAAO,CAAC,aAAa;AAC3D,GACA,EAAE,GAAGD,+BAAAA,mBAAmB,CAC1B;AAEF,MAAa,YAAY,EAAE,QAAQ,YAAwD;CACzF,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,iBAAkB,SAAS,QAAS;CACxC,OAAQ,iBAAiB,iBAAiB,KAAK,KAAK,KAAK,cAAc,IAAI,KAAK,MAAM,cAAc;AACtG;AAIA,MAAa,uBAAuB,KAAwB,WAAW,QACpE,OAAO,IAAI,UAAU,MAAM,UAAU,WAAW,IAAI,UAAU,MAAM,OAAO,UAAU,IAAI,UAAU,MAAM,UAAU,IAAI,SAAS,IAAI,WAAW;AAElJ,MAAa,uBAAuB,UAAkB,aACpD,SAAS,UAAU,aAAa,kBAAmB,SAAS,SAAA,UAA0B,IAAI,WAAW,GAAG,WAAWE,gCAAAA,sBAAuB;AAE5I,MAAa,mBAAmB,YAAkD;CAChF,IAAI,CAAC,SACH,OAAO;CAET,MAAM,SAAS,UAAU;CACzB,QAAQ,OAAO,KAAK,CAAC,CAAC,YAAY,GAAlC;EACE,KAAK;EACL,KAAK;EACL,KAAK,KACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MACH,OAAO;EACT,SACE,OAAO,QAAQ,MAAM;CACzB;AACF;AAWA,MAAa,+BAA+B,eAA6D;CACvG,MAAM,uBAAuB,kBAA4B,YACvD,OAAO,OAAO,OAAO,CAAC,CAAC,QAAgB,MAAM,WAAY,iBAAiB,SAAS,OAAO,UAAU,EAAE,IAAI,OAAO,IAAI,MAAO,CAAC;CAE/H,MAAM,aAAa,oBAAoBC,kBAAAA,4BAA4B,YAAY,WAAW,OAAO;CACjG,MAAM,UAAU,oBAAoBA,kBAAAA,4BAA4B,SAAS,WAAW,OAAO;CAC3F,MAAM,YAAY,oBAAoBA,kBAAAA,4BAA4B,WAAW,WAAW,OAAO;CAC/F,MAAM,WAAW,oBAAoBA,kBAAAA,4BAA4B,UAAU,WAAW,OAAO;CAE7F,OAAO;EAAE;EAAY,QADN,oBAAoBA,kBAAAA,4BAA4B,QAAQ,WAAW,OACxD;EAAG;EAAS;EAAW;CAAS;AAC5D;AAEA,MAAa,iBAAiB,OAAiB,eAC7C,MAAM,QAAQ,MAAM,aAAa,OAAO,OAAO,WAAW,aAAa,CAAC,GAAG,CAAC;AAE9E,MAAa,wBAAwB,YAAiC,gBAA2C;CAC/G,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;CACxB,MAAM,QAAQ;EAAE,GAAGC,kBAAAA;EAAc,GAAG;CAAO;CAC3C,MAAM,cAAc,cAAcC,kBAAAA,yCAAyCF,kBAAAA;CAC3E,MAAM,SAA0B;EAE9B,YAAY,cAAc,YAAY,YAAY,KAAK;EACvD,SAAS,cAAc,YAAY,SAAS,KAAK;EACjD,WAAW,cAAc,YAAY,WAAW,KAAK;EACrD,UAAU,cAAc,YAAY,UAAU,KAAK;EACnD,QAAQ,cAAc,YAAY,QAAQ,KAAK;CACjD;CACA,IAAI,aACF,OAAO,UAAU,cAAc,YAAY,SAAU,KAAK;CAE5D,OAAO;AACT;AAEA,MAAa,sBAAsB,eAA4C;CAC7E,MAAM,EAAE,QAAQ,mBAAmBG,kBAAAA,kBAAkB,YAAY;CACjE,MAAM,EAAE,YAAY,sBAAsB,WAAW,qBAAqB,UAAU;CAEpF,IAAI,SAASC,kBAAAA,wBAAwB;CACrC,IAAI,qBAAqBD,kBAAAA,kBAAkB,WAAW,yBAAyB,GAC7E,SAAS;MACJ,IAAI,SAAS,GAClB,SAASC,kBAAAA,wBAAwB;CAEnC,OAAO;AACT;AAQA,MAAa,kCAAkC,QAAsC,cACnF,UAAU,OAAO,OAAO,SACpB,GAAG,UAAU,IAAI,OAAO,MACrB,KACC,WACE,GAAG,OAAO,aAAa,OAAO,IAAI,GAAGd,+BAAAA,yBAAyB,OAAO,QAAQ,OAAO,YAAYA,+BAAAA,yBAAyB,IAAI,IAAI,CAAC,UAAU,GAAG,OAAO,OAC1J,CAAC,CACA,KAAK,IAAI,EAAE,KACd;AAUN,MAAa,uBAAuB,aAAkC,CAAC,MACrE,WAAW,QACR,MAAM,cAAc;CACnB,IAAI,EAAE,UAAU,SAAS,UAAU,SAAS,UAAU,UAAUG,+BAAAA,iBAAiB,WAC/E,OAAO;CAET,MAAM,QAAS,UAAU,SAASA,+BAAAA,iBAAiB;CACnD,KAAM,SAAqC;EACzC,GAAG,KAAK;GACP,UAAU,OAAO,UAAU;CAC9B;CACA,IAAI,UAAU,SAAS,iBAAiB,UAAU,UAAUA,+BAAAA,iBAAiB,WAC3E,KAAK,UAAU,cAAe,CAAC,CAAC,CAAc,OAAO,UAAU,KAA0B;CAE3F,OAAO;AACT,GACA;CAAE,WAAW;EAAE,aAAa,CAAC;EAAe,eAAe;CAAG;CAAG,UAAU,CAAC;CAAG,SAAS,CAAC;CAAG,QAAQ,CAAC;CAAG,MAAM,CAAC;AAAE,CACnH;AAEF,MAAa,cAAc,SAA0B,SAASY,2BAAAA;AAG9D,MAAa,4BAA4B,UACvC,MAAM,QAAQ,KAAK,EAAE,OAAO,QAAQ,cAAc;CAChD,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE;CAC1C,IAAI,CAAC,IAAI,OACP,IAAI,QAAQ;EACV,QAAQ;EACR,QAAQ,CAAC;CACX;CAEF,IAAI,CAAC,OACH,IAAI,KAAK,CAAC,UAAU;MAEpB,IAAI,KAAK,CAAC,OAAO,UAAU,IAAI,KAAK,CAAC,OAAO,UAAU,KAAK;CAE7D,OAAO;AACT,GAAG,CAAC,CAAC;AAEP,MAAa,4BACX,QACA,aAEA,OAAO,YACL,OAAO,QAAQ,MAAM,CAAC,CACnB,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,IAAI,CAAC,CAClC,KAAK,CAAC,KAAK,WAAW;CACrB,MAAM,YAAa,SAAS,IAAI,CAA2B;CAC3D,OAAO,CAAC,WAAW;EAAE,MAAM;EAAW,OAAO,OAAO,KAAK,KAAK;CAAE,CAAC;AACnE,CAAC,CACL;AAEF,MAAa,mBAAmB,EAAE,QAAQ,QAAQC,kBAAAA,SAAS,cAAc,eACvE,iBAAiB,SAAS,MAAM,GAAG,KAAK"}
package/dist/utils.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as mapUserRolesToUiPermissions, C as groupDeploymentDevicesStats, D as mapDeviceAttributes, E as listItemMapper, F as stringToBoolean, I as stripUndefined, M as parseSubscriptionPreview, N as progress, O as mapFiltersToTerms, P as statCollector, S as getDeploymentState, T as isDarkMode, _ as dispatchDelayed, b as filtersFilter, f as DeploymentStats, g as convertToBackendSPLimits, h as convertDeviceListStateToFilters, j as mergePermissions, k as mapTermsToFilters, m as FilterTerm, p as ErrorWithResponse, v as ensureVersionString, w as groupDeploymentStats, x as generateDeploymentGroupDetails, y as extractErrorMessage } from "./store-B5-0USDz.cjs";
2
- export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
1
+ import { A as mapTermsToFilters, C as getDeploymentState, D as listItemMapper, E as isDarkMode, F as statCollector, I as stringToBoolean, L as stripOrchestratorManifestPrefix, M as mergePermissions, N as parseSubscriptionPreview, O as mapDeviceAttributes, P as progress, R as stripUndefined, S as getAttributeScopeLabel, T as groupDeploymentStats, _ as dispatchDelayed, b as filtersFilter, f as DeploymentStats, g as convertToBackendSPLimits, h as convertDeviceListStateToFilters, j as mapUserRolesToUiPermissions, k as mapFiltersToTerms, m as FilterTerm, p as ErrorWithResponse, v as ensureVersionString, w as groupDeploymentDevicesStats, x as generateDeploymentGroupDetails, y as extractErrorMessage } from "./store-CGP5pCH8.cjs";
2
+ export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getAttributeScopeLabel, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripOrchestratorManifestPrefix, stripUndefined };
package/dist/utils.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as mapUserRolesToUiPermissions, C as groupDeploymentDevicesStats, D as mapDeviceAttributes, E as listItemMapper, F as stringToBoolean, I as stripUndefined, M as parseSubscriptionPreview, N as progress, O as mapFiltersToTerms, P as statCollector, S as getDeploymentState, T as isDarkMode, _ as dispatchDelayed, b as filtersFilter, f as DeploymentStats, g as convertToBackendSPLimits, h as convertDeviceListStateToFilters, j as mergePermissions, k as mapTermsToFilters, m as FilterTerm, p as ErrorWithResponse, v as ensureVersionString, w as groupDeploymentStats, x as generateDeploymentGroupDetails, y as extractErrorMessage } from "./store-CmiiLjxd.js";
2
- export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
1
+ import { A as mapTermsToFilters, C as getDeploymentState, D as listItemMapper, E as isDarkMode, F as statCollector, I as stringToBoolean, L as stripOrchestratorManifestPrefix, M as mergePermissions, N as parseSubscriptionPreview, O as mapDeviceAttributes, P as progress, R as stripUndefined, S as getAttributeScopeLabel, T as groupDeploymentStats, _ as dispatchDelayed, b as filtersFilter, f as DeploymentStats, g as convertToBackendSPLimits, h as convertDeviceListStateToFilters, j as mapUserRolesToUiPermissions, k as mapFiltersToTerms, m as FilterTerm, p as ErrorWithResponse, v as ensureVersionString, w as groupDeploymentDevicesStats, x as generateDeploymentGroupDetails, y as extractErrorMessage } from "./store-CkgokFlk.js";
2
+ export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getAttributeScopeLabel, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripOrchestratorManifestPrefix, stripUndefined };
package/dist/utils.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { DARK_MODE } from "./appSlice/constants.js";
2
- import { St as deploymentStatesToSubstatesWithSkipped, T as emptyUiPermissions, c as DEVICE_ISSUE_OPTIONS, ft as emptyFilter, gt as DEPLOYMENT_STATES, jt as TIMEOUTS, o as ATTRIBUTE_SCOPES, s as DEVICE_FILTERING_OPTIONS, vt as defaultStats, xt as deploymentStatesToSubstates, yt as deploymentDisplayStates } from "./constants-Cj2kp3Iy.js";
2
+ import { Dt as ATTRIBUTE_SCOPE_LABELS, Mt as ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX, Nt as TIMEOUTS, St as deploymentStatesToSubstatesWithSkipped, T as emptyUiPermissions, c as DEVICE_ISSUE_OPTIONS, ft as emptyFilter, gt as DEPLOYMENT_STATES, o as ATTRIBUTE_SCOPES, s as DEVICE_FILTERING_OPTIONS, vt as defaultStats, xt as deploymentStatesToSubstates, yt as deploymentDisplayStates } from "./constants-xpheFFkA.js";
3
3
  import { softwareIndicator } from "./releasesSlice/constants.js";
4
4
  import { duplicateFilter, yes } from "@northern.tech/utils/helpers";
5
5
  //#region src/utils.ts
@@ -73,6 +73,12 @@ const filterCompare = (filter, item) => Object.keys(emptyFilter).every((key) =>
73
73
  const filtersFilter = (item, index, array) => {
74
74
  return array.findIndex((filter) => filterCompare(filter, item)) === index;
75
75
  };
76
+ const stripOrchestratorManifestPrefix = (key) => key.startsWith("mender-orchestrator-manifest.") ? key.substring(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX.length) : key;
77
+ const getAttributeScopeLabel = ({ key = "", scope }) => {
78
+ if (scope === ATTRIBUTE_SCOPES.system) return ATTRIBUTE_SCOPE_LABELS.default;
79
+ if (scope === ATTRIBUTE_SCOPES.inventory && key.startsWith("mender-orchestrator-manifest.")) return ATTRIBUTE_SCOPE_LABELS.system;
80
+ return scope ?? "";
81
+ };
76
82
  const stripUndefined = (obj) => Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== void 0));
77
83
  const listItemMapper = (byId, ids, { cutOffSize = 50, defaultObject = {} }) => ids.slice(0, cutOffSize).reduce((accu, id) => {
78
84
  if (id && byId[id]) accu.push({
@@ -198,6 +204,6 @@ const convertToBackendSPLimits = (limits, spLimits) => Object.fromEntries(Object
198
204
  }));
199
205
  const dispatchDelayed = ({ action, delay = TIMEOUTS.threeSeconds, dispatch }) => setTimeout(() => dispatch(action), delay);
200
206
  //#endregion
201
- export { convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
207
+ export { convertDeviceListStateToFilters, convertToBackendSPLimits, dispatchDelayed, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getAttributeScopeLabel, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripOrchestratorManifestPrefix, stripUndefined };
202
208
 
203
209
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"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.\nimport type { AttributeFilterPredicate, AttributeResponse, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } 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 TIMEOUTS,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\nimport type { AppDispatch } from './store';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\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) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\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(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && 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: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\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] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\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 }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\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 type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((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: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n const groupStates = withSkipped ? deploymentStatesToSubstatesWithSkipped : deploymentStatesToSubstates;\n const result: DeploymentStats = {\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 if (withSkipped) {\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\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\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\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\nexport const mapDeviceAttributes = (attributes: AttributeResponse[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\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 = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n\nexport const dispatchDelayed = ({ action, delay = TIMEOUTS.threeSeconds, dispatch }: { action: any; delay?: number; dispatch: AppDispatch }) =>\n setTimeout(() => dispatch(action), delay);\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"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.\nimport type { AttributeFilterPredicate, AttributeResponse, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n ATTRIBUTE_SCOPE_LABELS,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX,\n TIMEOUTS,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\nimport type { AppDispatch } from './store';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\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) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\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(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && 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: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripOrchestratorManifestPrefix = (key: string) =>\n key.startsWith(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX) ? key.substring(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX.length) : key;\n\nexport const getAttributeScopeLabel = ({ key = '', scope }: { key?: string; scope?: string }) => {\n if (scope === ATTRIBUTE_SCOPES.system) {\n return ATTRIBUTE_SCOPE_LABELS.default;\n }\n if (scope === ATTRIBUTE_SCOPES.inventory && key.startsWith(ORCHESTRATOR_MANIFEST_ATTRIBUTE_PREFIX)) {\n return ATTRIBUTE_SCOPE_LABELS.system;\n }\n return scope ?? '';\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\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] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\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 }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\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 type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((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: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n const groupStates = withSkipped ? deploymentStatesToSubstatesWithSkipped : deploymentStatesToSubstates;\n const result: DeploymentStats = {\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 if (withSkipped) {\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\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\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\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\nexport const mapDeviceAttributes = (attributes: AttributeResponse[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\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 = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n\nexport const dispatchDelayed = ({ action, delay = TIMEOUTS.threeSeconds, dispatch }: { action: any; delay?: number; dispatch: AppDispatch }) =>\n setTimeout(() => dispatch(action), delay);\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@northern.tech/store",
3
- "version": "0.41.1",
3
+ "version": "0.41.3",
4
4
  "license": "Apache-2.0",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -144,7 +144,7 @@
144
144
  "axios": "^1.x",
145
145
  "dayjs": "^1.x",
146
146
  "md5": "^2.x",
147
- "msgpack5": "^6.x",
147
+ "msgpackr": "^2.x",
148
148
  "react": "^19.x",
149
149
  "react-dom": "^19.x",
150
150
  "react-redux": "^9.x",