@northern.tech/store 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/actions.js +4 -4
  2. package/dist/appSlice/thunks.cjs +21 -2
  3. package/dist/appSlice/thunks.cjs.map +1 -1
  4. package/dist/appSlice/thunks.js +10 -10
  5. package/dist/{chunk-QHGAJE7K.js → chunk-GAHFKM3N.js} +7 -7
  6. package/dist/{chunk-76GD35G3.js → chunk-QFYSFHAF.js} +19 -19
  7. package/dist/{chunk-GL634FKF.js → chunk-RJRZXDVT.js} +8 -8
  8. package/dist/{chunk-E2UO6BJ3.js → chunk-RVAERI6U.js} +9 -9
  9. package/dist/{chunk-JDSAICR3.js → chunk-TJBX7YHM.js} +29 -8
  10. package/dist/{chunk-JDSAICR3.js.map → chunk-TJBX7YHM.js.map} +1 -1
  11. package/dist/{chunk-QXS7I6BE.js → chunk-XC7DABLM.js} +7 -7
  12. package/dist/commonSelectors.cjs +31 -0
  13. package/dist/commonSelectors.cjs.map +1 -1
  14. package/dist/commonSelectors.d.cts +147 -1
  15. package/dist/commonSelectors.d.ts +147 -1
  16. package/dist/commonSelectors.js +4 -2
  17. package/dist/deploymentsSlice/thunks.cjs +21 -2
  18. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  19. package/dist/deploymentsSlice/thunks.js +10 -10
  20. package/dist/devicesSlice/thunks.cjs +21 -2
  21. package/dist/devicesSlice/thunks.cjs.map +1 -1
  22. package/dist/devicesSlice/thunks.js +10 -10
  23. package/dist/liststatehook.cjs +3 -1
  24. package/dist/liststatehook.cjs.map +1 -1
  25. package/dist/liststatehook.js +4 -2
  26. package/dist/liststatehook.js.map +1 -1
  27. package/dist/monitorSlice/thunks.cjs +19 -0
  28. package/dist/monitorSlice/thunks.cjs.map +1 -1
  29. package/dist/monitorSlice/thunks.js +8 -8
  30. package/dist/onboardingSlice/thunks.cjs +21 -2
  31. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  32. package/dist/onboardingSlice/thunks.js +10 -10
  33. package/dist/organizationSlice/thunks.cjs +23 -4
  34. package/dist/organizationSlice/thunks.cjs.map +1 -1
  35. package/dist/organizationSlice/thunks.js +10 -10
  36. package/dist/releasesSlice/mocks.cjs +1 -1
  37. package/dist/releasesSlice/mocks.cjs.map +1 -1
  38. package/dist/releasesSlice/mocks.d.cts +3 -1
  39. package/dist/releasesSlice/mocks.d.ts +3 -1
  40. package/dist/releasesSlice/mocks.js +1 -1
  41. package/dist/releasesSlice/mocks.js.map +1 -1
  42. package/dist/releasesSlice/thunks.cjs +19 -0
  43. package/dist/releasesSlice/thunks.cjs.map +1 -1
  44. package/dist/releasesSlice/thunks.js +8 -8
  45. package/dist/selectors.cjs +29 -0
  46. package/dist/selectors.cjs.map +1 -1
  47. package/dist/selectors.d.cts +1 -1
  48. package/dist/selectors.d.ts +1 -1
  49. package/dist/selectors.js +13 -11
  50. package/dist/store.js +5 -5
  51. package/dist/storehooks.cjs +26 -7
  52. package/dist/storehooks.cjs.map +1 -1
  53. package/dist/storehooks.js +11 -11
  54. package/dist/thunks.cjs +23 -4
  55. package/dist/thunks.cjs.map +1 -1
  56. package/dist/thunks.js +11 -11
  57. package/dist/useDeploymentDevice.cjs +21 -2
  58. package/dist/useDeploymentDevice.cjs.map +1 -1
  59. package/dist/useDeploymentDevice.js +12 -12
  60. package/dist/usersSlice/thunks.cjs +21 -2
  61. package/dist/usersSlice/thunks.cjs.map +1 -1
  62. package/dist/usersSlice/thunks.js +10 -10
  63. package/package.json +1 -1
  64. /package/dist/{chunk-QHGAJE7K.js.map → chunk-GAHFKM3N.js.map} +0 -0
  65. /package/dist/{chunk-76GD35G3.js.map → chunk-QFYSFHAF.js.map} +0 -0
  66. /package/dist/{chunk-GL634FKF.js.map → chunk-RJRZXDVT.js.map} +0 -0
  67. /package/dist/{chunk-E2UO6BJ3.js.map → chunk-RVAERI6U.js.map} +0 -0
  68. /package/dist/{chunk-QXS7I6BE.js.map → chunk-XC7DABLM.js.map} +0 -0
@@ -3,33 +3,33 @@ import {
3
3
  setFirstLoginAfterSignup,
4
4
  setOfflineThreshold,
5
5
  setSearchState
6
- } from "../chunk-76GD35G3.js";
6
+ } from "../chunk-QFYSFHAF.js";
7
+ import "../chunk-XC7DABLM.js";
8
+ import "../chunk-GAHFKM3N.js";
9
+ import "../chunk-RVAERI6U.js";
7
10
  import "../chunk-Y3DJIMEN.js";
8
- import "../chunk-QXS7I6BE.js";
9
- import "../chunk-QHGAJE7K.js";
10
11
  import "../chunk-5M6EUVNO.js";
11
- import "../chunk-E2UO6BJ3.js";
12
- import "../chunk-GL634FKF.js";
12
+ import "../chunk-RJRZXDVT.js";
13
+ import "../chunk-TRKA7XYU.js";
13
14
  import "../chunk-YR65C62H.js";
14
15
  import "../chunk-VCEFZTWS.js";
15
- import "../chunk-TRKA7XYU.js";
16
+ import "../chunk-PVCHKW35.js";
16
17
  import "../chunk-CQXDAXQF.js";
17
18
  import "../chunk-VODRLEDP.js";
18
- import "../chunk-PVCHKW35.js";
19
- import "../chunk-OLKM53RL.js";
20
19
  import "../chunk-6WJI4MOP.js";
20
+ import "../chunk-OLKM53RL.js";
21
21
  import "../chunk-FDSMCFV5.js";
