@northern.tech/store 0.19.1 → 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.
- package/dist/actions.cjs +3 -0
- package/dist/actions.cjs.map +1 -1
- package/dist/actions.d.cts +2 -1
- package/dist/actions.d.ts +2 -1
- package/dist/actions.js +6 -6
- package/dist/api/general-api.js +2 -2
- package/dist/api/users-api.js +2 -2
- package/dist/appSlice/constants.cjs +11 -49
- package/dist/appSlice/constants.cjs.map +1 -1
- package/dist/appSlice/constants.d.cts +1 -16
- package/dist/appSlice/constants.d.ts +1 -16
- package/dist/appSlice/constants.js +1 -1
- package/dist/appSlice/index.js +2 -2
- package/dist/appSlice/mocks.js +2 -2
- package/dist/appSlice/thunks.cjs +30 -60
- package/dist/appSlice/thunks.cjs.map +1 -1
- package/dist/appSlice/thunks.js +17 -17
- package/dist/auth.js +2 -2
- package/dist/{chunk-QFYYTAYD.js → chunk-3JBVI4UH.js} +9 -9
- package/dist/{chunk-QL6FN2JC.js → chunk-4ZYLGBJU.js} +2 -2
- package/dist/{chunk-U5TPV5X5.js → chunk-7WIISD2N.js} +17 -14
- package/dist/{chunk-U5TPV5X5.js.map → chunk-7WIISD2N.js.map} +1 -1
- package/dist/{chunk-FUGCLQ5L.js → chunk-AY7E7VA6.js} +102 -28
- package/dist/chunk-AY7E7VA6.js.map +1 -0
- package/dist/{chunk-EL672W25.js → chunk-DBBE6D36.js} +12 -50
- package/dist/chunk-DBBE6D36.js.map +1 -0
- package/dist/{chunk-GBXG2XBY.js → chunk-E657OJL4.js} +6 -6
- package/dist/{chunk-MZ5NRW3K.js → chunk-FXKMYYK5.js} +17 -17
- package/dist/{chunk-KJHHSYGP.js → chunk-P3N2J3QT.js} +10 -10
- package/dist/{chunk-GEQ2QQEE.js → chunk-PL6RIFD5.js} +2 -2
- package/dist/{chunk-VCEFZTWS.js → chunk-TIL2S3JA.js} +4 -1
- package/dist/chunk-TIL2S3JA.js.map +1 -0
- package/dist/{chunk-C3EMLDPU.js → chunk-V6BWOIRC.js} +6 -6
- package/dist/{chunk-O7DR57RN.js → chunk-ZGRY42BZ.js} +9 -12
- package/dist/{chunk-O7DR57RN.js.map → chunk-ZGRY42BZ.js.map} +1 -1
- package/dist/{chunk-3NOV7X4M.js → chunk-ZZQJWNQT.js} +3 -1
- package/dist/chunk-ZZQJWNQT.js.map +1 -0
- package/dist/commonConstants.js +2 -2
- package/dist/commonSelectors.cjs +19 -60
- package/dist/commonSelectors.cjs.map +1 -1
- package/dist/commonSelectors.js +9 -9
- package/dist/constants.cjs +11 -49
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.js +2 -2
- package/dist/deploymentsSlice/constants.js +2 -2
- package/dist/deploymentsSlice/index.js +2 -2
- package/dist/deploymentsSlice/mocks.js +2 -2
- package/dist/deploymentsSlice/selectors.js +2 -2
- package/dist/deploymentsSlice/thunks.cjs +30 -60
- package/dist/deploymentsSlice/thunks.cjs.map +1 -1
- package/dist/deploymentsSlice/thunks.js +17 -17
- package/dist/devicesSlice/constants.js +2 -2
- package/dist/devicesSlice/index.js +2 -2
- package/dist/devicesSlice/mocks.js +2 -2
- package/dist/devicesSlice/selectors.cjs +8 -11
- package/dist/devicesSlice/selectors.cjs.map +1 -1
- package/dist/devicesSlice/selectors.js +3 -3
- package/dist/devicesSlice/thunks.cjs +32 -60
- package/dist/devicesSlice/thunks.cjs.map +1 -1
- package/dist/devicesSlice/thunks.d.cts +41 -3
- package/dist/devicesSlice/thunks.d.ts +41 -3
- package/dist/devicesSlice/thunks.js +19 -17
- package/dist/liststatehook.js +2 -2
- package/dist/locationutils.js +2 -2
- package/dist/monitorSlice/index.js +2 -2
- package/dist/monitorSlice/mocks.js +2 -2
- package/dist/monitorSlice/thunks.cjs +22 -60
- package/dist/monitorSlice/thunks.cjs.map +1 -1
- package/dist/monitorSlice/thunks.js +15 -15
- package/dist/onboardingSlice/thunks.cjs +30 -60
- package/dist/onboardingSlice/thunks.cjs.map +1 -1
- package/dist/onboardingSlice/thunks.js +17 -17
- package/dist/organizationSlice/constants.js +2 -2
- package/dist/organizationSlice/index.cjs +3 -0
- package/dist/organizationSlice/index.cjs.map +1 -1
- package/dist/organizationSlice/index.d.cts +4 -1
- package/dist/organizationSlice/index.d.ts +4 -1
- package/dist/organizationSlice/index.js +3 -3
- package/dist/organizationSlice/mocks.cjs +175 -0
- package/dist/organizationSlice/mocks.cjs.map +1 -1
- package/dist/organizationSlice/mocks.d.cts +121 -2
- package/dist/organizationSlice/mocks.d.ts +121 -2
- package/dist/organizationSlice/mocks.js +88 -3
- package/dist/organizationSlice/mocks.js.map +1 -1
- package/dist/organizationSlice/selectors.cjs +3 -0
- package/dist/organizationSlice/selectors.cjs.map +1 -1
- package/dist/organizationSlice/selectors.d.cts +3 -2
- package/dist/organizationSlice/selectors.d.ts +3 -2
- package/dist/organizationSlice/selectors.js +5 -3
- package/dist/organizationSlice/thunks.cjs +113 -75
- package/dist/organizationSlice/thunks.cjs.map +1 -1
- package/dist/organizationSlice/thunks.d.cts +17 -3
- package/dist/organizationSlice/thunks.d.ts +17 -3
- package/dist/organizationSlice/thunks.js +23 -19
- package/dist/organizationSlice/types.cjs.map +1 -1
- package/dist/organizationSlice/types.d.cts +30 -7
- package/dist/organizationSlice/types.d.ts +30 -7
- package/dist/releasesSlice/index.js +2 -2
- package/dist/releasesSlice/mocks.js +2 -2
- package/dist/releasesSlice/selectors.cjs.map +1 -1
- package/dist/releasesSlice/selectors.js +4 -4
- package/dist/releasesSlice/thunks.cjs +22 -60
- package/dist/releasesSlice/thunks.cjs.map +1 -1
- package/dist/releasesSlice/thunks.js +15 -15
- package/dist/selectors.cjs +22 -60
- package/dist/selectors.cjs.map +1 -1
- package/dist/selectors.d.cts +1 -1
- package/dist/selectors.d.ts +1 -1
- package/dist/selectors.js +39 -37
- package/dist/sockethook.js +2 -2
- package/dist/store.cjs +3 -0
- package/dist/store.cjs.map +1 -1
- package/dist/store.js +7 -7
- package/dist/storehooks.cjs +109 -74
- package/dist/storehooks.cjs.map +1 -1
- package/dist/storehooks.js +24 -22
- package/dist/storehooks.js.map +1 -1
- package/dist/thunks.cjs +113 -73
- package/dist/thunks.cjs.map +1 -1
- package/dist/thunks.d.cts +2 -2
- package/dist/thunks.d.ts +2 -2
- package/dist/thunks.js +23 -17
- package/dist/useDeploymentDevice.cjs +30 -60
- package/dist/useDeploymentDevice.cjs.map +1 -1
- package/dist/useDeploymentDevice.js +19 -19
- package/dist/usersSlice/constants.js +2 -2
- package/dist/usersSlice/index.js +2 -2
- package/dist/usersSlice/mocks.js +2 -2
- package/dist/usersSlice/selectors.cjs +11 -49
- package/dist/usersSlice/selectors.cjs.map +1 -1
- package/dist/usersSlice/selectors.js +4 -4
- package/dist/usersSlice/thunks.cjs +30 -60
- package/dist/usersSlice/thunks.cjs.map +1 -1
- package/dist/usersSlice/thunks.js +17 -17
- package/dist/utils.cjs +26 -61
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +1 -3
- package/dist/utils.d.ts +1 -3
- package/dist/utils.js +3 -3
- package/package.json +3 -3
- package/dist/chunk-3NOV7X4M.js.map +0 -1
- package/dist/chunk-EL672W25.js.map +0 -1
- package/dist/chunk-FUGCLQ5L.js.map +0 -1
- package/dist/chunk-VCEFZTWS.js.map +0 -1
- /package/dist/{chunk-QFYYTAYD.js.map → chunk-3JBVI4UH.js.map} +0 -0
- /package/dist/{chunk-QL6FN2JC.js.map → chunk-4ZYLGBJU.js.map} +0 -0
- /package/dist/{chunk-GBXG2XBY.js.map → chunk-E657OJL4.js.map} +0 -0
- /package/dist/{chunk-MZ5NRW3K.js.map → chunk-FXKMYYK5.js.map} +0 -0
- /package/dist/{chunk-KJHHSYGP.js.map → chunk-P3N2J3QT.js.map} +0 -0
- /package/dist/{chunk-GEQ2QQEE.js.map → chunk-PL6RIFD5.js.map} +0 -0
- /package/dist/{chunk-C3EMLDPU.js.map → chunk-V6BWOIRC.js.map} +0 -0
package/dist/appSlice/thunks.js
CHANGED
|
@@ -3,39 +3,39 @@ import {
|
|
|
3
3
|
setFirstLoginAfterSignup,
|
|
4
4
|
setOfflineThreshold,
|
|
5
5
|
setSearchState
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
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-
|
|
12
|
+
import "../chunk-3JBVI4UH.js";
|
|
13
|
+
import "../chunk-CQXDAXQF.js";
|
|
13
14
|
import "../chunk-YR65C62H.js";
|
|
14
|
-
import "../chunk-VODRLEDP.js";
|
|
15
15
|
import "../chunk-TRKA7XYU.js";
|
|
16
|
-
import "../chunk-CQXDAXQF.js";
|
|
17
|
-
import "../chunk-VCEFZTWS.js";
|
|
18
16
|
import "../chunk-PVCHKW35.js";
|
|
17
|
+
import "../chunk-TIL2S3JA.js";
|
|
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-
|
|
25
|
-
import "../chunk-QL6FN2JC.js";
|
|
26
|
-
import "../chunk-O7DR57RN.js";
|
|
27
|
-
import "../chunk-GEQ2QQEE.js";
|
|
24
|
+
import "../chunk-FXKMYYK5.js";
|
|
28
25
|
import "../chunk-JIS4PA3R.js";
|
|
29
|
-
import "../chunk-
|
|
30
|
-
import "../chunk-
|
|
26
|
+
import "../chunk-4ZYLGBJU.js";
|
|
27
|
+
import "../chunk-PL6RIFD5.js";
|
|
31
28
|
import "../chunk-YO22XLHI.js";
|
|
29
|
+
import "../chunk-ZZQJWNQT.js";
|
|
30
|
+
import "../chunk-WR6RQKF5.js";
|
|
31
|
+
import "../chunk-ZGRY42BZ.js";
|
|
32
32
|
import "../chunk-4BHM6WVX.js";
|
|
33
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-7WIISD2N.js";
|
|
34
34
|
import "../chunk-WWED74SG.js";
|
|
35
35
|
import "../chunk-2DYA3X77.js";
|
|
36
|
-
import "../chunk-ZKAH3APE.js";
|
|
37
36
|
import "../chunk-FAJ3I2UQ.js";
|
|
38
|
-
import "../chunk-
|
|
37
|
+
import "../chunk-ZKAH3APE.js";
|
|
38
|
+
import "../chunk-DBBE6D36.js";
|
|
39
39
|
export {
|
|
40
40
|
getLatestReleaseInfo,
|
|
41
41
|
setFirstLoginAfterSignup,
|
package/dist/auth.js
CHANGED
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
} from "./chunk-UVTLZV34.js";
|
|
8
8
|
import "./chunk-WWED74SG.js";
|
|
9
9
|
import "./chunk-2DYA3X77.js";
|
|
10
|
-
import "./chunk-ZKAH3APE.js";
|
|
11
10
|
import "./chunk-FAJ3I2UQ.js";
|
|
12
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-ZKAH3APE.js";
|
|
12
|
+
import "./chunk-DBBE6D36.js";
|
|
13
13
|
export {
|
|
14
14
|
cleanUp,
|
|
15
15
|
getSessionInfo,
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
actions as actions5
|
|
3
|
+
} from "./chunk-CQXDAXQF.js";
|
|
1
4
|
import {
|
|
2
5
|
actions as actions8
|
|
3
6
|
} from "./chunk-YR65C62H.js";
|
|
4
|
-
import {
|
|
5
|
-
actions as actions3
|
|
6
|
-
} from "./chunk-VODRLEDP.js";
|
|
7
7
|
import {
|
|
8
8
|
actions as actions7
|
|
9
9
|
} from "./chunk-TRKA7XYU.js";
|
|
10
10
|
import {
|
|
11
|
-
actions as
|
|
12
|
-
} from "./chunk-
|
|
11
|
+
actions as actions4
|
|
12
|
+
} from "./chunk-PVCHKW35.js";
|
|
13
13
|
import {
|
|
14
14
|
actions as actions6
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-TIL2S3JA.js";
|
|
16
16
|
import {
|
|
17
|
-
actions as
|
|
18
|
-
} from "./chunk-
|
|
17
|
+
actions as actions3
|
|
18
|
+
} from "./chunk-VODRLEDP.js";
|
|
19
19
|
import {
|
|
20
20
|
actions
|
|
21
21
|
} from "./chunk-6WJI4MOP.js";
|
|
@@ -38,4 +38,4 @@ var actions_default = {
|
|
|
38
38
|
export {
|
|
39
39
|
actions_default
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-3JBVI4UH.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isDarkMode
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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-
|
|
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":"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","names":["filter"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n"],"mappings":"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","names":["filter"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getDeviceMonitorConfig,
|
|
3
3
|
getLatestDeviceAlerts
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-V6BWOIRC.js";
|
|
5
5
|
import {
|
|
6
6
|
commonErrorFallback,
|
|
7
7
|
commonErrorHandler,
|
|
8
8
|
createAppAsyncThunk
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-P3N2J3QT.js";
|
|
10
10
|
import {
|
|
11
11
|
users_api_default
|
|
12
12
|
} from "./chunk-XJLZK4QY.js";
|
|
@@ -15,23 +15,23 @@ import {
|
|
|
15
15
|
} from "./chunk-IRQRV552.js";
|
|
16
16
|
import {
|
|
17
17
|
actions_default
|
|
18
|
-
} from "./chunk-
|
|
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
|
|
22
26
|
} from "./chunk-YR65C62H.js";
|
|
27
|
+
import {
|
|
28
|
+
actions as actions5,
|
|
29
|
+
sliceName as sliceName5
|
|
30
|
+
} from "./chunk-TIL2S3JA.js";
|
|
23
31
|
import {
|
|
24
32
|
actions as actions3,
|
|
25
33
|
sliceName as sliceName3
|
|
26
34
|
} from "./chunk-VODRLEDP.js";
|
|
27
|
-
import {
|
|
28
|
-
actions as actions4,
|
|
29
|
-
sliceName as sliceName4
|
|
30
|
-
} from "./chunk-CQXDAXQF.js";
|
|
31
|
-
import {
|
|
32
|
-
actions as actions5,
|
|
33
|
-
sliceName as sliceName5
|
|
34
|
-
} from "./chunk-VCEFZTWS.js";
|
|
35
35
|
import {
|
|
36
36
|
actions,
|
|
37
37
|
sliceName
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
getSearchEndpoint,
|
|
53
53
|
getTenantCapabilities,
|
|
54
54
|
getUserCapabilities
|
|
55
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-FXKMYYK5.js";
|
|
56
56
|
import {
|
|
57
57
|
getCurrentSession,
|
|
58
58
|
getCurrentUser,
|
|
@@ -64,7 +64,17 @@ import {
|
|
|
64
64
|
getTooltipsState,
|
|
65
65
|
getUserSettings,
|
|
66
66
|
getUsersById
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-4ZYLGBJU.js";
|
|
68
|
+
import {
|
|
69
|
+
getAuditlogState,
|
|
70
|
+
getDeviceTwinIntegrations,
|
|
71
|
+
getOrganization,
|
|
72
|
+
getTenantsList
|
|
73
|
+
} from "./chunk-ZZQJWNQT.js";
|
|
74
|
+
import {
|
|
75
|
+
getDeploymentsById,
|
|
76
|
+
getDeploymentsByStatus
|
|
77
|
+
} from "./chunk-WR6RQKF5.js";
|
|
68
78
|
import {
|
|
69
79
|
getAcceptedDevices,
|
|
70
80
|
getDeviceById,
|
|
@@ -75,17 +85,7 @@ import {
|
|
|
75
85
|
getDevicesById,
|
|
76
86
|
getGroupsById,
|
|
77
87
|
getSelectedGroup
|
|
78
|
-
} from "./chunk-
|
|
79
|
-
import {
|
|
80
|
-
getAuditlogState,
|
|
81
|
-
getDeviceTwinIntegrations,
|
|
82
|
-
getOrganization,
|
|
83
|
-
getTenantsList
|
|
84
|
-
} from "./chunk-3NOV7X4M.js";
|
|
85
|
-
import {
|
|
86
|
-
getDeploymentsById,
|
|
87
|
-
getDeploymentsByStatus
|
|
88
|
-
} from "./chunk-WR6RQKF5.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-
|
|
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-
|
|
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";
|
|
@@ -652,11 +654,18 @@ var addStaticGroup = createAppAsyncThunk(
|
|
|
652
654
|
)
|
|
653
655
|
).catch((err) => commonErrorHandler(err, `Group could not be updated:`, dispatch))
|
|
654
656
|
);
|
|
657
|
+
var removeReportsByGroupName = createAppAsyncThunk(`${sliceName3}/removeReportsByGroupName`, (groupName, { dispatch, getState }) => {
|
|
658
|
+
if (!groupName) return Promise.resolve();
|
|
659
|
+
const reports = getDeviceReportsForUser(getState());
|
|
660
|
+
const filteredReports = reports.filter((report) => report.group !== groupName);
|
|
661
|
+
dispatch(saveUserSettings({ reports: filteredReports }));
|
|
662
|
+
});
|
|
655
663
|
var removeStaticGroup = createAppAsyncThunk(
|
|
656
664
|
`${sliceName3}/removeStaticGroup`,
|
|
657
665
|
(groupName, { dispatch }) => general_api_default.delete(`${inventoryApiUrl}/groups/${groupName}`).then(
|
|
658
666
|
() => Promise.all([
|
|
659
667
|
dispatch(actions3.removeGroup(groupName)),
|
|
668
|
+
dispatch(removeReportsByGroupName(groupName)),
|
|
660
669
|
dispatch(getGroups()),
|
|
661
670
|
dispatch(setSnackbar2({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
|
|
662
671
|
])
|
|
@@ -722,6 +731,7 @@ var removeDynamicGroup = createAppAsyncThunk(`${sliceName3}/removeDynamicGroup`,
|
|
|
722
731
|
return general_api_default.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(
|
|
723
732
|
() => Promise.all([
|
|
724
733
|
dispatch(actions3.removeGroup(groupName)),
|
|
734
|
+
dispatch(removeReportsByGroupName(groupName)),
|
|
725
735
|
dispatch(setSnackbar2({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
|
|
726
736
|
])
|
|
727
737
|
);
|
|
@@ -1542,6 +1552,63 @@ var cancelRequest = createAppAsyncThunk(`${sliceName5}/cancelRequest`, (reason,
|
|
|
1542
1552
|
() => Promise.resolve(dispatch(setSnackbar3({ message: "Deactivation request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds })))
|
|
1543
1553
|
);
|
|
1544
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
|
+
};
|
|
1545
1612
|
var getTargetLocation = (key) => {
|
|
1546
1613
|
if (devLocations.includes(window.location.hostname)) {
|
|
1547
1614
|
return "";
|
|
@@ -1756,7 +1823,7 @@ var getUserSubscription = createAppAsyncThunk(`${sliceName5}/getUserSubscription
|
|
|
1756
1823
|
});
|
|
1757
1824
|
var getBillingPreview = createAppAsyncThunk(
|
|
1758
1825
|
`${sliceName5}/getBillingPreview`,
|
|
1759
|
-
(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" ? {
|
|
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)
|
|
1760
1827
|
);
|
|
1761
1828
|
var getCurrentSubscription = createAppAsyncThunk(
|
|
1762
1829
|
`${sliceName5}/getCurrentSubscription`,
|
|
@@ -1767,6 +1834,10 @@ var getCurrentSubscription = createAppAsyncThunk(
|
|
|
1767
1834
|
return commonErrorHandler(err, "There was an error retrieving your current subscription", dispatch, commonErrorFallback);
|
|
1768
1835
|
})
|
|
1769
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
|
+
);
|
|
1770
1841
|
var requestPlanUpgrade = createAppAsyncThunk(
|
|
1771
1842
|
`${sliceName5}/requestPlanUpgrade`,
|
|
1772
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())]))
|
|
@@ -2648,6 +2719,7 @@ export {
|
|
|
2648
2719
|
addDevicesToGroup,
|
|
2649
2720
|
removeDevicesFromGroup,
|
|
2650
2721
|
addStaticGroup,
|
|
2722
|
+
removeReportsByGroupName,
|
|
2651
2723
|
removeStaticGroup,
|
|
2652
2724
|
getDynamicGroups,
|
|
2653
2725
|
addDynamicGroup,
|
|
@@ -2695,6 +2767,7 @@ export {
|
|
|
2695
2767
|
setOnboardingCanceled,
|
|
2696
2768
|
advanceOnboarding,
|
|
2697
2769
|
cancelRequest,
|
|
2770
|
+
transformProductResponse,
|
|
2698
2771
|
getTargetLocation,
|
|
2699
2772
|
createOrganizationTrial,
|
|
2700
2773
|
startCardUpdate,
|
|
@@ -2719,6 +2792,7 @@ export {
|
|
|
2719
2792
|
getUserSubscription,
|
|
2720
2793
|
getBillingPreview,
|
|
2721
2794
|
getCurrentSubscription,
|
|
2795
|
+
getProducts,
|
|
2722
2796
|
requestPlanUpgrade,
|
|
2723
2797
|
sendSupportMessage,
|
|
2724
2798
|
requestPlanChange,
|
|
@@ -2771,4 +2845,4 @@ export {
|
|
|
2771
2845
|
setAllTooltipsReadState,
|
|
2772
2846
|
submitUserFeedback
|
|
2773
2847
|
};
|
|
2774
|
-
//# sourceMappingURL=chunk-
|
|
2848
|
+
//# sourceMappingURL=chunk-AY7E7VA6.js.map
|