@northern.tech/store 0.19.2 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/actions.cjs +3 -0
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.d.cts +2 -1
  4. package/dist/actions.d.ts +2 -1
  5. package/dist/actions.js +5 -5
  6. package/dist/api/general-api.js +1 -1
  7. package/dist/api/users-api.js +1 -1
  8. package/dist/appSlice/constants.cjs +3 -45
  9. package/dist/appSlice/constants.cjs.map +1 -1
  10. package/dist/appSlice/constants.d.cts +0 -15
  11. package/dist/appSlice/constants.d.ts +0 -15
  12. package/dist/appSlice/constants.js +1 -1
  13. package/dist/appSlice/index.js +1 -1
  14. package/dist/appSlice/mocks.js +1 -1
  15. package/dist/appSlice/thunks.cjs +14 -56
  16. package/dist/appSlice/thunks.cjs.map +1 -1
  17. package/dist/appSlice/thunks.js +16 -16
  18. package/dist/auth.js +1 -1
  19. package/dist/{chunk-RJRZXDVT.js → chunk-3JBVI4UH.js} +7 -7
  20. package/dist/{chunk-43ZBO3JW.js → chunk-4ZYLGBJU.js} +2 -2
  21. package/dist/{chunk-B3C6H2PR.js → chunk-7WIISD2N.js} +17 -14
  22. package/dist/{chunk-B3C6H2PR.js.map → chunk-7WIISD2N.js.map} +1 -1
  23. package/dist/{chunk-KJ2SUFAU.js → chunk-AY7E7VA6.js} +81 -16
  24. package/dist/chunk-AY7E7VA6.js.map +1 -0
  25. package/dist/{chunk-AJ6DIDO4.js → chunk-DBBE6D36.js} +4 -46
  26. package/dist/chunk-DBBE6D36.js.map +1 -0
  27. package/dist/{chunk-AV7SRATY.js → chunk-E657OJL4.js} +6 -6
  28. package/dist/{chunk-XOASGJZU.js → chunk-FXKMYYK5.js} +13 -13
  29. package/dist/{chunk-ZAZTNDSY.js → chunk-P3N2J3QT.js} +9 -9
  30. package/dist/{chunk-42GZ6FGV.js → chunk-PL6RIFD5.js} +2 -2
  31. package/dist/{chunk-VCEFZTWS.js → chunk-TIL2S3JA.js} +4 -1
  32. package/dist/chunk-TIL2S3JA.js.map +1 -0
  33. package/dist/{chunk-45BHMNX6.js → chunk-V6BWOIRC.js} +6 -6
  34. package/dist/{chunk-O7DR57RN.js → chunk-ZGRY42BZ.js} +9 -12
  35. package/dist/{chunk-O7DR57RN.js.map → chunk-ZGRY42BZ.js.map} +1 -1
  36. package/dist/{chunk-3NOV7X4M.js → chunk-ZZQJWNQT.js} +3 -1
  37. package/dist/chunk-ZZQJWNQT.js.map +1 -0
  38. package/dist/commonConstants.js +1 -1
  39. package/dist/commonSelectors.cjs +11 -56
  40. package/dist/commonSelectors.cjs.map +1 -1
  41. package/dist/commonSelectors.js +8 -8
  42. package/dist/constants.cjs +3 -45
  43. package/dist/constants.cjs.map +1 -1
  44. package/dist/constants.js +1 -1
  45. package/dist/deploymentsSlice/constants.js +1 -1
  46. package/dist/deploymentsSlice/index.js +1 -1
  47. package/dist/deploymentsSlice/mocks.js +1 -1
  48. package/dist/deploymentsSlice/selectors.js +1 -1
  49. package/dist/deploymentsSlice/thunks.cjs +14 -56
  50. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  51. package/dist/deploymentsSlice/thunks.js +16 -16
  52. package/dist/devicesSlice/constants.js +1 -1
  53. package/dist/devicesSlice/index.js +1 -1
  54. package/dist/devicesSlice/mocks.js +1 -1
  55. package/dist/devicesSlice/selectors.cjs +8 -11
  56. package/dist/devicesSlice/selectors.cjs.map +1 -1
  57. package/dist/devicesSlice/selectors.js +2 -2
  58. package/dist/devicesSlice/thunks.cjs +14 -56
  59. package/dist/devicesSlice/thunks.cjs.map +1 -1
  60. package/dist/devicesSlice/thunks.js +16 -16
  61. package/dist/liststatehook.js +1 -1
  62. package/dist/locationutils.js +1 -1
  63. package/dist/monitorSlice/index.js +1 -1
  64. package/dist/monitorSlice/mocks.js +1 -1
  65. package/dist/monitorSlice/thunks.cjs +14 -56
  66. package/dist/monitorSlice/thunks.cjs.map +1 -1
  67. package/dist/monitorSlice/thunks.js +14 -14
  68. package/dist/onboardingSlice/thunks.cjs +14 -56
  69. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  70. package/dist/onboardingSlice/thunks.js +16 -16
  71. package/dist/organizationSlice/constants.js +1 -1
  72. package/dist/organizationSlice/index.cjs +3 -0
  73. package/dist/organizationSlice/index.cjs.map +1 -1
  74. package/dist/organizationSlice/index.d.cts +4 -1
  75. package/dist/organizationSlice/index.d.ts +4 -1
  76. package/dist/organizationSlice/index.js +2 -2
  77. package/dist/organizationSlice/mocks.cjs +175 -0
  78. package/dist/organizationSlice/mocks.cjs.map +1 -1
  79. package/dist/organizationSlice/mocks.d.cts +121 -2
  80. package/dist/organizationSlice/mocks.d.ts +121 -2
  81. package/dist/organizationSlice/mocks.js +87 -2
  82. package/dist/organizationSlice/mocks.js.map +1 -1
  83. package/dist/organizationSlice/selectors.cjs +3 -0
  84. package/dist/organizationSlice/selectors.cjs.map +1 -1
  85. package/dist/organizationSlice/selectors.d.cts +3 -2
  86. package/dist/organizationSlice/selectors.d.ts +3 -2
  87. package/dist/organizationSlice/selectors.js +4 -2
  88. package/dist/organizationSlice/thunks.cjs +97 -71
  89. package/dist/organizationSlice/thunks.cjs.map +1 -1
  90. package/dist/organizationSlice/thunks.d.cts +17 -3
  91. package/dist/organizationSlice/thunks.d.ts +17 -3
  92. package/dist/organizationSlice/thunks.js +22 -18
  93. package/dist/organizationSlice/types.cjs.map +1 -1
  94. package/dist/organizationSlice/types.d.cts +30 -7
  95. package/dist/organizationSlice/types.d.ts +30 -7
  96. package/dist/releasesSlice/index.js +1 -1
  97. package/dist/releasesSlice/mocks.js +1 -1
  98. package/dist/releasesSlice/selectors.cjs.map +1 -1
  99. package/dist/releasesSlice/selectors.js +3 -3
  100. package/dist/releasesSlice/thunks.cjs +14 -56
  101. package/dist/releasesSlice/thunks.cjs.map +1 -1
  102. package/dist/releasesSlice/thunks.js +14 -14
  103. package/dist/selectors.cjs +14 -56
  104. package/dist/selectors.cjs.map +1 -1
  105. package/dist/selectors.d.cts +1 -1
  106. package/dist/selectors.d.ts +1 -1
  107. package/dist/selectors.js +28 -26
  108. package/dist/sockethook.js +1 -1
  109. package/dist/store.cjs +3 -0
  110. package/dist/store.cjs.map +1 -1
  111. package/dist/store.js +6 -6
  112. package/dist/storehooks.cjs +93 -70
  113. package/dist/storehooks.cjs.map +1 -1
  114. package/dist/storehooks.js +20 -18
  115. package/dist/storehooks.js.map +1 -1
  116. package/dist/thunks.cjs +95 -69
  117. package/dist/thunks.cjs.map +1 -1
  118. package/dist/thunks.d.cts +1 -1
  119. package/dist/thunks.d.ts +1 -1
  120. package/dist/thunks.js +20 -16
  121. package/dist/useDeploymentDevice.cjs +14 -56
  122. package/dist/useDeploymentDevice.cjs.map +1 -1
  123. package/dist/useDeploymentDevice.js +16 -16
  124. package/dist/usersSlice/constants.js +1 -1
  125. package/dist/usersSlice/index.js +1 -1
  126. package/dist/usersSlice/mocks.js +1 -1
  127. package/dist/usersSlice/selectors.cjs +3 -45
  128. package/dist/usersSlice/selectors.cjs.map +1 -1
  129. package/dist/usersSlice/selectors.js +3 -3
  130. package/dist/usersSlice/thunks.cjs +14 -56
  131. package/dist/usersSlice/thunks.cjs.map +1 -1
  132. package/dist/usersSlice/thunks.js +16 -16
  133. package/dist/utils.cjs +18 -57
  134. package/dist/utils.cjs.map +1 -1
  135. package/dist/utils.d.cts +1 -3
  136. package/dist/utils.d.ts +1 -3
  137. package/dist/utils.js +2 -2
  138. package/package.json +1 -1
  139. package/dist/chunk-3NOV7X4M.js.map +0 -1
  140. package/dist/chunk-AJ6DIDO4.js.map +0 -1
  141. package/dist/chunk-KJ2SUFAU.js.map +0 -1
  142. package/dist/chunk-VCEFZTWS.js.map +0 -1
  143. /package/dist/{chunk-RJRZXDVT.js.map → chunk-3JBVI4UH.js.map} +0 -0
  144. /package/dist/{chunk-43ZBO3JW.js.map → chunk-4ZYLGBJU.js.map} +0 -0
  145. /package/dist/{chunk-AV7SRATY.js.map → chunk-E657OJL4.js.map} +0 -0
  146. /package/dist/{chunk-XOASGJZU.js.map → chunk-FXKMYYK5.js.map} +0 -0
  147. /package/dist/{chunk-ZAZTNDSY.js.map → chunk-P3N2J3QT.js.map} +0 -0
  148. /package/dist/{chunk-42GZ6FGV.js.map → chunk-PL6RIFD5.js.map} +0 -0
  149. /package/dist/{chunk-45BHMNX6.js.map → chunk-V6BWOIRC.js.map} +0 -0