22
22
  import "../chunk-53W2NRSL.js";
23
23
  import "../chunk-NMAXZ3ZY.js";
24
- import "../chunk-JDSAICR3.js";
24
+ import "../chunk-TJBX7YHM.js";
25
25
  import "../chunk-GEQ2QQEE.js";
26
26
  import "../chunk-QL6FN2JC.js";
27
27
  import "../chunk-3NOV7X4M.js";
28
28
  import "../chunk-YO22XLHI.js";
29
29
  import "../chunk-JIS4PA3R.js";
30
+ import "../chunk-WR6RQKF5.js";
30
31
  import "../chunk-O7DR57RN.js";
31
32
  import "../chunk-4BHM6WVX.js";
32
- import "../chunk-WR6RQKF5.js";
33
33
  import "../chunk-U5TPV5X5.js";
34
34
  import "../chunk-WWED74SG.js";
35
35
  import "../chunk-2DYA3X77.js";
@@ -1,21 +1,21 @@
1
- import {
2
- general_api_default
3
- } from "./chunk-5M6EUVNO.js";
4
1
  import {
5
2
  commonErrorFallback,
6
3
  commonErrorHandler,
7
4
  createAppAsyncThunk
8
- } from "./chunk-E2UO6BJ3.js";
5
+ } from "./chunk-RVAERI6U.js";
6
+ import {
7
+ general_api_default
8
+ } from "./chunk-5M6EUVNO.js";
9
9
  import {
10
10
  actions_default
11
- } from "./chunk-GL634FKF.js";
11
+ } from "./chunk-RJRZXDVT.js";
12
12
  import {
13
13
  actions,
14
14
  sliceName
15
15
  } from "./chunk-PVCHKW35.js";
16
16
  import {
17
17
  getSearchEndpoint
18
- } from "./chunk-JDSAICR3.js";
18
+ } from "./chunk-TJBX7YHM.js";
19
19
  import {
20
20
  getDeviceFilters
21
21
  } from "./chunk-O7DR57RN.js";
@@ -107,4 +107,4 @@ export {
107
107
  getDeviceMonitorConfig,
108
108
  changeNotificationSetting
109
109
  };
