@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/storehooks.js
CHANGED
|
@@ -11,28 +11,29 @@ import {
|
|
|
11
11
|
getIntegrations,
|
|
12
12
|
getLatestReleaseInfo,
|
|
13
13
|
getOnboardingState as getOnboardingState2,
|
|
14
|
+
getProducts,
|
|
14
15
|
getRoles,
|
|
15
16
|
getUserOrganization,
|
|
16
17
|
getUserSettings as getUserSettings2,
|
|
17
18
|
saveGlobalSettings,
|
|
18
19
|
saveUserSettings
|
|
19
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-AY7E7VA6.js";
|
|
20
21
|
import {
|
|
21
22
|
getReleases
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
} from "./chunk-E657OJL4.js";
|
|
24
|
+
import "./chunk-V6BWOIRC.js";
|
|
25
|
+
import "./chunk-P3N2J3QT.js";
|
|
25
26
|
import "./chunk-XJLZK4QY.js";
|
|
26
27
|
import "./chunk-IRQRV552.js";
|
|
27
28
|
import {
|
|
28
29
|
actions_default
|
|
29
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-3JBVI4UH.js";
|
|
31
|
+
import "./chunk-CQXDAXQF.js";
|
|
30
32
|
import "./chunk-YR65C62H.js";
|
|
31
|
-
import "./chunk-VODRLEDP.js";
|
|
32
33
|
import "./chunk-TRKA7XYU.js";
|
|
33
|
-
import "./chunk-CQXDAXQF.js";
|
|
34
|
-
import "./chunk-VCEFZTWS.js";
|
|
35
34
|
import "./chunk-PVCHKW35.js";
|
|
35
|
+
import "./chunk-TIL2S3JA.js";
|
|
36
|
+
import "./chunk-VODRLEDP.js";
|
|
36
37
|
import "./chunk-6WJI4MOP.js";
|
|
37
38
|
import "./chunk-OLKM53RL.js";
|
|
38
39
|
import {
|
|
@@ -44,30 +45,30 @@ import {
|
|
|
44
45
|
getIsEnterprise,
|
|
45
46
|
getOnboardingState,
|
|
46
47
|
getUserCapabilities
|
|
47
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-FXKMYYK5.js";
|
|
49
|
+
import "./chunk-JIS4PA3R.js";
|
|
48
50
|
import {
|
|
49
51
|
getGlobalSettings,
|
|
50
52
|
getOfflineThresholdSettings,
|
|
51
53
|
getUserSettings
|
|
52
|
-
} from "./chunk-
|
|
53
|
-
import
|
|
54
|
-
|
|
55
|
-
getSortedFilteringAttributes
|
|
56
|
-
} from "./chunk-O7DR57RN.js";
|
|
57
|
-
import "./chunk-GEQ2QQEE.js";
|
|
58
|
-
import "./chunk-JIS4PA3R.js";
|
|
54
|
+
} from "./chunk-4ZYLGBJU.js";
|
|
55
|
+
import "./chunk-PL6RIFD5.js";
|
|
56
|
+
import "./chunk-YO22XLHI.js";
|
|
59
57
|
import {
|
|
60
58
|
getIsServiceProvider
|
|
61
|
-
} from "./chunk-
|
|
59
|
+
} from "./chunk-ZZQJWNQT.js";
|
|
62
60
|
import "./chunk-WR6RQKF5.js";
|
|
63
|
-
import
|
|
61
|
+
import {
|
|
62
|
+
getDevicesByStatus,
|
|
63
|
+
getSortedFilteringAttributes
|
|
64
|
+
} from "./chunk-ZGRY42BZ.js";
|
|
64
65
|
import {
|
|
65
66
|
getFeatures
|
|
66
67
|
} from "./chunk-4BHM6WVX.js";
|
|
67
68
|
import {
|
|
68
69
|
getComparisonCompatibleVersion,
|
|
69
70
|
stringToBoolean
|
|
70
|
-
} from "./chunk-
|
|
71
|
+
} from "./chunk-7WIISD2N.js";
|
|
71
72
|
import {
|
|
72
73
|
DEPLOYMENT_STATES,
|
|
73
74
|
DEVICE_STATES,
|
|
@@ -75,9 +76,9 @@ import {
|
|
|
75
76
|
timeUnits
|
|
76
77
|
} from "./chunk-WWED74SG.js";
|
|
77
78
|
import "./chunk-2DYA3X77.js";
|
|
78
|
-
import "./chunk-ZKAH3APE.js";
|
|
79
79
|
import "./chunk-FAJ3I2UQ.js";
|
|
80
|
-
import "./chunk-
|
|
80
|
+
import "./chunk-ZKAH3APE.js";
|
|
81
|
+
import "./chunk-DBBE6D36.js";
|
|
81
82
|
|
|
82
83
|
// src/storehooks.ts
|
|
83
84
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
@@ -201,7 +202,8 @@ var useAppInit = (userId) => {
|
|
|
201
202
|
dispatch(getGroups()),
|
|
202
203
|
dispatch(getIntegrations()),
|
|
203
204
|
dispatch(getReleases()),
|
|
204
|
-
dispatch(getAllDeviceCounts()).unwrap()
|
|
205
|
+
dispatch(getAllDeviceCounts()).unwrap(),
|
|
206
|
+
dispatch(getProducts())
|
|
205
207
|
];
|
|
206
208
|
if (hasMultitenancy) {
|
|
207
209
|
tasks.push(dispatch(getDeviceLimits()));
|
package/dist/storehooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasOldTheme',\n 'hasReporting',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['commit', 'feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'sentry', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion\n } = mender_environment;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !stringToBoolean(environmentFeatures.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ ...versionInfo.remainder, docsVersion: versionInfo.docs })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const isServiceProvider = useSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback(() => {\n const tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback(() => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap()\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback(() => {\n const settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(dispatch(storeActions.setAppInitDone()));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
|
|
1
|
+
{"version":3,"sources":["../src/storehooks.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { extractErrorMessage } from '@northern.tech/utils/helpers';\nimport dayjs from 'dayjs';\nimport durationDayJs from 'dayjs/plugin/duration.js';\nimport Cookies from 'universal-cookie';\n\nimport storeActions from './actions';\nimport { getSessionInfo } from './auth';\nimport { DEPLOYMENT_STATES, DEVICE_STATES, TIMEOUTS, timeUnits } from './constants';\nimport {\n getDevicesByStatus as getDevicesByStatusSelector,\n getFeatures,\n getGlobalSettings as getGlobalSettingsSelector,\n getIsEnterprise,\n getIsServiceProvider,\n getOfflineThresholdSettings,\n getOnboardingState as getOnboardingStateSelector,\n getSortedFilteringAttributes,\n getUserCapabilities,\n getUserSettings as getUserSettingsSelector\n} from './selectors';\nimport {\n getAllDeviceCounts,\n getDeploymentsByStatus,\n getDeviceAttributes,\n getDeviceById,\n getDeviceLimits,\n getDevicesByStatus,\n getDynamicGroups,\n getGlobalSettings,\n getGroups,\n getIntegrations,\n getLatestReleaseInfo,\n getOnboardingState,\n getProducts,\n getReleases,\n getRoles,\n getUserOrganization,\n getUserSettings,\n saveGlobalSettings,\n saveUserSettings\n} from './thunks';\nimport { getComparisonCompatibleVersion, stringToBoolean } from './utils';\n\nconst cookies = new Cookies();\ndayjs.extend(durationDayJs);\n\nconst { setDeviceListState, setFirstLoginAfterSignup, setTooltipsState, setShowStartupNotification } = storeActions;\n\nconst featureFlags = [\n 'hasAiEnabled',\n 'hasAuditlogs',\n 'hasMultitenancy',\n 'hasDeltaProgress',\n 'hasDeviceConfig',\n 'hasDeviceConnect',\n 'hasFeedbackEnabled',\n 'hasOldTheme',\n 'hasReporting',\n 'hasMonitor',\n 'hasMCUEnabled',\n 'isEnterprise'\n];\n\nconst environmentDatas = ['commit', 'feedbackProbability', 'hostAddress', 'hostedAnnouncement', 'recaptchaSiteKey', 'sentry', 'stripeAPIKey', 'trackerCode'];\n\nexport const parseEnvironmentInfo = () => (dispatch, getState) => {\n const state = getState();\n let onboardingComplete = state.onboarding.complete || !!JSON.parse(window.localStorage.getItem('onboardingComplete') ?? 'false');\n let demoArtifactPort = 85;\n let environmentData = {};\n let environmentFeatures = {};\n let versionInfo = {};\n if (mender_environment) {\n const {\n features = {},\n demoArtifactPort: port,\n disableOnboarding,\n integrationVersion,\n menderVersion,\n menderArtifactVersion,\n metaMenderVersion\n } = mender_environment;\n demoArtifactPort = port || demoArtifactPort;\n environmentData = environmentDatas.reduce((accu, flag) => ({ ...accu, [flag]: mender_environment[flag] || state.app[flag] }), {});\n environmentFeatures = {\n ...featureFlags.reduce((accu, flag) => ({ ...accu, [flag]: stringToBoolean(features[flag]) }), {}),\n isHosted: stringToBoolean(features.isHosted) || window.location.hostname.includes('hosted.mender.io')\n };\n onboardingComplete = !stringToBoolean(environmentFeatures.isHosted) || stringToBoolean(disableOnboarding) || onboardingComplete;\n versionInfo = {\n docs: isNaN(integrationVersion.charAt(0)) ? '' : integrationVersion.split('.').slice(0, 2).join('.'),\n remainder: {\n Integration: getComparisonCompatibleVersion(integrationVersion),\n 'Mender-Client': getComparisonCompatibleVersion(menderVersion),\n 'Mender-Artifact': menderArtifactVersion,\n 'Meta-Mender': metaMenderVersion\n }\n };\n }\n return Promise.all([\n dispatch(storeActions.successfullyLoggedIn(getSessionInfo())),\n dispatch(storeActions.setOnboardingComplete(onboardingComplete)),\n dispatch(storeActions.setDemoArtifactPort(demoArtifactPort)),\n dispatch(storeActions.setFeatures(environmentFeatures)),\n dispatch(storeActions.setVersionInformation({ ...versionInfo.remainder, docsVersion: versionInfo.docs })),\n dispatch(storeActions.setEnvironmentData(environmentData)),\n dispatch(getLatestReleaseInfo())\n ]);\n};\n\nconst maybeAddOnboardingTasks = ({ devicesByStatus, dispatch, onboardingState, tasks }) => {\n if (!onboardingState.showTips || onboardingState.complete) {\n return tasks;\n }\n // try to retrieve full device details for onboarding devices to ensure ips etc. are available\n // we only load the first few/ 20 devices, as it is possible the onboarding is left dangling\n // and a lot of devices are present and we don't want to flood the backend for this\n return devicesByStatus[DEVICE_STATES.accepted].deviceIds.reduce((accu, id) => {\n accu.push(dispatch(getDeviceById(id)));\n return accu;\n }, tasks);\n};\n\nexport const useAppInit = userId => {\n const dispatch = useDispatch();\n const [coreInitDone, setCoreInitDone] = useState(false);\n const isEnterprise = useSelector(getIsEnterprise);\n const { hasMultitenancy, isHosted } = useSelector(getFeatures);\n const devicesByStatus = useSelector(getDevicesByStatusSelector);\n const onboardingState = useSelector(getOnboardingStateSelector);\n const { columnSelection = [], trackingConsentGiven: hasTrackingEnabled, tooltips = {} } = useSelector(getUserSettingsSelector);\n const { canManageUsers } = useSelector(getUserCapabilities);\n const { interval, intervalUnit } = useSelector(getOfflineThresholdSettings);\n const { id_attribute } = useSelector(getGlobalSettingsSelector);\n const { identityAttributes } = useSelector(getSortedFilteringAttributes);\n const isServiceProvider = useSelector(getIsServiceProvider);\n const coreInitRunning = useRef(false);\n const fullInitRunning = useRef(false);\n\n const retrieveCoreData = useCallback(() => {\n const tasks = [\n dispatch(parseEnvironmentInfo()),\n dispatch(getUserSettings()),\n dispatch(getGlobalSettings()),\n dispatch(setFirstLoginAfterSignup(stringToBoolean(cookies.get('firstLoginAfterSignup'))))\n ];\n const multitenancy = hasMultitenancy || isHosted || isEnterprise;\n if (multitenancy) {\n tasks.push(dispatch(getUserOrganization()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isHosted, isEnterprise]);\n\n const retrieveAppData = useCallback(() => {\n if (isServiceProvider) {\n return Promise.resolve(dispatch(getRoles()));\n }\n const tasks = [\n dispatch(getDeviceAttributes()),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.finished, shouldSelect: false })),\n dispatch(getDeploymentsByStatus({ status: DEPLOYMENT_STATES.inprogress })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.accepted })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.pending })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.preauth })),\n dispatch(getDevicesByStatus({ status: DEVICE_STATES.rejected })),\n dispatch(getDynamicGroups()),\n dispatch(getGroups()),\n dispatch(getIntegrations()),\n dispatch(getReleases()),\n dispatch(getAllDeviceCounts()).unwrap(),\n dispatch(getProducts())\n ];\n if (hasMultitenancy) {\n tasks.push(dispatch(getDeviceLimits()));\n tasks.push(dispatch(getRoles()));\n }\n return Promise.all(tasks);\n }, [dispatch, hasMultitenancy, isServiceProvider]);\n\n const interpretAppData = useCallback(() => {\n const settings = {};\n if (cookies.get('_ga') && typeof hasTrackingEnabled === 'undefined') {\n settings.trackingConsentGiven = true;\n }\n let tasks = [\n dispatch(setDeviceListState({ selectedAttributes: columnSelection.map(column => ({ attribute: column.key, scope: column.scope })) })),\n dispatch(setTooltipsState(tooltips)), // tooltips read state is primarily trusted from the redux store, except on app init - here user settings are the reference\n dispatch(saveUserSettings(settings))\n ];\n // checks if user id is set and if cookie for helptips exists for that user\n tasks = maybeAddOnboardingTasks({ devicesByStatus, dispatch, tasks, onboardingState });\n\n if (canManageUsers && intervalUnit && intervalUnit !== timeUnits.days) {\n const duration = dayjs.duration(interval, intervalUnit);\n const days = duration.asDays();\n if (days < 1) {\n tasks.push(Promise.resolve(setTimeout(() => dispatch(setShowStartupNotification(true)), TIMEOUTS.fiveSeconds)));\n } else {\n const roundedDays = Math.max(1, Math.round(days));\n tasks.push(dispatch(saveGlobalSettings({ offlineThreshold: { interval: roundedDays, intervalUnit: timeUnits.days } })));\n }\n }\n\n // the following is used as a migration and initialization of the stored identity attribute\n // changing the default device attribute to the first non-deviceId attribute, unless a stored\n // id attribute setting exists\n const identityOptions = identityAttributes.filter(attribute => !['id', 'Device ID', 'status'].includes(attribute));\n if (!id_attribute && identityOptions.length) {\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute: identityOptions[0], scope: 'identity' } })));\n } else if (typeof id_attribute === 'string') {\n let attribute = id_attribute;\n if (attribute === 'Device ID') {\n attribute = 'id';\n }\n tasks.push(dispatch(saveGlobalSettings({ id_attribute: { attribute, scope: 'identity' } })));\n }\n tasks.push(dispatch(storeActions.setAppInitDone()));\n return Promise.all(tasks);\n }, [\n columnSelection,\n dispatch,\n identityAttributes,\n hasTrackingEnabled,\n canManageUsers,\n devicesByStatus,\n id_attribute,\n interval,\n intervalUnit,\n onboardingState,\n tooltips\n ]);\n\n const initializeAppData = useCallback(\n () =>\n retrieveAppData()\n .then(interpretAppData)\n // this is allowed to fail if no user information are available\n .catch(err => console.log(extractErrorMessage(err)))\n .then(() => dispatch(getOnboardingState())),\n [dispatch, retrieveAppData, interpretAppData]\n );\n\n useEffect(() => {\n if (!userId || coreInitRunning.current) {\n return;\n }\n coreInitRunning.current = true;\n retrieveCoreData().then(() => setCoreInitDone(true));\n }, [userId, retrieveCoreData]);\n\n useEffect(() => {\n if (fullInitRunning.current || !coreInitDone) {\n return;\n }\n fullInitRunning.current = true;\n initializeAppData();\n }, [initializeAppData, coreInitDone]);\n\n return { coreInitDone };\n};\n"],"mappings":"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","names":["getUserSettings","getGlobalSettings","getDevicesByStatus","getOnboardingState"]}
|
package/dist/thunks.cjs
CHANGED
|
@@ -114,6 +114,7 @@ __export(thunks_exports, {
|
|
|
114
114
|
getLatestReleaseInfo: () => getLatestReleaseInfo,
|
|
115
115
|
getOnboardingState: () => getOnboardingState2,
|
|
116
116
|
getPermissionSets: () => getPermissionSets,
|
|
117
|
+
getProducts: () => getProducts,
|
|
117
118
|
getRelease: () => getRelease,
|
|
118
119
|
getReleases: () => getReleases,
|
|
119
120
|
getReportDataWithoutBackendSupport: () => getReportDataWithoutBackendSupport,
|
|
@@ -146,6 +147,7 @@ __export(thunks_exports, {
|
|
|
146
147
|
removeDynamicGroup: () => removeDynamicGroup,
|
|
147
148
|
removeRelease: () => removeRelease,
|
|
148
149
|
removeReleases: () => removeReleases,
|
|
150
|
+
removeReportsByGroupName: () => removeReportsByGroupName,
|
|
149
151
|
removeRole: () => removeRole,
|
|
150
152
|
removeStaticGroup: () => removeStaticGroup,
|
|
151
153
|
removeTenant: () => removeTenant,
|
|
@@ -188,6 +190,7 @@ __export(thunks_exports, {
|
|
|
188
190
|
submitUserFeedback: () => submitUserFeedback,
|
|
189
191
|
switchUserOrganization: () => switchUserOrganization,
|
|
190
192
|
tenantDataDivergedMessage: () => tenantDataDivergedMessage,
|
|
193
|
+
transformProductResponse: () => transformProductResponse,
|
|
191
194
|
triggerDeviceUpdate: () => triggerDeviceUpdate,
|
|
192
195
|
updateDeploymentControlMap: () => updateDeploymentControlMap,
|
|
193
196
|
updateDeviceAuth: () => updateDeviceAuth,
|
|
@@ -216,10 +219,6 @@ var import_constants5 = require("@northern.tech/utils/constants");
|
|
|
216
219
|
// src/appSlice/constants.ts
|
|
217
220
|
var import_icons_material = require("@mui/icons-material");
|
|
218
221
|
var import_utils = require("@northern.tech/utils");
|
|
219
|
-
var startingDeviceCount = {
|
|
220
|
-
os: "for first 50 devices",
|
|
221
|
-
professional: "for first 250 devices"
|
|
222
|
-
};
|
|
223
222
|
var chartTypes = {
|
|
224
223
|
bar: { key: "bar", Icon: import_icons_material.BarChart },
|
|
225
224
|
pie: { key: "pie", Icon: import_icons_material.PieChartOutline }
|
|
@@ -236,82 +235,48 @@ var PLANS = {
|
|
|
236
235
|
os: {
|
|
237
236
|
id: "os",
|
|
238
237
|
name: "Basic",
|
|
239
|
-
|
|
240
|
-
offer: true,
|
|
241
|
-
price: "$34 / month",
|
|
242
|
-
deviceCount: startingDeviceCount.os,
|
|
243
|
-
description: "The core features of Mender. To continue using Enterprise Trial features\u2014like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more\u2014please upgrade to a higher plan.",
|
|
244
|
-
features: ["Access to core features of Mender", "Basic support"]
|
|
238
|
+
description: "The core features of Mender. To continue using Enterprise Trial features\u2014like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more\u2014please upgrade to a higher plan."
|
|
245
239
|
},
|
|
246
240
|
professional: {
|
|
247
241
|
id: "professional",
|
|
248
242
|
name: "Professional",
|
|
249
|
-
|
|
250
|
-
offer: true,
|
|
251
|
-
price: "$291 / month",
|
|
252
|
-
deviceCount: startingDeviceCount.professional,
|
|
253
|
-
description: "Everything in Basic, plus enhanced update management and automation features.",
|
|
254
|
-
features: ["Advanced OTA features", "Higher priority support"]
|
|
243
|
+
description: "Everything in Basic, plus enhanced update management and automation features."
|
|
255
244
|
},
|
|
256
245
|
enterprise: {
|
|
257
246
|
id: "enterprise",
|
|
258
247
|
name: "Enterprise",
|
|
259
|
-
|
|
260
|
-
price: "Custom pricing",
|
|
261
|
-
deviceCount: "Unlimited devices",
|
|
262
|
-
description: "Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription \u2014 ask us for a quote.",
|
|
263
|
-
features: ["All Mender features", "Advanced security features", "SLA-backed support"]
|
|
248
|
+
description: "Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription \u2014 ask us for a quote."
|
|
264
249
|
}
|
|
265
250
|
};
|
|
266
251
|
var ADDONS = {
|
|
267
252
|
configure: {
|
|
268
253
|
id: "configure",
|
|
269
254
|
title: "Configure",
|
|
270
|
-
description: "
|
|
255
|
+
description: "Seamlessly configure applications and devices remotely \u2013 configure each device to its environment.",
|
|
271
256
|
needs: ["hasDeviceConfig"],
|
|
272
|
-
os: {
|
|
273
|
-
price: "$11/month",
|
|
274
|
-
deviceCount: startingDeviceCount.os
|
|
275
|
-
},
|
|
276
|
-
professional: {
|
|
277
|
-
price: "$65/month",
|
|
278
|
-
deviceCount: startingDeviceCount.professional
|
|
279
|
-
},
|
|
280
257
|
eligible: ["os", "professional", "enterprise"]
|
|
281
258
|
},
|
|
282
259
|
monitor: {
|
|
283
260
|
id: "monitor",
|
|
284
261
|
title: "Monitor",
|
|
285
|
-
description: "
|
|
262
|
+
description: "Detect and analyze health issues of devices, services and applications. Set up alerts so you can act quickly.",
|
|
286
263
|
needs: ["hasMonitor"],
|
|
287
|
-
os: {
|
|
288
|
-
price: "-",
|
|
289
|
-
deviceCount: "-"
|
|
290
|
-
},
|
|
291
|
-
professional: {
|
|
292
|
-
price: "$86/month",
|
|
293
|
-
deviceCount: startingDeviceCount.professional
|
|
294
|
-
},
|
|
295
264
|
eligible: ["professional", "enterprise"]
|
|
296
265
|
},
|
|
297
266
|
troubleshoot: {
|
|
298
267
|
id: "troubleshoot",
|
|
299
268
|
title: "Troubleshoot",
|
|
300
|
-
description: "
|
|
269
|
+
description: "Secure, remote access to your devices \u2013 quickly diagnose and fix issues in real time.",
|
|
301
270
|
needs: ["hasDeviceConnect"],
|
|
302
|
-
os: {
|
|
303
|
-
price: "$27/month",
|
|
304
|
-
deviceCount: startingDeviceCount.os
|
|
305
|
-
},
|
|
306
|
-
professional: {
|
|
307
|
-
price: "$72/month",
|
|
308
|
-
deviceCount: startingDeviceCount.professional
|
|
309
|
-
},
|
|
310
271
|
eligible: ["os", "professional", "enterprise"]
|
|
311
272
|
}
|
|
312
273
|
};
|
|
313
274
|
var BENEFITS = {
|
|
314
|
-
auditlog: {
|
|
275
|
+
auditlog: {
|
|
276
|
+
id: "auditlog",
|
|
277
|
+
benefit: "gain access to logs for important events such as changes to devices, deployments and user management, as well as remote terminal session replays",
|
|
278
|
+
requiredPlan: PLANS.enterprise.id
|
|
279
|
+
},
|
|
315
280
|
dashboard: { id: "dashboard", benefit: "actionable insights into the devices you are updating with Mender", requiredPlan: PLANS.enterprise.id },
|
|
316
281
|
deltaGeneration: {
|
|
317
282
|
id: "deltaGeneration",
|
|
@@ -1326,17 +1291,14 @@ var getAttributesList = (0, import_toolkit4.createSelector)(
|
|
|
1326
1291
|
[getFilteringAttributes, getFilteringAttributesFromConfig],
|
|
1327
1292
|
({ identityAttributes = [], inventoryAttributes = [] }, { identity = [], inventory = [] }) => [...identityAttributes, ...inventoryAttributes, ...identity, ...inventory].filter(import_helpers2.duplicateFilter)
|
|
1328
1293
|
);
|
|
1329
|
-
var getDeviceLimitStats = (0, import_toolkit4.createSelector)(
|
|
1330
|
-
|
|
1331
|
-
(limits,
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
}));
|
|
1338
|
-
}
|
|
1339
|
-
);
|
|
1294
|
+
var getDeviceLimitStats = (0, import_toolkit4.createSelector)([getDeviceLimits, getAcceptedDevices], (limits, accepted) => {
|
|
1295
|
+
const { counts } = accepted;
|
|
1296
|
+
return Object.entries(limits).filter(([, limit]) => limit !== 0).map(([type, limit]) => ({
|
|
1297
|
+
type,
|
|
1298
|
+
limit,
|
|
1299
|
+
total: counts[type] || 0
|
|
1300
|
+
}));
|
|
1301
|
+
});
|
|
1340
1302
|
var getDeviceTypes = (0, import_toolkit4.createSelector)(
|
|
1341
1303
|
[getAcceptedDevices, getDevicesById],
|
|
1342
1304
|
({ deviceIds = [] }, devicesById) => Object.keys(
|
|
@@ -1510,18 +1472,21 @@ var mapDeviceAttributes = (attributes = []) => attributes.reduce(
|
|
|
1510
1472
|
{ inventory: { device_type: [], artifact_name: "" }, identity: {}, monitor: {}, system: {}, tags: {} }
|
|
1511
1473
|
);
|
|
1512
1474
|
var isDarkMode = (mode) => mode === DARK_MODE;
|
|
1513
|
-
var parseSubscriptionPreview = (lines) => lines.reduce(
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
);
|
|
1475
|
+
var parseSubscriptionPreview = (lines) => lines.reduce((acc, { addon, amount, product }) => {
|
|
1476
|
+
const tier = product.replace("mender_", "");
|
|
1477
|
+
if (!acc[tier]) {
|
|
1478
|
+
acc[tier] = {
|
|
1479
|
+
amount: 0,
|
|
1480
|
+
addons: {}
|
|
1481
|
+
};
|
|
1482
|
+
}
|
|
1483
|
+
if (!addon) {
|
|
1484
|
+
acc[tier].amount += amount;
|
|
1485
|
+
} else {
|
|
1486
|
+
acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;
|
|
1487
|
+
}
|
|
1488
|
+
return acc;
|
|
1489
|
+
}, {});
|
|
1525
1490
|
|
|
1526
1491
|
// src/releasesSlice/selectors.ts
|
|
1527
1492
|
var getSelectedReleaseId = (state) => state.releases.selectedRelease;
|
|
@@ -2301,6 +2266,9 @@ var organizationSlice = (0, import_toolkit13.createSlice)({
|
|
|
2301
2266
|
setSubscription: (state, action) => {
|
|
2302
2267
|
state.organization.subscription = { ...state.organization.subscription, ...action.payload };
|
|
2303
2268
|
},
|
|
2269
|
+
setProducts: (state, action) => {
|
|
2270
|
+
state.products = action.payload;
|
|
2271
|
+
},
|
|
2304
2272
|
setBillingProfile: (state, action) => {
|
|
2305
2273
|
state.organization.billing_profile = action.payload;
|
|
2306
2274
|
},
|
|
@@ -3289,11 +3257,18 @@ var addStaticGroup = createAppAsyncThunk(
|
|
|
3289
3257
|
)
|
|
3290
3258
|
).catch((err) => commonErrorHandler(err, `Group could not be updated:`, dispatch))
|
|
3291
3259
|
);
|
|
3260
|
+
var removeReportsByGroupName = createAppAsyncThunk(`${sliceName3}/removeReportsByGroupName`, (groupName, { dispatch, getState }) => {
|
|
3261
|
+
if (!groupName) return Promise.resolve();
|
|
3262
|
+
const reports = getDeviceReportsForUser(getState());
|
|
3263
|
+
const filteredReports = reports.filter((report) => report.group !== groupName);
|
|
3264
|
+
dispatch(saveUserSettings({ reports: filteredReports }));
|
|
3265
|
+
});
|
|
3292
3266
|
var removeStaticGroup = createAppAsyncThunk(
|
|
3293
3267
|
`${sliceName3}/removeStaticGroup`,
|
|
3294
3268
|
(groupName, { dispatch }) => general_api_default.delete(`${import_constants5.inventoryApiUrl}/groups/${groupName}`).then(
|
|
3295
3269
|
() => Promise.all([
|
|
3296
3270
|
dispatch(actions3.removeGroup(groupName)),
|
|
3271
|
+
dispatch(removeReportsByGroupName(groupName)),
|
|
3297
3272
|
dispatch(getGroups2()),
|
|
3298
3273
|
dispatch(setSnackbar3({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
|
|
3299
3274
|
])
|
|
@@ -3359,6 +3334,7 @@ var removeDynamicGroup = createAppAsyncThunk(`${sliceName3}/removeDynamicGroup`,
|
|
|
3359
3334
|
return general_api_default.delete(`${import_constants5.inventoryApiUrlV2}/filters/${filterId}`).then(
|
|
3360
3335
|
() => Promise.all([
|
|
3361
3336
|
dispatch(actions3.removeGroup(groupName)),
|
|
3337
|
+
dispatch(removeReportsByGroupName(groupName)),
|
|
3362
3338
|
dispatch(setSnackbar3({ message: "Group was removed successfully", autoHideDuration: TIMEOUTS.fiveSeconds }))
|
|
3363
3339
|
])
|
|
3364
3340
|
);
|
|
@@ -4249,6 +4225,63 @@ var cancelRequest = createAppAsyncThunk(`${sliceName6}/cancelRequest`, (reason,
|
|
|
4249
4225
|
() => Promise.resolve(dispatch(setSnackbar4({ message: "Deactivation request was sent successfully", autoHideDuration: TIMEOUTS.fiveSeconds })))
|
|
4250
4226
|
);
|
|
4251
4227
|
});
|
|
4228
|
+
var getTierId = (tierName) => tierName.replace("mender_", "");
|
|
4229
|
+
var getProductPlans = (products) => products.reduce(
|
|
4230
|
+
(plansById, product) => {
|
|
4231
|
+
const { name, prices } = product;
|
|
4232
|
+
const tierId = getTierId(name);
|
|
4233
|
+
prices.forEach((price) => {
|
|
4234
|
+
const existing = plansById[price.plan] ?? { ...PLANS[price.plan], tierLimitsConstrains: {} };
|
|
4235
|
+
const tierConstraints = price.constraints ? { [tierId]: { min: price.constraints.min, max: price.constraints.max, div: price.constraints.div } } : {};
|
|
4236
|
+
plansById[price.plan] = {
|
|
4237
|
+
...existing,
|
|
4238
|
+
tierLimitsConstrains: {
|
|
4239
|
+
...existing.tierLimitsConstrains,
|
|
4240
|
+
...tierConstraints
|
|
4241
|
+
}
|
|
4242
|
+
};
|
|
4243
|
+
});
|
|
4244
|
+
return plansById;
|
|
4245
|
+
},
|
|
4246
|
+
{ enterprise: { ...PLANS.enterprise } }
|
|
4247
|
+
);
|
|
4248
|
+
var getProductAddons = (products) => products.reduce((accu, product) => {
|
|
4249
|
+
const { addons = [] } = product;
|
|
4250
|
+
addons.forEach((addon) => {
|
|
4251
|
+
const { name: addonName = "", prices: addonPrices = [] } = addon;
|
|
4252
|
+
const existingEligible = accu[addonName]?.eligible ?? [];
|
|
4253
|
+
const newEligible = addonPrices.map((p) => p.plan);
|
|
4254
|
+
accu[addonName] = {
|
|
4255
|
+
...ADDONS[addonName],
|
|
4256
|
+
eligible: [.../* @__PURE__ */ new Set([...existingEligible, ...newEligible, PLANS.enterprise.id])]
|
|
4257
|
+
};
|
|
4258
|
+
});
|
|
4259
|
+
return accu;
|
|
4260
|
+
}, {});
|
|
4261
|
+
var transformProductResponse = (products) => {
|
|
4262
|
+
const tiers = [];
|
|
4263
|
+
const sortedProducts = products.sort((a, b) => a.name.localeCompare(b.name));
|
|
4264
|
+
sortedProducts.forEach((tier) => {
|
|
4265
|
+
const addonsSupported = Object.fromEntries((tier.addons || []).map((addon) => [addon.name, addon.prices?.map((p) => p.plan)]));
|
|
4266
|
+
const allPlans = tier.prices.map((price) => price.plan);
|
|
4267
|
+
const addonsTransposed = allPlans.reduce((acc, plan) => {
|
|
4268
|
+
acc[plan] = Object.entries(addonsSupported).filter(([, addonSupportedPlans]) => addonSupportedPlans.includes(plan)).map(([addon]) => addon);
|
|
4269
|
+
return acc;
|
|
4270
|
+
}, {});
|
|
4271
|
+
const tierId = getTierId(tier.name);
|
|
4272
|
+
tiers.push({
|
|
4273
|
+
id: tierId,
|
|
4274
|
+
title: tierId,
|
|
4275
|
+
stripeProductName: tier.name,
|
|
4276
|
+
limitConstrains: Object.fromEntries(tier.prices.map((p) => [p.plan, p.constraints])),
|
|
4277
|
+
addons: addonsSupported,
|
|
4278
|
+
addonsByPlan: addonsTransposed
|
|
4279
|
+
});
|
|
4280
|
+
});
|
|
4281
|
+
const plans = getProductPlans(products);
|
|
4282
|
+
const addons = getProductAddons(products);
|
|
4283
|
+
return { plans, tiers, addons };
|
|
4284
|
+
};
|
|
4252
4285
|
var getTargetLocation = (key) => {
|
|
4253
4286
|
if (devLocations.includes(window.location.hostname)) {
|
|
4254
4287
|
return "";
|
|
@@ -4463,7 +4496,7 @@ var getUserSubscription = createAppAsyncThunk(`${sliceName6}/getUserSubscription
|
|
|
4463
4496
|
});
|
|
4464
4497
|
var getBillingPreview = createAppAsyncThunk(
|
|
4465
4498
|
`${sliceName6}/getBillingPreview`,
|
|
4466
|
-
(order, { dispatch }) => general_api_default.post(`${import_constants5.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" ? {
|
|
4499
|
+
(order, { dispatch }) => general_api_default.post(`${import_constants5.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)
|
|
4467
4500
|
);
|
|
4468
4501
|
var getCurrentSubscription = createAppAsyncThunk(
|
|
4469
4502
|
`${sliceName6}/getCurrentSubscription`,
|
|
@@ -4474,6 +4507,10 @@ var getCurrentSubscription = createAppAsyncThunk(
|
|
|
4474
4507
|
return commonErrorHandler(err, "There was an error retrieving your current subscription", dispatch, commonErrorFallback);
|
|
4475
4508
|
})
|
|
4476
4509
|
);
|
|
4510
|
+
var getProducts = createAppAsyncThunk(
|
|
4511
|
+
`${sliceName6}/getEnabledTiers`,
|
|
4512
|
+
(_, { dispatch }) => general_api_default.get(`${import_constants5.tenantadmApiUrlv2}/billing/products`).catch((err) => commonErrorHandler(err, "There was an error getting Mender products:", dispatch, commonErrorFallback)).then((res) => dispatch(actions6.setProducts(transformProductResponse(res.data))))
|
|
4513
|
+
);
|
|
4477
4514
|
var requestPlanUpgrade = createAppAsyncThunk(
|
|
4478
4515
|
`${sliceName6}/requestPlanUpgrade`,
|
|
4479
4516
|
(order, { dispatch }) => general_api_default.post(`${import_constants5.tenantadmApiUrlv2}/billing/subscription`, order).catch((err) => commonErrorHandler(err, "There was an error sending your request", dispatch, commonErrorFallback)).then(() => Promise.all([setTimeout(() => dispatch(getDeviceLimits2()), TIMEOUTS.threeSeconds), dispatch(getUserOrganization())]))
|
|
@@ -5726,6 +5763,7 @@ var submitUserFeedback = createAppAsyncThunk(
|
|
|
5726
5763
|
getLatestReleaseInfo,
|
|
5727
5764
|
getOnboardingState,
|
|
5728
5765
|
getPermissionSets,
|
|
5766
|
+
getProducts,
|
|
5729
5767
|
getRelease,
|
|
5730
5768
|
getReleases,
|
|
5731
5769
|
getReportDataWithoutBackendSupport,
|
|
@@ -5758,6 +5796,7 @@ var submitUserFeedback = createAppAsyncThunk(
|
|
|
5758
5796
|
removeDynamicGroup,
|
|
5759
5797
|
removeRelease,
|
|
5760
5798
|
removeReleases,
|
|
5799
|
+
removeReportsByGroupName,
|
|
5761
5800
|
removeRole,
|
|
5762
5801
|
removeStaticGroup,
|
|
5763
5802
|
removeTenant,
|
|
@@ -5800,6 +5839,7 @@ var submitUserFeedback = createAppAsyncThunk(
|
|
|
5800
5839
|
submitUserFeedback,
|
|
5801
5840
|
switchUserOrganization,
|
|
5802
5841
|
tenantDataDivergedMessage,
|
|
5842
|
+
transformProductResponse,
|
|
5803
5843
|
triggerDeviceUpdate,
|
|
5804
5844
|
updateDeploymentControlMap,
|
|
5805
5845
|
updateDeviceAuth,
|