@@ -3,39 +3,39 @@ import {
3
3
  setFirstLoginAfterSignup,
4
4
  setOfflineThreshold,
5
5
  setSearchState
6
- } from "../chunk-KJ2SUFAU.js";
7
- import "../chunk-AV7SRATY.js";
8
- import "../chunk-45BHMNX6.js";
9
- import "../chunk-ZAZTNDSY.js";
6
+ } from "../chunk-AY7E7VA6.js";
7
+ import "../chunk-E657OJL4.js";
8
+ import "../chunk-V6BWOIRC.js";
9
+ import "../chunk-P3N2J3QT.js";
10
10
  import "../chunk-XJLZK4QY.js";
11
11
  import "../chunk-IRQRV552.js";
12
- import "../chunk-RJRZXDVT.js";
13
- import "../chunk-TRKA7XYU.js";
12
+ import "../chunk-3JBVI4UH.js";
13
+ import "../chunk-CQXDAXQF.js";
14
14
  import "../chunk-YR65C62H.js";
15
- import "../chunk-VCEFZTWS.js";
15
+ import "../chunk-TRKA7XYU.js";
16
16
  import "../chunk-PVCHKW35.js";
17
- import "../chunk-CQXDAXQF.js";
17
+ import "../chunk-TIL2S3JA.js";
18
18
  import "../chunk-VODRLEDP.js";