110
- //# sourceMappingURL=chunk-QHGAJE7K.js.map
110
+ //# sourceMappingURL=chunk-GAHFKM3N.js.map
@@ -1,21 +1,21 @@
1
- import {
2
- users_api_default
3
- } from "./chunk-Y3DJIMEN.js";
4
1
  import {
5
2
  getDeviceMonitorConfig,
6
3
  getLatestDeviceAlerts
7
- } from "./chunk-QHGAJE7K.js";
8
- import {
9
- general_api_default
10
- } from "./chunk-5M6EUVNO.js";
4
+ } from "./chunk-GAHFKM3N.js";
11
5
  import {
12
6
  commonErrorFallback,
13
7
  commonErrorHandler,
14
8
  createAppAsyncThunk
15
- } from "./chunk-E2UO6BJ3.js";
9
+ } from "./chunk-RVAERI6U.js";
10
+ import {
11
+ users_api_default
12
+ } from "./chunk-Y3DJIMEN.js";
13
+ import {
14
+ general_api_default
15
+ } from "./chunk-5M6EUVNO.js";
16
16
  import {
17
17
  actions_default
18
- } from "./chunk-GL634FKF.js";
18
+ } from "./chunk-RJRZXDVT.js";
19
19
  import {
20
20
  actions as actions6,
21
21
  sliceName as sliceName6
@@ -32,14 +32,14 @@ import {
32
32
  actions as actions3,
33
33
  sliceName as sliceName3
34
34
  } from "./chunk-VODRLEDP.js";
35
- import {
36
- actions as actions2,
37
- sliceName as sliceName2
38
- } from "./chunk-OLKM53RL.js";
39
35
  import {
40
36
  actions,
41
37
  sliceName
42
38
  } from "./chunk-6WJI4MOP.js";
39
+ import {
40
+ actions as actions2,
41
+ sliceName as sliceName2
42
+ } from "./chunk-OLKM53RL.js";
43
43
  import {
44
44
  cleanUp,
45
45
  getSessionInfo,
@@ -52,7 +52,7 @@ import {
52
52
  getSearchEndpoint,
53
53
  getTenantCapabilities,
54
54
  getUserCapabilities
55
- } from "./chunk-JDSAICR3.js";
55
+ } from "./chunk-TJBX7YHM.js";
56
56
  import {
57
57
  getCurrentSession,
58
58
  getCurrentUser,
@@ -71,6 +71,10 @@ import {
71
71
  getOrganization,
72
72
  getTenantsList
73
73
  } from "./chunk-3NOV7X4M.js";
74
+ import {
75
+ getDeploymentsById,
76
+ getDeploymentsByStatus
77
+ } from "./chunk-WR6RQKF5.js";
74
78
  import {
75
79
  getAcceptedDevices,
76
80
  getDeviceById,
@@ -86,10 +90,6 @@ import {
86
90
  getFeatures,
87
91
  getSearchState
88
92
  } from "./chunk-4BHM6WVX.js";
89
- import {
90
- getDeploymentsById,
91
- getDeploymentsByStatus
92
- } from "./chunk-WR6RQKF5.js";
93
93
  import {
94
94
  convertDeviceListStateToFilters,
95
95
  extractErrorMessage,
@@ -2771,4 +2771,4 @@ export {
2771
2771
  setAllTooltipsReadState,
2772
2772
  submitUserFeedback
2773
2773
  };
2774
- //# sourceMappingURL=chunk-76GD35G3.js.map
2774
+ //# sourceMappingURL=chunk-QFYSFHAF.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ actions as actions7
3
+ } from "./chunk-TRKA7XYU.js";
1
4
  import {
2
5
  actions as actions8
3
6
  } from "./chunk-YR65C62H.js";
@@ -5,8 +8,8 @@ import {
5
8
  actions as actions6
6
9
  } from "./chunk-VCEFZTWS.js";
7
10
  import {
8
- actions as actions7
9
- } from "./chunk-TRKA7XYU.js";
11
+ actions as actions4
12
+ } from "./chunk-PVCHKW35.js";
10
13
  import {
11
14
  actions as actions5
12
15
  } from "./chunk-CQXDAXQF.js";
@@ -14,14 +17,11 @@ import {
14
17
  actions as actions3
15
18
  } from "./chunk-VODRLEDP.js";
16
19
  import {
17
- actions as actions4
18
- } from "./chunk-PVCHKW35.js";
20
+ actions
21
+ } from "./chunk-6WJI4MOP.js";
19
22
  import {
20
23
  actions as actions2
21
24
  } from "./chunk-OLKM53RL.js";
22
- import {
23
- actions
24
- } from "./chunk-6WJI4MOP.js";
25
25
 
26
26
  // src/actions.ts
27
27
  var actions_default = {
@@ -38,4 +38,4 @@ var actions_default = {
38
38
  export {
39
39
  actions_default
40
40
  };
41
- //# sourceMappingURL=chunk-GL634FKF.js.map
41
+ //# sourceMappingURL=chunk-RJRZXDVT.js.map
@@ -1,6 +1,9 @@
1
1
  import {
2
2
  actions_default
3
- } from "./chunk-GL634FKF.js";
3
+ } from "./chunk-RJRZXDVT.js";
4
+ import {
5
+ releasesSlice_default
6
+ } from "./chunk-TRKA7XYU.js";
4
7
  import {
5
8
  actions as actions2,
6
9
  usersSlice_default
@@ -10,8 +13,8 @@ import {
10
13
  organizationSlice_default
11
14
  } from "./chunk-VCEFZTWS.js";
12
15
  import {
13
- releasesSlice_default
14
- } from "./chunk-TRKA7XYU.js";
16
+ monitorSlice_default
17
+ } from "./chunk-PVCHKW35.js";
15
18
  import {
16
19
  onboardingSlice_default
17
20
  } from "./chunk-CQXDAXQF.js";
@@ -19,14 +22,11 @@ import {
19
22
  devicesSlice_default
20
23
  } from "./chunk-VODRLEDP.js";
21
24
  import {
22
- monitorSlice_default
23
- } from "./chunk-PVCHKW35.js";
25
+ appSlice_default
26
+ } from "./chunk-6WJI4MOP.js";
24
27
  import {
25
28
  deploymentsSlice_default
26
29
  } from "./chunk-OLKM53RL.js";
27
- import {
28
- appSlice_default
29
- } from "./chunk-6WJI4MOP.js";
30
30
  import {
31
31
  getToken
32
32
  } from "./chunk-FDSMCFV5.js";
@@ -139,4 +139,4 @@ export {
139
139
  useAppDispatch,
140
140
  createAppAsyncThunk
141
141
  };
142
- //# sourceMappingURL=chunk-E2UO6BJ3.js.map
142
+ //# sourceMappingURL=chunk-RVAERI6U.js.map
@@ -4,9 +4,12 @@ import {
4
4
  import {
5
5
  getCurrentUser,
6
6
  getGlobalSettings,
7
+ getHas2FA,
7
8
  getRolesById,
8
9
  getRolesList,
9
- getUserSettings
10
+ getSecurityAlertDismissedTimestamp,
11
+ getUserSettings,
12
+ getUserSettingsInitialized
10
13
  } from "./chunk-QL6FN2JC.js";
11
14
  import {
12
15
  getAuditLogEntry,
@@ -19,6 +22,11 @@ import {
19
22
  import {
20
23
  getOnboarding
21
24
  } from "./chunk-JIS4PA3R.js";
25
+ import {
26
+ getDeploymentsById,
27
+ getDeploymentsSelectionState,
28
+ getSelectedDeploymentDeviceIds
29
+ } from "./chunk-WR6RQKF5.js";
22
30
  import {
23
31
  getDeviceById,
24
32
  getDevicesById,
@@ -30,11 +38,6 @@ import {
30
38
  getFeatures,
31
39
  getSearchedDevices
32
40
  } from "./chunk-4BHM6WVX.js";
33
- import {
34
- getDeploymentsById,
35
- getDeploymentsSelectionState,
36
- getSelectedDeploymentDeviceIds
37
- } from "./chunk-WR6RQKF5.js";
38
41
  import {
39
42
  listItemMapper,
40
43
  mapUserRolesToUiPermissions
@@ -64,6 +67,7 @@ import {
64
67
  // src/commonSelectors.ts
65
68
  import { attributeDuplicateFilter, getDemoDeviceAddress as getDemoDeviceAddressHelper } from "@northern.tech/utils/helpers";
66
69
  import { createSelector } from "@reduxjs/toolkit";
70
+ import dayjs from "dayjs";
67
71
  var getIsEnterprise = createSelector(
68
72
  [getOrganization, getFeatures],
69
73
  ({ plan = PLANS.os.id }, { isEnterprise, isHosted }) => isEnterprise || isHosted && plan === PLANS.enterprise.id
@@ -268,6 +272,22 @@ var getRelevantRoles = createSelector([getOrganization, getRolesList], ({ servic
268
272
  return accu;
269
273
  }, roles);
270
274
  });
275
+ var getShowSecurityAlert = createSelector(
276
+ [getCurrentUser, getHas2FA, getFeatures, getIsEnterprise, getUserSettingsInitialized, getSecurityAlertDismissedTimestamp],
277
+ (currentUser, has2FA, features, isEnterprise, settingsInitialized, dismissedTimestamp) => {
278
+ const isHosted = features?.isHosted;
279
+ const canHave2FA = isEnterprise || isHosted;
280
+ if (!currentUser || !settingsInitialized || has2FA || !canHave2FA) {
281
+ return false;
282
+ }
283
+ if (dismissedTimestamp === null) {
284
+ return true;
285
+ }
286
+ const today = dayjs();
287
+ const dismissedMonthAgo = today.diff(dismissedTimestamp, "months");
288
+ return dismissedMonthAgo > 0;
289
+ }
290
+ );
271
291
 
272
292
  export {
273
293
  getIsEnterprise,
@@ -287,6 +307,7 @@ export {
287
307
  getDeviceReportsForUser,
288
308
  getMappedDevicesList,
289
309
  getAuditlogDevice,
290
- getRelevantRoles
310
+ getRelevantRoles,
311
+ getShowSecurityAlert
291
312
  };
292
- //# sourceMappingURL=chunk-JDSAICR3.js.map
313
+ //# sourceMappingURL=chunk-TJBX7YHM.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commonSelectors.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 { attributeDuplicateFilter, getDemoDeviceAddress as getDemoDeviceAddressHelper } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { ADDONS, PLANS, defaultReports } from './appSlice/constants';\nimport { getFeatures, getSearchedDevices } from './appSlice/selectors';\nimport { DEVICE_LIST_MAXIMUM_LENGTH, UNGROUPED_GROUP } from './commonConstants';\nimport {\n ALL_DEVICES,\n ATTRIBUTE_SCOPES,\n DEVICE_ISSUE_OPTIONS,\n inventoryApiUrlV2,\n reportingApiUrl,\n rolesById,\n rolesByName,\n serviceProviderRolesById,\n uiPermissionsById\n} from './constants';\nimport { getDeploymentsById, getDeploymentsSelectionState, getSelectedDeploymentDeviceIds } from './deploymentsSlice/selectors';\nimport { getDeviceById, getDevicesById, getFilteringAttributes, getGroupsById, getListedDevices } from './devicesSlice/selectors';\nimport { getIssueCountsByType } from './monitorSlice/selectors';\nimport { onboardingSteps } from './onboardingSlice/constants';\nimport { getOnboarding } from './onboardingSlice/selectors';\nimport { getAuditLogEntry, getIsServiceProvider, getOrganization } from './organizationSlice/selectors';\nimport { getReleasesById } from './releasesSlice/selectors';\nimport { getCurrentUser, getGlobalSettings, getRolesById, getRolesList, getUserSettings } from './usersSlice/selectors';\nimport { listItemMapper, mapUserRolesToUiPermissions } from './utils';\n\nexport const getIsEnterprise = createSelector(\n [getOrganization, getFeatures],\n ({ plan = PLANS.os.id }, { isEnterprise, isHosted }) => isEnterprise || (isHosted && plan === PLANS.enterprise.id)\n);\n\nexport const getAttrsEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search/attributes` : `${inventoryApiUrlV2}/filters/attributes`\n);\nexport const getSearchEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search` : `${inventoryApiUrlV2}/filters/search`\n);\n\nexport const getUserRoles = createSelector([getCurrentUser, getRolesById, getIsEnterprise], (currentUser, rolesById, isEnterprise) => {\n const isAdmin = currentUser.roles?.length ? currentUser.roles.some(role => role === rolesByName.admin) : !isEnterprise;\n const uiPermissions = isAdmin ? mapUserRolesToUiPermissions([rolesByName.admin], rolesById) : mapUserRolesToUiPermissions(currentUser.roles || [], rolesById);\n return { isAdmin, uiPermissions };\n});\n\nconst hasPermission = (thing, permission) => Object.values(thing).some(permissions => permissions.includes(permission));\n\nexport const getUserCapabilities = createSelector([getUserRoles, getIsServiceProvider], ({ uiPermissions }, isServiceProvider) => {\n const canManageReleases = hasPermission(uiPermissions.releases, uiPermissionsById.manage.value);\n const canReadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.read.value);\n const canUploadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.upload.value);\n\n const canAuditlog = uiPermissions.auditlog.includes(uiPermissionsById.read.value);\n\n const canReadUsers = uiPermissions.userManagement.includes(uiPermissionsById.read.value);\n const canManageUsers = uiPermissions.userManagement.includes(uiPermissionsById.manage.value);\n\n const canReadDevices = hasPermission(uiPermissions.groups, uiPermissionsById.read.value);\n const canWriteDevices = Object.values(uiPermissions.groups).some(\n groupPermissions => groupPermissions.includes(uiPermissionsById.read.value) && groupPermissions.length > 1\n );\n const canTroubleshoot = hasPermission(uiPermissions.groups, uiPermissionsById.connect.value);\n const canManageDevices = hasPermission(uiPermissions.groups, uiPermissionsById.manage.value);\n const canConfigure = hasPermission(uiPermissions.groups, uiPermissionsById.configure.value);\n\n const canDeploy = uiPermissions.deployments.includes(uiPermissionsById.deploy.value) || hasPermission(uiPermissions.groups, uiPermissionsById.deploy.value);\n const canReadDeployments = uiPermissions.deployments.includes(uiPermissionsById.read.value);\n\n return {\n canAuditlog,\n canConfigure,\n canDeploy,\n canManageDevices,\n canManageReleases,\n canManageUsers,\n canReadDeployments,\n canReadDevices,\n canReadReleases,\n canReadUsers,\n canTroubleshoot,\n canUploadReleases,\n canWriteDevices,\n groupsPermissions: uiPermissions.groups,\n releasesPermissions: uiPermissions.releases,\n SPTenant: isServiceProvider\n };\n});\n\nexport const getTenantCapabilities = createSelector(\n [getFeatures, getOrganization, getIsEnterprise],\n (\n {\n hasAuditlogs: isAuditlogEnabled,\n hasDeviceConfig: isDeviceConfigEnabled,\n hasDeviceConnect: isDeviceConnectEnabled,\n hasMonitor: isMonitorEnabled,\n isHosted\n },\n { addons = [], plan = PLANS.os.id },\n isEnterprise\n ) => {\n const canDelta = isEnterprise || plan === PLANS.professional.id;\n const hasAuditlogs = isAuditlogEnabled && isEnterprise;\n const hasDeviceConfig = addons.some(addon => addon.name === ADDONS.configure.id && addon.enabled) || (isDeviceConfigEnabled && !isHosted);\n const hasDeviceConnect = addons.some(addon => addon.name === ADDONS.troubleshoot.id && addon.enabled) || (isDeviceConnectEnabled && !isHosted);\n const hasMonitor = isMonitorEnabled && addons.some(addon => addon.name === ADDONS.monitor.id && addon.enabled);\n return {\n canDelta,\n canRetry: canDelta,\n canSchedule: canDelta,\n hasAuditlogs,\n hasDeviceConfig,\n hasDeviceConnect,\n hasFullFiltering: canDelta,\n hasMonitor,\n isEnterprise,\n plan\n };\n }\n);\n\nexport const getFilterAttributes = createSelector(\n [getGlobalSettings, getFilteringAttributes],\n ({ previousFilters }, { identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }) => {\n const deviceNameAttribute = { key: 'name', value: 'Name', scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 1 };\n const deviceIdAttribute = { key: 'id', value: 'Device ID', scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 };\n const checkInAttribute = { key: 'check_in_time', value: 'Latest activity', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const updateAttribute = { ...checkInAttribute, key: 'updated_ts', value: 'Last inventory update' };\n const firstRequestAttribute = { key: 'created_ts', value: 'First request', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const attributes = [\n ...previousFilters.map(item => ({\n ...item,\n value: deviceIdAttribute.key === item.key ? deviceIdAttribute.value : item.key,\n category: 'recently used',\n priority: 0\n })),\n deviceNameAttribute,\n deviceIdAttribute,\n ...identityAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 })),\n ...inventoryAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.inventory, category: ATTRIBUTE_SCOPES.inventory, priority: 2 })),\n ...tagAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 3 })),\n checkInAttribute,\n updateAttribute,\n firstRequestAttribute,\n ...systemAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 }))\n ];\n return attributeDuplicateFilter(attributes, 'key');\n }\n);\n\nexport const getOnboardingState = createSelector([getOnboarding, getUserSettings], ({ complete, progress, showTips, ...remainder }, { onboarding = {} }) => ({\n ...remainder,\n ...onboarding,\n complete: onboarding.complete || complete,\n progress:\n Object.keys(onboardingSteps).findIndex(step => step === progress) > Object.keys(onboardingSteps).findIndex(step => step === onboarding.progress)\n ? progress\n : onboarding.progress,\n showTips: !onboarding.showTips ? onboarding.showTips : showTips\n}));\n\nexport const getDemoDeviceAddress = createSelector([getDevicesById, getOnboarding], (devicesById, { approach, demoArtifactPort }) => {\n const demoDeviceAddress = `http://${getDemoDeviceAddressHelper(Object.values(devicesById), approach)}`;\n return demoArtifactPort ? `${demoDeviceAddress}:${demoArtifactPort}` : demoDeviceAddress;\n});\n\nexport const getDeviceConfigDeployment = createSelector([getDeviceById, getDeploymentsById], (device, deploymentsById) => {\n const { config = {} } = device;\n const { deployment_id: configDeploymentId } = config;\n const deviceConfigDeployment = deploymentsById[configDeploymentId] || {};\n return { device, deviceConfigDeployment };\n});\n\nexport const getDeploymentRelease = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getReleasesById],\n (deploymentsById, { selectedId }, releasesById) => {\n const deployment = deploymentsById[selectedId] || {};\n return deployment.artifact_name && releasesById[deployment.artifact_name] ? releasesById[deployment.artifact_name] : { device_types_compatible: [] };\n }\n);\n\nexport const getSelectedDeploymentData = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getDevicesById, getSelectedDeploymentDeviceIds],\n (deploymentsById, { selectedId }, devicesById, selectedDeviceIds) => {\n const deployment = deploymentsById[selectedId] ?? {};\n const { devices = {} } = deployment;\n return {\n deployment,\n selectedDevices: selectedDeviceIds.map(deviceId => ({ ...devicesById[deviceId], ...devices[deviceId] }))\n };\n }\n);\n\nexport const getAvailableIssueOptionsByType = createSelector(\n [getFeatures, getTenantCapabilities, getIssueCountsByType],\n ({ hasReporting }, { hasFullFiltering, hasMonitor }, issueCounts) =>\n Object.values(DEVICE_ISSUE_OPTIONS).reduce((accu, { isCategory, key, needsFullFiltering, needsMonitor, needsReporting, title }) => {\n if (isCategory || (needsReporting && !hasReporting) || (needsFullFiltering && !hasFullFiltering) || (needsMonitor && !hasMonitor)) {\n return accu;\n }\n accu[key] = { count: issueCounts[key].filtered, key, title };\n return accu;\n }, {})\n);\n\nexport const getGroupNames = createSelector([getGroupsById, getUserRoles], (groupsById, { uiPermissions }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [UNGROUPED_GROUP.id]: ungrouped, ...groups } = groupsById;\n return Object.keys(\n Object.entries(groups).reduce((accu, [groupName, group]) => {\n if (group.filterId || uiPermissions.groups[ALL_DEVICES]) {\n accu[groupName] = group;\n }\n return accu;\n }, uiPermissions.groups)\n ).sort();\n});\n\nexport const getDeviceReportsForUser = createSelector(\n [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],\n ({ reports }, { id: currentUserId }, globalSettings, devicesById) =>\n reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])\n);\n\nconst listTypeDeviceIdMap = {\n deviceList: getListedDevices,\n search: getSearchedDevices\n};\nconst deviceMapDefault = { defaultObject: { auth_sets: [] }, cutOffSize: DEVICE_LIST_MAXIMUM_LENGTH };\nconst getDeviceMappingDefaults = () => deviceMapDefault;\n\nexport const getMappedDevicesList = createSelector(\n [getDevicesById, (state, listType) => listTypeDeviceIdMap[listType](state), getDeviceMappingDefaults],\n listItemMapper\n);\n\nexport const getAuditlogDevice = createSelector([getAuditLogEntry, getDevicesById], (auditlogEvent, devicesById) => {\n let auditlogDevice = {};\n if (auditlogEvent) {\n const { object = {} } = auditlogEvent;\n const { device = {}, id, type } = object;\n auditlogDevice = type === 'device' ? { id, ...device } : auditlogDevice;\n }\n return { ...auditlogDevice, ...devicesById[auditlogDevice.id] };\n});\n\nexport const getRelevantRoles = createSelector([getOrganization, getRolesList], ({ service_provider }, roles) => {\n if (service_provider) {\n return roles.reduce((accu, role) => {\n if (rolesById[role.value]) {\n return accu;\n }\n accu.push(role);\n return accu;\n }, Object.values(serviceProviderRolesById));\n }\n return Object.keys(rolesById)\n .reverse()\n .reduce((accu, key) => {\n const index = accu.findIndex(({ value }) => value === key);\n accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];\n return accu;\n }, roles);\n});\n"],"mappings":"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","names":["rolesById"]}
1
+ {"version":3,"sources":["../src/commonSelectors.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 { attributeDuplicateFilter, getDemoDeviceAddress as getDemoDeviceAddressHelper } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\n\nimport { ADDONS, PLANS, defaultReports } from './appSlice/constants';\nimport { getFeatures, getSearchedDevices } from './appSlice/selectors';\nimport { DEVICE_LIST_MAXIMUM_LENGTH, UNGROUPED_GROUP } from './commonConstants';\nimport {\n ALL_DEVICES,\n ATTRIBUTE_SCOPES,\n DEVICE_ISSUE_OPTIONS,\n inventoryApiUrlV2,\n reportingApiUrl,\n rolesById,\n rolesByName,\n serviceProviderRolesById,\n uiPermissionsById\n} from './constants';\nimport { getDeploymentsById, getDeploymentsSelectionState, getSelectedDeploymentDeviceIds } from './deploymentsSlice/selectors';\nimport { getDeviceById, getDevicesById, getFilteringAttributes, getGroupsById, getListedDevices } from './devicesSlice/selectors';\nimport { getIssueCountsByType } from './monitorSlice/selectors';\nimport { onboardingSteps } from './onboardingSlice/constants';\nimport { getOnboarding } from './onboardingSlice/selectors';\nimport { getAuditLogEntry, getIsServiceProvider, getOrganization } from './organizationSlice/selectors';\nimport { getReleasesById } from './releasesSlice/selectors';\nimport {\n getCurrentUser,\n getGlobalSettings,\n getHas2FA,\n getRolesById,\n getRolesList,\n getSecurityAlertDismissedTimestamp,\n getUserSettings,\n getUserSettingsInitialized\n} from './usersSlice/selectors';\nimport { listItemMapper, mapUserRolesToUiPermissions } from './utils';\n\nexport const getIsEnterprise = createSelector(\n [getOrganization, getFeatures],\n ({ plan = PLANS.os.id }, { isEnterprise, isHosted }) => isEnterprise || (isHosted && plan === PLANS.enterprise.id)\n);\n\nexport const getAttrsEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search/attributes` : `${inventoryApiUrlV2}/filters/attributes`\n);\nexport const getSearchEndpoint = createSelector([getFeatures], ({ hasReporting }) =>\n hasReporting ? `${reportingApiUrl}/devices/search` : `${inventoryApiUrlV2}/filters/search`\n);\n\nexport const getUserRoles = createSelector([getCurrentUser, getRolesById, getIsEnterprise], (currentUser, rolesById, isEnterprise) => {\n const isAdmin = currentUser.roles?.length ? currentUser.roles.some(role => role === rolesByName.admin) : !isEnterprise;\n const uiPermissions = isAdmin ? mapUserRolesToUiPermissions([rolesByName.admin], rolesById) : mapUserRolesToUiPermissions(currentUser.roles || [], rolesById);\n return { isAdmin, uiPermissions };\n});\n\nconst hasPermission = (thing, permission) => Object.values(thing).some(permissions => permissions.includes(permission));\n\nexport const getUserCapabilities = createSelector([getUserRoles, getIsServiceProvider], ({ uiPermissions }, isServiceProvider) => {\n const canManageReleases = hasPermission(uiPermissions.releases, uiPermissionsById.manage.value);\n const canReadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.read.value);\n const canUploadReleases = canManageReleases || hasPermission(uiPermissions.releases, uiPermissionsById.upload.value);\n\n const canAuditlog = uiPermissions.auditlog.includes(uiPermissionsById.read.value);\n\n const canReadUsers = uiPermissions.userManagement.includes(uiPermissionsById.read.value);\n const canManageUsers = uiPermissions.userManagement.includes(uiPermissionsById.manage.value);\n\n const canReadDevices = hasPermission(uiPermissions.groups, uiPermissionsById.read.value);\n const canWriteDevices = Object.values(uiPermissions.groups).some(\n groupPermissions => groupPermissions.includes(uiPermissionsById.read.value) && groupPermissions.length > 1\n );\n const canTroubleshoot = hasPermission(uiPermissions.groups, uiPermissionsById.connect.value);\n const canManageDevices = hasPermission(uiPermissions.groups, uiPermissionsById.manage.value);\n const canConfigure = hasPermission(uiPermissions.groups, uiPermissionsById.configure.value);\n\n const canDeploy = uiPermissions.deployments.includes(uiPermissionsById.deploy.value) || hasPermission(uiPermissions.groups, uiPermissionsById.deploy.value);\n const canReadDeployments = uiPermissions.deployments.includes(uiPermissionsById.read.value);\n\n return {\n canAuditlog,\n canConfigure,\n canDeploy,\n canManageDevices,\n canManageReleases,\n canManageUsers,\n canReadDeployments,\n canReadDevices,\n canReadReleases,\n canReadUsers,\n canTroubleshoot,\n canUploadReleases,\n canWriteDevices,\n groupsPermissions: uiPermissions.groups,\n releasesPermissions: uiPermissions.releases,\n SPTenant: isServiceProvider\n };\n});\n\nexport const getTenantCapabilities = createSelector(\n [getFeatures, getOrganization, getIsEnterprise],\n (\n {\n hasAuditlogs: isAuditlogEnabled,\n hasDeviceConfig: isDeviceConfigEnabled,\n hasDeviceConnect: isDeviceConnectEnabled,\n hasMonitor: isMonitorEnabled,\n isHosted\n },\n { addons = [], plan = PLANS.os.id },\n isEnterprise\n ) => {\n const canDelta = isEnterprise || plan === PLANS.professional.id;\n const hasAuditlogs = isAuditlogEnabled && isEnterprise;\n const hasDeviceConfig = addons.some(addon => addon.name === ADDONS.configure.id && addon.enabled) || (isDeviceConfigEnabled && !isHosted);\n const hasDeviceConnect = addons.some(addon => addon.name === ADDONS.troubleshoot.id && addon.enabled) || (isDeviceConnectEnabled && !isHosted);\n const hasMonitor = isMonitorEnabled && addons.some(addon => addon.name === ADDONS.monitor.id && addon.enabled);\n return {\n canDelta,\n canRetry: canDelta,\n canSchedule: canDelta,\n hasAuditlogs,\n hasDeviceConfig,\n hasDeviceConnect,\n hasFullFiltering: canDelta,\n hasMonitor,\n isEnterprise,\n plan\n };\n }\n);\n\nexport const getFilterAttributes = createSelector(\n [getGlobalSettings, getFilteringAttributes],\n ({ previousFilters }, { identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }) => {\n const deviceNameAttribute = { key: 'name', value: 'Name', scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 1 };\n const deviceIdAttribute = { key: 'id', value: 'Device ID', scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 };\n const checkInAttribute = { key: 'check_in_time', value: 'Latest activity', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const updateAttribute = { ...checkInAttribute, key: 'updated_ts', value: 'Last inventory update' };\n const firstRequestAttribute = { key: 'created_ts', value: 'First request', scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 };\n const attributes = [\n ...previousFilters.map(item => ({\n ...item,\n value: deviceIdAttribute.key === item.key ? deviceIdAttribute.value : item.key,\n category: 'recently used',\n priority: 0\n })),\n deviceNameAttribute,\n deviceIdAttribute,\n ...identityAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.identity, category: ATTRIBUTE_SCOPES.identity, priority: 1 })),\n ...inventoryAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.inventory, category: ATTRIBUTE_SCOPES.inventory, priority: 2 })),\n ...tagAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.tags, category: ATTRIBUTE_SCOPES.tags, priority: 3 })),\n checkInAttribute,\n updateAttribute,\n firstRequestAttribute,\n ...systemAttributes.map(item => ({ key: item, value: item, scope: ATTRIBUTE_SCOPES.system, category: ATTRIBUTE_SCOPES.system, priority: 4 }))\n ];\n return attributeDuplicateFilter(attributes, 'key');\n }\n);\n\nexport const getOnboardingState = createSelector([getOnboarding, getUserSettings], ({ complete, progress, showTips, ...remainder }, { onboarding = {} }) => ({\n ...remainder,\n ...onboarding,\n complete: onboarding.complete || complete,\n progress:\n Object.keys(onboardingSteps).findIndex(step => step === progress) > Object.keys(onboardingSteps).findIndex(step => step === onboarding.progress)\n ? progress\n : onboarding.progress,\n showTips: !onboarding.showTips ? onboarding.showTips : showTips\n}));\n\nexport const getDemoDeviceAddress = createSelector([getDevicesById, getOnboarding], (devicesById, { approach, demoArtifactPort }) => {\n const demoDeviceAddress = `http://${getDemoDeviceAddressHelper(Object.values(devicesById), approach)}`;\n return demoArtifactPort ? `${demoDeviceAddress}:${demoArtifactPort}` : demoDeviceAddress;\n});\n\nexport const getDeviceConfigDeployment = createSelector([getDeviceById, getDeploymentsById], (device, deploymentsById) => {\n const { config = {} } = device;\n const { deployment_id: configDeploymentId } = config;\n const deviceConfigDeployment = deploymentsById[configDeploymentId] || {};\n return { device, deviceConfigDeployment };\n});\n\nexport const getDeploymentRelease = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getReleasesById],\n (deploymentsById, { selectedId }, releasesById) => {\n const deployment = deploymentsById[selectedId] || {};\n return deployment.artifact_name && releasesById[deployment.artifact_name] ? releasesById[deployment.artifact_name] : { device_types_compatible: [] };\n }\n);\n\nexport const getSelectedDeploymentData = createSelector(\n [getDeploymentsById, getDeploymentsSelectionState, getDevicesById, getSelectedDeploymentDeviceIds],\n (deploymentsById, { selectedId }, devicesById, selectedDeviceIds) => {\n const deployment = deploymentsById[selectedId] ?? {};\n const { devices = {} } = deployment;\n return {\n deployment,\n selectedDevices: selectedDeviceIds.map(deviceId => ({ ...devicesById[deviceId], ...devices[deviceId] }))\n };\n }\n);\n\nexport const getAvailableIssueOptionsByType = createSelector(\n [getFeatures, getTenantCapabilities, getIssueCountsByType],\n ({ hasReporting }, { hasFullFiltering, hasMonitor }, issueCounts) =>\n Object.values(DEVICE_ISSUE_OPTIONS).reduce((accu, { isCategory, key, needsFullFiltering, needsMonitor, needsReporting, title }) => {\n if (isCategory || (needsReporting && !hasReporting) || (needsFullFiltering && !hasFullFiltering) || (needsMonitor && !hasMonitor)) {\n return accu;\n }\n accu[key] = { count: issueCounts[key].filtered, key, title };\n return accu;\n }, {})\n);\n\nexport const getGroupNames = createSelector([getGroupsById, getUserRoles], (groupsById, { uiPermissions }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [UNGROUPED_GROUP.id]: ungrouped, ...groups } = groupsById;\n return Object.keys(\n Object.entries(groups).reduce((accu, [groupName, group]) => {\n if (group.filterId || uiPermissions.groups[ALL_DEVICES]) {\n accu[groupName] = group;\n }\n return accu;\n }, uiPermissions.groups)\n ).sort();\n});\n\nexport const getDeviceReportsForUser = createSelector(\n [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],\n ({ reports }, { id: currentUserId }, globalSettings, devicesById) =>\n reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])\n);\n\nconst listTypeDeviceIdMap = {\n deviceList: getListedDevices,\n search: getSearchedDevices\n};\nconst deviceMapDefault = { defaultObject: { auth_sets: [] }, cutOffSize: DEVICE_LIST_MAXIMUM_LENGTH };\nconst getDeviceMappingDefaults = () => deviceMapDefault;\n\nexport const getMappedDevicesList = createSelector(\n [getDevicesById, (state, listType) => listTypeDeviceIdMap[listType](state), getDeviceMappingDefaults],\n listItemMapper\n);\n\nexport const getAuditlogDevice = createSelector([getAuditLogEntry, getDevicesById], (auditlogEvent, devicesById) => {\n let auditlogDevice = {};\n if (auditlogEvent) {\n const { object = {} } = auditlogEvent;\n const { device = {}, id, type } = object;\n auditlogDevice = type === 'device' ? { id, ...device } : auditlogDevice;\n }\n return { ...auditlogDevice, ...devicesById[auditlogDevice.id] };\n});\n\nexport const getRelevantRoles = createSelector([getOrganization, getRolesList], ({ service_provider }, roles) => {\n if (service_provider) {\n return roles.reduce((accu, role) => {\n if (rolesById[role.value]) {\n return accu;\n }\n accu.push(role);\n return accu;\n }, Object.values(serviceProviderRolesById));\n }\n return Object.keys(rolesById)\n .reverse()\n .reduce((accu, key) => {\n const index = accu.findIndex(({ value }) => value === key);\n accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];\n return accu;\n }, roles);\n});\n\nexport const getShowSecurityAlert = createSelector(\n [getCurrentUser, getHas2FA, getFeatures, getIsEnterprise, getUserSettingsInitialized, getSecurityAlertDismissedTimestamp],\n (currentUser, has2FA, features, isEnterprise, settingsInitialized, dismissedTimestamp) => {\n const isHosted = features?.isHosted;\n const canHave2FA = isEnterprise || isHosted;\n if (!currentUser || !settingsInitialized || has2FA || !canHave2FA) {\n return false;\n }\n\n if (dismissedTimestamp === null) {\n return true;\n }\n\n const today = dayjs();\n const dismissedMonthAgo = today.diff(dismissedTimestamp, 'months');\n\n return dismissedMonthAgo > 0;\n }\n);\n"],"mappings":"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","names":["rolesById"]}
@@ -1,14 +1,14 @@
1
- import {
2
- general_api_default
3
- } from "./chunk-5M6EUVNO.js";
4
1
  import {
5
2
  commonErrorFallback,
6
3
  commonErrorHandler,
7
4
  createAppAsyncThunk
8
- } from "./chunk-E2UO6BJ3.js";
5
+ } from "./chunk-RVAERI6U.js";
6
+ import {
7
+ general_api_default
8
+ } from "./chunk-5M6EUVNO.js";
9
9
  import {
10
10
  actions_default
11
- } from "./chunk-GL634FKF.js";
11
+ } from "./chunk-RJRZXDVT.js";
12
12
  import {
13
13
  actions,
14
14
  sliceName
@@ -18,7 +18,7 @@ import {
18
18
  } from "./chunk-53W2NRSL.js";
19
19
  import {
20
20
  getSearchEndpoint
21
- } from "./chunk-JDSAICR3.js";
21
+ } from "./chunk-TJBX7YHM.js";
22
22
  import {
23
23
  getReleasesById
24
24
  } from "./chunk-GEQ2QQEE.js";
@@ -442,4 +442,4 @@ export {
442
442
  getDeltaGenerationJobs,
443
443
  getDeltaGenerationJobDetails
444
444
  };
445
- //# sourceMappingURL=chunk-QXS7I6BE.js.map
445
+ //# sourceMappingURL=chunk-XC7DABLM.js.map
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/commonSelectors.ts
@@ -35,6 +45,7 @@ __export(commonSelectors_exports, {
35
45
  getRelevantRoles: () => getRelevantRoles,
36
46
  getSearchEndpoint: () => getSearchEndpoint,
37
47
  getSelectedDeploymentData: () => getSelectedDeploymentData,
48
+ getShowSecurityAlert: () => getShowSecurityAlert,
38
49
  getTenantCapabilities: () => getTenantCapabilities,
39
50
  getUserCapabilities: () => getUserCapabilities,
40
51
  getUserRoles: () => getUserRoles
@@ -42,6 +53,7 @@ __export(commonSelectors_exports, {
42
53
  module.exports = __toCommonJS(commonSelectors_exports);
43
54
  var import_helpers4 = require("@northern.tech/utils/helpers");
44
55
  var import_toolkit7 = require("@reduxjs/toolkit");
56
+ var import_dayjs = __toESM(require("dayjs"), 1);
45
57
 
46
58
  // src/appSlice/constants.ts
47
59
  var import_icons_material = require("@mui/icons-material");
@@ -990,6 +1002,7 @@ var emptyObject = {};
990
1002
  var getRolesById = (state) => state.users.rolesById;
991
1003
  var getTooltipsById = (state) => state.users.tooltips.byId;
992
1004
  var getGlobalSettings = (state) => state.users.globalSettings;
1005
+ var getUserSettingsInitialized = (state) => state.users.userSettingsInitialized;
993
1006
  var getCurrentUserId = (state) => state.users.currentUser;
994
1007
  var getUsersById = (state) => state.users.byId;
995
1008
  var getUsersList = (0, import_toolkit6.createSelector)([getUsersById], (usersById) => Object.values(usersById));
@@ -1027,6 +1040,7 @@ var getOfflineThresholdSettings = (0, import_toolkit6.createSelector)([getGlobal
1027
1040
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
1028
1041
  }));
1029
1042
  var getRolesList = (0, import_toolkit6.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
1043
+ var getSecurityAlertDismissedTimestamp = (state) => state.users.userSettings.securityAlertDismissedTimestamp;
1030
1044
 
1031
1045
  // src/commonSelectors.ts
1032
1046
  var getIsEnterprise = (0, import_toolkit7.createSelector)(
@@ -1233,6 +1247,22 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1233
1247
  return accu;
1234
1248
  }, roles);
1235
1249
  });
1250
+ var getShowSecurityAlert = (0, import_toolkit7.createSelector)(
1251
+ [getCurrentUser, getHas2FA, getFeatures, getIsEnterprise, getUserSettingsInitialized, getSecurityAlertDismissedTimestamp],
1252
+ (currentUser, has2FA, features, isEnterprise, settingsInitialized, dismissedTimestamp) => {
1253
+ const isHosted = features?.isHosted;
1254
+ const canHave2FA = isEnterprise || isHosted;
1255
+ if (!currentUser || !settingsInitialized || has2FA || !canHave2FA) {
1256
+ return false;
1257
+ }
1258
+ if (dismissedTimestamp === null) {
1259
+ return true;
1260
+ }
1261
+ const today = (0, import_dayjs.default)();
1262
+ const dismissedMonthAgo = today.diff(dismissedTimestamp, "months");
1263
+ return dismissedMonthAgo > 0;
1264
+ }
1265
+ );
1236
1266
  // Annotate the CommonJS export names for ESM import in node:
1237
1267
  0 && (module.exports = {
1238
1268
  getAttrsEndpoint,
@@ -1250,6 +1280,7 @@ var getRelevantRoles = (0, import_toolkit7.createSelector)([getOrganization, get
1250
1280
  getRelevantRoles,
1251
1281
  getSearchEndpoint,
1252
1282
  getSelectedDeploymentData,
1283
+ getShowSecurityAlert,
1253
1284
  getTenantCapabilities,
1254
1285
  getUserCapabilities,
1255
1286
  getUserRoles