19
19
  import "../chunk-6WJI4MOP.js";
20
20
  import "../chunk-OLKM53RL.js";
21
21
  import "../chunk-UVTLZV34.js";
22
22
  import "../chunk-53W2NRSL.js";
23
23
  import "../chunk-NMAXZ3ZY.js";
24
- import "../chunk-XOASGJZU.js";
25
- import "../chunk-42GZ6FGV.js";
26
- import "../chunk-43ZBO3JW.js";
27
- import "../chunk-3NOV7X4M.js";
28
- import "../chunk-YO22XLHI.js";
24
+ import "../chunk-FXKMYYK5.js";
29
25
  import "../chunk-JIS4PA3R.js";
26
+ import "../chunk-4ZYLGBJU.js";
27
+ import "../chunk-PL6RIFD5.js";
28
+ import "../chunk-YO22XLHI.js";
29
+ import "../chunk-ZZQJWNQT.js";
30
30
  import "../chunk-WR6RQKF5.js";
31
- import "../chunk-O7DR57RN.js";
31
+ import "../chunk-ZGRY42BZ.js";
32
32
  import "../chunk-4BHM6WVX.js";
33
- import "../chunk-B3C6H2PR.js";
33
+ import "../chunk-7WIISD2N.js";
34
34
  import "../chunk-WWED74SG.js";
35
35
  import "../chunk-2DYA3X77.js";
36
36
  import "../chunk-FAJ3I2UQ.js";
37
37
  import "../chunk-ZKAH3APE.js";
38
- import "../chunk-AJ6DIDO4.js";
38
+ import "../chunk-DBBE6D36.js";
39
39
  export {
40
40
  getLatestReleaseInfo,
41
41
  setFirstLoginAfterSignup,
package/dist/auth.js CHANGED
@@ -9,7 +9,7 @@ import "./chunk-WWED74SG.js";
9
9
  import "./chunk-2DYA3X77.js";
10
10
  import "./chunk-FAJ3I2UQ.js";
11
11
  import "./chunk-ZKAH3APE.js";
12
- import "./chunk-AJ6DIDO4.js";
12
+ import "./chunk-DBBE6D36.js";
13
13
  export {
14
14
  cleanUp,
15
15
  getSessionInfo,
@@ -1,18 +1,18 @@
1
1
  import {
2
- actions as actions7
3
- } from "./chunk-TRKA7XYU.js";
2
+ actions as actions5
3
+ } from "./chunk-CQXDAXQF.js";
4
4
  import {
5
5
  actions as actions8
6
6
  } from "./chunk-YR65C62H.js";
7
7
  import {
8
- actions as actions6
9
- } from "./chunk-VCEFZTWS.js";
8
+ actions as actions7
9
+ } from "./chunk-TRKA7XYU.js";
10
10
  import {
11
11
  actions as actions4
12
12
  } from "./chunk-PVCHKW35.js";
13
13
  import {
14
- actions as actions5
15
- } from "./chunk-CQXDAXQF.js";
14
+ actions as actions6
15
+ } from "./chunk-TIL2S3JA.js";
16
16
  import {
17
17
  actions as actions3
18
18
  } from "./chunk-VODRLEDP.js";
@@ -38,4 +38,4 @@ var actions_default = {
38
38
  export {
39
39
  actions_default
40
40
  };
41
- //# sourceMappingURL=chunk-RJRZXDVT.js.map
41
+ //# sourceMappingURL=chunk-3JBVI4UH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isDarkMode
3
- } from "./chunk-B3C6H2PR.js";
3
+ } from "./chunk-7WIISD2N.js";
4
4
  import {
5
5
  DEVICE_ONLINE_CUTOFF,
6
6
  READ_STATES,
@@ -79,4 +79,4 @@ export {
79
79
  getRolesInitialized,
80
80
  getSecurityAlertDismissedTimestamp
81
81
  };
82
- //# sourceMappingURL=chunk-43ZBO3JW.js.map
82
+ //# sourceMappingURL=chunk-4ZYLGBJU.js.map
@@ -16,7 +16,7 @@ import {
16
16
  } from "./chunk-2DYA3X77.js";
17
17
  import {
18
18
  DARK_MODE
19
- } from "./chunk-AJ6DIDO4.js";
19
+ } from "./chunk-DBBE6D36.js";
20
20
 
21
21
  // src/utils.ts
22
22
  import { duplicateFilter, yes } from "@northern.tech/utils/helpers";
@@ -198,18 +198,21 @@ var mapDeviceAttributes = (attributes = []) => attributes.reduce(
198
198
  { inventory: { device_type: [], artifact_name: "" }, identity: {}, monitor: {}, system: {}, tags: {} }
199
199
  );
200
200
  var isDarkMode = (mode) => mode === DARK_MODE;
201
- var parseSubscriptionPreview = (lines) => lines.reduce(
202
- (acc, { addon, amount, product }) => {
203
- const planId = product.slice("mender_".length);
204
- if (!addon) {
205
- acc[planId] = (acc[planId] ?? 0) + amount;
206
- } else {
207
- acc.addons[addon] = (acc.addons[addon] ?? 0) + amount;
208
- }
209
- return acc;
210
- },
211
- { addons: {} }
212
- );
201
+ var parseSubscriptionPreview = (lines) => lines.reduce((acc, { addon, amount, product }) => {
202
+ const tier = product.replace("mender_", "");
203
+ if (!acc[tier]) {
204
+ acc[tier] = {
205
+ amount: 0,
206
+ addons: {}
207
+ };
208
+ }
209
+ if (!addon) {
210
+ acc[tier].amount += amount;
211
+ } else {
212
+ acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;
213
+ }
214
+ return acc;
215
+ }, {});
213
216
 
214
217
  export {
215
218
  mapFiltersToTerms,
@@ -233,4 +236,4 @@ export {
233
236
  isDarkMode,
234
237
  parseSubscriptionPreview
235
238
  };
236
- //# sourceMappingURL=chunk-B3C6H2PR.js.map
239
+ //# sourceMappingURL=chunk-7WIISD2N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]) =>\n lines.reduce(\n (acc, { addon, amount, product }) => {\n const planId = product.slice('mender_'.length);\n if (!addon) {\n acc[planId] = (acc[planId] ?? 0) + amount;\n } else {\n acc.addons[addon] = (acc.addons[addon] ?? 0) + amount;\n }\n return acc;\n },\n { addons: {} }\n );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,iBAAiB,WAAW;AAqBrC,IAAM,mBAAmB;AAAA,EACvB,CAAC,yBAAyB,IAAI,GAAG,GAAG,SAAO,OAAO,GAAG,KAAK;AAAA,EAC1D,CAAC,yBAAyB,KAAK,GAAG,GAAG,SAAO,OAAO,GAAG,KAAK;AAAA,EAC3D,CAAC,yBAAyB,IAAI,GAAG,GAAG,SAAO,OAAO,GAAG,KAAK;AAAA,EAC1D,CAAC,yBAAyB,KAAK,GAAG,GAAG,SAAO,OAAO,GAAG,KAAK;AAAA,EAC3D,CAAC,yBAAyB,MAAM,GAAG,GAAG,SAAO,OAAO,GAAG,KAAK;AAAA,EAC5D,CAAC,yBAAyB,IAAI,GAAG,GAAG,UAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAAA,EAClF,CAAC,yBAAyB,KAAK,GAAG,GAAG,UAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AAAA,EACnF,CAAC,yBAAyB,QAAQ,GAAG,GAAG;AAAA,EACxC,CAAC,yBAAyB,SAAS,GAAG,GAAG,MAAM;AACjD;AACA,IAAM,gBAAgB;AAAA,EACpB,UAAU,EAAE,OAAO,yBAAyB,QAAQ,KAAK,OAAO,MAAM;AACxE;AACO,IAAM,oBAAoB,aAC/B,QAAQ,IAAI,aAAW;AAAA,EACrB,OAAO,OAAO;AAAA,EACd,WAAW,OAAO;AAAA,EAClB,MAAM,cAAc,OAAO,QAAQ,GAAG,SAAS,OAAO;AAAA,EACtD,OAAO,iBAAiB,eAAe,OAAO,QAAQ,IAAI,iBAAiB,OAAO,QAAQ,EAAE,OAAO,KAAK,IAAI,OAAO;AACrH,EAAE;AACG,IAAM,oBAAoB,WAC/B,MAAM,IAAI,UAAQ;AAChB,QAAM,gBAAgB,OAAO,QAAQ,aAAa,EAAE;AAAA,IAClD,qBAAmB,gBAAgB,CAAC,EAAE,UAAU,KAAK,QAAQ,gBAAgB,CAAC,EAAE,UAAU,KAAK;AAAA,EACjG;AACA,QAAM,WAAW,gBAAgB,cAAc,CAAC,IAAI,KAAK;AACzD,SAAO,EAAE,OAAO,KAAK,OAAgB,KAAK,KAAK,WAAW,UAAU,OAAO,KAAK,MAAM;AACxF,CAAC;AAEH,IAAM,+BAA+B,CAAC,iBAAiB,eAAe,CAAC,MACrE,gBAAgB,IAAI,UAAQ;AAC1B,MAAI,OAAO,qBAAqB,IAAI,EAAE,WAAW,UAAU,YAAY;AACrE,WAAO,EAAE,GAAG,qBAAqB,IAAI,EAAE,YAAY,OAAO,qBAAqB,IAAI,EAAE,WAAW,MAAM,YAAY,EAAE;AAAA,EACtH;AACA,SAAO,qBAAqB,IAAI,EAAE;AACpC,CAAC;AAEI,IAAM,kCAAkC,CAAC;AAAA,EAC9C,UAAU,CAAC;AAAA,EACX;AAAA,EACA,SAAS,EAAE,MAAM,CAAC,EAAE;AAAA,EACpB;AAAA,EACA,iBAAiB,CAAC;AAAA,EAClB;AACF,MAOM;AACJ,MAAI,oBAAoB,CAAC,GAAG,OAAO;AACnC,MAAI,OAAO,UAAU,YAAY,EAAE,OAAO,KAAK,KAAK,GAAG,WAAW,mBAAmB,QAAQ;AAC3F,sBAAkB,KAAK,EAAE,KAAK,SAAS,OAAO,OAAO,UAAU,yBAAyB,IAAI,KAAK,OAAO,SAAS,CAAC;AAAA,EACpH;AACA,QAAM,oBAAoB,kBAAkB;AAAA,IAC1C,YACE,CAAC,OAAO,OAAO,oBAAoB,EAAE;AAAA,MACnC,CAAC,EAAE,WAAW,MAAM,OAAO,UAAU,eAAe,WAAW,UAAU,OAAO,SAAS,WAAW,QAAQ,OAAO;AAAA,IACrH;AAAA,EACJ;AACA,QAAM,qBAAqB,6BAA6B,gBAAgB,EAAE,iBAAiB,CAAC;AAC5F,sBAAoB,CAAC,GAAG,mBAAmB,GAAG,kBAAkB;AAChE,QAAM,mBAAmB,SACrB,CAAC,GAAG,mBAAmB,EAAE,KAAK,UAAU,OAAO,QAAQ,UAAU,yBAAyB,IAAI,KAAK,OAAO,WAAW,CAAC,IACtH;AACJ,SAAO,EAAE,mBAAmB,mBAAmB,aAAa,kBAAkB,gBAAgB,EAAE;AAClG;AAEA,IAAM,gBAAgB,CAAC,QAAQ,SAAS,OAAO,KAAK,WAAW,EAAE,MAAM,SAAO,KAAK,GAAG,GAAG,SAAS,MAAM,OAAO,GAAG,GAAG,SAAS,CAAC;AAExH,IAAM,gBAAgB,CAAC,MAAM,OAAO,UAAU;AACnD,QAAM,aAAa,MAAM,UAAU,YAAU,cAAc,QAAQ,IAAI,CAAC;AACxE,SAAO,eAAe;AACxB;AAEO,IAAM,iBAAiB,CAC5B,MACA,KACA,EAAE,aAAa,4BAA4B,gBAAgB,CAAC,EAAE,MAE9D,IAAI,MAAM,GAAG,UAAU,EAAE,OAAO,CAAC,MAAM,OAAO;AAC5C,MAAI,MAAM,KAAK,EAAE,GAAG;AAClB,SAAK,KAAK,EAAE,GAAG,eAAe,GAAG,KAAK,EAAE,EAAE,CAAC;AAAA,EAC7C;AACA,SAAO;AACT,GAAG,CAAC,CAAC;AAEA,IAAM,mBAAmB,CAAC,sBAAsB,EAAE,GAAG,mBAAmB,GAAG,qBAChF,OAAO,QAAQ,mBAAmB,EAAE;AAAA,EAClC,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM;AACtB,QAAI;AACJ,QAAI,CAAC,KAAK,GAAG,GAAG;AACd,WAAK,GAAG,IAAI;AACZ,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAS,CAAC,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,EAAE,OAAO,eAAe;AAAA,IAC1D,OAAO;AACL,eAAS,iBAAiB,KAAK,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC;AAAA,IACnD;AACA,SAAK,GAAG,IAAI;AACZ,WAAO;AAAA,EACT;AAAA,EACA,EAAE,GAAG,iBAAiB;AACxB;AAEK,IAAM,8BAA8B,CAAC,WAAW,UACrD,UAAU;AAAA,EACR,CAAC,MAAM,WAAW;AAChB,QAAI,EAAE,UAAU,MAAM,MAAM,IAAI;AAC9B,aAAO;AAAA,IACT;AACA,WAAO,iBAAiB,MAAM,MAAM,MAAM,EAAE,aAAa;AAAA,EAC3D;AAAA,EACA,EAAE,GAAG,mBAAmB;AAC1B;AAEK,IAAM,WAAW,CAAC,EAAE,QAAQ,MAAM,MAAM;AAC7C,MAAI,iBAAkB,SAAS,QAAS;AACxC,SAAQ,iBAAiB,iBAAiB,KAAK,KAAK,KAAK,cAAc,IAAI,KAAK,MAAM,cAAc;AACtG;AAEO,IAAM,sBAAsB,CAAC,KAAK,WAAW,OAClD,IAAI,UAAU,MAAM,OAAO,WAAW,IAAI,UAAU,MAAM,SAAS,IAAI,SAAS,IAAI,WAAW;AAE1F,IAAM,sBAAsB,CAAC,UAAU,aAC5C,SAAS,UAAU,aAAa,kBAAmB,SAAS,SAAS,iBAAiB,IAAI,WAAW,GAAG,QAAQ,GAAG,iBAAiB,KAAM;AAErI,IAAM,iCAAiC,aAAY,MAAM,QAAQ,OAAO,CAAC,CAAC,KAAK,YAAY,SAAS,WAAW;AAE/G,IAAM,kBAAkB,aAAW;AACxC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,SAAS,UAAU;AACzB,UAAQ,OAAO,KAAK,EAAE,YAAY,GAAG;AAAA,IACnC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,QAAQ,MAAM;AAAA,EACzB;AACF;AAEO,IAAM,8BAA8B,gBAAc;AACvD,QAAM,sBAAsB,CAAC,kBAAkB,YAC7C,OAAO,OAAO,OAAO,EAAE,OAAO,CAAC,MAAM,WAAY,iBAAiB,SAAS,OAAO,MAAM,IAAI,OAAO,IAAI,MAAO,CAAC;AAEjH,QAAM,aAAa,oBAAoB,4BAA4B,YAAY,WAAW,OAAO;AACjG,QAAM,UAAU,oBAAoB,4BAA4B,SAAS,WAAW,OAAO;AAC3F,QAAM,YAAY,oBAAoB,4BAA4B,WAAW,WAAW,OAAO;AAC/F,QAAM,WAAW,oBAAoB,4BAA4B,UAAU,WAAW,OAAO;AAC7F,QAAM,SAAS,oBAAoB,4BAA4B,QAAQ,WAAW,OAAO;AACzF,SAAO,EAAE,YAAY,QAAQ,SAAS,WAAW,SAAS;AAC5D;AAEO,IAAM,gBAAgB,CAAC,OAAO,eAAe,MAAM,OAAO,CAAC,MAAM,aAAa,OAAO,OAAO,WAAW,QAAQ,KAAK,CAAC,GAAG,CAAC;AACzH,IAAM,uBAAuB,CAAC,YAAY,gBAAgB;AAC/D,QAAM,EAAE,aAAa,CAAC,EAAE,IAAI;AAC5B,QAAM,EAAE,SAAS,CAAC,EAAE,IAAI;AACxB,QAAM,QAAQ,EAAE,GAAG,cAAc,GAAG,OAAO;AAC3C,MAAI,cAAc;AAClB,MAAI,SAAS,CAAC;AACd,MAAI,aAAa;AACf,kBAAc;AACd,WAAO,UAAU,cAAc,YAAY,SAAS,KAAK;AAAA,EAC3D;AACA,WAAS;AAAA,IACP,GAAG;AAAA;AAAA,IAEH,YAAY,cAAc,YAAY,YAAY,KAAK;AAAA,IACvD,SAAS,cAAc,YAAY,SAAS,KAAK;AAAA,IACjD,WAAW,cAAc,YAAY,WAAW,KAAK;AAAA,IACrD,UAAU,cAAc,YAAY,UAAU,KAAK;AAAA,IACnD,QAAQ,cAAc,YAAY,QAAQ,KAAK;AAAA,EACjD;AACA,SAAO;AACT;AAEO,IAAM,qBAAqB,gBAAc;AAC9C,QAAM,EAAE,QAAQ,mBAAmB,kBAAkB,QAAQ,IAAI;AACjE,QAAM,EAAE,YAAY,sBAAsB,OAAO,IAAI,qBAAqB,UAAU;AAEpF,MAAI,SAAS,wBAAwB,gBAAgB;AACrD,MAAI,qBAAqB,kBAAkB,WAAW,yBAAyB,GAAG;AAChF,aAAS;AAAA,EACX,WAAW,SAAS,GAAG;AACrB,aAAS,wBAAwB;AAAA,EACnC;AACA,SAAO;AACT;AAEO,IAAM,iCAAiC,CAAC,QAAQ,cACrD,UAAU,OAAO,OAAO,SACpB,GAAG,SAAS,KAAK,OAAO,MACrB,IAAI,CAAAA,YAAU,GAAGA,QAAO,aAAaA,QAAO,GAAG,IAAI,yBAAyBA,QAAO,QAAQA,QAAO,QAAQ,EAAE,SAAS,IAAIA,QAAO,KAAK,EAAE,EACvI,KAAK,IAAI,CAAC,MACb;AAEC,IAAM,sBAAsB,CACjC,aAAgC,CAAC,MAQjC,WAAW;AAAA,EACT,CAAC,MAAM,cAAc;AACnB,QAAI,EAAE,UAAU,SAAS,UAAU,SAAS,UAAU,UAAU,iBAAiB,WAAW;AAC1F,aAAO;AAAA,IACT;AACA,SAAK,UAAU,SAAS,iBAAiB,SAAS,IAAI;AAAA,MACpD,GAAG,KAAK,UAAU,SAAS,iBAAiB,SAAS;AAAA,MACrD,CAAC,UAAU,IAAI,GAAG,UAAU;AAAA,IAC9B;AACA,QAAI,UAAU,SAAS,iBAAiB,UAAU,UAAU,iBAAiB,WAAW;AACtF,WAAK,UAAU,cAAc,CAAC,EAAE,OAAO,UAAU,KAAK;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EACA,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,eAAe,GAAG,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,EAAE;AACvG;AAEK,IAAM,aAAa,UAAQ,SAAS;AAGpC,IAAM,2BAA2B,CAAC,UACvC,MAAM;AAAA,EACJ,CAAC,KAAK,EAAE,OAAO,QAAQ,QAAQ,MAAM;AACnC,UAAM,SAAS,QAAQ,MAAM,UAAU,MAAM;AAC7C,QAAI,CAAC,OAAO;AACV,UAAI,MAAM,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,IACrC,OAAO;AACL,UAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,KAAK;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EACA,EAAE,QAAQ,CAAC,EAAE;AACf;","names":["filter"]}
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n"],"mappings":"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","names":["filter"]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  getDeviceMonitorConfig,
3
3
  getLatestDeviceAlerts
4
- } from "./chunk-45BHMNX6.js";
4
+ } from "./chunk-V6BWOIRC.js";
5
5
  import {
6
6
  commonErrorFallback,
7
7
  commonErrorHandler,
8
8
  createAppAsyncThunk
9
- } from "./chunk-ZAZTNDSY.js";
9
+ } from "./chunk-P3N2J3QT.js";
10
10
  import {
11
11
  users_api_default
12
12
  } from "./chunk-XJLZK4QY.js";
@@ -15,7 +15,11 @@ import {
15
15
  } from "./chunk-IRQRV552.js";
16
16
  import {
17
17
  actions_default
18
- } from "./chunk-RJRZXDVT.js";
18
+ } from "./chunk-3JBVI4UH.js";
19
+ import {
20
+ actions as actions4,
21
+ sliceName as sliceName4
22
+ } from "./chunk-CQXDAXQF.js";
19
23
  import {
20
24
  actions as actions6,
21
25
  sliceName as sliceName6
@@ -23,11 +27,7 @@ import {
23
27
  import {
24
28
  actions as actions5,
25
29
  sliceName as sliceName5
26
- } from "./chunk-VCEFZTWS.js";
27
- import {
28
- actions as actions4,
29
- sliceName as sliceName4
30
- } from "./chunk-CQXDAXQF.js";
30
+ } from "./chunk-TIL2S3JA.js";
31
31
  import {
32
32
  actions as actions3,
33
33
  sliceName as sliceName3
@@ -52,7 +52,7 @@ import {
52
52
  getSearchEndpoint,
53
53
  getTenantCapabilities,
54
54
  getUserCapabilities
55
- } from "./chunk-XOASGJZU.js";
55
+ } from "./chunk-FXKMYYK5.js";
56
56
  import {
57
57
  getCurrentSession,
58
58
  getCurrentUser,
@@ -64,13 +64,13 @@ import {
64
64
  getTooltipsState,
65
65
  getUserSettings,
66
66
  getUsersById
67
- } from "./chunk-43ZBO3JW.js";
67
+ } from "./chunk-4ZYLGBJU.js";
68
68
  import {
69
69
  getAuditlogState,
70
70
  getDeviceTwinIntegrations,
71
71
  getOrganization,
72
72
  getTenantsList
73
- } from "./chunk-3NOV7X4M.js";
73
+ } from "./chunk-ZZQJWNQT.js";
74
74
  import {
75
75
  getDeploymentsById,
76
76
  getDeploymentsByStatus
@@ -85,7 +85,7 @@ import {
85
85
  getDevicesById,
86
86
  getGroupsById,
87
87
  getSelectedGroup
88
- } from "./chunk-O7DR57RN.js";
88
+ } from "./chunk-ZGRY42BZ.js";
89
89
  import {
90
90
  getFeatures,
91
91
  getSearchState
@@ -101,7 +101,7 @@ import {
101
101
  mergePermissions,
102
102
  parseSubscriptionPreview,
103
103
  progress
104
- } from "./chunk-B3C6H2PR.js";
104
+ } from "./chunk-7WIISD2N.js";
105
105
  import {
106
106
  ALL_DEVICE_STATES,
107
107
  ALL_RELEASES,
@@ -162,8 +162,10 @@ import {
162
162
  orderedOnboardingSteps
163
163
  } from "./chunk-FAJ3I2UQ.js";
164
164
  import {
165
+ ADDONS,
166
+ PLANS,
165
167
  locations
166
- } from "./chunk-AJ6DIDO4.js";
168
+ } from "./chunk-DBBE6D36.js";
167
169
 
168
170
  // src/appSlice/thunks.ts
169
171
  import { deepCompare as deepCompare4, extractErrorMessage as extractErrorMessage3 } from "@northern.tech/utils/helpers";
@@ -1550,6 +1552,63 @@ var cancelRequest = createAppAsyncThunk(`${sliceName5}/cancelRequest`, (reason,
1550
1552
  () => Promise.resolve(dispatch(setSnackbar3({ message: "Deactivation request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds })))
1551
1553
  );
1552
1554
  });
1555
+ var getTierId = (tierName) => tierName.replace("mender_", "");
1556
+ var getProductPlans = (products) => products.reduce(
1557
+ (plansById, product) => {
1558
+ const { name, prices } = product;
1559
+ const tierId = getTierId(name);
1560
+ prices.forEach((price) => {
1561
+ const existing = plansById[price.plan] ?? { ...PLANS[price.plan], tierLimitsConstrains: {} };
1562
+ const tierConstraints = price.constraints ? { [tierId]: { min: price.constraints.min, max: price.constraints.max, div: price.constraints.div } } : {};
1563
+ plansById[price.plan] = {
1564
+ ...existing,
1565
+ tierLimitsConstrains: {
1566
+ ...existing.tierLimitsConstrains,
1567
+ ...tierConstraints
1568
+ }
1569
+ };
1570
+ });
1571
+ return plansById;
1572
+ },
1573
+ { enterprise: { ...PLANS.enterprise } }
1574
+ );
1575
+ var getProductAddons = (products) => products.reduce((accu, product) => {
1576
+ const { addons = [] } = product;
1577
+ addons.forEach((addon) => {
1578
+ const { name: addonName = "", prices: addonPrices = [] } = addon;
1579
+ const existingEligible = accu[addonName]?.eligible ?? [];
1580
+ const newEligible = addonPrices.map((p) => p.plan);
1581
+ accu[addonName] = {
1582
+ ...ADDONS[addonName],
1583
+ eligible: [.../* @__PURE__ */ new Set([...existingEligible, ...newEligible, PLANS.enterprise.id])]
1584
+ };
1585
+ });
1586
+ return accu;
1587
+ }, {});
1588
+ var transformProductResponse = (products) => {
1589
+ const tiers = [];
1590
+ const sortedProducts = products.sort((a, b) => a.name.localeCompare(b.name));
1591
+ sortedProducts.forEach((tier) => {
1592
+ const addonsSupported = Object.fromEntries((tier.addons || []).map((addon) => [addon.name, addon.prices?.map((p) => p.plan)]));
1593
+ const allPlans = tier.prices.map((price) => price.plan);
1594
+ const addonsTransposed = allPlans.reduce((acc, plan) => {
1595
+ acc[plan] = Object.entries(addonsSupported).filter(([, addonSupportedPlans]) => addonSupportedPlans.includes(plan)).map(([addon]) => addon);
1596
+ return acc;
1597
+ }, {});
1598
+ const tierId = getTierId(tier.name);
1599
+ tiers.push({
1600
+ id: tierId,
1601
+ title: tierId,
1602
+ stripeProductName: tier.name,
1603
+ limitConstrains: Object.fromEntries(tier.prices.map((p) => [p.plan, p.constraints])),
1604
+ addons: addonsSupported,
1605
+ addonsByPlan: addonsTransposed
1606
+ });
1607
+ });
1608
+ const plans = getProductPlans(products);
1609
+ const addons = getProductAddons(products);
1610
+ return { plans, tiers, addons };
1611
+ };
1553
1612
  var getTargetLocation = (key) => {
1554
1613
  if (devLocations.includes(window.location.hostname)) {
1555
1614
  return "";
@@ -1764,7 +1823,7 @@ var getUserSubscription = createAppAsyncThunk(`${sliceName5}/getUserSubscription
1764
1823
  });
1765
1824
  var getBillingPreview = createAppAsyncThunk(
1766
1825
  `${sliceName5}/getBillingPreview`,
1767
- (order, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order).catch((err) => commonErrorHandler(err, "There was an error getting your billing information:", dispatch, commonErrorFallback)).then(({ data }) => order.preview_mode === "recurring" ? { ...parseSubscriptionPreview(data.lines), total: data.total } : data)
1826
+ (order, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/billing/subscription/invoices/preview`, order).catch((err) => commonErrorHandler(err, "There was an error getting your billing information:", dispatch, commonErrorFallback)).then(({ data }) => order.preview_mode === "recurring" ? { items: parseSubscriptionPreview(data.lines), total: data.total } : data)
1768
1827
  );
1769
1828
  var getCurrentSubscription = createAppAsyncThunk(
1770
1829
  `${sliceName5}/getCurrentSubscription`,
@@ -1775,6 +1834,10 @@ var getCurrentSubscription = createAppAsyncThunk(
1775
1834
  return commonErrorHandler(err, "There was an error retrieving your current subscription", dispatch, commonErrorFallback);
1776
1835
  })
1777
1836
  );
1837
+ var getProducts = createAppAsyncThunk(
1838
+ `${sliceName5}/getEnabledTiers`,
1839
+ (_, { dispatch }) => general_api_default.get(`${tenantadmApiUrlv2}/billing/products`).catch((err) => commonErrorHandler(err, "There was an error getting Mender products:", dispatch, commonErrorFallback)).then((res) => dispatch(actions5.setProducts(transformProductResponse(res.data))))
1840
+ );
1778
1841
  var requestPlanUpgrade = createAppAsyncThunk(
1779
1842
  `${sliceName5}/requestPlanUpgrade`,
1780
1843
  (order, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/billing/subscription`, order).catch((err) => commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback)).then(() => Promise.all([setTimeout(() => dispatch(getDeviceLimits()), TIMEOUTS.threeSeconds), dispatch(getUserOrganization())]))
@@ -2704,6 +2767,7 @@ export {
2704
2767
  setOnboardingCanceled,
2705
2768
  advanceOnboarding,
2706
2769
  cancelRequest,
2770
+ transformProductResponse,
2707
2771
  getTargetLocation,
2708
2772
  createOrganizationTrial,
2709
2773
  startCardUpdate,
@@ -2728,6 +2792,7 @@ export {
2728
2792
  getUserSubscription,
2729
2793
  getBillingPreview,
2730
2794
  getCurrentSubscription,
2795
+ getProducts,
2731
2796
  requestPlanUpgrade,
2732
2797
  sendSupportMessage,
2733
2798
  requestPlanChange,
@@ -2780,4 +2845,4 @@ export {
2780
2845
  setAllTooltipsReadState,
2781
2846
  submitUserFeedback
2782
2847
  };
2783
- //# sourceMappingURL=chunk-KJ2SUFAU.js.map
2848
+ //# sourceMappingURL=chunk-AY7E7VA6.js.map