@northern.tech/store 0.29.0 → 0.30.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 (178) hide show
  1. package/dist/actions.cjs +0 -1
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.js +9 -9
  4. package/dist/api/general-api.cjs.map +1 -1
  5. package/dist/api/general-api.js +3 -3
  6. package/dist/api/users-api.cjs.map +1 -1
  7. package/dist/api/users-api.js +4 -4
  8. package/dist/appSlice/index.cjs +0 -1
  9. package/dist/appSlice/index.cjs.map +1 -1
  10. package/dist/appSlice/index.js +2 -2
  11. package/dist/appSlice/mocks.cjs +0 -1
  12. package/dist/appSlice/mocks.cjs.map +1 -1
  13. package/dist/appSlice/mocks.js +2 -2
  14. package/dist/appSlice/thunks.cjs +25 -31
  15. package/dist/appSlice/thunks.cjs.map +1 -1
  16. package/dist/appSlice/thunks.js +24 -24
  17. package/dist/auth.cjs.map +1 -1
  18. package/dist/auth.js +2 -2
  19. package/dist/{chunk-2QIGK5IU.js → chunk-4UNLEL5A.js} +2 -2
  20. package/dist/{chunk-4573DUCR.js → chunk-6V5IIIF7.js} +2 -2
  21. package/dist/{chunk-Z4QLZNAN.js → chunk-ARMI6SZS.js} +13 -15
  22. package/dist/chunk-ARMI6SZS.js.map +1 -0
  23. package/dist/{chunk-KEQAPMP6.js → chunk-AZF4YY3P.js} +10 -12
  24. package/dist/chunk-AZF4YY3P.js.map +1 -0
  25. package/dist/{chunk-GX3X2E57.js → chunk-B5AI2YPV.js} +2 -3
  26. package/dist/chunk-B5AI2YPV.js.map +1 -0
  27. package/dist/{chunk-WXRYJOL3.js → chunk-ECVQVQEL.js} +2 -2
  28. package/dist/{chunk-FXPRG4WH.js → chunk-FCY7BUGK.js} +40 -39
  29. package/dist/chunk-FCY7BUGK.js.map +1 -0
  30. package/dist/{chunk-525LX7VL.js → chunk-FG37HJLC.js} +2 -2
  31. package/dist/{chunk-SDHCQ62K.js → chunk-FQAUVV6C.js} +2 -2
  32. package/dist/{chunk-5OLM3HEG.js → chunk-HKN3RN2Z.js} +8 -8
  33. package/dist/{chunk-XHLNGIAP.js → chunk-HPKXWNEF.js} +2 -2
  34. package/dist/{chunk-QX67O5A2.js → chunk-JXBTIFMS.js} +3 -3
  35. package/dist/{chunk-VK6FVQ5K.js → chunk-JYPSCCT4.js} +3 -3
  36. package/dist/{chunk-CMXRPUOF.js → chunk-L53CPHJU.js} +1 -3
  37. package/dist/chunk-L53CPHJU.js.map +1 -0
  38. package/dist/{chunk-4BUO44SS.js → chunk-MNJXEB7S.js} +11 -23
  39. package/dist/chunk-MNJXEB7S.js.map +1 -0
  40. package/dist/{chunk-UE2EPKRU.js → chunk-NXLXPRYW.js} +11 -11
  41. package/dist/{chunk-FAKWYYOB.js → chunk-O6VCSLNE.js} +2 -2
  42. package/dist/{chunk-LSAJE3IU.js → chunk-PQADM3M3.js} +2 -2
  43. package/dist/{chunk-VLII64V6.js → chunk-SJ75YKOA.js} +2 -2
  44. package/dist/{chunk-66LI4BJO.js → chunk-TUPBZ6MQ.js} +2 -2
  45. package/dist/{chunk-SDWPOLHM.js → chunk-XF3TZSZS.js} +3 -3
  46. package/dist/{chunk-HVZ5BOM6.js → chunk-YB3US6OT.js} +2 -2
  47. package/dist/{chunk-UBFFGYQ4.js → chunk-YDDE5TIH.js} +2 -2
  48. package/dist/{chunk-4YLOOOZH.js → chunk-Z2O6LYVP.js} +2 -2
  49. package/dist/commonConstants.cjs.map +1 -1
  50. package/dist/commonConstants.js +1 -1
  51. package/dist/commonSelectors.cjs +3 -15
  52. package/dist/commonSelectors.cjs.map +1 -1
  53. package/dist/commonSelectors.d.cts +6 -66
  54. package/dist/commonSelectors.d.ts +6 -66
  55. package/dist/commonSelectors.js +8 -12
  56. package/dist/constants.cjs +0 -2
  57. package/dist/constants.cjs.map +1 -1
  58. package/dist/constants.d.cts +1 -1
  59. package/dist/constants.d.ts +1 -1
  60. package/dist/constants.js +1 -3
  61. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  62. package/dist/deploymentsSlice/constants.js +1 -1
  63. package/dist/deploymentsSlice/index.cjs.map +1 -1
  64. package/dist/deploymentsSlice/index.js +2 -2
  65. package/dist/deploymentsSlice/mocks.cjs.map +1 -1
  66. package/dist/deploymentsSlice/mocks.js +2 -2
  67. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  68. package/dist/deploymentsSlice/selectors.js +2 -2
  69. package/dist/deploymentsSlice/thunks.cjs +25 -31
  70. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  71. package/dist/deploymentsSlice/thunks.js +24 -24
  72. package/dist/devicesSlice/constants.cjs.map +1 -1
  73. package/dist/devicesSlice/constants.js +1 -1
  74. package/dist/devicesSlice/index.cjs.map +1 -1
  75. package/dist/devicesSlice/index.js +2 -2
  76. package/dist/devicesSlice/mocks.cjs.map +1 -1
  77. package/dist/devicesSlice/mocks.js +2 -2
  78. package/dist/devicesSlice/selectors.cjs.map +1 -1
  79. package/dist/devicesSlice/selectors.js +2 -2
  80. package/dist/devicesSlice/thunks.cjs +25 -31
  81. package/dist/devicesSlice/thunks.cjs.map +1 -1
  82. package/dist/devicesSlice/thunks.js +24 -24
  83. package/dist/liststatehook.cjs.map +1 -1
  84. package/dist/liststatehook.js +2 -2
  85. package/dist/locationutils.cjs.map +1 -1
  86. package/dist/locationutils.js +2 -2
  87. package/dist/monitorSlice/index.cjs.map +1 -1
  88. package/dist/monitorSlice/index.js +2 -2
  89. package/dist/monitorSlice/mocks.cjs +0 -1
  90. package/dist/monitorSlice/mocks.cjs.map +1 -1
  91. package/dist/monitorSlice/mocks.d.cts +0 -4
  92. package/dist/monitorSlice/mocks.d.ts +0 -4
  93. package/dist/monitorSlice/mocks.js +2 -3
  94. package/dist/monitorSlice/mocks.js.map +1 -1
  95. package/dist/monitorSlice/thunks.cjs +29 -628
  96. package/dist/monitorSlice/thunks.cjs.map +1 -1
  97. package/dist/monitorSlice/thunks.js +20 -20
  98. package/dist/onboardingSlice/thunks.cjs +25 -31
  99. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  100. package/dist/onboardingSlice/thunks.js +24 -24
  101. package/dist/organizationSlice/constants.cjs.map +1 -1
  102. package/dist/organizationSlice/constants.js +1 -1
  103. package/dist/organizationSlice/index.cjs.map +1 -1
  104. package/dist/organizationSlice/index.js +2 -2
  105. package/dist/organizationSlice/mocks.cjs.map +1 -1
  106. package/dist/organizationSlice/mocks.js +2 -2
  107. package/dist/organizationSlice/selectors.cjs.map +1 -1
  108. package/dist/organizationSlice/selectors.js +2 -2
  109. package/dist/organizationSlice/thunks.cjs +25 -31
  110. package/dist/organizationSlice/thunks.cjs.map +1 -1
  111. package/dist/organizationSlice/thunks.js +24 -24
  112. package/dist/releasesSlice/index.cjs.map +1 -1
  113. package/dist/releasesSlice/index.js +2 -2
  114. package/dist/releasesSlice/mocks.cjs.map +1 -1
  115. package/dist/releasesSlice/mocks.js +2 -2
  116. package/dist/releasesSlice/selectors.cjs.map +1 -1
  117. package/dist/releasesSlice/selectors.js +3 -3
  118. package/dist/releasesSlice/thunks.cjs +99 -795
  119. package/dist/releasesSlice/thunks.cjs.map +1 -1
  120. package/dist/releasesSlice/thunks.js +16 -25
  121. package/dist/selectors.cjs +3 -15
  122. package/dist/selectors.cjs.map +1 -1
  123. package/dist/selectors.d.cts +1 -1
  124. package/dist/selectors.d.ts +1 -1
  125. package/dist/selectors.js +8 -12
  126. package/dist/sockethook.cjs.map +1 -1
  127. package/dist/sockethook.js +1 -1
  128. package/dist/store.cjs +0 -1
  129. package/dist/store.cjs.map +1 -1
  130. package/dist/store.js +11 -11
  131. package/dist/storehooks.cjs +27 -34
  132. package/dist/storehooks.cjs.map +1 -1
  133. package/dist/storehooks.js +24 -25
  134. package/dist/storehooks.js.map +1 -1
  135. package/dist/thunks.cjs +27 -33
  136. package/dist/thunks.cjs.map +1 -1
  137. package/dist/thunks.js +24 -24
  138. package/dist/useDeploymentDevice.cjs +25 -31
  139. package/dist/useDeploymentDevice.cjs.map +1 -1
  140. package/dist/useDeploymentDevice.js +24 -24
  141. package/dist/usersSlice/constants.cjs.map +1 -1
  142. package/dist/usersSlice/constants.js +1 -1
  143. package/dist/usersSlice/index.cjs.map +1 -1
  144. package/dist/usersSlice/index.js +2 -2
  145. package/dist/usersSlice/mocks.cjs.map +1 -1
  146. package/dist/usersSlice/mocks.js +2 -2
  147. package/dist/usersSlice/selectors.cjs.map +1 -1
  148. package/dist/usersSlice/selectors.js +3 -3
  149. package/dist/usersSlice/thunks.cjs +25 -31
  150. package/dist/usersSlice/thunks.cjs.map +1 -1
  151. package/dist/usersSlice/thunks.js +24 -24
  152. package/dist/utils.cjs.map +1 -1
  153. package/dist/utils.js +2 -2
  154. package/package.json +1 -1
  155. package/dist/chunk-4BUO44SS.js.map +0 -1
  156. package/dist/chunk-CMXRPUOF.js.map +0 -1
  157. package/dist/chunk-FXPRG4WH.js.map +0 -1
  158. package/dist/chunk-GX3X2E57.js.map +0 -1
  159. package/dist/chunk-KEQAPMP6.js.map +0 -1
  160. package/dist/chunk-Z4QLZNAN.js.map +0 -1
  161. /package/dist/{chunk-2QIGK5IU.js.map → chunk-4UNLEL5A.js.map} +0 -0
  162. /package/dist/{chunk-4573DUCR.js.map → chunk-6V5IIIF7.js.map} +0 -0
  163. /package/dist/{chunk-WXRYJOL3.js.map → chunk-ECVQVQEL.js.map} +0 -0
  164. /package/dist/{chunk-525LX7VL.js.map → chunk-FG37HJLC.js.map} +0 -0
  165. /package/dist/{chunk-SDHCQ62K.js.map → chunk-FQAUVV6C.js.map} +0 -0
  166. /package/dist/{chunk-5OLM3HEG.js.map → chunk-HKN3RN2Z.js.map} +0 -0
  167. /package/dist/{chunk-XHLNGIAP.js.map → chunk-HPKXWNEF.js.map} +0 -0
  168. /package/dist/{chunk-QX67O5A2.js.map → chunk-JXBTIFMS.js.map} +0 -0
  169. /package/dist/{chunk-VK6FVQ5K.js.map → chunk-JYPSCCT4.js.map} +0 -0
  170. /package/dist/{chunk-UE2EPKRU.js.map → chunk-NXLXPRYW.js.map} +0 -0
  171. /package/dist/{chunk-FAKWYYOB.js.map → chunk-O6VCSLNE.js.map} +0 -0
  172. /package/dist/{chunk-LSAJE3IU.js.map → chunk-PQADM3M3.js.map} +0 -0
  173. /package/dist/{chunk-VLII64V6.js.map → chunk-SJ75YKOA.js.map} +0 -0
  174. /package/dist/{chunk-66LI4BJO.js.map → chunk-TUPBZ6MQ.js.map} +0 -0
  175. /package/dist/{chunk-SDWPOLHM.js.map → chunk-XF3TZSZS.js.map} +0 -0
  176. /package/dist/{chunk-HVZ5BOM6.js.map → chunk-YB3US6OT.js.map} +0 -0
  177. /package/dist/{chunk-UBFFGYQ4.js.map → chunk-YDDE5TIH.js.map} +0 -0
  178. /package/dist/{chunk-4YLOOOZH.js.map → chunk-Z2O6LYVP.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/usersSlice/thunks.ts","../../src/usersSlice/index.ts","../../src/constants.ts","../../src/appSlice/constants.ts","../../src/commonConstants.tsx","../../src/deploymentsSlice/constants.ts","../../src/devicesSlice/constants.ts","../../src/onboardingSlice/constants.ts","../../src/organizationSlice/constants.ts","../../src/releasesSlice/constants.ts","../../src/usersSlice/constants.ts","../../src/appSlice/index.ts","../../src/deploymentsSlice/index.ts","../../src/devicesSlice/index.ts","../../src/monitorSlice/index.ts","../../src/onboardingSlice/index.ts","../../src/organizationSlice/index.ts","../../src/releasesSlice/index.ts","../../src/actions.ts","../../src/api/general-api.ts","../../src/auth.ts","../../src/api/users-api.ts","../../src/appSlice/selectors.ts","../../src/commonSelectors.ts","../../src/deploymentsSlice/selectors.ts","../../src/devicesSlice/selectors.ts","../../src/monitorSlice/selectors.ts","../../src/onboardingSlice/selectors.ts","../../src/organizationSlice/selectors.ts","../../src/releasesSlice/selectors.ts","../../src/utils.ts","../../src/usersSlice/selectors.ts","../../src/store.ts","../../src/appSlice/thunks.ts","../../src/deploymentsSlice/thunks.ts","../../src/devicesSlice/thunks.tsx","../../src/monitorSlice/thunks.ts"],"sourcesContent":["// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { PermissionSetWithScope, PersonalAccessToken, RolePermission, RolePermissionObject } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, extractErrorMessage, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport dayjs from 'dayjs';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport type { CustomColumn, GlobalSettings, User, UserSettings } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport UsersApi from '../api/users-api';\nimport { cleanUp, getSessionInfo, setSessionInfo } from '../auth';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReadState,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '../constants';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n PermissionTypes,\n SSO_TYPES,\n TIMEOUTS,\n apiRoot,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n scopedPermissionAreas,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from '../constants';\nimport { getHostedAnnouncement, getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { setOfflineThreshold } from '../thunks';\nimport { mergePermissions } from '../utils';\nimport { OWN_USER_ID, READ_STATES, USER_LOGOUT, itemUiPermissionsReducer, settingsKeys } from './constants';\nimport { getCurrentUser, getRolesById, getUsersById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\ntype ThunkPermissionSet = Record<string, PermissionSet>;\ntype CombinedPermissions = Record<string, UiPermissionsByIdKey[]>;\ntype TransformedAreaRoles = { name: PermissionSetId; scope?: { type?: string; value: string[] } }[];\n\ntype SubmittedRoleUiPermissions = {\n auditlog: AuditLogPermission[];\n deployments: DeploymentPermission[];\n groups: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: GroupsPermission[] }[];\n releases: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: ReleasesPermission[] }[];\n tenantManagement?: UserManagementPermission[];\n userManagement: UserManagementPermission[];\n};\nexport type SubmittedRole = {\n allowUserManagement?: boolean;\n description?: string;\n name: string;\n source?: Omit<SubmittedRole, 'source'>;\n uiPermissions: Partial<SubmittedRoleUiPermissions>;\n};\n\nconst handleLoginError =\n (err: Error, { token2fa: has2FA, password }: { password?: string; token2fa?: string }, rejectWithValue) =>\n () => {\n const errorText = extractErrorMessage(err);\n const is2FABackend = errorText.includes('2fa');\n if (is2FABackend && !has2FA) {\n return rejectWithValue({ error: '2fa code missing' });\n }\n if (password === undefined) {\n // Enterprise supports two-steps login. On the first step you can enter only email\n // and in case of SSO set up you will receive a redirect URL\n // otherwise you will receive 401 status code and password field will be shown.\n return Promise.reject();\n }\n const twoFAError = is2FABackend ? ' and verification code' : '';\n const errorMessage = `There was a problem logging in. Please check your email${\n twoFAError ? ',' : ' and'\n } password${twoFAError}. If you still have problems, contact an administrator.`;\n return rejectWithValue({ error: errorMessage });\n };\n\n/*\n User management\n*/\ninterface LoginUserPayload {\n email: string;\n password?: string;\n stayLoggedIn?: boolean;\n token2fa?: string;\n}\n\nexport const loginUser = createAppAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }: LoginUserPayload, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/auth/login`, { ...userData, no_expiry: stayLoggedIn })\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: token, contentType }) => {\n // If the content type is application/json then backend returned SSO configuration.\n // user should be redirected to the start sso url to finish login process.\n if (contentType.includes(APPLICATION_JSON_CONTENT_TYPE)) {\n const { id, kind } = token;\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n // save token to local storage & set maxAge if noexpiry checkbox not checked\n const now = new Date();\n now.setSeconds(now.getSeconds() + maxSessionAge);\n const expiresAt = stayLoggedIn ? undefined : now.toISOString();\n setSessionInfo({ token, expiresAt });\n cookies.remove('JWT', { path: '/' });\n return dispatch(getUser(OWN_USER_ID))\n .unwrap()\n .catch(e => {\n cleanUp();\n return Promise.reject(dispatch(setSnackbar(extractErrorMessage(e))));\n })\n .then(() => {\n window.sessionStorage.removeItem('pendings-redirect');\n if (window.location.pathname !== '/ui/') {\n window.location.replace('/ui/');\n }\n return Promise.resolve(dispatch(actions.successfullyLoggedIn({ expiresAt, token })));\n });\n })\n);\n\nexport const logoutUser = createAppAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.post(`${useradmApiUrl}/auth/logout`).finally(() => {\n cleanUp();\n clearAllRetryTimers(setSnackbar);\n return Promise.resolve(dispatch({ type: USER_LOGOUT }));\n });\n});\n\nexport const switchUserOrganization = createAppAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId: string, { getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get<string>(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n window.sessionStorage.setItem('tenantChanged', 'true');\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAppAsyncThunk(`${sliceName}/passwordResetStart`, (email: string, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/start`, { email }).catch(err =>\n commonErrorHandler(err, `The password reset request cannot be processed:`, dispatch, undefined, true)\n )\n);\n\ninterface PasswordResetPayload {\n newPassword: string;\n secretHash: string;\n}\nexport const passwordResetComplete = createAppAsyncThunk(\n `${sliceName}/passwordResetComplete`,\n ({ secretHash, newPassword }: PasswordResetPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/complete`, { secret_hash: secretHash, password: newPassword }).catch((err = {}) => {\n const { error, response = {} } = err;\n let errorMsg = '';\n if (response.status == 400) {\n errorMsg = 'the link you are using expired or the request is not valid, please try again.';\n } else {\n errorMsg = error;\n }\n dispatch(setSnackbar('The password reset request cannot be processed: ' + errorMsg));\n return Promise.reject(err);\n })\n);\n\nexport const verifyEmailStart = createAppAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAppAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash: string, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n .catch(err => rejectWithValue({ status: err.response?.status, data: err.response?.data }))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verify2FA = createAppAsyncThunk(`${sliceName}/verify2FA`, (tfaData: { token2fa: string }, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\n .then(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n .catch(err =>\n commonErrorHandler(err, 'An error occured validating the verification code: failed to verify token, please try again.', dispatch, undefined, true)\n )\n);\n\nexport const getUserList = createAppAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch, getState }) =>\n GeneralApi.get<User[]>(`${useradmApiUrl}/users`)\n .then(res => {\n const currentUsersById = getUsersById(getState());\n const users = res.data.reduce(\n (accu, item) => {\n accu[item.id] = {\n ...accu[item.id],\n ...item\n };\n return accu;\n },\n { ...currentUsersById }\n );\n return dispatch(actions.receivedUserList(users));\n })\n .catch(err => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))\n);\n\nexport const getUser = createAppAsyncThunk(`${sliceName}/getUser`, (id: string, { dispatch, rejectWithValue }) =>\n GeneralApi.get<User>(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n\nexport const initializeSelf = createAppAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n\ninterface UpdateColumnSettingsPayload {\n columns?: CustomColumn[];\n currentUserId?: string;\n}\n\nexport const updateUserColumnSettings = createAppAsyncThunk(\n `${sliceName}/updateUserColumnSettings`,\n ({ columns, currentUserId }: UpdateColumnSettingsPayload, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns: CustomColumn[] = [];\n if (!columns) {\n try {\n customColumns = JSON.parse(window.localStorage.getItem(storageKey) || '') || customColumns;\n } catch {\n // most likely the column info doesn't exist yet or is lost - continue\n }\n } else {\n customColumns = columns;\n }\n window.localStorage.setItem(storageKey, JSON.stringify(customColumns));\n return Promise.resolve(dispatch(actions.setCustomColumns(customColumns)));\n }\n);\n\nconst userActions = {\n add: {\n successMessage: 'The user was added successfully.',\n errorMessage: 'adding'\n },\n create: {\n successMessage: 'The user was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The user has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The user was removed from the system.',\n errorMessage: 'removing'\n }\n} as const;\n\nconst userActionErrorHandler = (err: Error, type: keyof typeof userActions, dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n\ninterface CreateUserPayload {\n email: string;\n password: string;\n shouldResetPassword?: boolean;\n sso?: boolean;\n}\n\nexport const createUser = createAppAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }: CreateUserPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAppAsyncThunk(`${sliceName}/removeUser`, (userId: string, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/users/${userId}`)\n .then(() => Promise.all([dispatch(actions.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar(userActions.remove.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'remove', dispatch))\n);\n\ninterface EditUserPayload {\n current_password: string;\n email: string;\n id: string;\n password: string;\n roles?: string[];\n}\n\nexport const editUser = createAppAsyncThunk(`${sliceName}/editUser`, ({ id, ...userData }: EditUserPayload, { dispatch, getState }) =>\n GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData)\n .then(() =>\n Promise.all([\n dispatch(actions.updatedUser({ ...userData, id: id === OWN_USER_ID ? getCurrentUser(getState()).id : id })),\n dispatch(setSnackbar(userActions.edit.successMessage))\n ])\n )\n .catch(err => userActionErrorHandler(err, 'edit', dispatch))\n);\n\nexport const checkEmailExists = createAppAsyncThunk(`${sliceName}/checkEmailExists`, async (email: string) => {\n const response = await GeneralApi.get(`${useradmApiUrl}/users/exists?email=${encodeURIComponent(email)}`);\n return response.data.exists;\n});\n\nexport const addUserToCurrentTenant = createAppAsyncThunk(`${sliceName}/addUserToTenant`, (userId: string, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\n .catch(err => commonErrorHandler(err, `There was an error adding the user to your organization:`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar(userActions.add.successMessage)), dispatch(getUserList())]));\n});\n\nexport const enableUser2fa = createAppAsyncThunk(`${sliceName}/enableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\nexport const disableUser2fa = createAppAsyncThunk(`${sliceName}/disableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions.receivedQrCode(null))]))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = (permission: RolePermissionObject) =>\n Object.entries(uiPermissionsByArea).reduce(\n (accu, [area, definition]) => {\n const endpointMatches = definition.endpoints.filter(\n endpoint => endpoint.path.test(permission.value) && (endpoint.types.includes(permission.type) || permission.type === PermissionTypes.Any)\n );\n if (permission.value === PermissionTypes.Any || (permission.value.includes(apiRoot) && endpointMatches.length)) {\n const endpointUiPermission = endpointMatches.reduce<PermissionObject[]>((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n .reduce((permissionsAccu: AnyPermission[], uiPermission) => {\n if (permission.type === PermissionTypes.Any || (!endpointMatches.length && uiPermission.verbs.some(verb => verb === permission.type))) {\n permissionsAccu.push(uiPermission.value);\n }\n return permissionsAccu;\n }, [])\n .filter(duplicateFilter);\n if (Array.isArray(accu[area])) {\n accu[area] = [...accu[area], ...collector].filter(duplicateFilter);\n } else {\n accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n deployments: [uiPermissionsById.deploy.value],\n groups: { [permission.value]: [uiPermissionsById.deploy.value] }\n }\n : {},\n http: mapHttpPermission,\n REMOTE_TERMINAL: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions: CombinedPermissions, additionalPermissions: CombinedPermissions = {}): CombinedPermissions =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n const maybeExistingPermissions = accu[name] || [];\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = (permission: RolePermission) => {\n const uiPermissions = permissionActionTypes[permission.action](permission.object);\n const result = mergePermissions({ ...emptyUiPermissions }, uiPermissions);\n return { isCustom: true, permission, result };\n};\n\nconst customPermissionHandler = (accu, permission: RolePermission) => {\n const processor = tryParseCustomPermission(permission);\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n};\n\nconst mapPermissionSet = (\n permissionSetName: PermissionSetId,\n names: string[],\n scope: UiPermissionsByAreaKey,\n existingGroupsPermissions: CombinedPermissions = {}\n): Record<string, AnyPermission[]> => {\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName)?.value as UiPermissionsByIdKey;\n const scopedPermissions = names.reduce((accu, name) => combinePermissions(accu, { [name]: [permission] }), existingGroupsPermissions);\n return Object.entries(scopedPermissions).reduce((accu, [key, permissions]) => ({ ...accu, [key]: deriveImpliedAreaPermissions(scope, permissions) }), {});\n};\n\nconst isEmptyPermissionSet = (permissionSet: Partial<UiPermissionsDefinition>) =>\n !Object.values(permissionSet).reduce((accu, permissions) => {\n if (Array.isArray(permissions)) {\n return accu || !!permissions.length;\n }\n return accu || !isEmpty(permissions);\n }, false);\n\nconst parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }: Role, permissionSets: Record<string, PermissionSet>) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n if (!permissionSet.name) {\n return accu;\n }\n const processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type) as UiPermissionsByAreaKey;\n if (scope) {\n const result = mapPermissionSet(\n permissionSet.name as PermissionSetId,\n permissionSet.scope?.value ?? [],\n scope,\n accu.uiPermissions[scope] as CombinedPermissions\n );\n return { ...accu, uiPermissions: { ...accu.uiPermissions, [scope]: result } };\n } else if (isEmptyPermissionSet(processor.result)) {\n return processor.permissions?.reduce(customPermissionHandler, accu);\n }\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles: Role[], rolesById: Record<string, Role>, permissionSets: ThunkPermissionSet) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions: UiPermissionsDefinition;\n let isCustom = false;\n if (rolesById[role.name]) {\n normalizedPermissions = {\n ...rolesById[role.name].uiPermissions,\n groups: { ...rolesById[role.name].uiPermissions.groups },\n releases: { ...rolesById[role.name].uiPermissions.releases }\n };\n } else {\n const result = parseRolePermissions(role, permissionSets);\n normalizedPermissions = result.uiPermissions;\n isCustom = result.isCustom;\n }\n\n const roleState = accu[role.name] ?? { ...emptyRole };\n accu[role.name] = {\n ...roleState,\n ...role,\n description: roleState.description ? roleState.description : role.description,\n editable: !defaultRolesById[role.name] && !isCustom && (typeof roleState.editable !== 'undefined' ? roleState.editable : true),\n isCustom,\n name: roleState.name ? roleState.name : role.name,\n uiPermissions: normalizedPermissions\n };\n return accu;\n },\n { ...rolesById }\n );\n\nexport const getPermissionSets = createAppAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get<Omit<PermissionSet, 'result'>[]>(`${useradmApiUrlv2}/permission_sets?per_page=500`)\n .then(({ data }) => {\n const permissionSets = data.reduce(\n (accu, permissionSet) => {\n const permissionSetState = accu[permissionSet.name] ?? {};\n let permissionSetObject = { ...permissionSetState, ...permissionSet };\n permissionSetObject.result = Object.values<PermissionObject>(uiPermissionsById).reduce(\n (accu, item) =>\n Object.entries(item.permissionSets).reduce((collector, [area, permissionSet]) => {\n if (scopedPermissionAreas[area]) {\n return collector;\n }\n if (permissionSet === permissionSetObject.name) {\n collector[area] = [...collector[area], item.value].filter(duplicateFilter);\n }\n return collector;\n }, accu),\n { ...emptyUiPermissions, ...(permissionSetObject.result ?? {}) }\n );\n const scopes = Object.values(scopedPermissionAreas).reduce((accu: ScopedPermissionsByAreaKey[], { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce<PermissionSet>((accu, scope) => {\n accu.result = {\n ...accu.result,\n [scope]: mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope) as Record<string, any[]>\n };\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([dispatch(actions.receivedPermissionSets(permissionSets)), permissionSets]) as ReturnType<AppDispatch>;\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAppAsyncThunk(`${sliceName}/getRoles`, (_, { dispatch, getState }) =>\n Promise.all([GeneralApi.get<Role[]>(`${useradmApiUrlv2}/roles?per_page=500`), dispatch(getPermissionSets())])\n .then(results => {\n if (!results) {\n return Promise.resolve() as any;\n }\n const [{ data: roles }, { payload: permissionSetTasks }] = results;\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1] as ThunkPermissionSet);\n return Promise.resolve(dispatch(actions.receivedRoles(rolesById)));\n })\n .catch(() => console.log('Role retrieval failed - likely accessing a non-RBAC backend'))\n .finally(() => Promise.resolve(dispatch(actions.finishedRoleInitialization(true))))\n);\n\nconst deriveImpliedAreaPermissions = (\n area: UiPermissionsByAreaKey,\n areaPermissions: UiPermissionsByIdKey[],\n skipPermissions: AnyPermission[] = []\n): AnyPermission[] => {\n const highestAreaPermissionLevelSelected = areaPermissions.reduce(\n (highest, current) => (uiPermissionsById[current].permissionLevel > highest ? uiPermissionsById[current].permissionLevel : highest),\n 1\n );\n return uiPermissionsByArea[area].uiPermissions.reduce((permissions: AnyPermission[], current) => {\n if ((current.permissionLevel < highestAreaPermissionLevelSelected || areaPermissions.includes(current.value)) && !skipPermissions.includes(current.value)) {\n permissions.push(current.value);\n }\n return permissions;\n }, []);\n};\n\n/**\n * transforms [{ group: \"groupName\", uiPermissions: [\"read\", \"manage\", \"connect\"] }, ...] to\n * [{ name: \"ReadDevices\", scope: { type: \"DeviceGroups\", value: [\"groupName\", ...] } }, ...]\n */\n\nconst transformAreaRoleDataToScopedPermissionsSets = (\n area: ScopedPermissionsByAreaKey,\n areaPermissions: { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector: string\n): TransformedAreaRoles => {\n type PermissionSetObject = Record<PermissionSetId, { type?: string; value: string[] }>;\n const permissionSetObject: PermissionSetObject = areaPermissions.reduce((accu, { item, uiPermissions }) => {\n // if permission area is release and item is release tag (not all releases) then exclude upload permission as it cannot be applied to tags\n\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission): PermissionSetObject => {\n const permissionSetState = itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] ?? {\n type: uiPermissionsByArea[area].scope,\n value: []\n };\n itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] = {\n ...permissionSetState,\n value: [...permissionSetState.value, item]\n };\n return itemPermissionAccu;\n }, accu);\n return accu;\n }, {} as PermissionSetObject);\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name: name as PermissionSetId };\n }\n return { name: name as PermissionSetId, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData: SubmittedRole, roleState: Partial<Role> = {}): { permissionSetsWithScope: PermissionSetWithScope[]; role: Role } => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce<{\n maybeUiPermissions: Partial<Record<ScopedPermissionsByAreaKey, Record<string, AnyPermission[]>>>;\n remainderKeys: UiPermissionsByAreaKey[];\n }>(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n accu.remainderKeys.push(key as UiPermissionsByAreaKey);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key as ScopedPermissionsByAreaKey] = uiPermissions[key].reduce(itemUiPermissionsReducer, emptyPermissions);\n }\n return accu;\n },\n { maybeUiPermissions: {}, remainderKeys: [] }\n );\n const { permissionSetsWithScope, roleUiPermissions } = remainderKeys.reduce(\n (accu, area) => {\n const areaPermissions = role.uiPermissions[area];\n if (!Array.isArray(areaPermissions)) {\n return accu;\n }\n const impliedPermissions = deriveImpliedAreaPermissions(area, areaPermissions as AnyPermission[]);\n accu.roleUiPermissions[area] = impliedPermissions;\n const mappedPermissions = impliedPermissions.map(uiPermission => ({ name: uiPermissionsById[uiPermission].permissionSets[area] }));\n accu.permissionSetsWithScope.push(...mappedPermissions);\n return accu;\n },\n { permissionSetsWithScope: [{ name: defaultPermissionSets.Basic.name }], roleUiPermissions: {} }\n );\n const scopedPermissionSets = Object.values(scopedPermissionAreas).reduce((accu, { key, excessiveAccessSelector }) => {\n if (!uiPermissions[key]) {\n return accu;\n }\n accu.push(\n ...transformAreaRoleDataToScopedPermissionsSets(\n key,\n uiPermissions[key] as unknown as { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector\n )\n );\n return accu;\n }, [] as TransformedAreaRoles);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\n description: description ? description : roleState.description || '',\n uiPermissions: {\n ...emptyUiPermissions,\n ...roleUiPermissions,\n ...maybeUiPermissions\n }\n }\n };\n};\n\nconst roleActions = {\n create: {\n successMessage: 'The role was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The role has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The role was deleted successfully.',\n errorMessage: 'removing'\n }\n} as const;\n\nconst roleActionErrorHandler = (err: Error, type: keyof typeof roleActions, dispatch: AppDispatch, meta?: { name: string; permissionSetsCreated: number }) => {\n let errorContext = `There was an error ${roleActions[type].errorMessage} the role.`;\n if (meta) {\n const { permissionSetsCreated, name } = meta;\n errorContext += ` Tried to ${type} role ${name} with ${permissionSetsCreated} permission sets.`;\n }\n return commonErrorHandler(err, errorContext, dispatch);\n};\n\nexport const createRole = createAppAsyncThunk(`${sliceName}/createRole`, (roleData: SubmittedRole, { dispatch }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData);\n return GeneralApi.post(`${useradmApiUrlv2}/roles`, {\n name: role.name,\n description: role.description,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.create.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'create', dispatch, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const editRole = createAppAsyncThunk(`${sliceName}/editRole`, (roleData: SubmittedRole, { dispatch, getState }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData, getRolesById(getState())[roleData.name]);\n return GeneralApi.put(`${useradmApiUrlv2}/roles/${role.name}`, {\n description: role.description,\n name: role.name,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.edit.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'edit', dispatch, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const removeRole = createAppAsyncThunk(`${sliceName}/removeRole`, (roleId: string, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrlv2}/roles/${roleId}`)\n .then(() => Promise.all([dispatch(actions.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.remove.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'remove', dispatch))\n);\n\n/*\n Global settings\n*/\nexport const getGlobalSettings = createAppAsyncThunk(`${sliceName}/getGlobalSettings`, (_, { dispatch }) =>\n GeneralApi.get<GlobalSettings>(`${useradmApiUrl}/settings`).then(({ data: settings, headers: { etag } }) => {\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n return Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold()), etag]);\n })\n);\n\nexport const saveGlobalSettings = createAppAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n ({ beOptimistic = false, notify = false, ...settings }: Partial<GlobalSettings>, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n const updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n const tasks: ReturnType<AppDispatch> = [dispatch(actions.setGlobalSettings(updatedSettings))];\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n tasks.push(dispatch(setSnackbar('Settings saved successfully')));\n }\n return Promise.all(tasks);\n })\n .catch(err => {\n if (beOptimistic) {\n return Promise.all([tasks]);\n }\n console.log(err);\n return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAppAsyncThunk(`${sliceName}/getUserSettings`, (_, { dispatch }) =>\n GeneralApi.get<UserSettings>(`${useradmApiUrl}/settings/me`).then(({ data: settings, headers: { etag } }) => {\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n return Promise.all([dispatch(actions.setUserSettings(settings)), etag]);\n })\n);\n\nexport const saveUserSettings = createAppAsyncThunk(\n `${sliceName}/saveUserSettings`,\n (settings: Partial<UserSettings> = { onboarding: {} }, { dispatch, getState }) => {\n if (!getCurrentUser(getState()).id) {\n return Promise.resolve();\n }\n return dispatch(getUserSettings())\n .unwrap()\n .then(result => {\n const userSettings = getUserSettingsSelector(getState());\n const onboardingState = getOnboardingState(getState());\n const tooltipState = getTooltipsState(getState());\n const updatedSettings = {\n ...userSettings,\n ...settings,\n firstLoginTimestamp: userSettings.firstLoginTimestamp ?? dayjs().format(),\n onboarding: {\n ...onboardingState,\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return Promise.all([\n Promise.resolve(dispatch(actions.setUserSettings(updatedSettings))),\n GeneralApi.post(`${useradmApiUrl}/settings/me`, updatedSettings, { headers })\n ]).catch(() => dispatch(actions.setUserSettings(userSettings)));\n });\n }\n);\n\nexport const get2FAQRCode = createAppAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get<{ qr: string }>(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n\nexport const setHideAnnouncement = createAppAsyncThunk<void, { shouldHide: boolean; userId?: string }>(\n `${sliceName}/setHideAnnouncement`,\n ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n const announcement = getHostedAnnouncement(getState());\n const hash = announcement ? hashString(announcement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n dispatch(setAnnouncement(''));\n }\n }\n);\n\nexport const getTokens = createAppAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/tokens`).then(({ data: tokens }) => {\n const user = getCurrentUser(getState());\n const updatedUser = {\n ...user,\n tokens\n };\n return Promise.resolve(dispatch(actions.updatedUser(updatedUser)));\n })\n);\n\nconst ONE_YEAR = 31536000;\n\nexport const generateToken = createAppAsyncThunk(\n `${sliceName}/generateToken`,\n ({ expiresIn = ONE_YEAR, name }: { expiresIn?: number; name: string }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn })\n .then(({ data: token }) => Promise.all([dispatch(getTokens()), token]))\n .catch(err => commonErrorHandler(err, 'There was an error creating the token:', dispatch))\n);\n\nexport const revokeToken = createAppAsyncThunk(`${sliceName}/revokeToken`, (token: PersonalAccessToken, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n\nexport const setTooltipReadState = createAppAsyncThunk(\n `${sliceName}/setTooltipReadState`,\n async ({ persist, ...remainder }: { id: string; persist: boolean; readState: ReadState }, { dispatch }) => {\n dispatch(actions.setTooltipState(remainder));\n if (persist) {\n await dispatch(saveUserSettings());\n }\n }\n);\n\nexport const setAllTooltipsReadState = createAppAsyncThunk(\n `${sliceName}/toggleHelptips`,\n ({ readState = READ_STATES.read, tooltipIds }: { readState: string; tooltipIds: string[] }, { dispatch }) => {\n const updatedTips = tooltipIds.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n }\n);\n\ntype LogAnalysisFeedback = {\n deployment_id: string;\n device_id: string;\n useful: boolean;\n};\n\ntype ProductFeedback = {\n message: string;\n score: number;\n};\n\ntype SubmitFeedbackPayload = {\n feedback: LogAnalysisFeedback | ProductFeedback;\n formId: string;\n};\n\nexport const submitUserFeedback = createAppAsyncThunk(`${sliceName}/submitFeedback`, ({ formId, feedback }: SubmitFeedbackPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {\n if (formId === 'product') {\n const today = new Date();\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n setTimeout(() => dispatch(actions.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);\n }\n })\n);\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { User as BackendUser, DeploymentPhase, TenantInfo, TenantsIdName } from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { FilterOperator, PermissionSet, Role } from '../constants';\nimport { defaultPermissionSets, rolesById } from '../constants';\nimport type { ReadState } from './constants';\nimport { READ_STATES } from './constants';\n\nexport const sliceName = 'users';\nexport type User = BackendUser & TenantInfo & { tenants?: TenantsIdName };\nexport type UserSession = {\n expiresAt?: string;\n token: string;\n};\nexport type CustomColumn = {\n attribute: {\n name: string;\n scope: string;\n };\n size: number;\n};\n\ntype FilterOption = {\n key: string;\n operator: FilterOperator;\n scope: string;\n value: string;\n};\nexport type GlobalSettings = {\n [x: string]: any;\n id_attribute?: {\n attribute: string;\n scope: string;\n };\n previousFilters: FilterOption[];\n previousPhases: DeploymentPhase[][];\n retries: number;\n};\ntype Column = {\n id: string;\n key: string;\n name: string;\n scope: string;\n title: string;\n};\nexport type UserSettings = {\n [x: string]: any;\n columnSelection: Column[];\n feedbackCollectedAt?: string;\n firstLoginTimestamp: null | string;\n mode?: 'light' | 'dark';\n onboarding: Partial<{\n address: string;\n approach: 'physical' | 'virtual' | 'mcu' | null;\n complete: boolean;\n demoArtifactPort: number;\n deviceType: string[] | string;\n progress: string;\n showTips: null | boolean;\n showTipsDialog: boolean;\n }>;\n securityAlertDismissedTimestamp: null | string;\n tooltips?: object;\n trackingConsentGiven?: boolean;\n};\n\nexport type UserSliceType = {\n byId: Record<string, User>;\n currentSession?: UserSession | object;\n currentUser: string | null;\n customColumns: CustomColumn[];\n globalSettings: GlobalSettings;\n permissionSetsById: Record<string, PermissionSet>;\n qrCode: string | null;\n rolesById: Record<string, Role>;\n rolesInitialized: boolean;\n settingsInitialized: boolean;\n showConnectDeviceDialog: boolean;\n showFeedbackDialog: boolean;\n showStartupNotification: boolean;\n tooltips: {\n byId: Record<string, { readState: ReadState }>;\n };\n userSettings: UserSettings;\n userSettingsInitialized: boolean;\n};\n\nexport const initialState: UserSliceType = {\n byId: {},\n currentUser: null,\n currentSession: {\n // { token: window.localStorage.getItem('JWT'), expiresAt: '2023-01-01T00:15:00.000Z' | undefined }, // expiresAt depending on the stay logged in setting\n },\n customColumns: [],\n qrCode: null,\n globalSettings: {\n id_attribute: undefined,\n previousFilters: [],\n previousPhases: [],\n retries: 0\n },\n permissionSetsById: {\n ...defaultPermissionSets\n },\n rolesById: {\n ...rolesById\n },\n rolesInitialized: false,\n settingsInitialized: false,\n showConnectDeviceDialog: false,\n showFeedbackDialog: false,\n showStartupNotification: false,\n tooltips: {\n byId: {\n // <id>: { readState: <read|unread> } // this object is getting enhanced by the tooltip texts in the app constants\n }\n },\n userSettings: {\n columnSelection: [],\n onboarding: {},\n firstLoginTimestamp: null,\n securityAlertDismissedTimestamp: null\n },\n userSettingsInitialized: false\n};\n\nexport const usersSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receivedQrCode: (state, action: PayloadAction<string | null>) => {\n state.qrCode = action.payload;\n },\n successfullyLoggedIn: (state, action: PayloadAction<UserSession>) => {\n state.currentSession = action.payload;\n },\n receivedUserList: (state, action: PayloadAction<Record<string, User>>) => {\n state.byId = action.payload;\n },\n receivedUser: (state, action: PayloadAction<User>) => {\n state.byId[action.payload.id] = action.payload;\n state.currentUser = action.payload.id;\n },\n removedUser: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removedUser, ...byId } = state.byId;\n state.byId = byId;\n state.currentUser = state.currentUser === action.payload ? null : state.currentUser;\n },\n updatedUser: (state, action: PayloadAction<Partial<User> & { id: string }>) => {\n state.byId[action.payload.id] = {\n ...state.byId[action.payload.id],\n ...action.payload\n };\n },\n receivedPermissionSets: (state, action: PayloadAction<Record<string, PermissionSet>>) => {\n state.permissionSetsById = action.payload;\n },\n receivedRoles: (state, action: PayloadAction<Record<string, Role>>) => {\n state.rolesById = action.payload;\n state.rolesInitialized = true;\n },\n finishedRoleInitialization: (state, action) => {\n state.rolesInitialized = action.payload;\n },\n createdRole: (state, action: PayloadAction<Role>) => {\n state.rolesById[action.payload.name] = {\n ...state.rolesById[action.payload.name],\n ...action.payload\n };\n },\n removedRole: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: toBeRemoved, ...rolesById } = state.rolesById;\n state.rolesById = rolesById;\n },\n setCustomColumns: (state, action: PayloadAction<CustomColumn[]>) => {\n state.customColumns = action.payload;\n },\n setGlobalSettings: (state, action: PayloadAction<GlobalSettings>) => {\n state.settingsInitialized = true;\n state.globalSettings = {\n ...state.globalSettings,\n ...action.payload\n };\n },\n setUserSettings: (state, action: PayloadAction<UserSettings>) => {\n state.userSettingsInitialized = true;\n state.userSettings = {\n ...state.userSettings,\n ...action.payload\n };\n },\n setTooltipState: (state, action: PayloadAction<{ id: string; readState: ReadState }>) => {\n const { id, readState = READ_STATES.read } = action.payload;\n state.tooltips.byId[id] = { ...state.tooltips.byId[id], readState };\n },\n setTooltipsState: (state, action: PayloadAction<UserSliceType['tooltips']['byId']>) => {\n state.tooltips.byId = {\n ...state.tooltips.byId,\n ...action.payload\n };\n },\n setShowFeedbackDialog: (state, action: PayloadAction<boolean>) => {\n state.showFeedbackDialog = action.payload;\n },\n setShowConnectingDialog: (state, action: PayloadAction<boolean>) => {\n state.showConnectDeviceDialog = action.payload;\n },\n setShowStartupNotification: (state, action: PayloadAction<boolean>) => {\n state.showStartupNotification = action.payload;\n }\n }\n});\n\nexport const actions = usersSlice.actions;\nexport default usersSlice.reducer;\n","// 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 {\n ALL_DEVICES,\n ALL_DEVICE_STATES,\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n ATTRIBUTE_SCOPES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n PermissionTypes,\n SORTING_OPTIONS,\n alertChannels,\n apiRoot,\n apiUrl,\n auditLogsApiUrl,\n defaultPermissionSets,\n deploymentsApiUrl,\n deploymentsApiUrlV2,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyRole,\n emptyUiPermissions,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n limitDefault,\n maxSessionAge,\n monitorApiUrlv1,\n reportingApiUrl,\n rolesById,\n rolesByName,\n scopedPermissionAreas,\n serviceProviderRolesById,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv1,\n useradmApiUrlv2\n} from '@northern.tech/utils/constants';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n DeviceIssueOptionKey,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n SortOptions,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '@northern.tech/utils/constants';\n\nexport {\n alertChannels,\n ALL_DEVICE_STATES,\n ALL_DEVICES,\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n ATTRIBUTE_SCOPES,\n apiRoot,\n apiUrl,\n auditLogsApiUrl,\n defaultPermissionSets,\n deploymentsApiUrl,\n deploymentsApiUrlV2,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyRole,\n emptyUiPermissions,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n monitorApiUrlv1,\n limitDefault,\n maxSessionAge,\n PermissionTypes,\n reportingApiUrl,\n rolesById,\n rolesByName,\n scopedPermissionAreas,\n serviceProviderRolesById,\n SORTING_OPTIONS,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv1,\n useradmApiUrlv2\n};\n\nexport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n DeviceIssueOptionKey,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n SortOptions,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n};\n\nexport * from './appSlice/constants';\nexport * from './commonConstants';\nexport * from './deploymentsSlice/constants';\nexport * from './devicesSlice/constants';\nexport * from './monitorSlice/constants';\nexport * from './onboardingSlice/constants';\nexport * from './organizationSlice/constants';\nexport * from './releasesSlice/constants';\nexport * from './usersSlice/constants';\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { BarChart as BarChartIcon, PieChartOutline as PieChartIcon } from '@mui/icons-material';\n\nimport { yes as yesUtil } from '@northern.tech/utils';\n\nexport const chartTypes = {\n bar: { key: 'bar', Icon: BarChartIcon },\n pie: { key: 'pie', Icon: PieChartIcon }\n} as const;\nexport const emptyChartSelection = { software: '', group: '', chartType: chartTypes.bar.key, attribute: 'artifact_name' };\nexport const defaultReportType = 'distribution';\nexport const defaultReports = [{ ...emptyChartSelection, group: null, attribute: 'artifact_name', type: defaultReportType }];\n\nexport const BEGINNING_OF_TIME = '2016-01-01T00:00:00.000Z';\n\nexport const locations = {\n cn: { key: 'cn', title: 'China', location: 'hosted.mender.cn' },\n eu: { key: 'eu', title: 'EU', location: 'eu.hosted.mender.io' },\n us: { key: 'us', title: 'US', location: 'hosted.mender.io' }\n} as const;\nexport type AvailablePlans = 'os' | 'professional' | 'enterprise';\n\nexport type Plan = {\n description: string;\n id: AvailablePlans;\n name: string;\n};\n\nexport type AvailableAddon = 'configure' | 'troubleshoot' | 'monitor';\n\nexport const PLANS: { [key in AvailablePlans]: Plan } = {\n os: {\n id: 'os',\n name: 'Basic',\n description:\n 'The core features of Mender. To continue using Enterprise Trial features—like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more—please upgrade to a higher plan.'\n },\n professional: {\n id: 'professional',\n name: 'Professional',\n description: 'Everything in Basic, plus enhanced update management and automation features.'\n },\n enterprise: {\n id: 'enterprise',\n name: 'Enterprise',\n description:\n 'Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription — ask us for a quote.'\n }\n} as const;\nexport type Addon = {\n description: string;\n eligible: AvailablePlans[];\n id: string;\n needs: string[];\n title: string;\n};\n\nexport type AddonId = keyof typeof ADDONS;\n\n// the needs names need to be aligned with the name of the features in the appReducer, as they will be checked in the addonselection\nexport const ADDONS: { [key in AvailableAddon]: Addon } = {\n configure: {\n id: 'configure',\n title: 'Configure',\n description: 'Seamlessly configure applications and devices remotely – configure each device to its environment.',\n needs: ['hasDeviceConfig'],\n eligible: ['os', 'professional', 'enterprise']\n },\n monitor: {\n id: 'monitor',\n title: 'Monitor',\n description: 'Detect and analyze health issues of devices, services and applications. Set up alerts so you can act quickly.',\n needs: ['hasMonitor'],\n eligible: ['professional', 'enterprise']\n },\n troubleshoot: {\n id: 'troubleshoot',\n title: 'Troubleshoot',\n description: 'Secure, remote access to your devices – quickly diagnose and fix issues in real time.',\n needs: ['hasDeviceConnect'],\n eligible: ['os', 'professional', 'enterprise']\n }\n};\n\nexport const BENEFITS = {\n auditlog: {\n id: 'auditlog',\n benefit: 'gain access to logs for important events such as changes to devices, deployments and user management, as well as remote terminal session replays',\n requiredPlan: PLANS.enterprise.id\n },\n dashboard: { id: 'dashboard', benefit: 'actionable insights into the devices you are updating with Mender', requiredPlan: PLANS.enterprise.id },\n deltaGeneration: {\n id: 'deltaGeneration',\n benefit: 'automatic delta artifacts generation to minimize data transfer and improve the update delivery',\n requiredPlan: PLANS.enterprise.id\n },\n deviceConfiguration: { id: 'deviceConfiguration', benefit: 'device configuration features', requiredAddon: ADDONS.configure.id },\n deviceMonitor: { id: 'deviceMonitor', benefit: 'device monitoring features', requiredAddon: ADDONS.monitor.id, requiredPlan: PLANS.professional.id },\n deviceTroubleshoot: { id: 'deviceTroubleshoot', benefit: 'device troubleshooting features', requiredAddon: ADDONS.troubleshoot.id },\n dynamicGroups: { id: 'dynamicGroups', benefit: 'create dynamic groups to ease device management', requiredPlan: PLANS.enterprise.id },\n fullFiltering: { id: 'fullFiltering', benefit: 'filtering by multiple attributes to improve the device overview', requiredPlan: PLANS.professional.id },\n gateway: { id: 'gateway', benefit: 'see devices connected to your gateway device for easy access', requiredPlans: PLANS.professional.id },\n pausedDeployments: {\n id: 'pausedDeployments',\n benefit: 'granular control about update rollout to allow synchronization across your fleet',\n requiredPlan: PLANS.enterprise.id\n },\n phasedDeployments: { id: 'phasedDeployments', benefit: 'choose to roll out deployments in multiple phases', requiredPlan: PLANS.enterprise.id },\n rbac: { id: 'rbac', benefit: 'granular role based access control', requiredPlan: PLANS.enterprise.id },\n retryDeployments: { id: 'retryDeployments', benefit: 'optional retries for failed rollout attempts', requiredPlan: PLANS.professional.id },\n scheduledDeployments: {\n id: 'scheduledDeployments',\n benefit: 'scheduled deployments to steer the distribution of your updates.',\n requiredPlan: PLANS.professional.id\n },\n webhookEvents: {\n id: 'webhookEvents',\n benefit: 'receive inventory events and select which type(s) of events the webhook will receive',\n requiredPlan: PLANS.professional.id\n },\n\n default: { id: 'default', benefit: 'gain access to this feature', requiredPlan: PLANS.enterprise.id }\n} as const;\n\nexport const yes = yesUtil;\nexport const canAccess = yes;\n\nexport const DARK_MODE = 'dark';\nexport const LIGHT_MODE = 'light';\n","// 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 { mdiAws as AWS, mdiMicrosoftAzure as Azure } from '@mdi/js';\nimport type { Integration } from '@northern.tech/types/MenderTypes';\n\nimport type { DEVICE_FILTERING_OPTIONS } from './constants';\nimport { ATTRIBUTE_SCOPES } from './constants';\n\nexport const timeUnits = {\n days: 'days',\n minutes: 'minutes',\n hours: 'hours'\n};\n\nexport const UNGROUPED_GROUP = { id: '*|=ungrouped=|*', name: 'Unassigned' };\n\nexport const DEVICE_LIST_MAXIMUM_LENGTH = 50;\n\nexport type FilterOperator = keyof typeof DEVICE_FILTERING_OPTIONS;\n\nconst oneSecond = 1000;\nexport const TIMEOUTS = {\n debounceDefault: 700,\n debounceShort: 300,\n halfASecond: 0.5 * oneSecond,\n oneSecond,\n twoSeconds: 2 * oneSecond,\n threeSeconds: 3 * oneSecond,\n fiveSeconds: 5 * oneSecond,\n refreshDefault: 10 * oneSecond,\n refreshLong: 60 * oneSecond\n};\n\nexport const DEVICE_ONLINE_CUTOFF = { interval: 1, intervalName: timeUnits.days };\n\nexport interface IdAttribute {\n attribute: string;\n scope: string;\n}\nexport const defaultIdAttribute: Readonly<IdAttribute> = Object.freeze({ attribute: 'id', scope: ATTRIBUTE_SCOPES.identity });\n\nexport const productOrder = ['micro', 'standard', 'system'];\n\nexport const credentialTypes = {\n aws: 'aws',\n http: 'http',\n sas: 'sas',\n x509: 'x509'\n};\nexport const EXTERNAL_PROVIDER = {\n 'iot-core': {\n credentialsType: credentialTypes.aws,\n icon: AWS,\n title: 'AWS IoT Core',\n twinTitle: 'Device Shadow',\n provider: 'iot-core',\n enabled: true,\n deviceTwin: true,\n configHint: <>For help finding your AWS IoT Core connection string, check the AWS IoT documentation.</>\n },\n 'iot-hub': {\n credentialsType: credentialTypes.sas,\n icon: Azure,\n title: 'Azure IoT Hub',\n twinTitle: 'Device Twin',\n provider: 'iot-hub',\n enabled: true,\n deviceTwin: true,\n configHint: (\n <span>\n For help finding your Azure IoT Hub connection string, look under &apos;Shared access policies&apos; in the Microsoft Azure UI as described{' '}\n {\n <a\n href=\"https://devblogs.microsoft.com/iotdev/understand-different-connection-strings-in-azure-iot-hub/#iothubconn\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n here\n </a>\n }\n .\n </span>\n )\n },\n webhook: {\n credentialsType: credentialTypes.http,\n deviceTwin: false,\n twinTitle: '',\n // disable the webhook provider here, since it is treated different than other integrations, with a custom configuration & management view, etc.\n enabled: false,\n provider: 'webhook'\n }\n} as const;\n\nexport interface Webhook extends Integration {\n provider: 'webhook';\n}\n\nexport const emptyWebhook: Webhook = {\n description: '',\n provider: 'webhook',\n credentials: {\n type: EXTERNAL_PROVIDER.webhook.credentialsType,\n [EXTERNAL_PROVIDER.webhook.credentialsType]: {\n secret: '',\n url: ''\n }\n }\n};\n\ninterface CountryType {\n code: string;\n label: string;\n}\nexport const MAX_PAGE_SIZE = 500;\nconst regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\nexport const countries: readonly CountryType[] = [\n 'AD',\n 'AE',\n 'AF',\n 'AG',\n 'AI',\n 'AL',\n 'AM',\n 'AO',\n 'AQ',\n 'AR',\n 'AS',\n 'AT',\n 'AU',\n 'AW',\n 'AX',\n 'AZ',\n 'BA',\n 'BB',\n 'BD',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BL',\n 'BM',\n 'BN',\n 'BO',\n 'BR',\n 'BS',\n 'BT',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'CA',\n 'CC',\n 'CD',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CK',\n 'CL',\n 'CM',\n 'CN',\n 'CO',\n 'CR',\n 'CU',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DM',\n 'DO',\n 'DZ',\n 'EC',\n 'EE',\n 'EG',\n 'EH',\n 'ER',\n 'ES',\n 'ET',\n 'FI',\n 'FJ',\n 'FK',\n 'FM',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GD',\n 'GE',\n 'GF',\n 'GG',\n 'GH',\n 'GI',\n 'GL',\n 'GM',\n 'GN',\n 'GP',\n 'GQ',\n 'GR',\n 'GS',\n 'GT',\n 'GU',\n 'GW',\n 'GY',\n 'HK',\n 'HM',\n 'HN',\n 'HR',\n 'HT',\n 'HU',\n 'ID',\n 'IE',\n 'IL',\n 'IM',\n 'IN',\n 'IO',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JE',\n 'JM',\n 'JO',\n 'JP',\n 'KE',\n 'KG',\n 'KH',\n 'KI',\n 'KM',\n 'KN',\n 'KP',\n 'KR',\n 'KW',\n 'KY',\n 'KZ',\n 'LA',\n 'LB',\n 'LC',\n 'LI',\n 'LK',\n 'LR',\n 'LS',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MF',\n 'MG',\n 'MH',\n 'MK',\n 'ML',\n 'MM',\n 'MN',\n 'MO',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MT',\n 'MU',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NC',\n 'NE',\n 'NF',\n 'NG',\n 'NI',\n 'NL',\n 'NO',\n 'NP',\n 'NR',\n 'NU',\n 'NZ',\n 'OM',\n 'PA',\n 'PE',\n 'PF',\n 'PG',\n 'PH',\n 'PK',\n 'PL',\n 'PM',\n 'PN',\n 'PR',\n 'PS',\n 'PT',\n 'PW',\n 'PY',\n 'QA',\n 'RE',\n 'RO',\n 'RS',\n 'RU',\n 'RW',\n 'SA',\n 'SB',\n 'SC',\n 'SD',\n 'SE',\n 'SG',\n 'SH',\n 'SI',\n 'SJ',\n 'SK',\n 'SL',\n 'SM',\n 'SN',\n 'SO',\n 'SR',\n 'SS',\n 'ST',\n 'SV',\n 'SX',\n 'SY',\n 'SZ',\n 'TC',\n 'TD',\n 'TF',\n 'TG',\n 'TH',\n 'TJ',\n 'TK',\n 'TL',\n 'TM',\n 'TN',\n 'TO',\n 'TR',\n 'TT',\n 'TV',\n 'TW',\n 'TZ',\n 'UA',\n 'UG',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VC',\n 'VE',\n 'VG',\n 'VI',\n 'VN',\n 'VU',\n 'WF',\n 'WS',\n 'XK',\n 'YE',\n 'YT',\n 'ZA',\n 'ZM',\n 'ZW'\n]\n .map(code => ({ code, label: regionNames.of(code) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DeploymentStatistics } from '@northern.tech/types/MenderTypes';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS } from '../constants';\n\nconst alreadyInstalled = 'already-installed';\n\nexport const deploymentSubstates = {\n aborted: 'aborted',\n alreadyInstalled,\n decommissioned: 'decommissioned',\n downloading: 'downloading',\n failure: 'failure',\n installing: 'installing',\n noartifact: 'noartifact',\n artifact_too_big: 'artifact_too_big',\n pause_before_committing: 'pause_before_committing',\n pause_before_installing: 'pause_before_installing',\n pause_before_rebooting: 'pause_before_rebooting',\n pending: 'pending',\n rebooting: 'rebooting',\n success: 'success'\n};\n\nexport const deploymentStatesToSubstates = {\n failures: [deploymentSubstates.failure, deploymentSubstates.aborted, deploymentSubstates.decommissioned],\n inprogress: [deploymentSubstates.downloading, deploymentSubstates.installing, deploymentSubstates.rebooting],\n paused: [deploymentSubstates.pause_before_installing, deploymentSubstates.pause_before_rebooting, deploymentSubstates.pause_before_committing],\n pending: [deploymentSubstates.pending],\n successes: [deploymentSubstates.success, deploymentSubstates.alreadyInstalled, deploymentSubstates.noartifact, deploymentSubstates.artifact_too_big]\n};\n\nexport const deploymentStatesToSubstatesWithSkipped = {\n ...deploymentStatesToSubstates,\n failures: [deploymentSubstates.failure],\n skipped: [\n deploymentSubstates.aborted,\n deploymentSubstates.noartifact,\n deploymentSubstates.artifact_too_big,\n deploymentSubstates.alreadyInstalled,\n deploymentSubstates.decommissioned\n ],\n successes: [deploymentSubstates.success]\n};\nexport const installationSubstatesMap = {\n download: {\n title: 'download',\n done: 'downloaded',\n successIndicators: [deploymentSubstates.installing, deploymentSubstates.rebooting, ...deploymentStatesToSubstates.paused, deploymentSubstates.success],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactInstall_Enter'\n },\n install: {\n title: 'install',\n done: 'installed',\n successIndicators: [\n deploymentSubstates.rebooting,\n deploymentSubstates.pause_before_rebooting,\n deploymentSubstates.pause_before_committing,\n deploymentSubstates.success\n ],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactReboot_Enter'\n },\n reboot: {\n title: 'reboot',\n done: 'rebooted',\n successIndicators: [deploymentSubstates.pause_before_committing, deploymentSubstates.success],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactCommit_Enter'\n },\n commit: {\n title: 'commit',\n done: 'committed',\n successIndicators: deploymentStatesToSubstates.successes,\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: undefined\n }\n};\n\nexport const DEPLOYMENT_STATES = {\n finished: 'finished',\n inprogress: 'inprogress',\n pending: 'pending',\n scheduled: 'scheduled'\n} as const;\n\nexport const listDefaultsByState = {\n [DEPLOYMENT_STATES.inprogress]: { page: 1, perPage: 10 },\n [DEPLOYMENT_STATES.pending]: { page: 1, perPage: 10 },\n [DEPLOYMENT_STATES.scheduled]: { ...DEVICE_LIST_DEFAULTS },\n [DEPLOYMENT_STATES.finished]: { ...DEVICE_LIST_DEFAULTS },\n sort: { direction: SORTING_OPTIONS.desc }\n};\n\nexport const DEFAULT_PENDING_INPROGRESS_COUNT = 10;\nexport const DEPLOYMENT_ROUTES = {\n active: {\n key: 'active',\n route: '/deployments/active',\n states: [DEPLOYMENT_STATES.pending, DEPLOYMENT_STATES.inprogress],\n title: 'Active'\n },\n finished: {\n key: 'finished',\n route: '/deployments/finished',\n states: [DEPLOYMENT_STATES.finished],\n title: 'Finished'\n },\n scheduled: {\n key: 'scheduled',\n route: '/deployments/scheduled',\n states: [DEPLOYMENT_STATES.scheduled],\n title: 'Scheduled'\n }\n} as const;\nexport const DEPLOYMENT_TYPES = {\n software: 'software',\n configuration: 'configuration'\n};\nexport const defaultStats = {\n [deploymentSubstates.aborted]: 0,\n [deploymentSubstates.alreadyInstalled]: 0,\n [deploymentSubstates.decommissioned]: 0,\n [deploymentSubstates.downloading]: 0,\n [deploymentSubstates.failure]: 0,\n [deploymentSubstates.installing]: 0,\n [deploymentSubstates.noartifact]: 0,\n [deploymentSubstates.pause_before_committing]: 0,\n [deploymentSubstates.pause_before_installing]: 0,\n [deploymentSubstates.pause_before_rebooting]: 0,\n [deploymentSubstates.pending]: 0,\n [deploymentSubstates.rebooting]: 0,\n [deploymentSubstates.success]: 0\n};\nexport const deploymentDisplayStates = {\n finished: 'Finished',\n scheduled: 'Scheduled',\n skipped: 'Skipped',\n paused: 'Paused',\n pending: 'Pending',\n inprogress: 'In Progress',\n success: 'Success',\n successes: 'Success',\n failure: 'Fail',\n failures: 'Fail'\n};\n\nexport const deploymentPrototype = {\n devices: {},\n name: undefined,\n statistics: { status: {} } as DeploymentStatistics\n};\n\nexport const pauseMap = {\n [deploymentSubstates.pause_before_installing]: {\n title: installationSubstatesMap.download.done,\n followUp: installationSubstatesMap.download.pauseConfigurationIndicator\n },\n [deploymentSubstates.pause_before_rebooting]: {\n title: installationSubstatesMap.install.done,\n followUp: installationSubstatesMap.install.pauseConfigurationIndicator\n },\n [deploymentSubstates.pause_before_committing]: {\n title: installationSubstatesMap.reboot.done,\n followUp: installationSubstatesMap.reboot.pauseConfigurationIndicator\n }\n};\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DEVICE_STATES, FilterOperator } from '../constants';\nimport { DEVICE_FILTERING_OPTIONS } from '../constants';\n\nexport const emptyFilter = { key: null, value: '', operator: DEVICE_FILTERING_OPTIONS.$eq.key as FilterOperator, scope: 'inventory' };\n\n// see https://github.com/mendersoftware/go-lib-micro/tree/master/ws\n// for the description of proto_header and the consts\n// *Note*: this needs to be aligned with mender-connect and deviceconnect.\nexport const DEVICE_MESSAGE_PROTOCOLS = {\n Shell: 1\n};\nexport const DEVICE_MESSAGE_TYPES = {\n Delay: 'delay',\n New: 'new',\n Ping: 'ping',\n Pong: 'pong',\n Resize: 'resize',\n Shell: 'shell',\n Stop: 'stop'\n};\n\n// we can't include the dismiss state with the rest since this would include dismissed devices in several queries\nexport const DEVICE_DISMISSAL_STATE = 'dismiss';\n\nexport type DeviceAuthState = (typeof DEVICE_STATES)[keyof typeof DEVICE_STATES];\n\nexport const DEVICE_CONNECT_STATES = {\n connected: 'connected',\n disconnected: 'disconnected',\n unknown: 'unknown'\n};\n\nexport const geoAttributes = ['geo-lat', 'geo-lon'].map(attribute => ({ attribute, scope: 'inventory' }));\n\nexport const REPORT_CHART_SIZE_LIMIT = 6;\n","// Copyright 2020 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.\nexport const onboardingSteps = {\n ONBOARDING_START: 'onboarding-start',\n DEVICES_PENDING_ONBOARDING_START: 'devices-pending-onboarding-start',\n DASHBOARD_ONBOARDING_START: 'dashboard-onboarding-start',\n DASHBOARD_ONBOARDING_PENDINGS: 'dashboard-onboarding-pendings',\n DEVICES_DELAYED_ONBOARDING: 'devices-delayed-onboarding',\n DEVICES_PENDING_ONBOARDING: 'devices-pending-onboarding',\n DEVICES_ACCEPTED_ONBOARDING: 'devices-accepted-onboarding',\n DEVICES_PENDING_ACCEPTING_ONBOARDING: 'devices-pending-accepting-onboarding',\n DEVICES_DEPLOY_RELEASE_ONBOARDING: 'devices-deploy-release-onboarding',\n SCHEDULING_ARTIFACT_SELECTION: 'scheduling-artifact-selection',\n SCHEDULING_ALL_DEVICES_SELECTION: 'scheduling-all-devices-selection',\n SCHEDULING_GROUP_SELECTION: 'scheduling-group-selection',\n SCHEDULING_RELEASE_TO_DEVICES: 'scheduling-release-to-devices',\n DEPLOYMENTS_INPROGRESS: 'deployments-inprogress',\n DEPLOYMENTS_COMPLETED: 'deployments-completed',\n DEPLOYMENTS_PAST: 'deployments-past',\n DEPLOYMENTS_PAST_COMPLETED: 'deployments-past-completed',\n DEPLOYMENTS_PAST_COMPLETED_FAILURE: 'deployments-past-completed-failure',\n ONBOARDING_CANCELED: 'onboarding-canceled'\n} as const;\n\nexport type OnboardingStepKey = keyof typeof onboardingSteps;\nexport type OnboardingStep = (typeof onboardingSteps)[OnboardingStepKey];\n\n// TODO: Update this to reflect the onboarding steps used in Mender?\nexport const orderedOnboardingSteps = [\n onboardingSteps.DASHBOARD_ONBOARDING_START,\n onboardingSteps.DEVICES_PENDING_ONBOARDING_START,\n onboardingSteps.DEVICES_DELAYED_ONBOARDING,\n onboardingSteps.DEVICES_PENDING_ONBOARDING,\n onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING,\n onboardingSteps.DASHBOARD_ONBOARDING_PENDINGS,\n onboardingSteps.DEVICES_ACCEPTED_ONBOARDING,\n onboardingSteps.DEVICES_DEPLOY_RELEASE_ONBOARDING,\n onboardingSteps.SCHEDULING_ALL_DEVICES_SELECTION,\n onboardingSteps.SCHEDULING_GROUP_SELECTION,\n onboardingSteps.SCHEDULING_ARTIFACT_SELECTION,\n onboardingSteps.SCHEDULING_RELEASE_TO_DEVICES,\n onboardingSteps.DEPLOYMENTS_INPROGRESS,\n onboardingSteps.DEPLOYMENTS_PAST,\n onboardingSteps.DEPLOYMENTS_PAST_COMPLETED,\n onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE,\n onboardingSteps.ONBOARDING_CANCELED\n];\n","// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { useradmApiUrl } from '../constants';\n\nexport const XML_METADATA_FORMAT = 'xml';\nexport const JSON_METADATA_FORMAT = 'json';\n\nexport const getSamlStartUrl = id => `${window.location.origin}${useradmApiUrl}/auth/sso/${id}/login`;\nexport const getOidcStartUrl = id => `${window.location.origin}${useradmApiUrl}/oidc/${id}/start`;\n\nexport const SSO_TYPES = {\n saml: {\n id: 'saml',\n type: 'saml',\n title: 'SAML',\n metadataFormat: XML_METADATA_FORMAT,\n editorLanguage: XML_METADATA_FORMAT,\n contentType: 'application/samlmetadata+xml',\n getStartUrl: getSamlStartUrl,\n configDetails: [\n { key: 'entityID', label: 'Entity ID', getValue: id => `${window.location.origin}${useradmApiUrl}/sso/sp/metadata/${id}` },\n { key: 'acs', label: 'ACS URL', getValue: id => `${window.location.origin}${useradmApiUrl}/auth/sso/${id}/acs` },\n { key: 'startURL', label: 'Start URL', getValue: getSamlStartUrl }\n ]\n },\n oidc: {\n id: 'oidc',\n type: 'oidc',\n title: 'OpenID Connect',\n metadataFormat: JSON_METADATA_FORMAT,\n editorLanguage: JSON_METADATA_FORMAT,\n contentType: 'application/json',\n getStartUrl: getOidcStartUrl,\n configDetails: [{ key: 'startURL', label: 'Start Url', getValue: getOidcStartUrl }]\n }\n} as const;\n\nexport type ContentType = (typeof SSO_TYPES)[keyof typeof SSO_TYPES]['contentType'];\n\nexport const auditlogTypes = {\n artifact: { title: 'Artifact', queryParameter: 'object_type', value: 'artifact' },\n deployment: { title: 'Deployment', queryParameter: 'object_deployment_name', value: 'deployment' },\n device: { title: 'Device', queryParameter: 'object_id', value: 'device' },\n user_access_token: { title: 'Personal Access Token', queryParameter: 'user_access_token', value: 'user_access_token' },\n user: { title: 'User', queryParameter: 'object_id', value: 'user' },\n tenant: { title: 'Tenant', queryParameter: 'object_id', value: 'tenant' }\n};\n\nexport const AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];\nexport const SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];\n\nexport const TENANT_LIST_DEFAULT = {\n page: 1,\n perPage: 20\n};\n","// Copyright 2019 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.\nexport const ARTIFACT_GENERATION_TYPE = { SINGLE_FILE: 'single_file' };\n\nexport const currentArtifact = 'artifact_name';\nexport const softwareIndicator = '.version';\nexport const rootfsImageVersion = 'rootfs-image.version';\nexport const softwareTitleMap = { [rootfsImageVersion]: { title: 'Root filesystem', priority: 0, key: rootfsImageVersion } };\n","'use strict';\n\n// Copyright 2015 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { uiPermissionsById } from '../constants';\n\nexport type UiPermission = {\n explanations: object;\n permissionLevel: number;\n permissionSets: Record<string, string>;\n title: string;\n value: string;\n verbs: string[];\n};\n\ntype ExcessiveAccessConfig = {\n selector: string;\n warning: string;\n};\n\ntype EndpointDefinition = {\n path: RegExp;\n types: string[];\n uiPermissions: UiPermission[];\n};\n\n/**\n * _uiPermissions_ represent the possible permissions/ rights that can be given for the area\n * _endpoints_ represent the possible endpoints this definition might be affecting in the UI and what\n * functionality might be affected\n *\n */\nexport type PermissionsArea = {\n endpoints: EndpointDefinition[];\n excessiveAccessConfig?: ExcessiveAccessConfig;\n explanation: string;\n filter?: (object) => string[];\n key: string;\n placeholder?: string;\n scope?: string;\n title: string;\n uiPermissions: UiPermission[];\n};\n\nexport const itemUiPermissionsReducer = (accu, { item, uiPermissions }) => (item ? { ...accu, [item]: uiPermissions } : accu);\n\nconst checkSinglePermission = (permission, requiredPermission) =>\n requiredPermission === permission || uiPermissionsById[permission].permissionLevel > uiPermissionsById[requiredPermission].permissionLevel;\n\nexport const checkPermissionsObject = (permissions, requiredPermission, scopedAccess, superAccess) =>\n permissions[superAccess]?.some(permission => checkSinglePermission(permission, requiredPermission)) ||\n permissions[scopedAccess]?.some(permission => checkSinglePermission(permission, requiredPermission));\n\nexport const USER_LOGOUT = 'USER_LOGOUT';\n\nexport const OWN_USER_ID = 'me';\n\nexport const settingsKeys = { initialized: 'settings-initialized' };\n\nexport const READ_STATES = {\n read: 'read',\n seen: 'seen',\n unread: 'unread'\n} as const;\nexport type ReadState = keyof typeof READ_STATES;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { SnackbarProps } from '@mui/material';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { SortOptions } from '../constants';\nimport { SORTING_OPTIONS } from '../constants';\n\nexport const sliceName = 'app';\n\nconst getYesterday = () => {\n const today = new Date();\n today.setDate(today.getDate() - 1);\n return today.toISOString();\n};\n\nexport type Repository = {\n name: string;\n version: string;\n};\n\nexport type VersionRelease = Partial<{ [versionInfo: string]: VersionRelease }> & {\n release?: string;\n release_date?: string;\n repos?: Repository[];\n supported_until?: string;\n};\n\nexport type SaasVersion = {\n date: string;\n tag: string;\n};\n\nexport type ReleaseData = {\n lts: string[];\n releases: {\n [version: string]: VersionRelease;\n };\n saas: SaasVersion[];\n};\nexport type TagData = { name: string }[];\n\nexport interface SnackbarContent extends Pick<SnackbarProps, 'action' | 'autoHideDuration' | 'message' | 'open'> {\n preventClickToCopy?: boolean;\n}\n\nexport interface SearchState {\n deviceIds: string[];\n isSearching: boolean;\n page?: number;\n perPage?: number;\n searchTerm: string;\n searchTotal: number;\n sort: SortOptions;\n}\n\nexport interface Upload {\n cancelSource: any;\n inprogress?: boolean;\n name?: string;\n progress: number;\n size?: number;\n}\n\ntype UILatestRelease = {\n releaseDate: string;\n repos: Record<string, string>;\n};\n\ntype VersionInformation = {\n [key: string]: string | UILatestRelease | undefined;\n backend?: string;\n GUI?: string;\n latestRelease?: UILatestRelease;\n};\n\nexport type SentryConfig = {\n isReduxEnabled?: string; // no parsing done here as this has to be accessed outside of the store\n location: string;\n replaysSessionSampleRate?: number;\n tracesSampleRate?: number;\n};\n\nexport type AppSliceType = {\n appInitDone: boolean;\n cancelSource: any;\n commit: string;\n demoArtifactLink: string;\n docsVersion: string;\n features: Record<string, boolean>;\n feedbackProbability: number;\n firstLoginAfterSignup: boolean;\n hostAddress: string | null;\n hostedAnnouncement: string;\n newThreshold: string;\n offlineThreshold: string;\n recaptchaSiteKey: string;\n searchState: SearchState;\n sentry: SentryConfig;\n snackbar: SnackbarContent;\n stripeAPIKey: string;\n trackerCode: string;\n uploadsById: Record<string, Upload>;\n versionInformation: VersionInformation;\n yesterday?: string;\n};\n\nexport const initialState: AppSliceType = {\n appInitDone: false,\n cancelSource: undefined,\n commit: '',\n demoArtifactLink: 'https://dgsbl4vditpls.cloudfront.net/mender-demo-artifact.mender',\n hostAddress: null,\n snackbar: {\n action: undefined,\n autoHideDuration: undefined,\n message: '',\n open: false,\n preventClickToCopy: false\n },\n // return boolean rather than organization details\n features: {\n hasAiEnabled: false,\n hasAuditlogs: false,\n hasDeltaProgress: false,\n hasMultitenancy: false,\n hasDeviceConfig: false,\n hasDeviceConnect: false,\n hasFeedbackEnabled: false,\n hasManifestsEnabled: false,\n hasMonitor: false,\n hasMCUEnabled: false,\n hasReporting: false,\n isHosted: true,\n isEnterprise: false\n },\n feedbackProbability: 0.3,\n firstLoginAfterSignup: false,\n hostedAnnouncement: '',\n docsVersion: '',\n recaptchaSiteKey: '',\n searchState: {\n deviceIds: [],\n searchTerm: '',\n searchTotal: 0,\n isSearching: false,\n sort: {\n direction: SORTING_OPTIONS.desc\n // key: null,\n // scope: null\n }\n },\n sentry: {\n location: '',\n replaysSessionSampleRate: 0.1,\n tracesSampleRate: 1.0\n },\n stripeAPIKey: '',\n trackerCode: '',\n uploadsById: {\n // id: { progress: 0, cancelSource: undefined }\n },\n newThreshold: getYesterday(),\n offlineThreshold: getYesterday(),\n versionInformation: {\n Integration: '',\n 'Mender-Artifact': '',\n 'Meta-Mender': ''\n },\n yesterday: undefined\n};\n\nexport const appSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n setFeatures: (state, action: PayloadAction<Record<string, boolean>>) => {\n state.features = {\n ...state.features,\n ...action.payload\n };\n },\n setSnackbar: (state, { payload }: PayloadAction<SnackbarContent | string>) => {\n if (typeof payload === 'string' || payload instanceof String) {\n state.snackbar = {\n ...initialState.snackbar,\n message: payload,\n open: !!payload\n };\n return;\n }\n const { message, autoHideDuration, action, preventClickToCopy = false } = payload;\n state.snackbar = {\n message,\n autoHideDuration,\n action,\n preventClickToCopy,\n open: !!message\n };\n },\n setFirstLoginAfterSignup: (state, action: PayloadAction<boolean>) => {\n state.firstLoginAfterSignup = action.payload;\n },\n setAnnouncement: (state, action: PayloadAction<string>) => {\n state.hostedAnnouncement = action.payload;\n },\n setSearchState: (state, action) => {\n state.searchState = {\n ...state.searchState,\n ...action.payload\n };\n },\n setOfflineThreshold: (state, action: PayloadAction<string>) => {\n state.offlineThreshold = action.payload;\n },\n initUpload: (state, action: PayloadAction<{ id: string; upload: Upload }>) => {\n const { id, upload } = action.payload;\n state.uploadsById[id] = upload;\n },\n uploadProgress: (state, action: PayloadAction<{ id: string; progress: number }>) => {\n const { id, progress } = action.payload;\n state.uploadsById[id] = {\n ...state.uploadsById[id],\n progress\n };\n },\n cleanUpUpload: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: current, ...remainder } = state.uploadsById;\n state.uploadsById = remainder;\n },\n setVersionInformation: (state, action: PayloadAction<VersionInformation>) => {\n state.versionInformation = {\n ...state.versionInformation,\n ...action.payload\n };\n },\n setEnvironmentData: (state, action) => ({ ...state, ...action.payload }),\n setAppInitDone: state => {\n state.appInitDone = true;\n }\n }\n});\n\nexport const actions = appSlice.actions;\nexport default appSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n Filter as BackendFilter,\n DeviceWithImage,\n FilterPredicate,\n Limit,\n Scope\n} from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, limitDefault } from '../constants';\nimport { DEFAULT_PENDING_INPROGRESS_COUNT, DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, deploymentPrototype } from './constants';\n\nexport const sliceName = 'deployments';\n\ntype Filter = {\n key: string;\n operator: FilterPredicate['type'];\n scope: string;\n value: any;\n};\nexport type DeviceDeployment = DeviceWithImage & {\n deviceId: string;\n release: string;\n route: string;\n};\n\nexport type Deployment = BackendDeploymentV1 &\n BackendDeploymentV2 & {\n devices: Record<string, DeviceWithImage>;\n filter?: BackendFilter & { filters: Filter[]; name?: string; scope?: Scope };\n group?: string;\n totalDeviceCount: number;\n };\n\nexport type DeploymentStatus = { deploymentIds: string[]; total: number };\nexport type DeploymentByStatus = {\n finished: DeploymentStatus;\n inprogress: DeploymentStatus;\n pending: DeploymentStatus;\n scheduled: DeploymentStatus;\n};\nexport type DeploymentByStatusKey = keyof DeploymentByStatus;\nexport type DeploymentConfig = {\n binaryDelta: {\n compressionLevel: number;\n disableChecksum: boolean;\n disableDecompression: boolean;\n duplicatesWindow: number;\n inputWindow: number;\n instructionBuffer: number;\n sourceWindow: number;\n timeout: number;\n };\n binaryDeltaLimits: {\n duplicatesWindow: Limit;\n inputWindow: Limit;\n instructionBuffer: Limit;\n sourceWindow: Limit;\n timeout: Limit;\n };\n};\n\nexport type SelectionListState = {\n endDate?: string;\n page?: number;\n perPage?: number;\n search?: string;\n selection: string[];\n startDate?: string;\n total?: number;\n type?: string;\n};\nexport type SelectionState = {\n finished: SelectionListState;\n general: {\n reportType: string | null;\n showCreationDialog: boolean;\n showReportDialog: boolean;\n state: string;\n };\n inprogress: SelectionListState;\n pending: SelectionListState;\n scheduled: SelectionListState;\n\n selectedId?: string;\n};\n\nexport type DeploymentsSliceType = {\n byId: Record<string, Deployment>;\n byStatus: DeploymentByStatus;\n config: DeploymentConfig;\n deploymentDeviceLimit: number;\n selectedDeviceIds: string[];\n selectionState: SelectionState;\n};\n\nexport const initialState: DeploymentsSliceType = {\n byId: {\n // [id]: { statistics: { status: {}, total_size }, devices: { [deploymentId]: { id, log } }, totalDeviceCount }\n },\n byStatus: {\n finished: { deploymentIds: [], total: 0 },\n inprogress: { deploymentIds: [], total: 0 },\n pending: { deploymentIds: [], total: 0 },\n scheduled: { deploymentIds: [], total: 0 }\n },\n config: {\n binaryDelta: {\n timeout: -1,\n duplicatesWindow: -1,\n compressionLevel: -1,\n disableChecksum: false,\n disableDecompression: false,\n inputWindow: -1,\n instructionBuffer: -1,\n sourceWindow: -1\n },\n binaryDeltaLimits: {\n timeout: { ...limitDefault, default: 60, max: 3600, min: 60 },\n sourceWindow: limitDefault,\n inputWindow: limitDefault,\n duplicatesWindow: limitDefault,\n instructionBuffer: limitDefault\n }\n },\n deploymentDeviceLimit: 5000,\n selectedDeviceIds: [],\n selectionState: {\n finished: { ...DEVICE_LIST_DEFAULTS, endDate: undefined, search: '', selection: [], startDate: undefined, total: 0, type: '' },\n inprogress: { ...DEVICE_LIST_DEFAULTS, perPage: DEFAULT_PENDING_INPROGRESS_COUNT, selection: [] },\n pending: { ...DEVICE_LIST_DEFAULTS, perPage: DEFAULT_PENDING_INPROGRESS_COUNT, selection: [] },\n scheduled: { ...DEVICE_LIST_DEFAULTS, selection: [] },\n general: {\n state: DEPLOYMENT_ROUTES.active.key,\n showCreationDialog: false,\n showReportDialog: false,\n reportType: null // DeploymentConstants.DEPLOYMENT_TYPES.configuration|DeploymentConstants.DEPLOYMENT_TYPES.software\n },\n selectedId: undefined\n }\n};\n\nexport const deploymentsSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n createdDeployment: (state, action) => {\n state.byId[action.payload.id] = {\n ...deploymentPrototype,\n ...action.payload\n };\n state.byStatus[DEPLOYMENT_STATES.pending].total = state.byStatus[DEPLOYMENT_STATES.pending].total + 1;\n state.byStatus[DEPLOYMENT_STATES.pending].deploymentIds = [...state.byStatus.pending.deploymentIds, action.payload.id];\n state.selectionState[DEPLOYMENT_STATES.pending].selection = [action.payload.id, ...state.selectionState[DEPLOYMENT_STATES.pending].selection];\n state.selectionState[DEPLOYMENT_STATES.pending].total = (state.selectionState[DEPLOYMENT_STATES.pending].total || 0) + 1;\n },\n removedDeployment: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removedDeployment, ...remainder } = state.byId;\n state.byId = remainder;\n },\n receivedDeployment: (state, action: PayloadAction<Deployment>) => {\n state.byId[action.payload.id] = {\n ...(state.byId[action.payload.id] || {}),\n ...action.payload\n };\n },\n receivedDeploymentDeviceLog: (state, action: PayloadAction<{ deviceId: string; id: string; log: boolean }>) => {\n const { id, deviceId, log } = action.payload;\n const deployment = {\n ...deploymentPrototype,\n ...state.byId[id]\n };\n state.byId[id] = {\n ...deployment,\n devices: {\n ...deployment.devices,\n [deviceId]: {\n ...deployment.devices[deviceId],\n log\n }\n }\n };\n },\n receivedDeploymentDevices: (\n state,\n action: PayloadAction<{ devices: Record<string, DeviceWithImage>; id: string; selectedDeviceIds: string[]; totalDeviceCount: number }>\n ) => {\n const { id, devices, selectedDeviceIds, totalDeviceCount } = action.payload;\n state.byId[id] = {\n ...state.byId[id],\n devices,\n totalDeviceCount\n };\n state.selectedDeviceIds = selectedDeviceIds;\n },\n receivedDeployments: (state, action: PayloadAction<Record<string, Deployment>>) => {\n state.byId = {\n ...state.byId,\n ...action.payload\n };\n },\n receivedDeploymentsForStatus: (state, action: PayloadAction<{ deploymentIds: string[]; status: DeploymentByStatusKey; total: number }>) => {\n const { status, deploymentIds, total } = action.payload;\n state.byStatus[status].deploymentIds = deploymentIds;\n state.byStatus[status].total = total;\n },\n selectDeploymentsForStatus: (state, action: PayloadAction<{ deploymentIds: string[]; status: DeploymentByStatusKey; total: number }>) => {\n const { status, deploymentIds, total } = action.payload;\n state.selectionState[status].selection = deploymentIds;\n state.selectionState[status].total = total;\n },\n setDeploymentsState: (state, action: PayloadAction<SelectionState>) => {\n state.selectionState = action.payload;\n },\n setDeploymentsConfig: (state, action: PayloadAction<DeploymentConfig>) => {\n state.config = action.payload;\n }\n }\n});\n\nexport const actions = deploymentsSlice.actions;\nexport default deploymentsSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n Device as BackendDeviceAuth,\n ConnectionState,\n DeviceConfiguration,\n DeviceState,\n DeviceTierLimits,\n MonitorConfiguration,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\n// @ts-nocheck\nimport { deepCompare, duplicateFilter } from '@northern.tech/utils/helpers';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { ALL_DEVICE_STATES, DeviceIssueOptionKey, FilterOperator, SortOptions } from '../constants';\nimport { DEVICE_LIST_DEFAULTS, DEVICE_STATES, SORTING_OPTIONS } from '../constants';\nimport type { DeviceDeployment } from '../deploymentsSlice';\nimport type { DeviceAuthState } from './constants';\n\nexport const sliceName = 'devices';\nexport type DeviceSelectedAttribute = { attribute: string; scope: string };\nexport type DeviceListState = {\n detailsTab: string;\n deviceIds: string[];\n isLoading: boolean;\n open?: boolean;\n page: number;\n perPage: number;\n refreshTrigger: boolean;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedId?: string;\n selectedIssues: DeviceIssueOptionKey[];\n selection: number[];\n setOnly?: boolean;\n sort: SortOptions & Partial<SortCriteria>;\n state?: DeviceAuthState | typeof ALL_DEVICE_STATES;\n total: number;\n};\ntype DeviceReport = {\n items: { count: number; key: string }[];\n otherCount: number;\n total: number;\n};\nexport type DeviceGroup = { deviceIds?: string[]; filters?: DeviceFilter[]; id?: string; total?: number };\nexport type InventoryAttributes = {\n [key: string]: string | string[];\n artifact_name: string;\n device_type: string[];\n};\n\n// based on the api docs the Record values might be even: \"Supported types: number, string, array of numbers, array of strings\" - but I guess \"string\" or \"string | sting[]\" should be good enough\ntype UiDeviceAttributes = {\n attributes: InventoryAttributes;\n identity?: Record<string, string>;\n monitor?: Record<string, string>;\n system: Record<string, string>;\n tags?: Record<string, string>;\n};\n\nexport type Device = BackendDeviceAuth &\n UiDeviceAttributes & {\n check_in_time_exact?: string;\n check_in_time_rounded?: string;\n config?: DeviceConfiguration;\n connect_status?: ConnectionState['status'];\n connect_updated_ts?: string;\n deploymentsCount?: number;\n deviceDeployments?: DeviceDeployment;\n etag?: string;\n gatewayIds?: string[];\n group?: string;\n id: string;\n isNew?: boolean;\n isOffline?: boolean;\n monitors?: MonitorConfiguration[];\n status: Status;\n twinsByIntegration?: Record<string, DeviceState & { twinError?: string }>;\n };\nexport type DeviceFilter = {\n key: string;\n operator: FilterOperator;\n scope: string;\n value: string | string[];\n};\ntype FilteringAttributes = {\n identityAttributes: string[];\n inventoryAttributes: string[];\n systemAttributes: string[];\n tagAttributes: string[];\n};\ntype FilteringAttributesConfig = {\n attributes: Record<string, string[]>;\n count: number;\n limit: number;\n};\n\nexport type DeviceGroups = {\n byId: Record<string, DeviceGroup>;\n selectedGroup?: string;\n};\nexport type DeviceSliceType = {\n byId: Record<string, Device>;\n byStatus: Record<DeviceAuthState, { counts: DeviceTierLimits & { total: number }; deviceIds: string[] }>;\n deviceList: DeviceListState;\n filteringAttributes: FilteringAttributes;\n filteringAttributesConfig: FilteringAttributesConfig;\n filteringAttributesLimit: number;\n filters: DeviceFilter[];\n groups: DeviceGroups;\n limits: DeviceTierLimits;\n reports: DeviceReport[];\n total: number;\n};\nexport const initialState: DeviceSliceType = {\n byId: {\n // [deviceId]: {\n // ...,\n // twinsByIntegration: { [external.provider.id]: twinData }\n // }\n },\n byStatus: {\n [DEVICE_STATES.accepted]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.pending]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.preauth]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.rejected]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } }\n },\n deviceList: {\n deviceIds: [],\n ...DEVICE_LIST_DEFAULTS,\n selectedAttributes: [],\n selectedIssues: [],\n selection: [],\n sort: {\n direction: SORTING_OPTIONS.desc\n // key: null,\n // scope: null\n },\n state: DEVICE_STATES.accepted,\n total: 0,\n refreshTrigger: false,\n isLoading: false,\n detailsTab: '',\n open: false\n },\n filters: [\n // { key: 'device_type', value: 'raspberry', operator: '$eq', scope: 'inventory' }\n ],\n filteringAttributes: { identityAttributes: [], inventoryAttributes: [], systemAttributes: [], tagAttributes: [] },\n filteringAttributesLimit: 10,\n filteringAttributesConfig: {\n attributes: {\n // inventory: ['some_attribute']\n },\n count: 0,\n limit: 100\n },\n reports: [\n // { items: [{ key: \"someKey\", count: 42 }], otherCount: 123, total: <otherCount + itemsCount> }\n ],\n total: 0,\n limits: {\n standard: 0,\n micro: 0,\n system: 0\n },\n groups: {\n byId: {\n // groupName: { deviceIds: [], total: 0, filters: [] },\n // dynamo: { deviceIds: [], total: 3, filters: [{ a: 1 }] }\n },\n selectedGroup: undefined\n }\n};\n\nexport const devicesSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receivedGroups: (state, action: PayloadAction<Record<string, DeviceGroup>>) => {\n state.groups.byId = action.payload;\n },\n addToGroup: (state, action: PayloadAction<{ deviceIds: string[]; group: string }>) => {\n const { group, deviceIds } = action.payload;\n const maybeExistingGroup = {\n filters: [],\n deviceIds: [],\n ...state.groups.byId[group]\n };\n state.groups.byId[group] = {\n ...maybeExistingGroup,\n deviceIds: [...maybeExistingGroup.deviceIds, ...deviceIds].filter(duplicateFilter),\n total: (maybeExistingGroup.total || 0) + 1\n };\n },\n removeFromGroup: (state, action: PayloadAction<{ deviceIds: string[]; group: string }>) => {\n const { group, deviceIds: removedIds } = action.payload;\n const { deviceIds = [], total = 0, ...maybeExistingGroup } = state.groups.byId[group] || {};\n const changedGroup = {\n ...maybeExistingGroup,\n deviceIds: deviceIds.filter(id => !removedIds.includes(id)),\n total: Math.max(total - removedIds.length, 0)\n };\n if (changedGroup.total || changedGroup.deviceIds.length) {\n state.groups.byId[group] = changedGroup;\n return;\n } else if (state.groups.selectedGroup === group) {\n state.groups.selectedGroup = undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [group]: removal, ...remainingById } = state.groups.byId;\n state.groups.byId = remainingById;\n },\n addGroup: (state, action: PayloadAction<{ group: DeviceGroup; groupName: string }>) => {\n const { groupName, group } = action.payload;\n state.groups.byId[groupName] = {\n ...state.groups.byId[groupName],\n ...group\n };\n },\n selectGroup: (state, { payload: group }: PayloadAction<string | undefined>) => {\n state.deviceList.deviceIds =\n group && state.groups.byId[group] && state.groups.byId[group].deviceIds && state.groups.byId[group].deviceIds.length > 0\n ? state.groups.byId[group].deviceIds\n : [];\n state.groups.selectedGroup = group;\n },\n removeGroup: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removal, ...remainingById } = state.groups.byId;\n state.groups.byId = remainingById;\n state.groups.selectedGroup = state.groups.selectedGroup === action.payload ? undefined : state.groups.selectedGroup;\n },\n setDeviceListState: (state, action: PayloadAction<Partial<DeviceListState>>) => {\n state.deviceList = {\n ...state.deviceList,\n ...action.payload,\n sort: {\n ...state.deviceList.sort,\n ...action.payload.sort\n }\n };\n },\n setFilterAttributes: (state, action: PayloadAction<FilteringAttributes>) => {\n state.filteringAttributes = action.payload;\n },\n setFilterablesConfig: (state, action: PayloadAction<FilteringAttributesConfig>) => {\n state.filteringAttributesConfig = action.payload;\n },\n receivedDevices: (state, action: PayloadAction<Record<string, Device>>) => {\n state.byId = {\n ...state.byId,\n ...action.payload\n };\n },\n setDeviceFilters: (state, action: PayloadAction<DeviceFilter[]>) => {\n if (deepCompare(action.payload, state.filters)) {\n return;\n }\n state.filters = action.payload.filter(filter => filter.key && filter.operator && filter.scope && typeof filter.value !== 'undefined');\n },\n setDeviceReports: (state, action: PayloadAction<DeviceReport[]>) => {\n state.reports = action.payload;\n },\n setDevicesByStatus: (state, action: PayloadAction<{ deviceIds: string[]; status: DeviceAuthState; total: number }>) => {\n const { status, total, deviceIds } = action.payload;\n if (total) {\n state.byStatus[status].deviceIds = deviceIds;\n state.byStatus[status].counts.total = total;\n }\n },\n setDevicesCountByStatus: (state, action: PayloadAction<{ countsPerTier: DeviceTierLimits; status: DeviceAuthState }>) => {\n const { countsPerTier, status } = action.payload;\n state.byStatus[status].counts = { ...countsPerTier, total: Object.values(countsPerTier).reduce((accu, tieredCount) => (accu += tieredCount), 0) };\n },\n setDeviceLimits: (state, action: PayloadAction<DeviceTierLimits>) => {\n state.limits = action.payload;\n },\n receivedDevice: (state, action: PayloadAction<{ id: string } & Partial<Device>>) => {\n state.byId[action.payload.id] = {\n ...state.byId[action.payload.id],\n ...action.payload\n };\n },\n maybeUpdateDevicesByStatus: (state, action: PayloadAction<{ authId?: string; deviceId: string }>) => {\n const { deviceId, authId } = action.payload;\n const device = state.byId[deviceId];\n const hasMultipleAuthSets = authId && device.auth_sets ? device.auth_sets.filter(authset => authset.id !== authId).length > 0 : false;\n if (!hasMultipleAuthSets && (Object.values(DEVICE_STATES) as string[]).includes(device.status)) {\n const deviceIds = state.byStatus[device.status].deviceIds.filter(id => id !== deviceId);\n const deviceTier = (device.attributes.tier as string) || 'standard';\n state.byStatus[device.status] = {\n deviceIds,\n counts: {\n ...state.byStatus[device.status].counts,\n [deviceTier]: Math.max(0, state.byStatus[device.status].counts[deviceTier] - 1),\n total: Math.max(0, state.byStatus[device.status].counts.total - 1)\n }\n };\n }\n }\n }\n});\n\nexport const actions = devicesSlice.actions;\nexport default devicesSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { Alert } from '@northern.tech/types/MenderTypes';\nimport { createSlice } from '@reduxjs/toolkit';\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\nimport type { DeviceIssueOptionKey } from '../constants';\nimport { DEVICE_ISSUE_OPTIONS, DEVICE_LIST_DEFAULTS, alertChannels } from '../constants';\nimport type { AlertChannelKey } from './constants';\n\nexport const sliceName = 'monitor';\ntype IssueCounts = Record<DeviceIssueOptionKey, { filtered: number; total: number }>;\ntype ChannelSettings = Record<AlertChannelKey, { enabled: boolean }>;\ntype SanitizedAlert = Alert & { fullName?: string };\n\nexport type MonitorSliceType = {\n alerts: {\n alertList: {\n page: number;\n perPage: number;\n total: number;\n };\n byDeviceId: { alerts?: Record<string, SanitizedAlert>; latest?: Record<string, SanitizedAlert> };\n };\n issueCounts: { byType: IssueCounts };\n settings: {\n global: {\n channels: ChannelSettings;\n };\n };\n};\nexport const initialState: MonitorSliceType = {\n alerts: {\n alertList: { ...DEVICE_LIST_DEFAULTS, total: 0 },\n byDeviceId: {}\n },\n issueCounts: {\n byType: Object.keys(DEVICE_ISSUE_OPTIONS).reduce<IssueCounts>((accu, key) => ({ ...accu, [key]: { filtered: 0, total: 0 } }), {} as IssueCounts)\n },\n settings: {\n global: {\n channels: {\n ...Object.keys(alertChannels).reduce((accu, item) => ({ ...accu, [item]: { enabled: true } }), {} as ChannelSettings)\n }\n }\n }\n};\n\nexport const monitorSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n changeAlertChannel: (state, action: PayloadAction<{ channel: AlertChannelKey; enabled: boolean }>) => {\n const { channel, enabled } = action.payload;\n state.settings.global.channels[channel] = { enabled };\n },\n receiveDeviceAlerts: (state, action: PayloadAction<{ alerts: SanitizedAlert[]; deviceId: string }>) => {\n const { deviceId, alerts } = action.payload;\n state.alerts.byDeviceId[deviceId] = { alerts };\n },\n receiveLatestDeviceAlerts: (state, action: PayloadAction<{ alerts: SanitizedAlert[]; deviceId: string }>) => {\n const { deviceId, alerts } = action.payload;\n state.alerts.byDeviceId[deviceId] = { ...state.alerts.byDeviceId[deviceId], latest: alerts };\n },\n receiveDeviceIssueCounts: (state, action: PayloadAction<{ counts: { filtered: number; total: number }; issueType: DeviceIssueOptionKey }>) => {\n const { issueType, counts } = action.payload;\n state.issueCounts.byType[issueType] = counts;\n },\n setAlertListState: (state, action) => {\n state.alerts.alertList = { ...state.alerts.alertList, ...action.payload };\n }\n }\n});\n\nexport const actions = monitorSlice.actions;\nexport default monitorSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nexport const sliceName = 'onboarding';\n\nexport type OnboardingApproach = 'virtual' | 'physical' | 'mcu';\n\nexport type OnboardingSliceType = {\n address?: string;\n approach: OnboardingApproach | null;\n complete: boolean;\n demoArtifactPort: number;\n deviceConnection?: string;\n deviceType: string[] | string | null;\n progress: string | null;\n showTips: boolean | null;\n showTipsDialog: boolean;\n};\n\nexport const initialState: OnboardingSliceType = {\n approach: null,\n complete: false,\n deviceType: null,\n demoArtifactPort: 85,\n progress: null,\n showTips: null,\n showTipsDialog: false\n};\n\nexport const onboardingSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n setOnboardingState: (state, action: PayloadAction<Partial<OnboardingSliceType>>) => ({ ...state, ...action.payload }),\n setDemoArtifactPort: (state, action: PayloadAction<number>) => {\n state.demoArtifactPort = action.payload;\n },\n setShowOnboardingHelp: (state, action: PayloadAction<boolean>) => {\n state.showTips = action.payload;\n },\n setShowDismissOnboardingTipsDialog: (state, action: PayloadAction<boolean>) => {\n state.showTipsDialog = action.payload;\n },\n setOnboardingComplete: (state, action: PayloadAction<boolean>) => {\n state.complete = action.payload;\n },\n setOnboardingProgress: (state, action: PayloadAction<string>) => {\n state.progress = action.payload;\n },\n setOnboardingDeviceType: (state, action: PayloadAction<string[] | string>) => {\n state.deviceType = action.payload;\n },\n setOnboardingApproach: (state, action: PayloadAction<OnboardingApproach>) => {\n state.approach = action.payload;\n }\n }\n});\n\nexport const actions = onboardingSlice.actions;\nexport default onboardingSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { AuditLog as AuditLogEvent, BillingProfile, Integration, Event as WebhookEvent } from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TENANT_LIST_DEFAULT } from '../constants';\nimport type { AuditLog, AuditLogSelectionState, Card, Organization, ProductConfig, SSOConfig, TenantList, Webhook } from './types';\n\nexport const sliceName = 'organization';\n\nexport type OrganizationSliceType = {\n auditlog: AuditLog;\n card: Card;\n externalDeviceIntegrations: Integration[];\n intentId: string | null;\n organization: Partial<Organization>;\n products?: ProductConfig;\n ssoConfigs: SSOConfig[];\n tenantList: TenantList;\n webhooks: Webhook;\n};\n\nexport const initialState: OrganizationSliceType = {\n card: {\n last4: '',\n expiration: { month: 1, year: 2020 },\n brand: ''\n },\n intentId: null,\n tenantList: {\n ...TENANT_LIST_DEFAULT,\n total: 0,\n tenants: [],\n selectedTenant: null,\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'name'\n }\n },\n organization: {\n // id, name, status, tenant_token, plan\n },\n auditlog: {\n events: [],\n selectionState: {\n ...DEVICE_LIST_DEFAULTS,\n detail: undefined,\n endDate: undefined,\n selectedIssue: undefined,\n sort: { direction: SORTING_OPTIONS.desc },\n startDate: undefined,\n total: 0,\n type: undefined,\n user: undefined,\n isLoading: false\n }\n },\n externalDeviceIntegrations: [\n // { <connection_string|x509|...>, id, provider }\n ],\n ssoConfigs: [],\n webhooks: {\n // [id]: { events: [] }\n // for now:\n events: [],\n eventsTotal: 0\n }\n};\n\nexport const organizationSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receiveAuditLogs: (state, action: PayloadAction<{ events: AuditLogEvent[]; total: number }>) => {\n const { events, total } = action.payload;\n state.auditlog.events = events;\n state.auditlog.selectionState.total = total;\n },\n setAuditLogState: (state, action: PayloadAction<Partial<AuditLogSelectionState>>) => {\n state.auditlog.selectionState = {\n ...state.auditlog.selectionState,\n ...action.payload\n };\n },\n receiveCurrentCard: (state, action: PayloadAction<Card>) => {\n state.card = action.payload;\n },\n receiveSetupIntent: (state, action: PayloadAction<string | null>) => {\n state.intentId = action.payload;\n },\n setOrganization: (state, action: PayloadAction<Partial<Organization>>) => {\n state.organization = { ...state.organization, ...action.payload };\n },\n setSubscription: (state, action) => {\n state.organization.subscription = { ...state.organization.subscription, ...action.payload };\n },\n setProducts: (state, action: PayloadAction<ProductConfig>) => {\n state.products = action.payload;\n },\n setBillingProfile: (state, action: PayloadAction<BillingProfile>) => {\n state.organization.billing_profile = action.payload;\n },\n setTenantListState: (state, action: PayloadAction<TenantList>) => {\n state.tenantList = action.payload;\n },\n receiveExternalDeviceIntegrations: (state, action: PayloadAction<Integration[]>) => {\n state.externalDeviceIntegrations = action.payload;\n },\n receiveSsoConfigs: (state, action: PayloadAction<SSOConfig[]>) => {\n state.ssoConfigs = action.payload;\n },\n receiveWebhookEvents: (state, action: PayloadAction<{ total: number; value: WebhookEvent[] }>) => {\n const { value, total } = action.payload;\n state.webhooks.events = value;\n state.webhooks.eventsTotal = total;\n }\n }\n});\n\nexport const actions = organizationSlice.actions;\nexport default organizationSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n ArtifactV1 as BackendArtifactV1,\n ArtifactV2 as BackendArtifactV2,\n ReleaseV1 as BackendReleaseV1,\n ReleaseV2 as BackendReleaseV2,\n Update as BackendUpdate,\n DeltaJobDetailsItem,\n DeltaJobsListItem\n} from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS } from '../constants';\nimport type { SortOptions } from '../constants';\n\ntype Update = Omit<BackendUpdate, 'meta_data'>;\nexport type Artifact = Omit<BackendArtifactV1, 'updates'> &\n Omit<BackendArtifactV2, 'updates'> & { installCount?: number; updates?: Array<Update>; url?: string };\nexport type Release = BackendReleaseV1 & BackendReleaseV2 & { artifacts: Artifact[]; device_types_compatible: string[]; name: string };\n\nexport const sliceName = 'releases';\n\ntype EnhancedJobDetailsItem = DeltaJobDetailsItem & DeltaJobsListItem;\n\nexport type ReleasesList = {\n isLoading?: boolean;\n page: number;\n perPage: number;\n releaseIds: string[];\n searchedIds: string[];\n searchOnly?: boolean;\n searchTerm: string;\n searchTotal: number;\n selectedTags: string[];\n selection: number[];\n sort?: SortOptions;\n tab?: 'releases' | 'delta';\n total: number;\n type: string;\n};\n\nexport type ReleaseSliceType = {\n artifacts: never[];\n byId: Record<string, Release>;\n deltaJobs: Record<string, EnhancedJobDetailsItem>;\n deltaJobsList: {\n jobIds: string[];\n page: number;\n perPage: number;\n sort?: SortOptions;\n total: 0;\n };\n releasesList: ReleasesList;\n selectedJob: string | null;\n selectedRelease: string | null;\n tags: string[];\n updateTypes: string[];\n};\n\nexport const initialState: ReleaseSliceType = {\n /*\n * Return list of saved artifacts objects\n */\n /*\n * return list of artifacts where duplicate names are collated with device compatibility lists combined\n */\n // artifacts: AppStore.getCollatedArtifacts(AppStore.getArtifactsRepo()),\n artifacts: [],\n /*\n * Return list of saved release objects\n */\n byId: {\n /*\n [releaseName]: {\n artifacts: [\n {\n id: '',\n name: '',\n description: '',\n device_types_compatible: [],\n ...\n updates: [{\n files: [\n { size: 123, name: '' }\n ],\n type_info: { type: '' }\n }],\n url: '' // optional\n }\n ],\n modified: ''\n device_types_compatible,\n name: '',\n tags: ['something'],\n notes: ''\n }\n */\n },\n deltaJobs: {\n /*\n [jobId]: {\n id: '',\n ...\n }\n */\n },\n deltaJobsList: {\n ...DEVICE_LIST_DEFAULTS,\n jobIds: [],\n total: 0,\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'started'\n }\n },\n releasesList: {\n ...DEVICE_LIST_DEFAULTS,\n searchedIds: [],\n releaseIds: [],\n selection: [],\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'modified'\n },\n isLoading: undefined,\n searchTerm: '',\n searchTotal: 0,\n selectedTags: [],\n total: 0,\n type: ''\n },\n tags: [],\n updateTypes: [],\n selectedJob: null,\n /*\n * Return single release with corresponding Artifacts\n */\n selectedRelease: null\n};\n\nexport const releaseSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receiveRelease: (state, action: PayloadAction<Release>) => {\n const { name } = action.payload;\n state.byId[name] = action.payload;\n },\n receiveReleases: (state, action: PayloadAction<Record<string, Release>>) => {\n state.byId = action.payload;\n },\n receiveReleaseTags: (state, action: PayloadAction<string[]>) => {\n state.tags = action.payload;\n },\n receiveReleaseTypes: (state, action: PayloadAction<string[]>) => {\n state.updateTypes = action.payload;\n },\n removeRelease: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: toBeRemoved, ...byId } = state.byId;\n state.byId = byId;\n state.selectedRelease = action.payload === state.selectedRelease ? null : state.selectedRelease;\n },\n selectedRelease: (state, action: PayloadAction<string | null>) => {\n state.selectedRelease = action.payload;\n },\n setReleaseListState: (state, action) => {\n state.releasesList = action.payload;\n },\n receivedDeltaJobs: (state, action) => {\n const { jobs, total } = action.payload;\n state.deltaJobs = jobs.reduce(\n (accu, job) => {\n accu[job.id] = {\n ...accu[job.id],\n ...job\n };\n return accu;\n },\n { ...state.deltaJobs }\n );\n state.deltaJobsList.jobIds = jobs.map(job => job.id);\n state.deltaJobsList.total = total;\n },\n receivedDeltaJobDetails: (state, action) => {\n const job: DeltaJobDetailsItem & { id: string } = action.payload;\n state.deltaJobs[job.id] = {\n ...state.deltaJobs[job.id],\n ...job\n };\n },\n setDeltaJobsListState: (state, action) => {\n state.deltaJobsList = { ...state.deltaJobsList, ...action.payload };\n },\n setSelectedJob: (state, action) => {\n state.selectedJob = action.payload;\n }\n }\n});\n\nexport const actions = releaseSlice.actions;\nexport default releaseSlice.reducer;\n","// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { actions as appActions } from './appSlice';\nimport { actions as deploymentActions } from './deploymentsSlice';\nimport { actions as devicesActions } from './devicesSlice';\nimport { actions as monitorActions } from './monitorSlice';\nimport { actions as onboardingActions } from './onboardingSlice';\nimport { actions as organizationActions } from './organizationSlice';\nimport { actions as releaseActions } from './releasesSlice';\nimport { actions as userActions } from './usersSlice';\n\nexport default {\n ...appActions,\n ...deploymentActions,\n ...devicesActions,\n ...monitorActions,\n ...onboardingActions,\n ...organizationActions,\n ...releaseActions,\n ...userActions\n};\n","// Copyright 2017 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 axios, { isCancel } from 'axios';\nimport Cookies from 'universal-cookie';\n\nimport { cleanUp, getToken } from '../auth';\nimport { TIMEOUTS } from '../constants';\n\nconst cookies = new Cookies();\n\nconst unauthorizedRedirect = error => {\n if (!isCancel(error) && error.response?.status === 401 && getToken() && !window.location.pathname.endsWith('/subscription')) {\n // a new jwt might have been set by sso while the current request was in-flight with an old token\n // => reload instead of logging out\n if (cookies.get('JWT', { doNotParse: true })) {\n window.location.reload();\n return Promise.reject(error);\n }\n cleanUp();\n window.location.replace('/ui/');\n }\n return Promise.reject(error);\n};\n\nexport const commonRequestConfig = { timeout: TIMEOUTS.refreshDefault, headers: { 'Content-Type': 'application/json' } };\n\nexport const authenticatedRequest = axios.create(commonRequestConfig);\nauthenticatedRequest.interceptors.response.use(res => res, unauthorizedRedirect);\nauthenticatedRequest.interceptors.request.use(\n config => ({ ...config, headers: { ...config.headers, Authorization: `Bearer ${getToken()}` } }),\n error => Promise.reject(error)\n);\n\nconst Api = {\n get: authenticatedRequest.get,\n delete: (url, data?) => authenticatedRequest.request({ method: 'delete', url, data }),\n patch: authenticatedRequest.patch,\n post: authenticatedRequest.post,\n postUnauthorized: (url, data, config = {}) => axios.post(url, data, { ...commonRequestConfig, ...config }),\n put: authenticatedRequest.put,\n upload: (url, formData, progress, cancelSignal) =>\n authenticatedRequest.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: progress,\n timeout: 0,\n signal: cancelSignal\n }),\n uploadPut: (url, formData, progress, cancelSignal) =>\n authenticatedRequest.put(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: progress,\n timeout: 0,\n signal: cancelSignal\n })\n};\n\nexport default Api;\n","// Copyright 2016 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport Cookies from 'universal-cookie';\n\nimport { TIMEOUTS, maxSessionAge } from './constants';\nimport type { UserSession } from './usersSlice';\n\nconst cookies = new Cookies();\n\nconst emptySession = Object.freeze({ token: '', expiresAt: undefined }) as Readonly<UserSession>;\n\nlet tokenCache = '';\n\nexport const getSessionInfo = (): UserSession => {\n let sessionInfo = { ...emptySession } as UserSession;\n try {\n sessionInfo = JSON.parse(window.localStorage.getItem('JWT') ?? '');\n } catch {\n // most likely not logged in - nothing to do here\n }\n\n // check for cookie first to handles sso login while an old/expired token may still exist in cache/ localStorage\n const jwtTokenFromCookie = cookies.get('JWT', { doNotParse: true }) ?? '';\n if (jwtTokenFromCookie) {\n setSessionInfo({ token: jwtTokenFromCookie });\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n return { token: jwtTokenFromCookie, expiresAt: undefined };\n }\n if (sessionInfo.expiresAt && new Date(sessionInfo.expiresAt) < new Date()) {\n cleanUp();\n return { ...emptySession };\n }\n sessionInfo.token = sessionInfo.token || '';\n tokenCache = sessionInfo.token;\n return sessionInfo;\n};\n\nexport const getToken = () => (tokenCache ? tokenCache : getSessionInfo().token);\n\nexport const setSessionInfo = ({ token, expiresAt }: UserSession) => {\n tokenCache = token;\n window.localStorage.setItem('JWT', JSON.stringify({ token, expiresAt }));\n};\n\nexport const cleanUp = () => {\n tokenCache = '';\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n window.localStorage.removeItem('JWT');\n window.localStorage.removeItem('oauth');\n};\n\nexport const updateMaxAge = ({ expiresAt, token }) => {\n const oAuthExpiration = Number(window.localStorage.getItem('oauth'));\n let updateWithOAuth = false;\n if (oAuthExpiration) {\n const soon = Date.now() + maxSessionAge * TIMEOUTS.oneSecond;\n updateWithOAuth = oAuthExpiration <= soon;\n if (updateWithOAuth) {\n window.localStorage.removeItem('oauth');\n }\n }\n if (token && expiresAt && (!oAuthExpiration || updateWithOAuth)) {\n const expiration = new Date();\n expiration.setSeconds(expiration.getSeconds() + maxSessionAge);\n setSessionInfo({ token, expiresAt: expiration.toISOString() });\n }\n};\n","// Copyright 2016 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport axios from 'axios';\n\nimport { getToken } from '../auth';\nimport { commonRequestConfig } from './general-api';\n\ntype PostLoginBody = {\n email: string;\n no_expiry?: boolean;\n password?: string;\n token2fa?: string;\n};\n\nconst Api = {\n postLogin: (url: string, { email: username, password, ...body }: PostLoginBody) =>\n axios\n // @ts-ignore\n .post(url, body, { ...commonRequestConfig, auth: { username, password } })\n .then(res => ({ text: res.data, code: res.status, contentType: res.headers?.['content-type'] })),\n putVerifyTFA: (url, userData) => {\n let body = {};\n if (userData.hasOwnProperty('token2fa')) {\n body = { token2fa: userData.token2fa };\n }\n return axios.put(url, body, { ...commonRequestConfig, headers: { ...commonRequestConfig.headers, Authorization: `Bearer ${getToken()}` } });\n }\n};\n\nexport default Api;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { versionCompare } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { RootState } from '../store';\n\nexport const getDocsVersion = (state: RootState) => state.app.docsVersion;\nexport const getFeatures = (state: RootState) => state.app.features;\nexport const getFullVersionInformation = (state: RootState) => state.app.versionInformation;\nexport const getSearchState = (state: RootState) => state.app.searchState;\nexport const getUploads = (state: RootState) => state.app.uploadsById;\nexport const getSnackbar = (state: RootState) => state.app.snackbar;\nexport const getHostAddress = (state: RootState) => state.app.hostAddress;\nexport const getHostedAnnouncement = (state: RootState) => state.app.hostedAnnouncement;\nexport const getRecaptchaKey = (state: RootState) => state.app.recaptchaSiteKey;\nexport const getStripeKey = (state: RootState) => state.app.stripeAPIKey;\nexport const getTrackerCode = (state: RootState) => state.app.trackerCode;\nexport const getSentryConfig = (state: RootState) => state.app.sentry;\nexport const getCommit = (state: RootState) => state.app.commit;\nexport const getIsFirstLogin = (state: RootState) => state.app.firstLoginAfterSignup;\nexport const getFeedbackProbability = (state: RootState) => state.app.feedbackProbability;\nexport const getAppInitDone = (state: RootState) => state.app.appInitDone;\n\nexport const getIsUploading = createSelector([getUploads], uploadsById => !!Object.keys(uploadsById).length);\nexport const getSearchedDevices = createSelector([getSearchState], ({ deviceIds }) => deviceIds);\nexport const getVersionInformation = createSelector([getFullVersionInformation, getFeatures], ({ Integration, ...remainder }, { isHosted }) =>\n isHosted && Integration !== 'next' ? remainder : { ...remainder, Integration }\n);\nexport const getIsPreview = createSelector([getFullVersionInformation], ({ Integration }) => versionCompare(Integration, 'next') > -1);\n","// 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 isOAuth2 = !!currentUser?.sso?.length;\n const userVerified = !!currentUser.verified;\n\n const isHosted = features?.isHosted;\n const canHave2FA = isEnterprise || isHosted;\n const secureOAuthUser = isOAuth2 && userVerified;\n if (!currentUser || !settingsInitialized || has2FA || !canHave2FA || secureOAuthUser) {\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","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { Deployment } from '.';\nimport type { RootState } from '../store';\nimport { DEPLOYMENT_STATES } from './constants';\n\nexport const getDeploymentsById = (state: RootState) => state.deployments.byId;\nexport const getDeploymentsByStatus = (state: RootState) => state.deployments.byStatus;\nexport const getSelectedDeploymentDeviceIds = (state: RootState) => state.deployments.selectedDeviceIds;\nexport const getDeploymentsSelectionState = (state: RootState) => state.deployments.selectionState;\n\nexport const getDeploymentById = createSelector(\n [getDeploymentsById, (_, deploymentId) => deploymentId],\n (deploymentsById, deploymentId = '') => deploymentsById[deploymentId]\n);\n\nexport const getMappedDeploymentSelection = createSelector(\n [getDeploymentsSelectionState, (_, deploymentsState) => deploymentsState, getDeploymentsById],\n (selectionState, deploymentsState, deploymentsById) => {\n const { selection = [] } = selectionState[deploymentsState] ?? {};\n return selection.reduce((accu, id) => {\n if (deploymentsById[id]) {\n accu.push(deploymentsById[id]);\n }\n return accu;\n }, []);\n }\n);\n\nconst relevantDeploymentStates = [DEPLOYMENT_STATES.pending, DEPLOYMENT_STATES.inprogress, DEPLOYMENT_STATES.finished] as const;\nexport const DEPLOYMENT_CUTOFF = 3;\nexport const getRecentDeployments = createSelector([getDeploymentsById, getDeploymentsByStatus], (deploymentsById, deploymentsByStatus) =>\n Object.entries(deploymentsByStatus).reduce(\n (accu, [state, byStatus]) => {\n if (!relevantDeploymentStates.includes(state as (typeof relevantDeploymentStates)[number]) || !byStatus.deploymentIds.length) {\n return accu;\n }\n accu[state] = byStatus.deploymentIds\n .reduce<Deployment[]>((accu, id) => {\n if (deploymentsById[id]) {\n accu.push(deploymentsById[id]);\n }\n return accu;\n }, [])\n .slice(0, DEPLOYMENT_CUTOFF);\n accu.total += byStatus.total;\n return accu;\n },\n { total: 0 }\n )\n);\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { duplicateFilter } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { DeviceFilter, DeviceGroup } from '.';\nimport type { DeviceAuthState } from '../constants';\nimport { DEVICE_STATES, UNGROUPED_GROUP } from '../constants';\nimport type { RootState } from '../store';\n\nexport const getAcceptedDevices = (state: RootState) => state.devices.byStatus.accepted;\nexport const getDevicesByStatus = (state: RootState) => state.devices.byStatus;\nexport const getDevicesById = (state: RootState) => state.devices.byId;\nexport const getDeviceReports = (state: RootState) => state.devices.reports;\nexport const getGroupsById = (state: RootState) => state.devices.groups.byId;\nexport const getSelectedGroup = (state: RootState) => state.devices.groups.selectedGroup;\n\nexport const getDeviceListState = (state: RootState) => state.devices.deviceList;\nexport const getListedDevices = (state: RootState) => state.devices.deviceList.deviceIds;\nexport const getFilteringAttributes = (state: RootState) => state.devices.filteringAttributes;\nexport const getDeviceFilters = (state: RootState) => state.devices.filters || [];\nconst getFilteringAttributesFromConfig = (state: RootState) => state.devices.filteringAttributesConfig.attributes;\nexport const getSortedFilteringAttributes = createSelector([getFilteringAttributes], filteringAttributes => ({\n ...filteringAttributes,\n identityAttributes: [...filteringAttributes.identityAttributes, 'id']\n}));\nexport const getDeviceLimits = (state: RootState) => state.devices.limits;\nconst getFilteringAttributesLimit = (state: RootState) => state.devices.filteringAttributesLimit;\n\nexport const getDeviceIdentityAttributes = createSelector(\n [getFilteringAttributes, getFilteringAttributesLimit],\n ({ identityAttributes }, filteringAttributesLimit) => {\n // limit the selection of the available attribute to AVAILABLE_ATTRIBUTE_LIMIT\n const attributes = identityAttributes.slice(0, filteringAttributesLimit);\n return attributes.reduce(\n (accu, value) => {\n accu.push({ value, label: value, scope: 'identity' });\n return accu;\n },\n [\n { value: 'name', label: 'Name', scope: 'tags' },\n { value: 'id', label: 'Device ID', scope: 'identity' }\n ]\n );\n }\n);\n\nexport const getDeviceCountsByStatus = createSelector([getDevicesByStatus], byStatus =>\n Object.values(DEVICE_STATES).reduce<Record<DeviceAuthState, number>>(\n (accu, deviceState) => {\n const { counts } = byStatus[deviceState];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { total, ...tieredCounts } = counts;\n const count = Object.values(tieredCounts).reduce((accu, countPerTier) => accu + countPerTier, 0);\n accu[deviceState] = count;\n accu.total = accu.total + count;\n return accu;\n },\n { total: 0 }\n )\n);\n\nexport const getDeviceById = createSelector([getDevicesById, (_, deviceId) => deviceId], (devicesById, deviceId = '') => devicesById[deviceId] ?? {});\n\nexport const getSelectedGroupInfo = createSelector(\n [getDeviceCountsByStatus, getGroupsById, getSelectedGroup],\n ({ accepted: acceptedDeviceTotal }, groupsById, selectedGroup) => {\n let groupCount = acceptedDeviceTotal;\n let groupFilters: DeviceFilter[] = [];\n if (selectedGroup && groupsById[selectedGroup]) {\n groupCount = groupsById[selectedGroup].total || 0;\n groupFilters = groupsById[selectedGroup].filters || [];\n }\n return { groupCount, selectedGroup, groupFilters };\n }\n);\n\nexport const getCombinedLimit = createSelector(\n [getDeviceLimits],\n deviceLimits => Object.values(deviceLimits).reduce((accu, limit) => accu + Math.max(limit ?? 0, 0), 0) // limit might be -1 for unlimited devices\n);\n\nexport const getLimitMaxed = createSelector(\n [getDeviceCountsByStatus, getCombinedLimit],\n ({ accepted: acceptedDevices }, combinedLimit) => !!combinedLimit && combinedLimit <= acceptedDevices\n);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const getGroupsByIdWithoutUngrouped = createSelector([getGroupsById], ({ [UNGROUPED_GROUP.id]: ungrouped, ...groups }) => groups);\n\nexport const getGroupData = createSelector([getGroupsByIdWithoutUngrouped], groups => {\n const createdGroup = Object.keys(groups).length ? Object.keys(groups)[0] : undefined;\n const hasDynamicGroups = Object.values(groups).some(group => !!group.id);\n return { createdGroup, hasDynamicGroups, groups };\n});\n\ntype SelectorGroup = DeviceGroup & { groupId: string };\ntype SelectorGroups = { dynamic: SelectorGroup[]; static: SelectorGroup[]; ungrouped: SelectorGroup[] };\n\nexport const getGroups = createSelector([getGroupsById], groupsById => {\n const groupNames = Object.keys(groupsById).sort();\n const groupedGroups = Object.entries(groupsById)\n .sort((a, b) => a[0].localeCompare(b[0]))\n .reduce<SelectorGroups>(\n (accu, [groupname, group]) => {\n const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;\n const groupItem = { ...group, groupId: name, name: groupname };\n if ((group.filters ?? []).length > 0) {\n if (groupname !== UNGROUPED_GROUP.id) {\n accu.dynamic.push(groupItem);\n } else {\n accu.ungrouped.push(groupItem);\n }\n } else {\n accu.static.push(groupItem);\n }\n return accu;\n },\n { dynamic: [], static: [], ungrouped: [] }\n );\n return { groupNames, ...groupedGroups };\n});\nexport const getAttributesList = createSelector(\n [getFilteringAttributes, getFilteringAttributesFromConfig],\n ({ identityAttributes = [], inventoryAttributes = [] }, { identity = [], inventory = [] }) =>\n [...identityAttributes, ...inventoryAttributes, ...identity, ...inventory].filter(duplicateFilter)\n);\nconst getEnabledTierLimits = createSelector([getDeviceLimits], limits => Object.entries(limits).filter(([, limit]) => limit !== 0));\n\nexport const getEnabledTiers = createSelector([getEnabledTierLimits], enabledTierLimits => enabledTierLimits.map(([type]) => type));\n\nexport const getDeviceLimitStats = createSelector([getEnabledTierLimits, getAcceptedDevices], (enabledTierLimits, accepted) => {\n const { counts } = accepted;\n return enabledTierLimits.map(([type, limit]) => ({\n type,\n limit,\n total: counts[type] || 0\n }));\n});\n\nexport const getDeviceTypes = createSelector([getAcceptedDevices, getDevicesById], ({ deviceIds = [] }, devicesById) =>\n Object.keys(\n deviceIds.slice(0, 200).reduce((accu, item) => {\n const { device_type: deviceTypes = [] } = devicesById[item] ? devicesById[item].attributes : {};\n accu = deviceTypes.reduce((deviceTypeAccu, deviceType) => {\n if (deviceType.length > 1) {\n deviceTypeAccu[deviceType] = deviceTypeAccu[deviceType] ? deviceTypeAccu[deviceType] + 1 : 1;\n }\n return deviceTypeAccu;\n }, accu);\n return accu;\n }, {})\n )\n);\n","// Copyright 2023 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\nexport const getIssueCountsByType = state => state.monitor.issueCounts.byType;\n","// Copyright 2023 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\nexport const getOnboarding = state => state.onboarding;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { Tenant } from '@northern.tech/types/MenderTypes';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { EXTERNAL_PROVIDER, productOrder } from '../constants';\nimport type { RootState } from '../store';\n\nexport const getOrganization = (state: RootState) => state.organization.organization;\nexport const getProducts = (state: RootState) => state.organization.products;\nexport const getExternalIntegrations = (state: RootState) => state.organization.externalDeviceIntegrations;\nexport const getAuditlogState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getAuditLog = (state: RootState) => state.organization.auditlog.events;\nexport const getAuditLogSelectionState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getBillingProfile = (state: RootState) => state.organization.organization.billing_profile;\nexport const getSubscription = (state: RootState) => state.organization.organization.subscription;\nexport const getCard = (state: RootState) => state.organization.card;\nexport const getSsoConfig = ({ organization: { ssoConfigs = [] } }: RootState) => ssoConfigs[0];\nexport const getTenantsList = (state: RootState) => state.organization.tenantList;\nexport const getWebhookEvents = (state: RootState) => state.organization.webhooks.events;\nexport const getWebhookEventTotal = (state: RootState) => state.organization.webhooks.eventsTotal;\n\nexport const getDeviceTwinIntegrations = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && EXTERNAL_PROVIDER[integration.provider]?.deviceTwin)\n);\nexport const getIsServiceProvider = (state: RootState) => state.organization.organization.service_provider;\n\nexport const getWebhooks = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && integration.provider === EXTERNAL_PROVIDER.webhook.provider)\n);\nexport const getWebhookEventInfo = createSelector([getWebhooks, getWebhookEvents, getWebhookEventTotal], (webhooks, events, eventTotal) =>\n webhooks.length ? { events, eventTotal } : { events: [], eventTotal: 0 }\n);\n\nexport const getAuditLogEntry = createSelector([getAuditLog, getAuditLogSelectionState], (events, { selectedId }) => {\n if (!selectedId) {\n return;\n }\n const [eventAction, eventTime] = atob(selectedId).split('|');\n return events.find(item => item.action === eventAction && item.time === eventTime);\n});\n\nconst toTierName = (key: string) => key.replace(/max_|_?devices/g, '') || 'standard';\nconst processDeviceLimits = (deviceLimits: Tenant['device_limits'], skipFilter = false) => {\n const result: { disabled: string[]; limits: Record<string, object> } = { limits: {}, disabled: [] };\n if (!deviceLimits) return result;\n const tiersByName = Object.fromEntries(Object.entries(deviceLimits).map(([key, limit]) => [toTierName(key), { key, limit }]));\n return productOrder.reduce((accu, tierName) => {\n const entry = tiersByName[tierName];\n if (!entry) return accu;\n const { key, limit } = entry;\n if (limit.value === 0) {\n accu.disabled.push(tierName);\n if (!skipFilter) return accu;\n }\n accu.limits[tierName] = {\n id: tierName,\n backendId: key,\n limit: limit.value,\n current: limit.current_value,\n name: tierName,\n quotaLeft: Math.max(limit.value - limit.current_value, 0),\n limitReached: limit.value !== -1 && limit.value <= limit.current_value\n };\n return accu;\n }, result);\n};\nconst getDeviceLimitsInfo = createSelector([getOrganization], ({ device_limits }) => processDeviceLimits(device_limits));\nexport const getDisabledTiers = createSelector([getDeviceLimitsInfo], ({ disabled }) => disabled);\nexport const getSpLimits = createSelector([getDeviceLimitsInfo], ({ limits }) => limits);\nexport const getTenantListWithLimits = createSelector([getTenantsList], tenantList => ({\n ...tenantList,\n tenants: tenantList.tenants.map(tenant => ({\n ...tenant,\n device_limits: processDeviceLimits(tenant.device_limits, true).limits\n }))\n}));\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { ReleaseV2 } from '@northern.tech/types/MenderTypes';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { RootState } from '../store';\nimport { listItemMapper } from '../utils';\n\nconst getSelectedReleaseId = (state: RootState) => state.releases.selectedRelease;\nexport const getReleasesById = (state: RootState) => state.releases.byId;\nexport const getReleaseTags = (state: RootState) => state.releases.tags;\nexport const getReleaseListState = (state: RootState) => state.releases.releasesList;\nconst getListedReleases = (state: RootState) => state.releases.releasesList.releaseIds;\nexport const getUpdateTypes = (state: RootState) => state.releases.updateTypes;\nconst releaseDefaults = {};\nconst getReleaseMappingDefaults = () => releaseDefaults;\nexport const getReleasesList = createSelector([getReleasesById, getListedReleases, getReleaseMappingDefaults], listItemMapper<ReleaseV2>);\n\nexport const getReleaseTagsById = createSelector([getReleaseTags], releaseTags => releaseTags.reduce((accu, key) => ({ ...accu, [key]: key }), {}));\nexport const getHasReleases = createSelector(\n [getReleaseListState, getReleasesById],\n ({ searchTotal, total }, byId) => !!(Object.keys(byId).length || total || searchTotal)\n);\n\nexport const getSelectedRelease = createSelector([getReleasesById, getSelectedReleaseId], (byId, id) => byId[id || ''] ?? {});\n\nexport const getSelectedReleases = createSelector([getReleaseListState, getReleasesList], ({ selection }, releases) => selection.map(index => releases[index]));\n\nexport const getDeltaJobsListState = (state: RootState) => state.releases.deltaJobsList;\nexport const getDeltaJobsById = (state: RootState) => state.releases.deltaJobs;\nexport const getDeltaJobById = createSelector([getDeltaJobsById, (_, jobId) => jobId], (byId, jobId: string) => byId[jobId]);\nconst getSelectedJobId = (state: RootState) => state.releases.selectedJob;\nexport const getSelectedJob = createSelector([getDeltaJobsById, getSelectedJobId], (byId, jobId) => byId[jobId || '']);\n","// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (limits, spLimits) =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const { backendId } = spLimits[key];\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { DEVICE_ONLINE_CUTOFF, defaultIdAttribute } from '../constants';\nimport { twoFAStates } from '../constants';\nimport type { RootState } from '../store';\nimport { isDarkMode } from '../utils';\nimport { READ_STATES } from './constants';\nimport type { User } from './index';\n\nconst emptyObject = {} as User;\n\nexport const getRolesById = (state: RootState) => state.users.rolesById;\nexport const getTooltipsById = (state: RootState) => state.users.tooltips.byId;\nexport const getGlobalSettings = (state: RootState) => state.users.globalSettings;\nexport const getGlobalSettingsInitialized = (state: RootState) => state.users.settingsInitialized;\nexport const getUserSettingsInitialized = (state: RootState) => state.users.userSettingsInitialized;\nconst getCurrentUserId = (state: RootState) => state.users.currentUser;\nexport const getUsersById = (state: RootState) => state.users.byId;\n\nexport const getUsersList = createSelector([getUsersById], usersById => Object.values(usersById));\nexport const getCurrentUser = createSelector([getUsersById, getCurrentUserId], (usersById, userId) =>\n userId ? (usersById[userId] ?? emptyObject) : emptyObject\n);\nexport const getUserSettings = (state: RootState) => state.users.userSettings;\nexport const getSelectedDeviceAttribute = createSelector([getUserSettings], ({ columnSelection }) =>\n columnSelection.map(attribute => ({ attribute: attribute.key, scope: attribute.scope }))\n);\nexport const getIsDarkMode = createSelector([getUserSettings], ({ mode }) => isDarkMode(mode));\n\nexport const getReadAllHelptips = createSelector([getTooltipsById], tooltips =>\n Object.values(tooltips).every(({ readState }) => readState === READ_STATES.read)\n);\n\nexport const getTooltipsState = createSelector([getTooltipsById, getUserSettings], (byId, { tooltips = {} }) =>\n Object.entries(byId).reduce(\n (accu, [id, value]) => {\n accu[id] = { ...accu[id], ...value };\n return accu;\n },\n { ...tooltips }\n )\n);\n\nexport const getHas2FA = createSelector(\n [getCurrentUser],\n currentUser => currentUser.hasOwnProperty('tfa_status') && (currentUser as User).tfa_status === twoFAStates.enabled\n);\n\nexport const getIdAttribute = createSelector([getGlobalSettings], ({ id_attribute = { ...defaultIdAttribute } }) => id_attribute);\n\nexport const getOfflineThresholdSettings = createSelector([getGlobalSettings], ({ offlineThreshold }) => ({\n interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,\n intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName\n}));\n\nexport const getRolesList = createSelector([getRolesById], rolesById => Object.entries(rolesById).map(([value, role]) => ({ value, ...role })));\n\nexport const getCurrentSession = (state: RootState) => state.users.currentSession;\nexport const getRolesInitialized = (state: RootState) => state.users.rolesInitialized;\n\nexport const getSecurityAlertDismissedTimestamp = (state: RootState) => state.users.userSettings.securityAlertDismissedTimestamp;\n","// Copyright 2019 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 { useDispatch } from 'react-redux';\n\nimport { extractErrorMessage, preformatWithRequestID } from '@northern.tech/utils/helpers';\nimport { combineReducers, configureStore, createAsyncThunk } from '@reduxjs/toolkit';\nimport { createReduxEnhancer } from '@sentry/react';\n\nimport actions from './actions';\nimport appSlice from './appSlice';\nimport { getToken } from './auth';\nimport { USER_LOGOUT, settingsKeys } from './constants';\nimport deploymentSlice from './deploymentsSlice';\nimport deviceSlice from './devicesSlice';\nimport monitorSlice from './monitorSlice';\nimport onboardingSlice from './onboardingSlice';\nimport organizationSlice, { actions as organizationActions } from './organizationSlice';\nimport releaseSlice from './releasesSlice';\nimport userSlice, { actions as userActions } from './usersSlice';\n\nconst { setSnackbar, uploadProgress } = actions;\n\n// exclude 'pendings-redirect' since this is expected to persist refreshes - the rest should be better to be redone\nconst keys = ['sessionDeploymentChecker', settingsKeys.initialized];\nconst resetEnvironment = () => keys.forEach(key => window.sessionStorage.removeItem(key));\n\nresetEnvironment();\n\nexport const commonErrorFallback = 'Please check your connection.';\nexport const commonErrorHandler = (err, errorContext, dispatch, fallback?: string, mightBeAuthRelated = false): Promise<never> => {\n const errMsg = extractErrorMessage(err, fallback);\n if (mightBeAuthRelated || getToken()) {\n dispatch(setSnackbar({ message: preformatWithRequestID(err.response, `${errorContext} ${errMsg}`), action: 'Copy to clipboard' }));\n }\n return Promise.reject(err);\n};\n\nconst rootReducer = combineReducers({\n app: appSlice,\n devices: deviceSlice,\n deployments: deploymentSlice,\n monitor: monitorSlice,\n onboarding: onboardingSlice,\n organization: organizationSlice,\n releases: releaseSlice,\n users: userSlice\n});\n\nexport const sessionReducer = (state, action) => {\n if (action.type === USER_LOGOUT) {\n state = undefined;\n }\n return rootReducer(state, action);\n};\n\nconst rejectionLoggerMiddleware = () => next => action => {\n if (action.type.endsWith('/rejected')) {\n const { error } = action;\n console.error('Rejection in action:', action);\n console.error(error.stack);\n }\n return next(action);\n};\n\nconst tracingActionIgnoreList = [userActions.successfullyLoggedIn.type, 'users/loginUser/pending', 'users/loginUser/fulfilled', 'users/loginUser/rejected'];\n\nconst sentryReduxEnhancer = createReduxEnhancer({\n actionTransformer: action => {\n if (tracingActionIgnoreList.includes(action.type)) {\n return null;\n }\n return action;\n },\n // Transform the state to remove sensitive information\n stateTransformer: (state: RootState) => {\n const transformedState = {\n ...state,\n users: { ...state.users, currentSession: null },\n organization: {\n ...state.organization,\n organization: {\n ...state.organization.organization,\n tenant_token: null\n }\n }\n };\n return transformedState;\n }\n});\n\nexport const getConfiguredStore = (options = {}) => {\n const { preloadedState = {}, ...config } = options;\n return configureStore({\n ...config,\n preloadedState,\n enhancers: getDefaultEnhancers => {\n // rely on the plain injected env object, as we're initializing the store only here\n if (window.mender_environment?.sentry?.isReduxEnabled) {\n return getDefaultEnhancers().concat(sentryReduxEnhancer);\n }\n return getDefaultEnhancers();\n },\n reducer: sessionReducer,\n middleware: getDefaultMiddleware =>\n getDefaultMiddleware({\n immutableCheck: {\n ignoredPaths: ['app.uploadsById']\n },\n serializableCheck: {\n ignoredActions: [organizationActions.receiveExternalDeviceIntegrations.name, uploadProgress.name],\n ignoredActionPaths: ['uploads', /payload\\..*$/, 'meta.arg.file', 'meta.arg.integration.configHint'],\n ignoredPaths: ['app.uploadsById', 'organization.externalDeviceIntegrations']\n }\n }).concat(rejectionLoggerMiddleware)\n });\n};\nexport const store = getConfiguredStore({\n preloadedState: {}\n});\nexport type AppDispatch = typeof store.dispatch;\nexport const useAppDispatch: () => AppDispatch = useDispatch;\nexport type RootState = ReturnType<typeof store.getState>;\n\nexport const createAppAsyncThunk = createAsyncThunk.withTypes<{\n dispatch: AppDispatch;\n state: RootState;\n}>();\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { deepCompare, extractErrorMessage } from '@northern.tech/utils/helpers';\nimport Cookies from 'universal-cookie';\n\nimport type { ReleaseData, SearchState, TagData, VersionRelease } from '.';\nimport { actions, sliceName } from '.';\nimport GeneralApi from '../api/general-api';\nimport { getOfflineThresholdSettings } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { searchDevices } from '../thunks';\nimport { getComparisonCompatibleVersion } from '../utils';\nimport { getFeatures, getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAppAsyncThunk<void, boolean>(`${sliceName}/setFirstLoginAfterSignup`, (firstLoginAfterSignup, { dispatch }) => {\n cookies.set('firstLoginAfterSignup', !!firstLoginAfterSignup, { maxAge: 60, path: '/', domain: '.mender.io', sameSite: false });\n dispatch(actions.setFirstLoginAfterSignup(!!firstLoginAfterSignup));\n});\n\nconst dateFunctionMap = {\n getDays: 'getDate',\n setDays: 'setDate'\n};\nexport const setOfflineThreshold = createAppAsyncThunk(`${sliceName}/setOfflineThreshold`, (_, { dispatch, getState }) => {\n const { interval, intervalUnit } = getOfflineThresholdSettings(getState());\n const today = new Date();\n const intervalName = `${intervalUnit.charAt(0).toUpperCase()}${intervalUnit.substring(1)}`;\n const setter = dateFunctionMap[`set${intervalName}`] ?? `set${intervalName}`;\n const getter = dateFunctionMap[`get${intervalName}`] ?? `get${intervalName}`;\n today[setter](today[getter]() - interval);\n let value: string;\n try {\n value = today.toISOString();\n } catch {\n return Promise.resolve(dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.')));\n }\n return Promise.resolve(dispatch(actions.setOfflineThreshold(value))) as ReturnType<AppDispatch>;\n});\n\nconst versionRegex = new RegExp(/\\d+\\.\\d+/);\n\nconst getLatestRelease = (thing: VersionRelease): VersionRelease => {\n const latestKey = Object.keys(thing)\n .filter(key => versionRegex.test(key))\n .sort()\n .reverse()[0];\n return thing[latestKey] as VersionRelease;\n};\n\nconst repoKeyMap = {\n integration: 'Integration',\n 'mender-artifact': 'Mender-Artifact'\n} as const;\n\nconst deductSaasState = (latestRelease: VersionRelease, guiTags: TagData): string | undefined => {\n const latestGuiTag = guiTags.length ? guiTags[0].name : '';\n return latestGuiTag ? latestGuiTag : latestRelease.release;\n};\n\nexport const getLatestReleaseInfo = createAppAsyncThunk(`${sliceName}/getLatestReleaseInfo`, (_, { dispatch, getState }) => {\n if (!getFeatures(getState()).isHosted) {\n return Promise.resolve();\n }\n return Promise.all([GeneralApi.get<ReleaseData>('/versions.json'), GeneralApi.get<TagData>('/tags.json')])\n .catch(err => {\n console.log('init error:', extractErrorMessage(err));\n return Promise.resolve([{ data: {} }, { data: [] }]) as any;\n })\n .then(([{ data }, { data: guiTags }]) => {\n if (!guiTags.length) {\n return Promise.resolve();\n }\n const { releases } = data;\n const latestRelease = getLatestRelease(getLatestRelease(releases));\n const { latestRepos, latestVersions } = latestRelease.repos!.reduce(\n (accu, item) => {\n if (repoKeyMap[item.name]) {\n accu.latestVersions[repoKeyMap[item.name]] = getComparisonCompatibleVersion(item.version);\n }\n accu.latestRepos[item.name] = getComparisonCompatibleVersion(item.version);\n return accu;\n },\n { latestVersions: { ...getState().app.versionInformation }, latestRepos: {} }\n );\n const info = deductSaasState(latestRelease, guiTags);\n return Promise.resolve(\n dispatch(\n actions.setVersionInformation({\n ...latestVersions,\n Server: info,\n latestRelease: {\n releaseDate: latestRelease.release_date!,\n repos: latestRepos\n }\n })\n )\n ) as ReturnType<AppDispatch>;\n });\n});\n\nexport const setSearchState = createAppAsyncThunk(`${sliceName}/setSearchState`, (searchState: Partial<SearchState>, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n const nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n const tasks: ReturnType<AppDispatch>[] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: currentSearching, deviceIds: currentDevices, searchTotal: currentTotal, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: nextSearching, deviceIds: nextDevices, searchTotal: nextTotal, ...nextRequestState } = nextState;\n if (nextRequestState.searchTerm && !deepCompare(currentRequestState, nextRequestState)) {\n nextState.isSearching = true;\n tasks.push(\n dispatch(searchDevices(nextState))\n .unwrap()\n .then(results => {\n const searchResult = results[results.length - 1];\n return dispatch(actions.setSearchState({ ...searchResult, isSearching: false }));\n })\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(dispatch(actions.setSearchState(nextState)));\n return Promise.all(tasks);\n});\n","// 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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n DeviceWithImage,\n NewDeploymentTypeManagement as NewDeployment,\n NewDeploymentForGroup,\n NewDeploymentV2TypeManagement as NewDeploymentV2\n} from '@northern.tech/types/MenderTypes';\nimport { customSort, deepCompare, isEmpty, standardizePhases } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport validator from 'validator';\n\nimport type {\n Deployment,\n DeploymentByStatus,\n DeploymentByStatusKey,\n DeploymentConfig,\n DeploymentStatus,\n DeviceDeployment,\n SelectionListState,\n SelectionState\n} from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, apiRoot, deploymentsApiUrl, deploymentsApiUrlV2, headerNames } from '../constants';\nimport type { SortOptions } from '../constants';\nimport { getDevicesById, getGlobalSettings, getIdAttribute, getOrganization, getUserCapabilities } from '../selectors';\nimport { commonErrorHandler, createAppAsyncThunk } from '../store';\nimport type { AppDispatch } from '../store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '../thunks';\nimport { mapTermsToFilters } from '../utils';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { isUUID } = validator;\nconst { receivedDevice, setSnackbar } = storeActions;\n\n// default per page until pagination and counting integrated\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const deriveDeploymentGroup = ({ filter, group, groups = [], name }: Deployment) =>\n group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter?.name;\n\ntype ReceivedDeployment = BackendDeploymentV1 | BackendDeploymentV2;\nconst transformDeployments = (deployments: ReceivedDeployment[], deploymentsById: Record<string, Deployment>) =>\n deployments.sort(customSort(true, 'created')).reduce<{ deploymentIds: string[]; deployments: Record<string, Deployment> }>(\n (accu, item) => {\n const filter = item.filter;\n let deployment: Deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n // TODO: explicitly set filter term types to address scope type mismatch in deployment specs\n // @ts-expect-error: type misalignment in filter terms type\n filter: filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeURIComponent(item.name)\n };\n // deriving the group in a second step to potentially make use of the merged data from the existing group state + the decoded name\n deployment = { ...deployment, group: deriveDeploymentGroup(deployment) };\n accu.deployments[item.id] = deployment;\n accu.deploymentIds.push(item.id);\n return accu;\n },\n { deployments: {}, deploymentIds: [] }\n );\n\n/*Deployments */\nexport type GetDeploymentsByStatusPayload = Partial<SelectionListState> & {\n group?: string;\n shouldSelect?: boolean;\n sort?: SortOptions;\n status: DeploymentByStatusKey;\n};\nexport const getDeploymentsByStatus = createAppAsyncThunk(\n `${sliceName}/getDeploymentsByStatus`,\n (options: GetDeploymentsByStatusPayload, { dispatch, getState }) => {\n const { status, page = defaultPage, perPage = defaultPerPage, startDate, endDate, group, type, shouldSelect = true, sort = SORTING_OPTIONS.desc } = options;\n const created_after = startDate ? `&created_after=${startDate}` : '';\n const created_before = endDate ? `&created_before=${endDate}` : '';\n const { attribute, scope } = getIdAttribute(getState());\n const attributeHint = `&id_attribute=${attribute}&id_scope=${scope}`;\n const search = group ? `&name=${group}${attributeHint}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get<BackendDeploymentV1[]>(\n `${deploymentsApiUrlV2}/deployments?status=${status}&per_page=${perPage}&page=${page}${created_after}${created_before}${search}${typeFilter}&sort=${sort}`\n ).then(res => {\n const { deployments, deploymentIds } = transformDeployments(res.data, getState().deployments.byId);\n const total = Number(res.headers[headerNames.total]);\n let tasks: ReturnType<AppDispatch> = [\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(\n actions.receivedDeploymentsForStatus({\n deploymentIds,\n status,\n total: !(startDate || endDate || group || type) ? total : getState().deployments.byStatus[status].total\n })\n )\n ];\n tasks = deploymentIds.reduce((accu, deploymentId) => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n accu.push(dispatch(getSingleDeployment(deploymentId)));\n }\n return accu;\n }, tasks);\n if (shouldSelect) {\n tasks.push(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total })));\n }\n tasks.push({ deploymentIds, total });\n return Promise.all(tasks);\n });\n }\n);\n\nconst isWithinFirstMonth = (expirationDate?: string) => {\n if (!expirationDate) {\n return false;\n }\n const endOfFirstMonth = new Date(expirationDate);\n endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);\n return endOfFirstMonth > new Date();\n};\n\nconst trackDeploymentCreation = (totalDeploymentCount: number, hasDeployments: boolean, trial_expiration?: string) => {\n Tracking.event({ category: 'deployments', action: 'create' });\n if (!totalDeploymentCount) {\n if (!hasDeployments) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment' });\n if (isWithinFirstMonth(trial_expiration)) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_first_month' });\n }\n }\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_user' });\n }\n};\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAppAsyncThunk(\n `${sliceName}/createDeployment`,\n (\n {\n newDeployment,\n hasNewRetryDefault = false\n }: { hasNewRetryDefault: boolean; newDeployment: NewDeployment | (NewDeploymentForGroup & { group: string }) | NewDeploymentV2 },\n { dispatch, getState }\n ) => {\n let request;\n if ('filter_id' in newDeployment && newDeployment.filter_id) {\n request = GeneralApi.post(`${deploymentsApiUrlV2}/deployments`, newDeployment);\n } else if ('group' in newDeployment && newDeployment.group) {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${newDeployment.group}`, newDeployment);\n } else {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, newDeployment);\n }\n const totalDeploymentCount = (Object.values(getDeploymentsByStatusSelector(getState())) as DeploymentStatus[]).reduce<number>(\n (accu, item) => accu + item.total,\n 0\n );\n const { hasDeployments } = getGlobalSettings(getState());\n const { trial_expiration } = getOrganization(getState());\n return request\n .catch(err => commonErrorHandler(err, 'Error creating deployment.', dispatch))\n .then(data => {\n const lastslashindex = data.headers.location.lastIndexOf('/');\n const deploymentId = data.headers.location.substring(lastslashindex + 1);\n const deployment = {\n ...newDeployment,\n id: deploymentId,\n devices: 'devices' in newDeployment && newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n const tasks = [\n dispatch(actions.createdDeployment(deployment)),\n dispatch(getSingleDeployment(deploymentId)),\n dispatch(setSnackbar({ message: 'Deployment created successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ] as ReturnType<AppDispatch>;\n // track in GA\n trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases, retries } = newDeployment;\n const { previousPhases = [], retries: previousRetries = 0 } = getGlobalSettings(getState());\n const newSettings: any = { retries: hasNewRetryDefault ? retries : previousRetries, hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(phases);\n const prevPhases = previousPhases.map(standardizePhases);\n if (!prevPhases.find(previousPhaseList => previousPhaseList.every(oldPhase => standardPhases.find(phase => deepCompare(phase, oldPhase))))) {\n prevPhases.push(standardPhases);\n }\n newSettings.previousPhases = prevPhases.slice(-1 * MAX_PREVIOUS_PHASES_COUNT);\n }\n tasks.push(dispatch(saveGlobalSettings(newSettings)));\n }\n return Promise.all(tasks);\n });\n }\n);\n\nexport const getDeploymentDevices = createAppAsyncThunk(\n `${sliceName}/getDeploymentDevices`,\n (options: { id: string; page?: number; perPage?: number }, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get<DeviceWithImage[]>(`${deploymentsApiUrl}/deployments/${id}/devices/list?&page=${page}&per_page=${perPage}`).then(response => {\n const { devices: deploymentDevices = {} } = getState().deployments.byId[id] || {};\n const devices = response.data.reduce<Record<string, DeviceWithImage>>((accu, item) => {\n accu[item.id] = item;\n const log: boolean = (deploymentDevices[item.id] || {}).log;\n if (log) {\n accu[item.id].log = log;\n }\n return accu;\n }, {});\n const selectedDeviceIds = Object.keys(devices);\n let tasks: ReturnType<AppDispatch> = [\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce<string[]>((accu, deviceId) => {\n const device = devicesById[deviceId];\n if (!device || !device.identity_data || !device.attributes || Object.keys(device.attributes).length === 0) {\n accu.push(deviceId);\n }\n return accu;\n }, []);\n // get device artifact, inventory and identity details not listed in schedule data\n tasks = lackingData.reduce((accu, deviceId) => [...accu, dispatch(getDeviceById(deviceId)), dispatch(getDeviceAuth(deviceId))], tasks);\n return Promise.all(tasks);\n });\n }\n);\nconst parseDeviceDeployment = ({\n deployment: { id, artifact_name: release, status: deploymentStatus },\n device: { created, deleted, id: deviceId, finished, status, log }\n}: {\n deployment: Deployment;\n device: DeviceWithImage;\n}): DeviceDeployment => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce<string>((accu, { key, states }) => {\n if (!accu) {\n return (states as readonly string[]).includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\ntype GetDeviceDeploymentsPayload = {\n deviceId: string;\n filterSelection?: string[];\n page?: number;\n perPage?: number;\n};\n\nexport const getDeviceDeployments = createAppAsyncThunk(`${sliceName}/getDeviceDeployments`, (options: GetDeviceDeploymentsPayload, { dispatch }) => {\n const { deviceId, filterSelection = [], page = defaultPage, perPage = defaultPerPage } = options;\n const filters = filterSelection.map(item => `&status=${item}`).join('');\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/devices/${deviceId}?page=${page}&per_page=${perPage}${filters}`)\n .then(({ data, headers }) =>\n Promise.resolve(\n dispatch(\n receivedDevice({\n id: deviceId,\n deviceDeployments: data.map(parseDeviceDeployment),\n deploymentsCount: Number(headers[headerNames.total])\n })\n )\n )\n )\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the device deployment history:', dispatch));\n});\n\nexport const resetDeviceDeployments = createAppAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId: string, { dispatch }) =>\n GeneralApi.delete(`${deploymentsApiUrl}/deployments/devices/${deviceId}/history`)\n .then(() => Promise.resolve(dispatch(getDeviceDeployments({ deviceId }))))\n .catch(err => commonErrorHandler(err, 'There was an error resetting the device deployment history:', dispatch))\n);\n\nexport const getSingleDeployment = createAppAsyncThunk(`${sliceName}/getSingleDeployment`, (id: string, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}`).then(({ data }) => {\n const { deployments } = transformDeployments([data], getState().deployments.byId);\n return Promise.resolve(dispatch(actions.receivedDeployment(deployments[id])));\n })\n);\n\nexport const getDeviceLog = createAppAsyncThunk(\n `${sliceName}/getDeviceLog`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${deploymentId}/devices/${deviceId}/log`)\n .catch(e => {\n console.log('no log here', e);\n return Promise.reject();\n })\n .then(({ data: log }) =>\n Promise.all([Promise.resolve(dispatch(actions.receivedDeploymentDeviceLog({ id: deploymentId, deviceId, log }))), Promise.resolve(log)])\n )\n);\n\nexport const abortDeployment = createAppAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId: string, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus: DeploymentByStatus = getDeploymentsByStatusSelector(getState());\n let status: DeploymentByStatusKey = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex((id: string) => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex((id: string) => id === deploymentId);\n }\n const deploymentIds = [...deploymentsByStatus[status].deploymentIds.slice(0, index), ...deploymentsByStatus[status].deploymentIds.slice(index + 1)];\n const deploymentsById = getDeploymentsById(getState());\n const deployments = deploymentIds.reduce<Record<string, Deployment>>((accu, id) => {\n accu[id] = deploymentsById[id];\n return accu;\n }, {});\n const total = Math.max(deploymentsByStatus[status].total - 1, 0);\n return Promise.all([\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(actions.receivedDeploymentsForStatus({ deploymentIds, status, total })),\n dispatch(actions.removedDeployment(deploymentId)),\n dispatch(setSnackbar('The deployment was successfully aborted'))\n ]);\n })\n .catch(err => commonErrorHandler(err, 'There was an error while aborting the deployment:', dispatch))\n);\n\nexport const updateDeploymentControlMap = createAppAsyncThunk(\n `${sliceName}/updateDeploymentControlMap`,\n ({ deploymentId, updateControlMap }: { deploymentId: string; updateControlMap: BackendDeploymentV1['update_control_map'] }, { dispatch }) =>\n GeneralApi.patch(`${deploymentsApiUrl}/deployments/${deploymentId}`, { update_control_map: updateControlMap })\n .catch(err => commonErrorHandler(err, 'There was an error while updating the deployment status:', dispatch))\n .then(() => Promise.resolve(dispatch(getSingleDeployment(deploymentId))))\n);\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ntype SetDeploymentsStatePayload = DeepPartial<SelectionState> & { page?: number; perPage?: number };\nexport const setDeploymentsState = createAppAsyncThunk(`${sliceName}/setDeploymentsState`, (selection: SetDeploymentsStatePayload, { dispatch, getState }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page, perPage, ...selectionState } = selection;\n const currentState = getState().deployments.selectionState;\n const nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce<Partial<SelectionState>>((accu, item) => {\n accu[item] = {\n ...currentState[item],\n ...selectionState[item]\n };\n return accu;\n }, {}),\n general: {\n ...currentState.general,\n ...selectionState.general\n }\n } as SelectionState;\n const tasks: ReturnType<AppDispatch> = [dispatch(actions.setDeploymentsState(nextState))];\n if (nextState.selectedId && currentState.selectedId !== nextState.selectedId) {\n tasks.push(dispatch(getSingleDeployment(nextState.selectedId)));\n }\n return Promise.all(tasks);\n});\n\nconst deltaAttributeMappings = [\n { here: 'compressionLevel', there: 'compression_level' },\n { here: 'disableChecksum', there: 'disable_checksum' },\n { here: 'disableDecompression', there: 'disable_external_decompression' },\n { here: 'sourceWindow', there: 'source_window_size' },\n { here: 'inputWindow', there: 'input_window_size' },\n { here: 'duplicatesWindow', there: 'compression_duplicates_window' },\n { here: 'instructionBuffer', there: 'instruction_buffer_size' }\n];\n\nconst mapExternalDeltaConfig = (config = {}) =>\n deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[there] !== undefined) {\n accu[here] = config[there];\n }\n return accu;\n }, {});\n\nexport const getDeploymentsConfig = createAppAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/config`).then(({ data }) => {\n const oldConfig = getState().deployments.config;\n const { delta = {} } = data;\n const { binary_delta = {}, binary_delta_limits = {} } = delta;\n const { xdelta_args = {} } = binary_delta;\n const { xdelta_args_limits = {} } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\n ...mapExternalDeltaConfig(xdelta_args_limits)\n }\n };\n return Promise.resolve(dispatch(actions.setDeploymentsConfig(config)));\n })\n);\n\n// traverse a source object and remove undefined & empty object properties to only return an attribute if there really is content worth sending\nconst deepClean = <T extends Record<string, any>>(source: T): Partial<T> | undefined =>\n Object.entries(source).reduce<Partial<T> | undefined>((accu, [key, value]) => {\n if (value !== undefined) {\n const cleanedValue = typeof value === 'object' ? deepClean(value) : value;\n if (cleanedValue === undefined || (typeof cleanedValue === 'object' && isEmpty(cleanedValue))) {\n return accu;\n }\n accu = { ...(accu ?? {}), [key]: cleanedValue } as Partial<T>;\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAppAsyncThunk(\n `${sliceName}/saveDeltaDeploymentsConfig`,\n (config: DeploymentConfig['binaryDelta'], { dispatch, getState }) => {\n const configChange = {\n xdelta_args: deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[here] !== undefined) {\n accu[there] = config[here];\n }\n return accu;\n }, {})\n };\n const result = deepClean(configChange);\n if (!result) {\n return Promise.resolve();\n }\n return GeneralApi.put(`${deploymentsApiUrl}/config/binary_delta`, result)\n .catch(err => commonErrorHandler(err, 'There was a problem storing your delta artifact generation configuration.', dispatch))\n .then(() => {\n const oldConfig = getState().deployments.config;\n const newConfig = {\n ...oldConfig,\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...config\n }\n };\n return Promise.all([dispatch(actions.setDeploymentsConfig(newConfig)), dispatch(setSnackbar('Settings saved successfully'))]);\n });\n }\n);\n\nexport const generateDeploymentLogAnalysis = createAppAsyncThunk(\n `${sliceName}/generateDeploymentLogAnalysis`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch, rejectWithValue }) =>\n GeneralApi.get(`${apiRoot}/v1alpha1/deployments/deployments/${deploymentId}/devices/${deviceId}/log/explain`, { timeout: 60 * TIMEOUTS.oneSecond })\n .then(({ data: result }) => Promise.resolve(result))\n .catch(err => {\n if (err.response.status === 429) {\n return rejectWithValue(err.response);\n }\n commonErrorHandler(err, 'There was an error analysing the deployment log:', dispatch);\n })\n);\n","// 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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport { Link } from 'react-router-dom';\n\nimport type {\n AttributeV2,\n Device as BackendDevice,\n DeviceConfiguration,\n DeviceInventory,\n DeviceState,\n DeviceTierLimits,\n DeviceWithImage,\n Integration,\n ManagementApiConfiguration,\n NewConfigurationDeployment,\n PreAuthSet,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\nimport { attributeDuplicateFilter, dateRangeToUnix, deepCompare, getSnackbarMessage } from '@northern.tech/utils/helpers';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Device, DeviceFilter, DeviceGroup, DeviceGroups, DeviceListState, DeviceSelectedAttribute } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport type { SearchState } from '../appSlice';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n rootfsImageVersion\n} from '../constants';\nimport type { DeviceAuthState, DeviceIssueOptionKey } from '../constants';\nimport {\n getAcceptedDevices,\n getAttrsEndpoint,\n getDeviceReports,\n getDeviceReportsForUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSearchEndpoint,\n getSelectedDeviceAttribute,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '../selectors';\nimport type { AppDispatch, RootState } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings, saveUserSettings } from '../thunks';\nimport {\n convertDeviceListStateToFilters,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '../utils';\nimport { emptyFilter } from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceCountsByStatus,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\n getSelectedGroup\n} from './selectors';\n\nconst { cleanUpUpload, initUpload, setSnackbar, uploadProgress } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst defaultAttributes = [\n { scope: 'identity', attribute: 'status' },\n { scope: 'inventory', attribute: 'artifact_name' },\n { scope: 'inventory', attribute: 'device_type' },\n { scope: 'inventory', attribute: 'mender_is_gateway' },\n { scope: 'inventory', attribute: 'mender_gateway_system_id' },\n { scope: 'inventory', attribute: rootfsImageVersion },\n { scope: 'monitor', attribute: 'alerts' },\n { scope: 'system', attribute: 'created_ts' },\n { scope: 'system', attribute: 'updated_ts' },\n { scope: 'system', attribute: 'check_in_time' },\n { scope: 'system', attribute: 'group' },\n { scope: 'tags', attribute: 'name' }\n];\n\nexport const getGroups = createAppAsyncThunk(`${sliceName}/getGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/groups`).then(res => {\n const state: Record<string, DeviceGroup> = getGroupsById(getState());\n const dynamicGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (group.id || (group.filters?.length && id !== UNGROUPED_GROUP.id)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = res.data.reduce((accu, group) => {\n accu[group] = { deviceIds: [], filters: [], total: 0, ...state[group] };\n return accu;\n }, dynamicGroups);\n const filters = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n return Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: '', page: 1, perPage: 1, status: undefined }))\n ]).then((promises: [any, any]) => {\n const devicesRetrieval = promises[promises.length - 1] || [];\n const { payload } = devicesRetrieval || {};\n const result = payload[payload.length - 1] || {};\n if (!result.total) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName: UNGROUPED_GROUP.id,\n group: { filters: [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }] }\n })\n )\n );\n });\n })\n);\n\nexport const addDevicesToGroup = createAppAsyncThunk(\n `${sliceName}/addDevicesToGroup`,\n ({ group, deviceIds, isCreation }: { deviceIds: string[]; group: string; isCreation: boolean }, { dispatch }) =>\n GeneralApi.patch(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds)\n .then(() => dispatch(actions.addToGroup({ group, deviceIds })))\n .finally(() => (isCreation ? Promise.resolve(dispatch(getGroups())) : {}))\n);\n\nexport const removeDevicesFromGroup = createAppAsyncThunk(\n `${sliceName}/removeDevicesFromGroup`,\n ({ group, deviceIds }: { deviceIds: string[]; group: string }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(\n setSnackbar({\n message: `The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`,\n autoHideDuration: TIMEOUTS.fiveSeconds\n })\n )\n ])\n )\n);\n\nconst getGroupNotification = (newGroup: string, selectedGroup?: string) => {\n const successMessage = 'The group was updated successfully';\n if (newGroup === selectedGroup) {\n return { message: successMessage, autoHideDuration: TIMEOUTS.fiveSeconds };\n }\n return {\n action: '',\n autoHideDuration: TIMEOUTS.fiveSeconds,\n message: (\n <>\n {successMessage} - <Link to={`/devices?inventory=group:eq:${newGroup}`}>click here</Link> to see it.\n </>\n ),\n preventClickToCopy: true\n };\n};\n\nexport const addStaticGroup = createAppAsyncThunk(\n `${sliceName}/addStaticGroup`,\n ({ group, devices }: { devices: Device[]; group: string }, { dispatch, getState }) =>\n Promise.resolve(dispatch(addDevicesToGroup({ group, deviceIds: devices.map(({ id }) => id), isCreation: true })))\n .then(() =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n group: { deviceIds: [], total: 0, filters: [], ...getState().devices.groups.byId[group] },\n groupName: group\n })\n )\n ).then(() =>\n Promise.all([\n dispatch(setDeviceListState({ setOnly: true })),\n dispatch(getGroups()),\n dispatch(setSnackbar(getGroupNotification(group, getState().devices.groups.selectedGroup)))\n ])\n )\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\nexport const removeReportsByGroupName = createAppAsyncThunk(`${sliceName}/removeReportsByGroupName`, (groupName: string, { dispatch, getState }) => {\n if (!groupName) return Promise.resolve();\n const reports = getDeviceReportsForUser(getState());\n const filteredReports = reports.filter(report => report.group !== groupName);\n dispatch(saveUserSettings({ reports: filteredReports }));\n});\n\nexport const removeStaticGroup = createAppAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName: string, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n )\n);\nexport const getDynamicGroup = createAppAsyncThunk(`${sliceName}/getDynamicGroupById`, (id, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters/${id}`).catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, `Error retrieving the group: `, dispatch, commonErrorFallback);\n })\n);\n\nexport const getDynamicGroups = createAppAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state: Record<string, DeviceGroup> = getGroupsById(getState());\n const staticGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (!(group.id || group.filters?.length)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = (filters || []).reduce((accu, filter) => {\n accu[filter.name] = {\n deviceIds: [],\n total: 0,\n ...state[filter.name],\n id: filter.id,\n filters: mapTermsToFilters(filter.terms)\n };\n return accu;\n }, staticGroups);\n return Promise.resolve(dispatch(actions.receivedGroups(groups)));\n })\n .catch(() => console.log('Dynamic group retrieval failed - likely accessing a non-enterprise backend'))\n);\n\nexport const addDynamicGroup = createAppAsyncThunk(\n `${sliceName}/addDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters`, { name: groupName, terms: mapFiltersToTerms(filterPredicates) })\n .then(res =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName,\n group: {\n id: res.headers[headerNames.location].substring(res.headers[headerNames.location].lastIndexOf('/') + 1),\n filters: filterPredicates\n }\n })\n )\n ).then(() => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n return Promise.all([\n dispatch(actions.setDeviceFilters(cleanedFilters)),\n dispatch(setSnackbar(getGroupNotification(groupName, getState().devices.groups.selectedGroup))),\n dispatch(getDynamicGroups())\n ]);\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAppAsyncThunk(\n `${sliceName}/updateDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.resolve(dispatch(addDynamicGroup({ groupName, filterPredicates })) as ReturnType<AppDispatch>)\n );\n }\n);\n\nexport const removeDynamicGroup = createAppAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName: string, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group: string, groupsState: DeviceGroups, filters: DeviceFilter[] = []) => {\n const groupName = group === UNGROUPED_GROUP.id || group === UNGROUPED_GROUP.name ? UNGROUPED_GROUP.id : group;\n const selectedGroup = groupsState.byId[groupName];\n const groupFilterLength = selectedGroup?.filters?.length || 0;\n const cleanedFilters = groupFilterLength ? [...filters, ...(selectedGroup.filters || [])].filter(filtersFilter) : filters;\n return { cleanedFilters, groupName, selectedGroup, groupFilterLength };\n};\n\nexport const selectGroup = createAppAsyncThunk(\n `${sliceName}/selectGroup`,\n ({ group, filters = [] }: { filters: DeviceFilter[]; group: string }, { dispatch, getState }) => {\n const { cleanedFilters, groupName, selectedGroup, groupFilterLength } = getGroupFilters(group, getState().devices.groups, filters);\n if (getSelectedGroup(getState()) === groupName && ((filters.length === 0 && !groupFilterLength) || filters.length === cleanedFilters.length)) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n const tasks: ReturnType<AppDispatch>[] = [];\n if (groupFilterLength) {\n tasks.push(dispatch(actions.setDeviceFilters(cleanedFilters)));\n } else {\n tasks.push(dispatch(actions.setDeviceFilters(filters)));\n tasks.push(dispatch(getGroupDevices({ group: groupName, perPage: 1, shouldIncludeAllStates: true })));\n }\n const selectedGroupName = selectedGroup || !Object.keys(getGroupsById(getState())).length ? groupName : undefined;\n tasks.push(dispatch(actions.selectGroup(selectedGroupName)));\n return Promise.all(tasks);\n }\n);\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\ntype ReceivedDevice = BackendDevice & DeviceInventory & Omit<DeviceWithImage, 'status'>;\nconst reduceReceivedDevices = (devices: ReceivedDevice[], ids: string[], state: RootState, status?: DeviceAuthState) =>\n devices.reduce(\n (accu, device: any) => {\n const stateDevice = getDeviceByIdSelector(state, device.id);\n const {\n attributes: storedAttributes = {},\n identity_data: storedIdentity = {},\n monitor: storedMonitor = {},\n tags: storedTags = {},\n group: storedGroup\n } = stateDevice;\n const { identity, inventory, monitor, system = {}, tags } = mapDeviceAttributes(device.attributes);\n device.tags = { ...storedTags, ...tags };\n device.group = system.group ?? storedGroup;\n device.monitor = { ...storedMonitor, ...monitor };\n device.identity_data = { ...storedIdentity, ...identity, ...(device.identity_data ? device.identity_data : {}) };\n device.status = status ? status : device.status || identity.status;\n device.check_in_time_rounded = system.check_in_time ?? stateDevice.check_in_time_rounded;\n device.check_in_time_exact = device.check_in_time ?? stateDevice.check_in_time_exact;\n device.created_ts = getEarliestTs(getEarliestTs(system.created_ts, device.created_ts), stateDevice.created_ts);\n device.updated_ts = device.attributes ? device.updated_ts : stateDevice.updated_ts;\n device.isNew = new Date(device.created_ts) > new Date(state.app.newThreshold);\n device.isOffline = new Date(device.check_in_time_rounded) < new Date(state.app.offlineThreshold) || device.check_in_time_rounded === undefined;\n // all the other mapped attributes return as empty objects if there are no attributes to map, but identity will be initialized with an empty state\n // for device_type and artifact_name, potentially overwriting existing info, so rely on stored information instead if there are no attributes\n device.attributes = device.attributes ? { ...storedAttributes, ...inventory } : storedAttributes;\n accu.devicesById[device.id] = { ...stateDevice, ...device };\n accu.ids.push(device.id);\n return accu;\n },\n { ids, devicesById: {} }\n );\ntype getGroupDevicesPayload = {\n group: string;\n page?: number;\n perPage?: number;\n shouldIncludeAllStates: boolean;\n};\nexport const getGroupDevices = createAppAsyncThunk(`${sliceName}/getGroupDevices`, (options: getGroupDevicesPayload, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n return dispatch(\n getDevicesByStatus({\n ...remainder,\n filterSelection,\n group,\n status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted\n })\n )\n .unwrap()\n .then(results => {\n if (!group) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n const { deviceAccu, total } = results[results.length - 1];\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n group: {\n deviceIds:\n deviceAccu.ids.length === total || (stateGroup && stateGroup.deviceIds && deviceAccu.ids.length > stateGroup.deviceIds)\n ? deviceAccu.ids\n : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n )\n );\n });\n});\n\nexport const getAllGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { dispatch, getState }) => {\n if (!group || (!!group && (!getGroupsById(getState())[group] || getGroupsById(getState())[group].filters!.length))) {\n return Promise.resolve();\n }\n const { attributes, filterTerms } = prepareSearchArguments({\n filters: [],\n group,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices: string[] = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes: [...attributes, { scope: 'inventory', attribute }]\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total: deviceAccu.ids.length }, groupName: group })));\n });\n return getAllDevices();\n }\n);\n\nexport const getAllDynamicGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllDynamicGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { dispatch, getState }) => {\n if (!!group && (!getGroupsById(getState())[group] || !getGroupsById(getState())[group].filters!.length)) {\n return Promise.resolve();\n }\n const { attributes, filterTerms: filters } = prepareSearchArguments({\n filters: getState().devices.groups.byId[group].filters,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices: string[] = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), { page, per_page: perPage, filters, attributes: [...attributes, { scope: 'inventory', attribute }] }).then(\n res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > deviceAccu.ids.length) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total }, groupName: group })));\n }\n );\n return getAllDevices();\n }\n);\n\nexport const getDeviceById = createAppAsyncThunk(`${sliceName}/getDeviceById`, (id: string, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/devices/${id}`)\n .then(res => {\n const device = reduceReceivedDevices([res.data], [], getState()).devicesById[id];\n device.etag = res.headers.etag;\n dispatch(actions.receivedDevice(device));\n return Promise.resolve(device);\n })\n .catch(err => {\n const errMsg = extractErrorMessage(err);\n if (errMsg.includes('Not Found')) {\n console.log(`${id} does not have any inventory information`);\n const device = reduceReceivedDevices(\n [\n {\n id,\n attributes: [\n { name: 'status', value: 'decomissioned', scope: 'identity' },\n { name: 'decomissioned', value: 'true', scope: 'inventory' }\n ],\n log: false\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAppAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId: string, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId) as Device;\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n // Get full device identity details for single selected device\n const tasks: ReturnType<AppDispatch>[] = [\n dispatch(getDeviceAuth(deviceId)),\n dispatch(getDeviceById(deviceId)),\n ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))\n ];\n if (hasDeviceConfig && canConfigure && (device.status === DEVICE_STATES.accepted || device.status === DEVICE_STATES.preauth)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\n if (hasDeviceConnect) {\n tasks.push(dispatch(getDeviceConnect(deviceId)));\n }\n if (hasMonitor) {\n tasks.push(dispatch(getLatestDeviceAlerts({ id: deviceId })));\n tasks.push(dispatch(getDeviceMonitorConfig(deviceId)));\n }\n }\n return Promise.all(tasks);\n});\n\n/*\n Device Auth + admission\n */\nexport const getAllDeviceCounts = createAppAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/statistics`).then(({ data }) => {\n const { devices_by_status }: { devices_by_status: Record<DeviceAuthState, DeviceTierLimits> } = data;\n Object.entries(devices_by_status).map(([status, countsPerTier]) => dispatch(actions.setDevicesCountByStatus({ countsPerTier, status })));\n return;\n })\n);\n\nexport const getDeviceLimits = createAppAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/devices`).then(res => dispatch(actions.setDeviceLimits(res.data)))\n);\n\ntype SetDeviceListStatePayload = {\n fetchAuth?: boolean;\n forceRefresh?: boolean;\n shouldSelectDevices?: boolean;\n} & Partial<DeviceListState>;\nexport const setDeviceListState = createAppAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }: SetDeviceListStatePayload, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n const nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: ReturnType<AppDispatch>[] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, deviceIds: currentDevices, selection: currentSelection, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: nextLoading, deviceIds: nextDevices, selection: nextSelection, ...nextRequestState } = nextState;\n if (!nextState.setOnly && !deepCompare(currentRequestState, nextRequestState)) {\n const { direction: sortDown = SORTING_OPTIONS.desc, key: sortCol, scope: sortScope = '' } = nextState.sort ?? {};\n const sortBy = sortCol ? ([{ attribute: sortCol, order: sortDown as SortCriteria['order'], scope: sortScope }] as SortCriteria[]) : undefined;\n const applicableSelectedState = nextState.state === ALL_DEVICE_STATES ? undefined : nextState.state;\n nextState.isLoading = true;\n tasks.push(\n dispatch(getDevicesByStatus({ ...nextState, status: applicableSelectedState as DeviceAuthState | undefined, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(results => {\n const { deviceAccu, total } = results[results.length - 1];\n const devicesState = shouldSelectDevices ? { deviceIds: deviceAccu.ids, total, isLoading: false } : { isLoading: false };\n return Promise.resolve(dispatch(actions.setDeviceListState(devicesState)));\n })\n // whatever happens, change \"loading\" back to null\n .catch(() => Promise.resolve({ isLoading: false }))\n );\n }\n if (\n currentState.page !== nextState.page ||\n currentState.perPage > nextState.perPage ||\n currentState.state !== nextState.state ||\n !deepCompare(currentState.sort, nextState.sort)\n ) {\n nextState.selection = [];\n }\n tasks.push(dispatch(actions.setDeviceListState(nextState)));\n return Promise.all(tasks);\n }\n);\n\ntype GetDevicesByStatusPayload = {\n fetchAuth: boolean;\n filterSelection: DeviceFilter[];\n group: string;\n page: number;\n perPage: number;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedIssues: DeviceIssueOptionKey[];\n sortOptions: SortCriteria[];\n status: DeviceAuthState;\n};\n// get devices from inventory\nexport const getDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getDevicesByStatus`,\n (options: Partial<GetDevicesByStatusPayload>, { dispatch, getState }) => {\n const {\n status,\n fetchAuth = true,\n filterSelection,\n group,\n selectedIssues = [],\n page = defaultPage,\n perPage = defaultPerPage,\n sortOptions = [],\n selectedAttributes = getSelectedDeviceAttribute(getState())\n } = options;\n const state = getState();\n const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({\n filters: filterSelection ?? getDeviceFilters(state),\n group: group ?? getSelectedGroup(state),\n groups: state.devices.groups,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues,\n status\n });\n const attributes = [...defaultAttributes, getIdAttribute(getState()), ...selectedAttributes];\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .then(response => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], state, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : 0;\n if (status && state.devices.byStatus[status].counts.total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n const tasks: ReturnType<AppDispatch>[] = [dispatch(actions.receivedDevices(deviceAccu.devicesById))];\n if (status) {\n tasks.push(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total })));\n }\n // for each device, get device identity info\n const receivedDevices: Device[] = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n tasks.push(dispatch(getDevicesWithAuth(receivedDevices)));\n }\n tasks.push(Promise.resolve({ deviceAccu, total: Number(response.headers[headerNames.total]) }));\n return Promise.all(tasks);\n })\n .catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n }\n);\n\nexport const getAllDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getAllDevicesByStatus`,\n ({ status, attribute }: { attribute: string; status: DeviceAuthState }, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices: string[] = []) =>\n GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: [...attributes, { scope: 'inventory', attribute }]\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state, status);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > state.deployments.deploymentDeviceLimit) {\n return Promise.resolve();\n }\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve();\n });\n return getAllDevices();\n }\n);\n\ntype SearchDevicesPayload = SearchState & { sortOptions: SortCriteria[] };\nexport const searchDevices = createAppAsyncThunk(`${sliceName}/searchDevices`, (passedOptions: Partial<SearchDevicesPayload> = {}, { dispatch, getState }) => {\n const state = getState();\n const options = { ...state.app.searchState, ...passedOptions };\n const { page = defaultPage, searchTerm, sortOptions = [] } = options;\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = attributeDuplicateFilter([...defaultAttributes, getIdAttribute(state), ...selectedAttributes], 'attribute');\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n })\n .then(response => {\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n return Promise.all([\n dispatch(actions.receivedDevices(deviceAccu.devicesById)),\n Promise.resolve({ deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) })\n ]);\n })\n .catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n});\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes: AttributeV2[] = []) =>\n attributes.slice(0, ATTRIBUTE_LIST_CUTOFF).reduce(\n (accu, { name, scope }) => {\n if (!accu[scope]) {\n accu[scope] = [];\n }\n accu[scope].push(name);\n return accu;\n },\n { identity: [], inventory: [], system: [], tags: [] }\n );\n\nexport const getDeviceAttributes = createAppAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch, getState }) =>\n GeneralApi.get(getAttrsEndpoint(getState())).then(({ data }) => {\n // TODO: remove the array fallback once the inventory attributes endpoint is fixed\n const { identity: identityAttributes, inventory: inventoryAttributes, system: systemAttributes, tags: tagAttributes } = attributeReducer(data || []);\n return dispatch(actions.setFilterAttributes({ identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }));\n })\n);\n\nconst initializeDistributionData = (report, groups: Record<string, DeviceGroup>, devices: Record<string, Device>, totalDeviceCount: number) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices: Device[] = deviceIds ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce<Record<string, number>>((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n const attributeValue: string = item.attributes[effectiveAttribute] as string;\n if (!accu[attributeValue]) {\n accu[attributeValue] = 0;\n }\n accu[attributeValue] = accu[attributeValue] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items: { count: number; key: string }[] = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce<number>((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = (groups[group] ? total : totalDeviceCount) - dataCount;\n return { items, otherCount, total: otherCount + dataCount };\n};\n\nexport const updateReportData = createAppAsyncThunk(`${sliceName}/updateReportData`, (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n const { group = '' } = report;\n const devicesById = getDevicesById(getState());\n const groups = getGroupsById(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const totalDeviceCount = groups[group] ? (groups[group].total as number) : acceptedDevicesCount;\n\n const reportsData = getDeviceReports(getState());\n const newReports = [...reportsData];\n newReports[reportIndex] = initializeDistributionData(report, groups, devicesById, totalDeviceCount);\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportDataWithoutBackendSupport = createAppAsyncThunk(\n `${sliceName}/getReportDataWithoutBackendSupport`,\n (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n if (!report) {\n return;\n }\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const devicesById = getDevicesById(getState());\n const acceptedDevices = getAcceptedDevices(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const groups = getGroupsById(getState());\n const { deviceIds = [], filters = [], total = 0 } = groups[group] || {};\n let groupDevicesRequest = Promise.resolve({\n payload: { groupName: '', group: { deviceIds: Object.keys(devicesById), total: Object.keys(devicesById).length } }\n });\n if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every(id => !!devicesById[id]))) {\n groupDevicesRequest = filters.length\n ? dispatch(getAllDynamicGroupDevices({ group, attribute: effectiveAttribute })).unwrap()\n : dispatch(getAllGroupDevices({ group, attribute: effectiveAttribute })).unwrap();\n } else if (!group && (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every(id => !!devicesById[id]))) {\n groupDevicesRequest = dispatch(getAllDevicesByStatus({ status: DEVICE_STATES.accepted, attribute: effectiveAttribute })).unwrap();\n }\n return groupDevicesRequest.then(() => dispatch(updateReportData(reportIndex)));\n }\n);\n\nexport const getDeviceConnect = createAppAsyncThunk(`${sliceName}/getDeviceConnect`, (id: string, { dispatch }) =>\n GeneralApi.get(`${deviceConnect}/devices/${id}`).then(({ data }) =>\n Promise.all([dispatch(actions.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])\n )\n);\n\nconst updateTypeMap = { deploymentUpdate: 'check-update', inventoryUpdate: 'send-inventory' };\nexport const triggerDeviceUpdate = createAppAsyncThunk(`${sliceName}/triggerDeviceUpdate`, ({ id, type }: { id: string; type: string }, { dispatch }) =>\n GeneralApi.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`)\n .catch(err => commonErrorHandler(err, `The request couldn’t be sent.`, dispatch))\n .then(() => {\n dispatch(setSnackbar('Request has been sent.'));\n return new Promise(resolve => setTimeout(() => resolve(dispatch(getDeviceById(id)) as ReturnType<AppDispatch>), TIMEOUTS.threeSeconds));\n })\n);\n\ntype GetSessionDetailsPayload = { deviceId: string; endDate: string; sessionId: string; startDate: string; userId: string };\nexport const getSessionDetails = createAppAsyncThunk(\n `${sliceName}/getSessionDetails`,\n ({ sessionId, deviceId, userId, startDate, endDate }: GetSessionDetailsPayload) => {\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\n const objectSearch = `&object_id=${deviceId}`;\n return GeneralApi.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(\n ({ data: auditLogEntries }) => {\n const { start, end } = auditLogEntries.reduce(\n (accu, item) => {\n if (item.meta?.session_id?.includes(sessionId)) {\n accu.start = new Date(item.action.startsWith('open') ? item.time : accu.start);\n accu.end = new Date(item.action.startsWith('close') ? item.time : accu.end);\n }\n return accu;\n },\n { start: startDate || endDate, end: endDate || startDate }\n );\n return Promise.resolve({ start, end });\n }\n );\n }\n);\n\nexport const getDeviceFileDownloadLink = createAppAsyncThunk(\n `${sliceName}/getDeviceFileDownloadLink`,\n ({ deviceId, path }: { deviceId: string; path: string }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAppAsyncThunk(\n `${sliceName}/deviceFileUpload`,\n ({ deviceId, path, file }: { deviceId: string; file: File; path: string }, { dispatch }) => {\n const formData = new FormData();\n formData.append('path', path);\n formData.append('file', file);\n const uploadId = uuid();\n const cancelSource = new AbortController();\n return Promise.all([\n dispatch(setSnackbar('Uploading file')),\n dispatch(initUpload({ id: uploadId, upload: { progress: 0, cancelSource } })),\n GeneralApi.uploadPut(\n `${deviceConnect}/devices/${deviceId}/upload`,\n formData,\n e => dispatch(uploadProgress({ id: uploadId, progress: progress(e) })),\n cancelSource.signal\n )\n ])\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Upload successful', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar({ message: 'The upload has been cancelled', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n }\n);\n\nexport const getDeviceAuth = createAppAsyncThunk(`${sliceName}/getDeviceAuth`, (id: string, { dispatch }) =>\n dispatch(getDevicesWithAuth([{ id }]))\n .unwrap()\n .then(results => {\n if (results[results.length - 1]) {\n return Promise.resolve(results[results.length - 1][0]);\n }\n return Promise.resolve();\n })\n);\n\nexport const getDevicesWithAuth = createAppAsyncThunk(`${sliceName}/getDevicesWithAuth`, (devices: { id: string }[], { dispatch, getState }) =>\n devices.length\n ? GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`)\n .then(({ data: receivedDevices }) => {\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n return Promise.all([dispatch(actions.receivedDevices(devicesById)), Promise.resolve(receivedDevices)]);\n })\n .catch(err => commonErrorHandler(err, `Error: ${err}`, dispatch))\n : (Promise.resolve([[], []]) as ReturnType<AppDispatch>)\n);\n\nexport const updateDeviceAuth = createAppAsyncThunk(\n `${sliceName}/updateDeviceAuth`,\n ({ deviceId, authId, status }: { authId: string; deviceId: string; status: Status['status'] }, { dispatch, getState }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}/status`, { status })\n .then(() => Promise.all([dispatch(getDeviceAuth(deviceId)), dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAppAsyncThunk(\n `${sliceName}/updateDevicesAuth`,\n ({ deviceIds, status }: { deviceIds: string[]; status: Status['status'] }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce<{ id: string }[]>((accu, id) => (devices[id].auth_sets ? accu : [...accu, { id }]), []);\n return dispatch(getDevicesWithAuth(deviceIdsWithoutAuth)).then(() => {\n devices = getDevicesById(getState());\n // for each device, get id and id of authset & make api call to accept\n // if >1 authset, skip instead\n const deviceAuthUpdates = deviceIds.map(id => {\n const device = devices[id];\n if (device.auth_sets && device.auth_sets.length !== 1) {\n return Promise.reject();\n }\n // api call device.id and device.authsets[0].id\n return dispatch(updateDeviceAuth({ authId: device.auth_sets![0].id!, deviceId: device.id, status }))\n .unwrap()\n .catch(err => commonErrorHandler(err, 'The action was stopped as there was a problem updating a device authorization status: ', dispatch, '', false));\n });\n return Promise.allSettled(deviceAuthUpdates).then(results => {\n const { skipped, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n accu.skipped = accu.skipped + 1;\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n }\n);\n\nexport const deleteAuthset = createAppAsyncThunk(\n `${sliceName}/deleteAuthset`,\n ({ deviceId, authId }: { authId: string; deviceId: string }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}`)\n .then(() => Promise.all([dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const preauthDevice = createAppAsyncThunk(`${sliceName}/preauthDevice`, (authset: PreAuthSet, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Device was successfully added to the preauthorization list', autoHideDuration: TIMEOUTS.fiveSeconds })))\n )\n .catch(err => {\n if (err.response.status === 409) {\n return rejectWithValue('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n);\n\nexport const decommissionDevice = createAppAsyncThunk(\n `${sliceName}/decommissionDevice`,\n ({ deviceId, authId }: { authId?: string; deviceId: string }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}`)\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was decommissioned successfully'))))\n .catch(err => commonErrorHandler(err, 'There was a problem decommissioning the device:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n // trigger reset of device list list!\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const getDeviceConfig = createAppAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId: string, { dispatch }) =>\n GeneralApi.get<DeviceConfiguration>(`${deviceConfig}/${deviceId}`)\n .then(({ data }) => Promise.all([dispatch(actions.receivedDevice({ id: deviceId, config: data })), Promise.resolve(data)]))\n .catch(err => {\n // if we get a proper error response we most likely queried a device without an existing config check-in and we can just ignore the call\n if (err.response?.data?.error.status_code !== 404) {\n return commonErrorHandler(err, `There was an error retrieving the configuration for device ${deviceId}.`, dispatch, commonErrorFallback);\n }\n })\n);\n\nexport const setDeviceConfig = createAppAsyncThunk(\n `${sliceName}/setDeviceConfig`,\n ({ deviceId, config }: { config: ManagementApiConfiguration; deviceId: string }, { dispatch }) =>\n GeneralApi.put(`${deviceConfig}/${deviceId}`, config)\n .catch(err => commonErrorHandler(err, `There was an error setting the configuration for device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(getDeviceConfig(deviceId))))\n);\ntype ApplyDeviceConfigPayload = {\n config: DeviceConfiguration;\n configDeploymentConfiguration: NewConfigurationDeployment;\n deviceId: string;\n isDefault: boolean;\n};\nexport const applyDeviceConfig = createAppAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }: ApplyDeviceConfigPayload, { dispatch, getState }) =>\n GeneralApi.post(`${deviceConfig}/${deviceId}/deploy`, configDeploymentConfiguration)\n .catch(err => commonErrorHandler(err, `There was an error deploying the configuration to device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { canManageUsers } = getUserCapabilities(getState());\n const tasks: ReturnType<AppDispatch>[] = [\n dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id } })),\n new Promise(resolve => setTimeout(() => resolve(dispatch(getSingleDeployment(data.deployment_id))), TIMEOUTS.oneSecond))\n ];\n if (isDefault && canManageUsers) {\n const { previous } = getGlobalSettings(getState()).defaultDeviceConfig ?? {};\n tasks.push(dispatch(saveGlobalSettings({ defaultDeviceConfig: { current: config, previous } })));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const setDeviceTags = createAppAsyncThunk(\n `${sliceName}/setDeviceTags`,\n ({ deviceId, tags }: { deviceId: string; tags: Record<string, string> }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n dispatch(getDeviceById(deviceId))\n .unwrap()\n .then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n const tagList = Object.entries(tags).map(([name, value]) => ({ name, value }));\n const isNameChange = tagList.some(({ name }) => name === 'name');\n return GeneralApi.put(`${inventoryApiUrl}/devices/${deviceId}/tags`, tagList, { headers })\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })),\n dispatch(setSnackbar(`Device ${tagList.length === 1 && isNameChange ? 'name' : 'tags'} changed`))\n ])\n );\n })\n);\n\ntype DeviceTwinPayload = { deviceId: string; integration: Integration };\nexport const getDeviceTwin = createAppAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }: DeviceTwinPayload, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get<DeviceState>(`${iotManagerBaseURL}/devices/${deviceId}/state`)\n .then(({ data }) => {\n providerResult = { ...data, twinError: '' };\n })\n .catch(err => {\n providerResult = {\n twinError: `There was an error getting the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}. ${err}`\n };\n })\n .finally(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...device.twinsByIntegration, ...providerResult } })));\n });\n});\n\ntype SetDeviceTwinPayload = { deviceId: string; integration: Integration; settings: any };\nexport const setDeviceTwin = createAppAsyncThunk(\n `${sliceName}/setDeviceTwin`,\n ({ deviceId, integration, settings }: SetDeviceTwinPayload, { dispatch, getState }) =>\n GeneralApi.put(`${iotManagerBaseURL}/devices/${deviceId}/state/${integration.id}`, { desired: settings })\n .catch(err =>\n commonErrorHandler(\n err,\n `There was an error updating the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}.`,\n dispatch\n )\n )\n .then(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { twinsByIntegration = {} } = device;\n const { [integration.id!]: currentState = {} } = twinsByIntegration;\n return Promise.resolve(\n dispatch(\n actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id!]: { ...currentState, desired: settings } } })\n )\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }: { filters?: DeviceFilter[]; group?: string; state: RootState; status?: string }) => {\n const { filterTerms } = convertDeviceListStateToFilters({ filters, group, offlineThreshold: state.app.offlineThreshold, selectedIssues: [], status });\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = [...defaultAttributes, getIdAttribute(state), ...selectedAttributes];\n return { attributes, filterTerms };\n};\ntype GetSystemDevicesPayload = { id: string; page?: number; perPage?: number; sortOptions: SortCriteria[] };\nexport const getSystemDevices = createAppAsyncThunk(`${sliceName}/getSystemDevices`, (options: GetSystemDevicesPayload, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage, sortOptions = [] } = options;\n const state = getState();\n const { hasFullFiltering } = getTenantCapabilities(state);\n if (!hasFullFiltering) {\n return Promise.resolve();\n }\n const { attributes: deviceAttributes = {} } = getDeviceByIdSelector(state, id);\n const { mender_gateway_system_id = '' } = deviceAttributes as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\n { ...emptyFilter, key: 'mender_is_gateway', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .catch(err => commonErrorHandler(err, `There was an error getting system devices device ${id}.`, dispatch, 'Please check your connection.'))\n .then(({ data, headers }) => {\n const state = getState();\n const { devicesById, ids } = reduceReceivedDevices(data, [], state);\n const device = {\n ...getDeviceByIdSelector(state, id),\n systemDeviceIds: ids,\n systemDeviceTotal: Number(headers[headerNames.total])\n };\n return Promise.resolve(dispatch(actions.receivedDevices({ ...devicesById, [id]: device })));\n });\n});\n\nexport const getGatewayDevices = createAppAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId: string, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes as { mender_gateway_system_id?: string };\n const filters = [\n { ...emptyFilter, key: 'id', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: deviceId, scope: 'identity' },\n { ...emptyFilter, key: 'mender_is_gateway', value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes: attributeSelection, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: attributeSelection\n }).then(({ data }) => {\n const { ids } = reduceReceivedDevices(data, [], getState());\n const tasks: ReturnType<AppDispatch> = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids })));\n return Promise.all(tasks);\n });\n});\n","// Copyright 2021 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DeviceFilter } from '@/src/devicesSlice';\nimport type { Alert } from '@northern.tech/types/MenderTypes';\n\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport Api from '../api/general-api';\nimport type { AlertChannelKey, DeviceIssueOptionKey } from '../constants';\nimport { DEVICE_LIST_DEFAULTS, TIMEOUTS, alertChannels, headerNames, monitorApiUrlv1 } from '../constants';\nimport { getDeviceFilters, getSearchEndpoint } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { convertDeviceListStateToFilters } from '../utils';\n\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst cutoffLength = 75;\nconst ellipsis = '...';\nconst longTextTrimmer = (text: string): string =>\n text.length >= cutoffLength + ellipsis.length ? `${text.substring(0, cutoffLength + ellipsis.length)}${ellipsis}` : text;\n\nconst sanitizeDeviceAlerts = (alerts: Alert[]) => alerts.map(alert => ({ ...alert, fullName: alert.name, name: longTextTrimmer(alert.name || '') }));\n\ninterface GetDeviceAlertsPayload {\n config?: { issuedAfter?: string; issuedBefore?: string; page?: number; perPage?: number; sortAscending?: boolean };\n id: string;\n}\nexport const getDeviceAlerts = createAppAsyncThunk(`${sliceName}/getDeviceAlerts`, ({ id, config = {} }: GetDeviceAlertsPayload, { dispatch }) => {\n const { page = defaultPage, perPage = defaultPerPage, issuedBefore, issuedAfter, sortAscending = false } = config;\n const issued_after = issuedAfter ? `&issued_after=${issuedAfter}` : '';\n const issued_before = issuedBefore ? `&issued_before=${issuedBefore}` : '';\n return Api.get<Alert[]>(\n `${monitorApiUrlv1}/devices/${id}/alerts?page=${page}&per_page=${perPage}${issued_after}${issued_before}&sort_ascending=${sortAscending}`\n )\n .catch(err => commonErrorHandler(err, `Retrieving device alerts for device ${id} failed:`, dispatch))\n .then(res =>\n Promise.all([\n dispatch(actions.receiveDeviceAlerts({ deviceId: id, alerts: sanitizeDeviceAlerts(res.data) })),\n dispatch(actions.setAlertListState({ total: Number(res.headers[headerNames.total]) }))\n ])\n );\n});\n\ninterface GetLatestDeviceAlertsPayload {\n config?: { page?: number; perPage?: number };\n id: string;\n}\nexport const getLatestDeviceAlerts = createAppAsyncThunk(\n `${sliceName}/getLatestDeviceAlerts`,\n ({ id, config = {} }: GetLatestDeviceAlertsPayload, { dispatch }) => {\n const { page = defaultPage, perPage = 10 } = config;\n return Api.get<Alert[]>(`${monitorApiUrlv1}/devices/${id}/alerts/latest?page=${page}&per_page=${perPage}`)\n .catch(err => commonErrorHandler(err, `Retrieving device alerts for device ${id} failed:`, dispatch))\n .then(res => Promise.resolve(dispatch(actions.receiveLatestDeviceAlerts({ deviceId: id, alerts: sanitizeDeviceAlerts(res.data) }))));\n }\n);\n\ninterface GetIssueCountsByTypePayload {\n options?: Partial<{ filters: DeviceFilter[]; group: string; status: string; type: string }>;\n type: DeviceIssueOptionKey;\n}\nexport const getIssueCountsByType = createAppAsyncThunk(\n `${sliceName}/getIssueCountsByType`,\n ({ type, options = {} }: GetIssueCountsByTypePayload, { dispatch, getState }) => {\n const state = getState();\n const { filters = getDeviceFilters(state), group, status, ...remainder } = options;\n const { applicableFilters: nonMonitorFilters, filterTerms } = convertDeviceListStateToFilters({\n ...remainder,\n filters,\n group,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues: [type],\n status\n });\n return Api.post(getSearchEndpoint(getState()), {\n page: 1,\n per_page: 1,\n filters: filterTerms,\n attributes: [{ scope: 'identity', attribute: 'status' }]\n })\n .catch(err => commonErrorHandler(err, `Retrieving issue counts failed:`, dispatch, commonErrorFallback))\n .then(res => {\n const total = nonMonitorFilters.length ? state.monitor.issueCounts.byType[type].total : Number(res.headers[headerNames.total]);\n const filtered = nonMonitorFilters.length ? Number(res.headers[headerNames.total]) : total;\n if (total === state.monitor.issueCounts.byType[type].total && filtered === state.monitor.issueCounts.byType[type].filtered) {\n return Promise.resolve();\n }\n return Promise.resolve(dispatch(actions.receiveDeviceIssueCounts({ counts: { filtered, total }, issueType: type }))) as ReturnType<AppDispatch>;\n });\n }\n);\n\nexport const getDeviceMonitorConfig = createAppAsyncThunk(`${sliceName}/getDeviceMonitorConfig`, (id: string, { dispatch }) =>\n Api.get(`${monitorApiUrlv1}/devices/${id}/config`)\n .catch(err => commonErrorHandler(err, `Retrieving device monitor config for device ${id} failed:`, dispatch))\n .then(({ data }) => Promise.all([dispatch(storeActions.receivedDevice({ id, monitors: data }), Promise.resolve(data))]))\n);\n\ninterface ChangeNotificationSettingPayload {\n channel?: AlertChannelKey;\n enabled: boolean;\n}\nexport const changeNotificationSetting = createAppAsyncThunk(\n `${sliceName}/changeNotificationSetting`,\n ({ enabled, channel = alertChannels.email as AlertChannelKey }: ChangeNotificationSettingPayload, { dispatch }) =>\n Api.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled })\n .catch(err => commonErrorHandler(err, `${enabled ? 'En' : 'Dis'}abling ${channel} alerts failed:`, dispatch))\n .then(() =>\n Promise.all([\n dispatch(actions.changeAlertChannel({ channel, enabled })),\n dispatch(\n storeActions.setSnackbar({ message: `Successfully ${enabled ? 'en' : 'dis'}abled ${channel} alerts`, autoHideDuration: TIMEOUTS.fiveSeconds })\n )\n ])\n )\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,IAAAC,mBAA8D;AAC9D,wBAAoC;AACpC,IAAAC,gBAAkB;AAClB,iBAAuB;AACvB,IAAAC,2BAAoB;;;ACHpB,qBAA4B;;;ACD5B,IAAAC,oBA8CO;;;AC/CP,4BAA0E;AAE1E,mBAA+B;AAExB,IAAM,aAAa;AAAA,EACxB,KAAK,EAAE,KAAK,OAAO,MAAM,sBAAAC,SAAa;AAAA,EACtC,KAAK,EAAE,KAAK,OAAO,MAAM,sBAAAC,gBAAa;AACxC;AACO,IAAM,sBAAsB,EAAE,UAAU,IAAI,OAAO,IAAI,WAAW,WAAW,IAAI,KAAK,WAAW,gBAAgB;AACjH,IAAM,oBAAoB;AAC1B,IAAM,iBAAiB,CAAC,EAAE,GAAG,qBAAqB,OAAO,MAAM,WAAW,iBAAiB,MAAM,kBAAkB,CAAC;AAmBpH,IAAM,QAA2C;AAAA,EACtD,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,YAAY;AAAA,IACV,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AACF;AAYO,IAAM,SAA6C;AAAA,EACxD,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO,CAAC,iBAAiB;AAAA,IACzB,UAAU,CAAC,MAAM,gBAAgB,YAAY;AAAA,EAC/C;AAAA,EACA,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO,CAAC,YAAY;AAAA,IACpB,UAAU,CAAC,gBAAgB,YAAY;AAAA,EACzC;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,OAAO,CAAC,kBAAkB;AAAA,IAC1B,UAAU,CAAC,MAAM,gBAAgB,YAAY;AAAA,EAC/C;AACF;AAEO,IAAM,WAAW;AAAA,EACtB,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,cAAc,MAAM,WAAW;AAAA,EACjC;AAAA,EACA,WAAW,EAAE,IAAI,aAAa,SAAS,qEAAqE,cAAc,MAAM,WAAW,GAAG;AAAA,EAC9I,iBAAiB;AAAA,IACf,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,cAAc,MAAM,WAAW;AAAA,EACjC;AAAA,EACA,qBAAqB,EAAE,IAAI,uBAAuB,SAAS,iCAAiC,eAAe,OAAO,UAAU,GAAG;AAAA,EAC/H,eAAe,EAAE,IAAI,iBAAiB,SAAS,8BAA8B,eAAe,OAAO,QAAQ,IAAI,cAAc,MAAM,aAAa,GAAG;AAAA,EACnJ,oBAAoB,EAAE,IAAI,sBAAsB,SAAS,mCAAmC,eAAe,OAAO,aAAa,GAAG;AAAA,EAClI,eAAe,EAAE,IAAI,iBAAiB,SAAS,mDAAmD,cAAc,MAAM,WAAW,GAAG;AAAA,EACpI,eAAe,EAAE,IAAI,iBAAiB,SAAS,mEAAmE,cAAc,MAAM,aAAa,GAAG;AAAA,EACtJ,SAAS,EAAE,IAAI,WAAW,SAAS,gEAAgE,eAAe,MAAM,aAAa,GAAG;AAAA,EACxI,mBAAmB;AAAA,IACjB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,cAAc,MAAM,WAAW;AAAA,EACjC;AAAA,EACA,mBAAmB,EAAE,IAAI,qBAAqB,SAAS,qDAAqD,cAAc,MAAM,WAAW,GAAG;AAAA,EAC9I,MAAM,EAAE,IAAI,QAAQ,SAAS,sCAAsC,cAAc,MAAM,WAAW,GAAG;AAAA,EACrG,kBAAkB,EAAE,IAAI,oBAAoB,SAAS,gDAAgD,cAAc,MAAM,aAAa,GAAG;AAAA,EACzI,sBAAsB;AAAA,IACpB,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,cAAc,MAAM,aAAa;AAAA,EACnC;AAAA,EACA,eAAe;AAAA,IACb,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,cAAc,MAAM,aAAa;AAAA,EACnC;AAAA,EAEA,SAAS,EAAE,IAAI,WAAW,SAAS,+BAA+B,cAAc,MAAM,WAAW,GAAG;AACtG;AAKO,IAAM,YAAY;;;AC7HzB,gBAA0D;AAwD1C;AAlDT,IAAM,YAAY;AAAA,EACvB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,kBAAkB,EAAE,IAAI,mBAAmB,MAAM,aAAa;AAEpE,IAAM,6BAA6B;AAI1C,IAAM,YAAY;AACX,IAAM,WAAW;AAAA,EACtB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa,MAAM;AAAA,EACnB;AAAA,EACA,YAAY,IAAI;AAAA,EAChB,cAAc,IAAI;AAAA,EAClB,aAAa,IAAI;AAAA,EACjB,gBAAgB,KAAK;AAAA,EACrB,aAAa,KAAK;AACpB;AAEO,IAAM,uBAAuB,EAAE,UAAU,GAAG,cAAc,UAAU,KAAK;AAMzE,IAAM,qBAA4C,OAAO,OAAO,EAAE,WAAW,MAAM,OAAO,mCAAiB,SAAS,CAAC;AAErH,IAAM,eAAe,CAAC,SAAS,YAAY,QAAQ;AAEnD,IAAM,kBAAkB;AAAA,EAC7B,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AACO,IAAM,oBAAoB;AAAA,EAC/B,YAAY;AAAA,IACV,iBAAiB,gBAAgB;AAAA,IACjC,MAAM,UAAAC;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY,2EAAE,oGAAsF;AAAA,EACtG;AAAA,EACA,WAAW;AAAA,IACT,iBAAiB,gBAAgB;AAAA,IACjC,MAAM,UAAAC;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YACE,6CAAC,UAAK;AAAA;AAAA,MACwI;AAAA,MAE1I;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAO;AAAA,UACP,KAAI;AAAA,UACL;AAAA;AAAA,MAED;AAAA,MACD;AAAA,OAEH;AAAA,EAEJ;AAAA,EACA,SAAS;AAAA,IACP,iBAAiB,gBAAgB;AAAA,IACjC,YAAY;AAAA,IACZ,WAAW;AAAA;AAAA,IAEX,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAMO,IAAM,eAAwB;AAAA,EACnC,aAAa;AAAA,EACb,UAAU;AAAA,EACV,aAAa;AAAA,IACX,MAAM,kBAAkB,QAAQ;AAAA,IAChC,CAAC,kBAAkB,QAAQ,eAAe,GAAG;AAAA,MAC3C,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA,EACF;AACF;AAMO,IAAM,gBAAgB;AAC7B,IAAM,cAAc,IAAI,KAAK,aAAa,CAAC,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC7D,IAAM,YAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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","names":["getGlobalSettings","getUserSettings","import_helpers","import_dayjs","import_universal_cookie","import_constants","BarChartIcon","PieChartIcon","AWS","Azure","rolesById","import_toolkit","sliceName","initialState","progress","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","actions","import_universal_cookie","Cookies","cookies","Cookies","axios","progress","import_axios","Api","axios","import_helpers","import_toolkit","import_helpers","import_toolkit","import_toolkit","accu","import_helpers","import_toolkit","accu","import_toolkit","import_toolkit","import_helpers","uploadProgress","import_toolkit","rolesById","rolesById","progress","getDemoDeviceAddressHelper","dayjs","import_helpers","import_toolkit","actions","import_helpers","import_universal_cookie","cookies","Cookies","sliceName","actions","import_helpers","validator","setSnackbar","getDeploymentsByStatus","sliceName","actions","Tracking","getDeviceById","import_helpers","import_axios","import_jsx_runtime","setSnackbar","uploadProgress","defaultPage","defaultPerPage","getGroups","sliceName","actions","getDevicesByStatus","pluralize","getDeviceById","getDeviceLimits","state","uuid","deviceId","defaultPage","defaultPerPage","sliceName","actions","getIssueCountsByType","cookies","Cookies","setSnackbar","permission","scope","rolesById","accu","permissionSet","getGlobalSettings","getUserSettings","dayjs","hashString"]}
1
+ {"version":3,"sources":["../../src/usersSlice/thunks.ts","../../src/usersSlice/index.ts","../../src/constants.ts","../../src/appSlice/constants.ts","../../src/commonConstants.tsx","../../src/deploymentsSlice/constants.ts","../../src/devicesSlice/constants.ts","../../src/onboardingSlice/constants.ts","../../src/organizationSlice/constants.ts","../../src/releasesSlice/constants.ts","../../src/usersSlice/constants.ts","../../src/appSlice/index.ts","../../src/deploymentsSlice/index.ts","../../src/devicesSlice/index.ts","../../src/monitorSlice/index.ts","../../src/onboardingSlice/index.ts","../../src/organizationSlice/index.ts","../../src/releasesSlice/index.ts","../../src/actions.ts","../../src/api/general-api.ts","../../src/auth.ts","../../src/api/users-api.ts","../../src/appSlice/selectors.ts","../../src/commonSelectors.ts","../../src/deploymentsSlice/selectors.ts","../../src/devicesSlice/selectors.ts","../../src/monitorSlice/selectors.ts","../../src/onboardingSlice/selectors.ts","../../src/organizationSlice/selectors.ts","../../src/releasesSlice/selectors.ts","../../src/utils.ts","../../src/usersSlice/selectors.ts","../../src/store.ts","../../src/appSlice/thunks.ts","../../src/deploymentsSlice/thunks.ts","../../src/devicesSlice/thunks.tsx","../../src/monitorSlice/thunks.ts"],"sourcesContent":["// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { PermissionSetWithScope, PersonalAccessToken, RolePermission, RolePermissionObject } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, extractErrorMessage, isEmpty } from '@northern.tech/utils/helpers';\nimport { clearAllRetryTimers } from '@northern.tech/utils/retrytimer';\nimport dayjs from 'dayjs';\nimport hashString from 'md5';\nimport Cookies from 'universal-cookie';\n\nimport type { CustomColumn, GlobalSettings, User, UserSettings } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport UsersApi from '../api/users-api';\nimport { cleanUp, getSessionInfo, setSessionInfo } from '../auth';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReadState,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '../constants';\nimport {\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n PermissionTypes,\n SSO_TYPES,\n TIMEOUTS,\n apiRoot,\n defaultPermissionSets,\n rolesById as defaultRolesById,\n emptyRole,\n emptyUiPermissions,\n maxSessionAge,\n scopedPermissionAreas,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv2\n} from '../constants';\nimport { getHostedAnnouncement, getOnboardingState, getOrganization, getTooltipsState, getUserSettings as getUserSettingsSelector } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { setOfflineThreshold } from '../thunks';\nimport { mergePermissions } from '../utils';\nimport { OWN_USER_ID, READ_STATES, USER_LOGOUT, itemUiPermissionsReducer, settingsKeys } from './constants';\nimport { getCurrentUser, getRolesById, getUsersById } from './selectors';\n\nconst cookies = new Cookies();\n\nconst { setAnnouncement, setSnackbar } = storeActions;\n\ntype ThunkPermissionSet = Record<string, PermissionSet>;\ntype CombinedPermissions = Record<string, UiPermissionsByIdKey[]>;\ntype TransformedAreaRoles = { name: PermissionSetId; scope?: { type?: string; value: string[] } }[];\n\ntype SubmittedRoleUiPermissions = {\n auditlog: AuditLogPermission[];\n deployments: DeploymentPermission[];\n groups: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: GroupsPermission[] }[];\n releases: { disableEdit?: boolean; item: string; notFound?: boolean; uiPermissions: ReleasesPermission[] }[];\n tenantManagement?: UserManagementPermission[];\n userManagement: UserManagementPermission[];\n};\nexport type SubmittedRole = {\n allowUserManagement?: boolean;\n description?: string;\n name: string;\n source?: Omit<SubmittedRole, 'source'>;\n uiPermissions: Partial<SubmittedRoleUiPermissions>;\n};\n\nconst handleLoginError =\n (err: Error, { token2fa: has2FA, password }: { password?: string; token2fa?: string }, rejectWithValue) =>\n () => {\n const errorText = extractErrorMessage(err);\n const is2FABackend = errorText.includes('2fa');\n if (is2FABackend && !has2FA) {\n return rejectWithValue({ error: '2fa code missing' });\n }\n if (password === undefined) {\n // Enterprise supports two-steps login. On the first step you can enter only email\n // and in case of SSO set up you will receive a redirect URL\n // otherwise you will receive 401 status code and password field will be shown.\n return Promise.reject();\n }\n const twoFAError = is2FABackend ? ' and verification code' : '';\n const errorMessage = `There was a problem logging in. Please check your email${\n twoFAError ? ',' : ' and'\n } password${twoFAError}. If you still have problems, contact an administrator.`;\n return rejectWithValue({ error: errorMessage });\n };\n\n/*\n User management\n*/\ninterface LoginUserPayload {\n email: string;\n password?: string;\n stayLoggedIn?: boolean;\n token2fa?: string;\n}\n\nexport const loginUser = createAppAsyncThunk(`${sliceName}/loginUser`, ({ stayLoggedIn, ...userData }: LoginUserPayload, { dispatch, rejectWithValue }) =>\n UsersApi.postLogin(`${useradmApiUrl}/auth/login`, { ...userData, no_expiry: stayLoggedIn })\n .catch(err => {\n cleanUp();\n return Promise.reject(dispatch(handleLoginError(err, userData, rejectWithValue)));\n })\n .then(({ text: token, contentType }) => {\n // If the content type is application/json then backend returned SSO configuration.\n // user should be redirected to the start sso url to finish login process.\n if (contentType.includes(APPLICATION_JSON_CONTENT_TYPE)) {\n const { id, kind } = token;\n const type = kind.split('/')[1];\n const ssoLoginUrl = SSO_TYPES[type].getStartUrl(id);\n window.location.replace(ssoLoginUrl);\n return;\n }\n\n if (contentType !== APPLICATION_JWT_CONTENT_TYPE || !token) {\n return;\n }\n // save token to local storage & set maxAge if noexpiry checkbox not checked\n const now = new Date();\n now.setSeconds(now.getSeconds() + maxSessionAge);\n const expiresAt = stayLoggedIn ? undefined : now.toISOString();\n setSessionInfo({ token, expiresAt });\n cookies.remove('JWT', { path: '/' });\n return dispatch(getUser(OWN_USER_ID))\n .unwrap()\n .catch(e => {\n cleanUp();\n return Promise.reject(dispatch(setSnackbar(extractErrorMessage(e))));\n })\n .then(() => {\n window.sessionStorage.removeItem('pendings-redirect');\n if (window.location.pathname !== '/ui/') {\n window.location.replace('/ui/');\n }\n return Promise.resolve(dispatch(actions.successfullyLoggedIn({ expiresAt, token })));\n });\n })\n);\n\nexport const logoutUser = createAppAsyncThunk(`${sliceName}/logoutUser`, (_, { dispatch, getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.post(`${useradmApiUrl}/auth/logout`).finally(() => {\n cleanUp();\n clearAllRetryTimers(setSnackbar);\n return Promise.resolve(dispatch({ type: USER_LOGOUT }));\n });\n});\n\nexport const switchUserOrganization = createAppAsyncThunk(`${sliceName}/switchUserOrganization`, (tenantId: string, { getState }) => {\n if (Object.keys(getState().app.uploadsById).length) {\n return Promise.reject();\n }\n return GeneralApi.get<string>(`${useradmApiUrl}/users/tenants/${tenantId}/token`).then(({ data: token }) => {\n window.sessionStorage.setItem('tenantChanged', 'true');\n setSessionInfo({ ...getSessionInfo(), token });\n window.location.reload();\n });\n});\n\nexport const passwordResetStart = createAppAsyncThunk(`${sliceName}/passwordResetStart`, (email: string, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/start`, { email }).catch(err =>\n commonErrorHandler(err, `The password reset request cannot be processed:`, dispatch, undefined, true)\n )\n);\n\ninterface PasswordResetPayload {\n newPassword: string;\n secretHash: string;\n}\nexport const passwordResetComplete = createAppAsyncThunk(\n `${sliceName}/passwordResetComplete`,\n ({ secretHash, newPassword }: PasswordResetPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/password-reset/complete`, { secret_hash: secretHash, password: newPassword }).catch((err = {}) => {\n const { error, response = {} } = err;\n let errorMsg = '';\n if (response.status == 400) {\n errorMsg = 'the link you are using expired or the request is not valid, please try again.';\n } else {\n errorMsg = error;\n }\n dispatch(setSnackbar('The password reset request cannot be processed: ' + errorMsg));\n return Promise.reject(err);\n })\n);\n\nexport const verifyEmailStart = createAppAsyncThunk(`${sliceName}/verifyEmailStart`, (_, { dispatch, getState }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/start`, { email: getCurrentUser(getState()).email })\n .catch(err => commonErrorHandler(err, 'An error occured starting the email verification process:', dispatch))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verifyEmailComplete = createAppAsyncThunk(`${sliceName}/verifyEmailComplete`, (secret_hash: string, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${useradmApiUrl}/auth/verify-email/complete`, { secret_hash })\n .catch(err => rejectWithValue({ status: err.response?.status, data: err.response?.data }))\n .finally(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n);\n\nexport const verify2FA = createAppAsyncThunk(`${sliceName}/verify2FA`, (tfaData: { token2fa: string }, { dispatch }) =>\n UsersApi.putVerifyTFA(`${useradmApiUrl}/2faverify`, tfaData)\n .then(() => Promise.resolve(dispatch(getUser(OWN_USER_ID))))\n .catch(err =>\n commonErrorHandler(err, 'An error occured validating the verification code: failed to verify token, please try again.', dispatch, undefined, true)\n )\n);\n\nexport const getUserList = createAppAsyncThunk(`${sliceName}/getUserList`, (_, { dispatch, getState }) =>\n GeneralApi.get<User[]>(`${useradmApiUrl}/users`)\n .then(res => {\n const currentUsersById = getUsersById(getState());\n const users = res.data.reduce(\n (accu, item) => {\n accu[item.id] = {\n ...accu[item.id],\n ...item\n };\n return accu;\n },\n { ...currentUsersById }\n );\n return dispatch(actions.receivedUserList(users));\n })\n .catch(err => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))\n);\n\nexport const getUser = createAppAsyncThunk(`${sliceName}/getUser`, (id: string, { dispatch, rejectWithValue }) =>\n GeneralApi.get<User>(`${useradmApiUrl}/users/${id}`)\n .then(({ data: user }) =>\n Promise.all([\n dispatch(actions.receivedUser(user)),\n dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),\n dispatch(updateUserColumnSettings({ currentUserId: user.id })),\n user\n ])\n )\n .catch(e => rejectWithValue(e))\n);\n\nexport const initializeSelf = createAppAsyncThunk(`${sliceName}/initializeSelf`, (_, { dispatch }) => dispatch(getUser(OWN_USER_ID)));\n\ninterface UpdateColumnSettingsPayload {\n columns?: CustomColumn[];\n currentUserId?: string;\n}\n\nexport const updateUserColumnSettings = createAppAsyncThunk(\n `${sliceName}/updateUserColumnSettings`,\n ({ columns, currentUserId }: UpdateColumnSettingsPayload, { dispatch, getState }) => {\n const userId = currentUserId ?? getCurrentUser(getState()).id;\n const storageKey = `${userId}-column-widths`;\n let customColumns: CustomColumn[] = [];\n if (!columns) {\n try {\n customColumns = JSON.parse(window.localStorage.getItem(storageKey) || '') || customColumns;\n } catch {\n // most likely the column info doesn't exist yet or is lost - continue\n }\n } else {\n customColumns = columns;\n }\n window.localStorage.setItem(storageKey, JSON.stringify(customColumns));\n return Promise.resolve(dispatch(actions.setCustomColumns(customColumns)));\n }\n);\n\nconst userActions = {\n add: {\n successMessage: 'The user was added successfully.',\n errorMessage: 'adding'\n },\n create: {\n successMessage: 'The user was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The user has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The user was removed from the system.',\n errorMessage: 'removing'\n }\n} as const;\n\nconst userActionErrorHandler = (err: Error, type: keyof typeof userActions, dispatch: AppDispatch) =>\n commonErrorHandler(err, `There was an error ${userActions[type].errorMessage} the user.`, dispatch);\n\ninterface CreateUserPayload {\n email: string;\n password: string;\n shouldResetPassword?: boolean;\n sso?: boolean;\n}\n\nexport const createUser = createAppAsyncThunk(`${sliceName}/createUser`, ({ shouldResetPassword, ...userData }: CreateUserPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users`, { ...userData, send_reset_password: shouldResetPassword })\n .then(() => Promise.all([dispatch(getUserList()), dispatch(setSnackbar(userActions.create.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'create', dispatch))\n);\n\nexport const removeUser = createAppAsyncThunk(`${sliceName}/removeUser`, (userId: string, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/users/${userId}`)\n .then(() => Promise.all([dispatch(actions.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar(userActions.remove.successMessage))]))\n .catch(err => userActionErrorHandler(err, 'remove', dispatch))\n);\n\ninterface EditUserPayload {\n current_password: string;\n email: string;\n id: string;\n password: string;\n roles?: string[];\n}\n\nexport const editUser = createAppAsyncThunk(`${sliceName}/editUser`, ({ id, ...userData }: EditUserPayload, { dispatch, getState }) =>\n GeneralApi.put(`${useradmApiUrl}/users/${id}`, userData)\n .then(() =>\n Promise.all([\n dispatch(actions.updatedUser({ ...userData, id: id === OWN_USER_ID ? getCurrentUser(getState()).id : id })),\n dispatch(setSnackbar(userActions.edit.successMessage))\n ])\n )\n .catch(err => userActionErrorHandler(err, 'edit', dispatch))\n);\n\nexport const checkEmailExists = createAppAsyncThunk(`${sliceName}/checkEmailExists`, async (email: string) => {\n const response = await GeneralApi.get(`${useradmApiUrl}/users/exists?email=${encodeURIComponent(email)}`);\n return response.data.exists;\n});\n\nexport const addUserToCurrentTenant = createAppAsyncThunk(`${sliceName}/addUserToTenant`, (userId: string, { dispatch, getState }) => {\n const { id } = getOrganization(getState());\n return GeneralApi.post(`${useradmApiUrl}/users/${userId}/assign`, { tenant_ids: [id] })\n .catch(err => commonErrorHandler(err, `There was an error adding the user to your organization:`, dispatch))\n .then(() => Promise.all([dispatch(setSnackbar(userActions.add.successMessage)), dispatch(getUserList())]));\n});\n\nexport const enableUser2fa = createAppAsyncThunk(`${sliceName}/enableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/enable`)\n .catch(err => commonErrorHandler(err, `There was an error enabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.resolve(dispatch(getUser(userId))))\n);\n\nexport const disableUser2fa = createAppAsyncThunk(`${sliceName}/disableUser2fa`, (userId: string = OWN_USER_ID, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/users/${userId}/2fa/disable`)\n .catch(err => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch))\n .then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions.receivedQrCode(null))]))\n);\n\n/* RBAC related things follow: */\nconst mapHttpPermission = (permission: RolePermissionObject) =>\n Object.entries(uiPermissionsByArea).reduce(\n (accu, [area, definition]) => {\n const endpointMatches = definition.endpoints.filter(\n endpoint => endpoint.path.test(permission.value) && (endpoint.types.includes(permission.type) || permission.type === PermissionTypes.Any)\n );\n if (permission.value === PermissionTypes.Any || (permission.value.includes(apiRoot) && endpointMatches.length)) {\n const endpointUiPermission = endpointMatches.reduce<PermissionObject[]>((endpointAccu, endpoint) => [...endpointAccu, ...endpoint.uiPermissions], []);\n const collector = (endpointUiPermission || definition.uiPermissions)\n .reduce((permissionsAccu: AnyPermission[], uiPermission) => {\n if (permission.type === PermissionTypes.Any || (!endpointMatches.length && uiPermission.verbs.some(verb => verb === permission.type))) {\n permissionsAccu.push(uiPermission.value);\n }\n return permissionsAccu;\n }, [])\n .filter(duplicateFilter);\n if (Array.isArray(accu[area])) {\n accu[area] = [...accu[area], ...collector].filter(duplicateFilter);\n } else {\n accu[area] = mergePermissions(accu[area], { [scopedPermissionAreas[area].excessiveAccessSelector]: collector });\n }\n }\n return accu;\n },\n { ...emptyUiPermissions }\n );\n\nconst permissionActionTypes = {\n any: mapHttpPermission,\n CREATE_DEPLOYMENT: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n deployments: [uiPermissionsById.deploy.value],\n groups: { [permission.value]: [uiPermissionsById.deploy.value] }\n }\n : {},\n http: mapHttpPermission,\n REMOTE_TERMINAL: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.connect.value] }\n }\n : {},\n VIEW_DEVICE: (permission: RolePermissionObject) =>\n permission.type === PermissionTypes.DeviceGroup\n ? {\n groups: { [permission.value]: [uiPermissionsById.read.value] }\n }\n : {}\n};\n\nconst combinePermissions = (existingPermissions: CombinedPermissions, additionalPermissions: CombinedPermissions = {}): CombinedPermissions =>\n Object.entries(additionalPermissions).reduce((accu, [name, permissions]) => {\n const maybeExistingPermissions = accu[name] || [];\n accu[name] = [...permissions, ...maybeExistingPermissions].filter(duplicateFilter);\n return accu;\n }, existingPermissions);\n\nconst tryParseCustomPermission = (permission: RolePermission) => {\n const uiPermissions = permissionActionTypes[permission.action](permission.object);\n const result = mergePermissions({ ...emptyUiPermissions }, uiPermissions);\n return { isCustom: true, permission, result };\n};\n\nconst customPermissionHandler = (accu, permission: RolePermission) => {\n const processor = tryParseCustomPermission(permission);\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n};\n\nconst mapPermissionSet = (\n permissionSetName: PermissionSetId,\n names: string[],\n scope: UiPermissionsByAreaKey,\n existingGroupsPermissions: CombinedPermissions = {}\n): Record<string, AnyPermission[]> => {\n const permission = Object.values(uiPermissionsById).find(permission => permission.permissionSets[scope] === permissionSetName)?.value as UiPermissionsByIdKey;\n const scopedPermissions = names.reduce((accu, name) => combinePermissions(accu, { [name]: [permission] }), existingGroupsPermissions);\n return Object.entries(scopedPermissions).reduce((accu, [key, permissions]) => ({ ...accu, [key]: deriveImpliedAreaPermissions(scope, permissions) }), {});\n};\n\nconst isEmptyPermissionSet = (permissionSet: Partial<UiPermissionsDefinition>) =>\n !Object.values(permissionSet).reduce((accu, permissions) => {\n if (Array.isArray(permissions)) {\n return accu || !!permissions.length;\n }\n return accu || !isEmpty(permissions);\n }, false);\n\nconst parseRolePermissions = ({ permission_sets_with_scope = [], permissions = [] }: Role, permissionSets: Record<string, PermissionSet>) => {\n const preliminaryResult = permission_sets_with_scope.reduce(\n (accu, permissionSet) => {\n if (!permissionSet.name) {\n return accu;\n }\n const processor = permissionSets[permissionSet.name];\n if (!processor) {\n return accu;\n }\n const scope = Object.keys(scopedPermissionAreas).find(scope => uiPermissionsByArea[scope].scope === permissionSet.scope?.type) as UiPermissionsByAreaKey;\n if (scope) {\n const result = mapPermissionSet(\n permissionSet.name as PermissionSetId,\n permissionSet.scope?.value ?? [],\n scope,\n accu.uiPermissions[scope] as CombinedPermissions\n );\n return { ...accu, uiPermissions: { ...accu.uiPermissions, [scope]: result } };\n } else if (isEmptyPermissionSet(processor.result)) {\n return processor.permissions?.reduce(customPermissionHandler, accu);\n }\n return {\n ...accu,\n isCustom: accu.isCustom || processor.isCustom,\n uiPermissions: mergePermissions(accu.uiPermissions, processor.result)\n };\n },\n { isCustom: false, uiPermissions: { ...emptyUiPermissions, groups: {}, releases: {} } }\n );\n return permissions.reduce(customPermissionHandler, preliminaryResult);\n};\n\nexport const normalizeRbacRoles = (roles: Role[], rolesById: Record<string, Role>, permissionSets: ThunkPermissionSet) =>\n roles.reduce(\n (accu, role) => {\n let normalizedPermissions: UiPermissionsDefinition;\n let isCustom = false;\n if (rolesById[role.name]) {\n normalizedPermissions = {\n ...rolesById[role.name].uiPermissions,\n groups: { ...rolesById[role.name].uiPermissions.groups },\n releases: { ...rolesById[role.name].uiPermissions.releases }\n };\n } else {\n const result = parseRolePermissions(role, permissionSets);\n normalizedPermissions = result.uiPermissions;\n isCustom = result.isCustom;\n }\n\n const roleState = accu[role.name] ?? { ...emptyRole };\n accu[role.name] = {\n ...roleState,\n ...role,\n description: roleState.description ? roleState.description : role.description,\n editable: !defaultRolesById[role.name] && !isCustom && (typeof roleState.editable !== 'undefined' ? roleState.editable : true),\n isCustom,\n name: roleState.name ? roleState.name : role.name,\n uiPermissions: normalizedPermissions\n };\n return accu;\n },\n { ...rolesById }\n );\n\nexport const getPermissionSets = createAppAsyncThunk(`${sliceName}/getPermissionSets`, (_, { dispatch, getState }) =>\n GeneralApi.get<Omit<PermissionSet, 'result'>[]>(`${useradmApiUrlv2}/permission_sets?per_page=500`)\n .then(({ data }) => {\n const permissionSets = data.reduce(\n (accu, permissionSet) => {\n const permissionSetState = accu[permissionSet.name] ?? {};\n let permissionSetObject = { ...permissionSetState, ...permissionSet };\n permissionSetObject.result = Object.values<PermissionObject>(uiPermissionsById).reduce(\n (accu, item) =>\n Object.entries(item.permissionSets).reduce((collector, [area, permissionSet]) => {\n if (scopedPermissionAreas[area]) {\n return collector;\n }\n if (permissionSet === permissionSetObject.name) {\n collector[area] = [...collector[area], item.value].filter(duplicateFilter);\n }\n return collector;\n }, accu),\n { ...emptyUiPermissions, ...(permissionSetObject.result ?? {}) }\n );\n const scopes = Object.values(scopedPermissionAreas).reduce((accu: ScopedPermissionsByAreaKey[], { key, scopeType }) => {\n if (permissionSetObject.supported_scope_types?.includes(key) || permissionSetObject.supported_scope_types?.includes(scopeType)) {\n accu.push(key);\n }\n return accu;\n }, []);\n permissionSetObject = scopes.reduce<PermissionSet>((accu, scope) => {\n accu.result = {\n ...accu.result,\n [scope]: mapPermissionSet(permissionSetObject.name, [scopedPermissionAreas[scope].excessiveAccessSelector], scope) as Record<string, any[]>\n };\n return accu;\n }, permissionSetObject);\n accu[permissionSet.name] = permissionSetObject;\n return accu;\n },\n { ...getState().users.permissionSetsById }\n );\n return Promise.all([dispatch(actions.receivedPermissionSets(permissionSets)), permissionSets]) as ReturnType<AppDispatch>;\n })\n .catch(() => console.log('Permission set retrieval failed - likely accessing a non-RBAC backend'))\n);\n\nexport const getRoles = createAppAsyncThunk(`${sliceName}/getRoles`, (_, { dispatch, getState }) =>\n Promise.all([GeneralApi.get<Role[]>(`${useradmApiUrlv2}/roles?per_page=500`), dispatch(getPermissionSets())])\n .then(results => {\n if (!results) {\n return Promise.resolve() as any;\n }\n const [{ data: roles }, { payload: permissionSetTasks }] = results;\n const rolesById = normalizeRbacRoles(roles, getRolesById(getState()), permissionSetTasks[permissionSetTasks.length - 1] as ThunkPermissionSet);\n return Promise.resolve(dispatch(actions.receivedRoles(rolesById)));\n })\n .catch(() => console.log('Role retrieval failed - likely accessing a non-RBAC backend'))\n .finally(() => Promise.resolve(dispatch(actions.finishedRoleInitialization(true))))\n);\n\nconst deriveImpliedAreaPermissions = (\n area: UiPermissionsByAreaKey,\n areaPermissions: UiPermissionsByIdKey[],\n skipPermissions: AnyPermission[] = []\n): AnyPermission[] => {\n const highestAreaPermissionLevelSelected = areaPermissions.reduce(\n (highest, current) => (uiPermissionsById[current].permissionLevel > highest ? uiPermissionsById[current].permissionLevel : highest),\n 1\n );\n return uiPermissionsByArea[area].uiPermissions.reduce((permissions: AnyPermission[], current) => {\n if ((current.permissionLevel < highestAreaPermissionLevelSelected || areaPermissions.includes(current.value)) && !skipPermissions.includes(current.value)) {\n permissions.push(current.value);\n }\n return permissions;\n }, []);\n};\n\n/**\n * transforms [{ group: \"groupName\", uiPermissions: [\"read\", \"manage\", \"connect\"] }, ...] to\n * [{ name: \"ReadDevices\", scope: { type: \"DeviceGroups\", value: [\"groupName\", ...] } }, ...]\n */\n\nconst transformAreaRoleDataToScopedPermissionsSets = (\n area: ScopedPermissionsByAreaKey,\n areaPermissions: { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector: string\n): TransformedAreaRoles => {\n type PermissionSetObject = Record<PermissionSetId, { type?: string; value: string[] }>;\n const permissionSetObject: PermissionSetObject = areaPermissions.reduce((accu, { item, uiPermissions }) => {\n // if permission area is release and item is release tag (not all releases) then exclude upload permission as it cannot be applied to tags\n\n const skipPermissions = scopedPermissionAreas.releases.key === area && item !== ALL_RELEASES ? [uiPermissionsById.upload.value] : [];\n const impliedPermissions = deriveImpliedAreaPermissions(area, uiPermissions, skipPermissions);\n accu = impliedPermissions.reduce((itemPermissionAccu, impliedPermission): PermissionSetObject => {\n const permissionSetState = itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] ?? {\n type: uiPermissionsByArea[area].scope,\n value: []\n };\n itemPermissionAccu[uiPermissionsById[impliedPermission].permissionSets[area]] = {\n ...permissionSetState,\n value: [...permissionSetState.value, item]\n };\n return itemPermissionAccu;\n }, accu);\n return accu;\n }, {} as PermissionSetObject);\n return Object.entries(permissionSetObject).map(([name, { value, ...scope }]) => {\n if (value.includes(excessiveAccessSelector)) {\n return { name: name as PermissionSetId };\n }\n return { name: name as PermissionSetId, scope: { ...scope, value: value.filter(duplicateFilter) } };\n });\n};\n\nconst transformRoleDataToRole = (roleData: SubmittedRole, roleState: Partial<Role> = {}): { permissionSetsWithScope: PermissionSetWithScope[]; role: Role } => {\n const role = { ...roleState, ...roleData };\n const { description = '', name, uiPermissions = emptyUiPermissions } = role;\n const { maybeUiPermissions, remainderKeys } = Object.entries(emptyUiPermissions).reduce<{\n maybeUiPermissions: Partial<Record<ScopedPermissionsByAreaKey, Record<string, AnyPermission[]>>>;\n remainderKeys: UiPermissionsByAreaKey[];\n }>(\n (accu, [key, emptyPermissions]) => {\n if (!scopedPermissionAreas[key]) {\n accu.remainderKeys.push(key as UiPermissionsByAreaKey);\n } else if (uiPermissions[key]) {\n accu.maybeUiPermissions[key as ScopedPermissionsByAreaKey] = uiPermissions[key].reduce(itemUiPermissionsReducer, emptyPermissions);\n }\n return accu;\n },\n { maybeUiPermissions: {}, remainderKeys: [] }\n );\n const { permissionSetsWithScope, roleUiPermissions } = remainderKeys.reduce(\n (accu, area) => {\n const areaPermissions = role.uiPermissions[area];\n if (!Array.isArray(areaPermissions)) {\n return accu;\n }\n const impliedPermissions = deriveImpliedAreaPermissions(area, areaPermissions as AnyPermission[]);\n accu.roleUiPermissions[area] = impliedPermissions;\n const mappedPermissions = impliedPermissions.map(uiPermission => ({ name: uiPermissionsById[uiPermission].permissionSets[area] }));\n accu.permissionSetsWithScope.push(...mappedPermissions);\n return accu;\n },\n { permissionSetsWithScope: [{ name: defaultPermissionSets.Basic.name }], roleUiPermissions: {} }\n );\n const scopedPermissionSets = Object.values(scopedPermissionAreas).reduce((accu, { key, excessiveAccessSelector }) => {\n if (!uiPermissions[key]) {\n return accu;\n }\n accu.push(\n ...transformAreaRoleDataToScopedPermissionsSets(\n key,\n uiPermissions[key] as unknown as { item: string; uiPermissions: UiPermissionsByIdKey[] }[],\n excessiveAccessSelector\n )\n );\n return accu;\n }, [] as TransformedAreaRoles);\n return {\n permissionSetsWithScope: [...permissionSetsWithScope, ...scopedPermissionSets],\n role: {\n ...emptyRole,\n name,\n description: description ? description : roleState.description || '',\n uiPermissions: {\n ...emptyUiPermissions,\n ...roleUiPermissions,\n ...maybeUiPermissions\n }\n }\n };\n};\n\nconst roleActions = {\n create: {\n successMessage: 'The role was created successfully.',\n errorMessage: 'creating'\n },\n edit: {\n successMessage: 'The role has been updated.',\n errorMessage: 'editing'\n },\n remove: {\n successMessage: 'The role was deleted successfully.',\n errorMessage: 'removing'\n }\n} as const;\n\nconst roleActionErrorHandler = (err: Error, type: keyof typeof roleActions, dispatch: AppDispatch, meta?: { name: string; permissionSetsCreated: number }) => {\n let errorContext = `There was an error ${roleActions[type].errorMessage} the role.`;\n if (meta) {\n const { permissionSetsCreated, name } = meta;\n errorContext += ` Tried to ${type} role ${name} with ${permissionSetsCreated} permission sets.`;\n }\n return commonErrorHandler(err, errorContext, dispatch);\n};\n\nexport const createRole = createAppAsyncThunk(`${sliceName}/createRole`, (roleData: SubmittedRole, { dispatch }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData);\n return GeneralApi.post(`${useradmApiUrlv2}/roles`, {\n name: role.name,\n description: role.description,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.create.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'create', dispatch, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const editRole = createAppAsyncThunk(`${sliceName}/editRole`, (roleData: SubmittedRole, { dispatch, getState }) => {\n const { permissionSetsWithScope, role } = transformRoleDataToRole(roleData, getRolesById(getState())[roleData.name]);\n return GeneralApi.put(`${useradmApiUrlv2}/roles/${role.name}`, {\n description: role.description,\n name: role.name,\n permission_sets_with_scope: permissionSetsWithScope\n })\n .then(() => Promise.all([dispatch(actions.createdRole(role)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.edit.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'edit', dispatch, { permissionSetsCreated: permissionSetsWithScope.length, name: role.name }));\n});\n\nexport const removeRole = createAppAsyncThunk(`${sliceName}/removeRole`, (roleId: string, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrlv2}/roles/${roleId}`)\n .then(() => Promise.all([dispatch(actions.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar(roleActions.remove.successMessage))]))\n .catch(err => roleActionErrorHandler(err, 'remove', dispatch))\n);\n\n/*\n Global settings\n*/\nexport const getGlobalSettings = createAppAsyncThunk(`${sliceName}/getGlobalSettings`, (_, { dispatch }) =>\n GeneralApi.get<GlobalSettings>(`${useradmApiUrl}/settings`).then(({ data: settings, headers: { etag } }) => {\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n return Promise.all([dispatch(actions.setGlobalSettings(settings)), dispatch(setOfflineThreshold()), etag]);\n })\n);\n\nexport const saveGlobalSettings = createAppAsyncThunk(\n `${sliceName}/saveGlobalSettings`,\n ({ beOptimistic = false, notify = false, ...settings }: Partial<GlobalSettings>, { dispatch, getState }) => {\n if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {\n return;\n }\n return dispatch(getGlobalSettings())\n .unwrap()\n .then(result => {\n const updatedSettings = { ...getState().users.globalSettings, ...settings };\n if (getCurrentUser(getState()).verified) {\n updatedSettings['2fa'] = twoFAStates.enabled;\n } else {\n delete updatedSettings['2fa'];\n }\n const tasks: ReturnType<AppDispatch> = [dispatch(actions.setGlobalSettings(updatedSettings))];\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return GeneralApi.post(`${useradmApiUrl}/settings`, updatedSettings, { headers })\n .then(() => {\n if (notify) {\n tasks.push(dispatch(setSnackbar('Settings saved successfully')));\n }\n return Promise.all(tasks);\n })\n .catch(err => {\n if (beOptimistic) {\n return Promise.all([tasks]);\n }\n console.log(err);\n return commonErrorHandler(err, `The settings couldn't be saved.`, dispatch);\n });\n });\n }\n);\n\nexport const getUserSettings = createAppAsyncThunk(`${sliceName}/getUserSettings`, (_, { dispatch }) =>\n GeneralApi.get<UserSettings>(`${useradmApiUrl}/settings/me`).then(({ data: settings, headers: { etag } }) => {\n window.sessionStorage.setItem(settingsKeys.initialized, 'true');\n return Promise.all([dispatch(actions.setUserSettings(settings)), etag]);\n })\n);\n\nexport const saveUserSettings = createAppAsyncThunk(\n `${sliceName}/saveUserSettings`,\n (settings: Partial<UserSettings> = { onboarding: {} }, { dispatch, getState }) => {\n if (!getCurrentUser(getState()).id) {\n return Promise.resolve();\n }\n return dispatch(getUserSettings())\n .unwrap()\n .then(result => {\n const userSettings = getUserSettingsSelector(getState());\n const onboardingState = getOnboardingState(getState());\n const tooltipState = getTooltipsState(getState());\n const updatedSettings = {\n ...userSettings,\n ...settings,\n firstLoginTimestamp: userSettings.firstLoginTimestamp ?? dayjs().format(),\n onboarding: {\n ...onboardingState,\n ...settings.onboarding\n },\n tooltips: tooltipState\n };\n const headers = result[result.length - 1] ? { 'If-Match': result[result.length - 1] } : {};\n return Promise.all([\n Promise.resolve(dispatch(actions.setUserSettings(updatedSettings))),\n GeneralApi.post(`${useradmApiUrl}/settings/me`, updatedSettings, { headers })\n ]).catch(() => dispatch(actions.setUserSettings(userSettings)));\n });\n }\n);\n\nexport const get2FAQRCode = createAppAsyncThunk(`${sliceName}/get2FAQRCode`, (_, { dispatch }) =>\n GeneralApi.get<{ qr: string }>(`${useradmApiUrl}/2faqr`).then(res => dispatch(actions.receivedQrCode(res.data.qr)))\n);\n\nexport const setHideAnnouncement = createAppAsyncThunk<void, { shouldHide: boolean; userId?: string }>(\n `${sliceName}/setHideAnnouncement`,\n ({ shouldHide, userId }, { dispatch, getState }) => {\n const currentUserId = userId || getCurrentUser(getState()).id;\n const announcement = getHostedAnnouncement(getState());\n const hash = announcement ? hashString(announcement) : '';\n const announceCookie = cookies.get(`${currentUserId}${hash}`);\n if (shouldHide || (hash.length && typeof announceCookie !== 'undefined')) {\n cookies.set(`${currentUserId}${hash}`, true, { maxAge: 604800 });\n dispatch(setAnnouncement(''));\n }\n }\n);\n\nexport const getTokens = createAppAsyncThunk(`${sliceName}/getTokens`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${useradmApiUrl}/settings/tokens`).then(({ data: tokens }) => {\n const user = getCurrentUser(getState());\n const updatedUser = {\n ...user,\n tokens\n };\n return Promise.resolve(dispatch(actions.updatedUser(updatedUser)));\n })\n);\n\nconst ONE_YEAR = 31536000;\n\nexport const generateToken = createAppAsyncThunk(\n `${sliceName}/generateToken`,\n ({ expiresIn = ONE_YEAR, name }: { expiresIn?: number; name: string }, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrl}/settings/tokens`, { name, expires_in: expiresIn })\n .then(({ data: token }) => Promise.all([dispatch(getTokens()), token]))\n .catch(err => commonErrorHandler(err, 'There was an error creating the token:', dispatch))\n);\n\nexport const revokeToken = createAppAsyncThunk(`${sliceName}/revokeToken`, (token: PersonalAccessToken, { dispatch }) =>\n GeneralApi.delete(`${useradmApiUrl}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))\n);\n\nexport const setTooltipReadState = createAppAsyncThunk(\n `${sliceName}/setTooltipReadState`,\n async ({ persist, ...remainder }: { id: string; persist: boolean; readState: ReadState }, { dispatch }) => {\n dispatch(actions.setTooltipState(remainder));\n if (persist) {\n await dispatch(saveUserSettings());\n }\n }\n);\n\nexport const setAllTooltipsReadState = createAppAsyncThunk(\n `${sliceName}/toggleHelptips`,\n ({ readState = READ_STATES.read, tooltipIds }: { readState: string; tooltipIds: string[] }, { dispatch }) => {\n const updatedTips = tooltipIds.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});\n return Promise.resolve(dispatch(actions.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));\n }\n);\n\ntype LogAnalysisFeedback = {\n deployment_id: string;\n device_id: string;\n useful: boolean;\n};\n\ntype ProductFeedback = {\n message: string;\n score: number;\n};\n\ntype SubmitFeedbackPayload = {\n feedback: LogAnalysisFeedback | ProductFeedback;\n formId: string;\n};\n\nexport const submitUserFeedback = createAppAsyncThunk(`${sliceName}/submitFeedback`, ({ formId, feedback }: SubmitFeedbackPayload, { dispatch }) =>\n GeneralApi.post(`${useradmApiUrlv2}/support/feedback/${formId}`, feedback).then(() => {\n if (formId === 'product') {\n const today = new Date();\n dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split('T')[0] }));\n setTimeout(() => dispatch(actions.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);\n }\n })\n);\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { User as BackendUser, DeploymentPhase, TenantInfo, TenantsIdName } from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { FilterOperator, PermissionSet, Role } from '../constants';\nimport { defaultPermissionSets, rolesById } from '../constants';\nimport type { ReadState } from './constants';\nimport { READ_STATES } from './constants';\n\nexport const sliceName = 'users';\nexport type User = BackendUser & TenantInfo & { tenants?: TenantsIdName };\nexport type UserSession = {\n expiresAt?: string;\n token: string;\n};\nexport type CustomColumn = {\n attribute: {\n name: string;\n scope: string;\n };\n size: number;\n};\n\ntype FilterOption = {\n key: string;\n operator: FilterOperator;\n scope: string;\n value: string;\n};\nexport type GlobalSettings = {\n [x: string]: any;\n id_attribute?: {\n attribute: string;\n scope: string;\n };\n previousFilters: FilterOption[];\n previousPhases: DeploymentPhase[][];\n retries: number;\n};\ntype Column = {\n id: string;\n key: string;\n name: string;\n scope: string;\n title: string;\n};\nexport type UserSettings = {\n [x: string]: any;\n columnSelection: Column[];\n feedbackCollectedAt?: string;\n firstLoginTimestamp: null | string;\n mode?: 'light' | 'dark';\n onboarding: Partial<{\n address: string;\n approach: 'physical' | 'virtual' | 'mcu' | null;\n complete: boolean;\n demoArtifactPort: number;\n deviceType: string[] | string;\n progress: string;\n showTips: null | boolean;\n showTipsDialog: boolean;\n }>;\n securityAlertDismissedTimestamp: null | string;\n tooltips?: object;\n trackingConsentGiven?: boolean;\n};\n\nexport type UserSliceType = {\n byId: Record<string, User>;\n currentSession?: UserSession | object;\n currentUser: string | null;\n customColumns: CustomColumn[];\n globalSettings: GlobalSettings;\n permissionSetsById: Record<string, PermissionSet>;\n qrCode: string | null;\n rolesById: Record<string, Role>;\n rolesInitialized: boolean;\n settingsInitialized: boolean;\n showConnectDeviceDialog: boolean;\n showFeedbackDialog: boolean;\n showStartupNotification: boolean;\n tooltips: {\n byId: Record<string, { readState: ReadState }>;\n };\n userSettings: UserSettings;\n userSettingsInitialized: boolean;\n};\n\nexport const initialState: UserSliceType = {\n byId: {},\n currentUser: null,\n currentSession: {\n // { token: window.localStorage.getItem('JWT'), expiresAt: '2023-01-01T00:15:00.000Z' | undefined }, // expiresAt depending on the stay logged in setting\n },\n customColumns: [],\n qrCode: null,\n globalSettings: {\n id_attribute: undefined,\n previousFilters: [],\n previousPhases: [],\n retries: 0\n },\n permissionSetsById: {\n ...defaultPermissionSets\n },\n rolesById: {\n ...rolesById\n },\n rolesInitialized: false,\n settingsInitialized: false,\n showConnectDeviceDialog: false,\n showFeedbackDialog: false,\n showStartupNotification: false,\n tooltips: {\n byId: {\n // <id>: { readState: <read|unread> } // this object is getting enhanced by the tooltip texts in the app constants\n }\n },\n userSettings: {\n columnSelection: [],\n onboarding: {},\n firstLoginTimestamp: null,\n securityAlertDismissedTimestamp: null\n },\n userSettingsInitialized: false\n};\n\nexport const usersSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receivedQrCode: (state, action: PayloadAction<string | null>) => {\n state.qrCode = action.payload;\n },\n successfullyLoggedIn: (state, action: PayloadAction<UserSession>) => {\n state.currentSession = action.payload;\n },\n receivedUserList: (state, action: PayloadAction<Record<string, User>>) => {\n state.byId = action.payload;\n },\n receivedUser: (state, action: PayloadAction<User>) => {\n state.byId[action.payload.id] = action.payload;\n state.currentUser = action.payload.id;\n },\n removedUser: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removedUser, ...byId } = state.byId;\n state.byId = byId;\n state.currentUser = state.currentUser === action.payload ? null : state.currentUser;\n },\n updatedUser: (state, action: PayloadAction<Partial<User> & { id: string }>) => {\n state.byId[action.payload.id] = {\n ...state.byId[action.payload.id],\n ...action.payload\n };\n },\n receivedPermissionSets: (state, action: PayloadAction<Record<string, PermissionSet>>) => {\n state.permissionSetsById = action.payload;\n },\n receivedRoles: (state, action: PayloadAction<Record<string, Role>>) => {\n state.rolesById = action.payload;\n state.rolesInitialized = true;\n },\n finishedRoleInitialization: (state, action) => {\n state.rolesInitialized = action.payload;\n },\n createdRole: (state, action: PayloadAction<Role>) => {\n state.rolesById[action.payload.name] = {\n ...state.rolesById[action.payload.name],\n ...action.payload\n };\n },\n removedRole: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: toBeRemoved, ...rolesById } = state.rolesById;\n state.rolesById = rolesById;\n },\n setCustomColumns: (state, action: PayloadAction<CustomColumn[]>) => {\n state.customColumns = action.payload;\n },\n setGlobalSettings: (state, action: PayloadAction<GlobalSettings>) => {\n state.settingsInitialized = true;\n state.globalSettings = {\n ...state.globalSettings,\n ...action.payload\n };\n },\n setUserSettings: (state, action: PayloadAction<UserSettings>) => {\n state.userSettingsInitialized = true;\n state.userSettings = {\n ...state.userSettings,\n ...action.payload\n };\n },\n setTooltipState: (state, action: PayloadAction<{ id: string; readState: ReadState }>) => {\n const { id, readState = READ_STATES.read } = action.payload;\n state.tooltips.byId[id] = { ...state.tooltips.byId[id], readState };\n },\n setTooltipsState: (state, action: PayloadAction<UserSliceType['tooltips']['byId']>) => {\n state.tooltips.byId = {\n ...state.tooltips.byId,\n ...action.payload\n };\n },\n setShowFeedbackDialog: (state, action: PayloadAction<boolean>) => {\n state.showFeedbackDialog = action.payload;\n },\n setShowConnectingDialog: (state, action: PayloadAction<boolean>) => {\n state.showConnectDeviceDialog = action.payload;\n },\n setShowStartupNotification: (state, action: PayloadAction<boolean>) => {\n state.showStartupNotification = action.payload;\n }\n }\n});\n\nexport const actions = usersSlice.actions;\nexport default usersSlice.reducer;\n","// 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 {\n ALL_DEVICES,\n ALL_DEVICE_STATES,\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n ATTRIBUTE_SCOPES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n PermissionTypes,\n SORTING_OPTIONS,\n alertChannels,\n apiRoot,\n apiUrl,\n auditLogsApiUrl,\n defaultPermissionSets,\n deploymentsApiUrl,\n deploymentsApiUrlV2,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyRole,\n emptyUiPermissions,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n limitDefault,\n maxSessionAge,\n monitorApiUrlv1,\n rolesById,\n rolesByName,\n scopedPermissionAreas,\n serviceProviderRolesById,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv1,\n useradmApiUrlv2\n} from '@northern.tech/utils/constants';\nimport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n DeviceIssueOptionKey,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n SortOptions,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n} from '@northern.tech/utils/constants';\n\nexport {\n alertChannels,\n ALL_DEVICE_STATES,\n ALL_DEVICES,\n ALL_RELEASES,\n APPLICATION_JSON_CONTENT_TYPE,\n APPLICATION_JWT_CONTENT_TYPE,\n ATTRIBUTE_SCOPES,\n apiRoot,\n apiUrl,\n auditLogsApiUrl,\n defaultPermissionSets,\n deploymentsApiUrl,\n deploymentsApiUrlV2,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n emptyRole,\n emptyUiPermissions,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n monitorApiUrlv1,\n limitDefault,\n maxSessionAge,\n PermissionTypes,\n rolesById,\n rolesByName,\n scopedPermissionAreas,\n serviceProviderRolesById,\n SORTING_OPTIONS,\n ssoIdpApiUrlv1,\n tenantadmApiUrlv1,\n tenantadmApiUrlv2,\n twoFAStates,\n uiPermissionsByArea,\n uiPermissionsById,\n useradmApiUrl,\n useradmApiUrlv1,\n useradmApiUrlv2\n};\n\nexport type {\n AnyPermission,\n AuditLogPermission,\n DeploymentPermission,\n DeviceIssueOptionKey,\n GroupsPermission,\n PermissionObject,\n PermissionSet,\n PermissionSetId,\n ReleasesPermission,\n Role,\n ScopedPermissionsByAreaKey,\n SortOptions,\n UiPermissionsByAreaKey,\n UiPermissionsByIdKey,\n UiPermissionsDefinition,\n UserManagementPermission\n};\n\nexport * from './appSlice/constants';\nexport * from './commonConstants';\nexport * from './deploymentsSlice/constants';\nexport * from './devicesSlice/constants';\nexport * from './monitorSlice/constants';\nexport * from './onboardingSlice/constants';\nexport * from './organizationSlice/constants';\nexport * from './releasesSlice/constants';\nexport * from './usersSlice/constants';\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { BarChart as BarChartIcon, PieChartOutline as PieChartIcon } from '@mui/icons-material';\n\nimport { yes as yesUtil } from '@northern.tech/utils';\n\nexport const chartTypes = {\n bar: { key: 'bar', Icon: BarChartIcon },\n pie: { key: 'pie', Icon: PieChartIcon }\n} as const;\nexport const emptyChartSelection = { software: '', group: '', chartType: chartTypes.bar.key, attribute: 'artifact_name' };\nexport const defaultReportType = 'distribution';\nexport const defaultReports = [{ ...emptyChartSelection, group: null, attribute: 'artifact_name', type: defaultReportType }];\n\nexport const BEGINNING_OF_TIME = '2016-01-01T00:00:00.000Z';\n\nexport const locations = {\n cn: { key: 'cn', title: 'China', location: 'hosted.mender.cn' },\n eu: { key: 'eu', title: 'EU', location: 'eu.hosted.mender.io' },\n us: { key: 'us', title: 'US', location: 'hosted.mender.io' }\n} as const;\nexport type AvailablePlans = 'os' | 'professional' | 'enterprise';\n\nexport type Plan = {\n description: string;\n id: AvailablePlans;\n name: string;\n};\n\nexport type AvailableAddon = 'configure' | 'troubleshoot' | 'monitor';\n\nexport const PLANS: { [key in AvailablePlans]: Plan } = {\n os: {\n id: 'os',\n name: 'Basic',\n description:\n 'The core features of Mender. To continue using Enterprise Trial features—like Delta updates, scheduled deployments, phased rollouts, device filtering, dynamic groups, RBAC, audit logs, and more—please upgrade to a higher plan.'\n },\n professional: {\n id: 'professional',\n name: 'Professional',\n description: 'Everything in Basic, plus enhanced update management and automation features.'\n },\n enterprise: {\n id: 'enterprise',\n name: 'Enterprise',\n description:\n 'Every advanced feature of Mender, tailored for complex and large-scale deployments. Not available as a monthly subscription — ask us for a quote.'\n }\n} as const;\nexport type Addon = {\n description: string;\n eligible: AvailablePlans[];\n id: string;\n needs: string[];\n title: string;\n};\n\nexport type AddonId = keyof typeof ADDONS;\n\n// the needs names need to be aligned with the name of the features in the appReducer, as they will be checked in the addonselection\nexport const ADDONS: { [key in AvailableAddon]: Addon } = {\n configure: {\n id: 'configure',\n title: 'Configure',\n description: 'Seamlessly configure applications and devices remotely – configure each device to its environment.',\n needs: ['hasDeviceConfig'],\n eligible: ['os', 'professional', 'enterprise']\n },\n monitor: {\n id: 'monitor',\n title: 'Monitor',\n description: 'Detect and analyze health issues of devices, services and applications. Set up alerts so you can act quickly.',\n needs: ['hasMonitor'],\n eligible: ['professional', 'enterprise']\n },\n troubleshoot: {\n id: 'troubleshoot',\n title: 'Troubleshoot',\n description: 'Secure, remote access to your devices – quickly diagnose and fix issues in real time.',\n needs: ['hasDeviceConnect'],\n eligible: ['os', 'professional', 'enterprise']\n }\n};\n\nexport const BENEFITS = {\n auditlog: {\n id: 'auditlog',\n benefit: 'gain access to logs for important events such as changes to devices, deployments and user management, as well as remote terminal session replays',\n requiredPlan: PLANS.enterprise.id\n },\n dashboard: { id: 'dashboard', benefit: 'actionable insights into the devices you are updating with Mender', requiredPlan: PLANS.enterprise.id },\n deltaGeneration: {\n id: 'deltaGeneration',\n benefit: 'automatic delta artifacts generation to minimize data transfer and improve the update delivery',\n requiredPlan: PLANS.enterprise.id\n },\n deviceConfiguration: { id: 'deviceConfiguration', benefit: 'device configuration features', requiredAddon: ADDONS.configure.id },\n deviceMonitor: { id: 'deviceMonitor', benefit: 'device monitoring features', requiredAddon: ADDONS.monitor.id, requiredPlan: PLANS.professional.id },\n deviceTroubleshoot: { id: 'deviceTroubleshoot', benefit: 'device troubleshooting features', requiredAddon: ADDONS.troubleshoot.id },\n dynamicGroups: { id: 'dynamicGroups', benefit: 'create dynamic groups to ease device management', requiredPlan: PLANS.enterprise.id },\n fullFiltering: { id: 'fullFiltering', benefit: 'filtering by multiple attributes to improve the device overview', requiredPlan: PLANS.professional.id },\n gateway: { id: 'gateway', benefit: 'see devices connected to your gateway device for easy access', requiredPlans: PLANS.professional.id },\n pausedDeployments: {\n id: 'pausedDeployments',\n benefit: 'granular control about update rollout to allow synchronization across your fleet',\n requiredPlan: PLANS.enterprise.id\n },\n phasedDeployments: { id: 'phasedDeployments', benefit: 'choose to roll out deployments in multiple phases', requiredPlan: PLANS.enterprise.id },\n rbac: { id: 'rbac', benefit: 'granular role based access control', requiredPlan: PLANS.enterprise.id },\n retryDeployments: { id: 'retryDeployments', benefit: 'optional retries for failed rollout attempts', requiredPlan: PLANS.professional.id },\n scheduledDeployments: {\n id: 'scheduledDeployments',\n benefit: 'scheduled deployments to steer the distribution of your updates.',\n requiredPlan: PLANS.professional.id\n },\n webhookEvents: {\n id: 'webhookEvents',\n benefit: 'receive inventory events and select which type(s) of events the webhook will receive',\n requiredPlan: PLANS.professional.id\n },\n\n default: { id: 'default', benefit: 'gain access to this feature', requiredPlan: PLANS.enterprise.id }\n} as const;\n\nexport const yes = yesUtil;\nexport const canAccess = yes;\n\nexport const DARK_MODE = 'dark';\nexport const LIGHT_MODE = 'light';\n","// 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 { mdiAws as AWS, mdiMicrosoftAzure as Azure } from '@mdi/js';\nimport type { Integration } from '@northern.tech/types/MenderTypes';\n\nimport type { DEVICE_FILTERING_OPTIONS } from './constants';\nimport { ATTRIBUTE_SCOPES } from './constants';\n\nexport const timeUnits = {\n days: 'days',\n minutes: 'minutes',\n hours: 'hours'\n};\n\nexport const UNGROUPED_GROUP = { id: '*|=ungrouped=|*', name: 'Unassigned' };\n\nexport const DEVICE_LIST_MAXIMUM_LENGTH = 50;\n\nexport type FilterOperator = keyof typeof DEVICE_FILTERING_OPTIONS;\n\nconst oneSecond = 1000;\nexport const TIMEOUTS = {\n debounceDefault: 700,\n debounceShort: 300,\n halfASecond: 0.5 * oneSecond,\n oneSecond,\n twoSeconds: 2 * oneSecond,\n threeSeconds: 3 * oneSecond,\n fiveSeconds: 5 * oneSecond,\n refreshDefault: 10 * oneSecond,\n refreshLong: 60 * oneSecond\n};\n\nexport const DEVICE_ONLINE_CUTOFF = { interval: 1, intervalName: timeUnits.days };\n\nexport interface IdAttribute {\n attribute: string;\n scope: string;\n}\nexport const defaultIdAttribute: Readonly<IdAttribute> = Object.freeze({ attribute: 'id', scope: ATTRIBUTE_SCOPES.identity });\n\nexport const productOrder = ['micro', 'standard', 'system'];\n\nexport const credentialTypes = {\n aws: 'aws',\n http: 'http',\n sas: 'sas',\n x509: 'x509'\n};\nexport const EXTERNAL_PROVIDER = {\n 'iot-core': {\n credentialsType: credentialTypes.aws,\n icon: AWS,\n title: 'AWS IoT Core',\n twinTitle: 'Device Shadow',\n provider: 'iot-core',\n enabled: true,\n deviceTwin: true,\n configHint: <>For help finding your AWS IoT Core connection string, check the AWS IoT documentation.</>\n },\n 'iot-hub': {\n credentialsType: credentialTypes.sas,\n icon: Azure,\n title: 'Azure IoT Hub',\n twinTitle: 'Device Twin',\n provider: 'iot-hub',\n enabled: true,\n deviceTwin: true,\n configHint: (\n <span>\n For help finding your Azure IoT Hub connection string, look under &apos;Shared access policies&apos; in the Microsoft Azure UI as described{' '}\n {\n <a\n href=\"https://devblogs.microsoft.com/iotdev/understand-different-connection-strings-in-azure-iot-hub/#iothubconn\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n here\n </a>\n }\n .\n </span>\n )\n },\n webhook: {\n credentialsType: credentialTypes.http,\n deviceTwin: false,\n twinTitle: '',\n // disable the webhook provider here, since it is treated different than other integrations, with a custom configuration & management view, etc.\n enabled: false,\n provider: 'webhook'\n }\n} as const;\n\nexport interface Webhook extends Integration {\n provider: 'webhook';\n}\n\nexport const emptyWebhook: Webhook = {\n description: '',\n provider: 'webhook',\n credentials: {\n type: EXTERNAL_PROVIDER.webhook.credentialsType,\n [EXTERNAL_PROVIDER.webhook.credentialsType]: {\n secret: '',\n url: ''\n }\n }\n};\n\ninterface CountryType {\n code: string;\n label: string;\n}\nexport const MAX_PAGE_SIZE = 500;\nconst regionNames = new Intl.DisplayNames(['en'], { type: 'region' });\nexport const countries: readonly CountryType[] = [\n 'AD',\n 'AE',\n 'AF',\n 'AG',\n 'AI',\n 'AL',\n 'AM',\n 'AO',\n 'AQ',\n 'AR',\n 'AS',\n 'AT',\n 'AU',\n 'AW',\n 'AX',\n 'AZ',\n 'BA',\n 'BB',\n 'BD',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BL',\n 'BM',\n 'BN',\n 'BO',\n 'BR',\n 'BS',\n 'BT',\n 'BV',\n 'BW',\n 'BY',\n 'BZ',\n 'CA',\n 'CC',\n 'CD',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CK',\n 'CL',\n 'CM',\n 'CN',\n 'CO',\n 'CR',\n 'CU',\n 'CV',\n 'CW',\n 'CX',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DM',\n 'DO',\n 'DZ',\n 'EC',\n 'EE',\n 'EG',\n 'EH',\n 'ER',\n 'ES',\n 'ET',\n 'FI',\n 'FJ',\n 'FK',\n 'FM',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GD',\n 'GE',\n 'GF',\n 'GG',\n 'GH',\n 'GI',\n 'GL',\n 'GM',\n 'GN',\n 'GP',\n 'GQ',\n 'GR',\n 'GS',\n 'GT',\n 'GU',\n 'GW',\n 'GY',\n 'HK',\n 'HM',\n 'HN',\n 'HR',\n 'HT',\n 'HU',\n 'ID',\n 'IE',\n 'IL',\n 'IM',\n 'IN',\n 'IO',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JE',\n 'JM',\n 'JO',\n 'JP',\n 'KE',\n 'KG',\n 'KH',\n 'KI',\n 'KM',\n 'KN',\n 'KP',\n 'KR',\n 'KW',\n 'KY',\n 'KZ',\n 'LA',\n 'LB',\n 'LC',\n 'LI',\n 'LK',\n 'LR',\n 'LS',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MF',\n 'MG',\n 'MH',\n 'MK',\n 'ML',\n 'MM',\n 'MN',\n 'MO',\n 'MP',\n 'MQ',\n 'MR',\n 'MS',\n 'MT',\n 'MU',\n 'MV',\n 'MW',\n 'MX',\n 'MY',\n 'MZ',\n 'NA',\n 'NC',\n 'NE',\n 'NF',\n 'NG',\n 'NI',\n 'NL',\n 'NO',\n 'NP',\n 'NR',\n 'NU',\n 'NZ',\n 'OM',\n 'PA',\n 'PE',\n 'PF',\n 'PG',\n 'PH',\n 'PK',\n 'PL',\n 'PM',\n 'PN',\n 'PR',\n 'PS',\n 'PT',\n 'PW',\n 'PY',\n 'QA',\n 'RE',\n 'RO',\n 'RS',\n 'RU',\n 'RW',\n 'SA',\n 'SB',\n 'SC',\n 'SD',\n 'SE',\n 'SG',\n 'SH',\n 'SI',\n 'SJ',\n 'SK',\n 'SL',\n 'SM',\n 'SN',\n 'SO',\n 'SR',\n 'SS',\n 'ST',\n 'SV',\n 'SX',\n 'SY',\n 'SZ',\n 'TC',\n 'TD',\n 'TF',\n 'TG',\n 'TH',\n 'TJ',\n 'TK',\n 'TL',\n 'TM',\n 'TN',\n 'TO',\n 'TR',\n 'TT',\n 'TV',\n 'TW',\n 'TZ',\n 'UA',\n 'UG',\n 'US',\n 'UY',\n 'UZ',\n 'VA',\n 'VC',\n 'VE',\n 'VG',\n 'VI',\n 'VN',\n 'VU',\n 'WF',\n 'WS',\n 'XK',\n 'YE',\n 'YT',\n 'ZA',\n 'ZM',\n 'ZW'\n]\n .map(code => ({ code, label: regionNames.of(code) }))\n .sort((a, b) => a.label.localeCompare(b.label));\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DeploymentStatistics } from '@northern.tech/types/MenderTypes';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS } from '../constants';\n\nconst alreadyInstalled = 'already-installed';\n\nexport const deploymentSubstates = {\n aborted: 'aborted',\n alreadyInstalled,\n decommissioned: 'decommissioned',\n downloading: 'downloading',\n failure: 'failure',\n installing: 'installing',\n noartifact: 'noartifact',\n artifact_too_big: 'artifact_too_big',\n pause_before_committing: 'pause_before_committing',\n pause_before_installing: 'pause_before_installing',\n pause_before_rebooting: 'pause_before_rebooting',\n pending: 'pending',\n rebooting: 'rebooting',\n success: 'success'\n};\n\nexport const deploymentStatesToSubstates = {\n failures: [deploymentSubstates.failure, deploymentSubstates.aborted, deploymentSubstates.decommissioned],\n inprogress: [deploymentSubstates.downloading, deploymentSubstates.installing, deploymentSubstates.rebooting],\n paused: [deploymentSubstates.pause_before_installing, deploymentSubstates.pause_before_rebooting, deploymentSubstates.pause_before_committing],\n pending: [deploymentSubstates.pending],\n successes: [deploymentSubstates.success, deploymentSubstates.alreadyInstalled, deploymentSubstates.noartifact, deploymentSubstates.artifact_too_big]\n};\n\nexport const deploymentStatesToSubstatesWithSkipped = {\n ...deploymentStatesToSubstates,\n failures: [deploymentSubstates.failure],\n skipped: [\n deploymentSubstates.aborted,\n deploymentSubstates.noartifact,\n deploymentSubstates.artifact_too_big,\n deploymentSubstates.alreadyInstalled,\n deploymentSubstates.decommissioned\n ],\n successes: [deploymentSubstates.success]\n};\nexport const installationSubstatesMap = {\n download: {\n title: 'download',\n done: 'downloaded',\n successIndicators: [deploymentSubstates.installing, deploymentSubstates.rebooting, ...deploymentStatesToSubstates.paused, deploymentSubstates.success],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactInstall_Enter'\n },\n install: {\n title: 'install',\n done: 'installed',\n successIndicators: [\n deploymentSubstates.rebooting,\n deploymentSubstates.pause_before_rebooting,\n deploymentSubstates.pause_before_committing,\n deploymentSubstates.success\n ],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactReboot_Enter'\n },\n reboot: {\n title: 'reboot',\n done: 'rebooted',\n successIndicators: [deploymentSubstates.pause_before_committing, deploymentSubstates.success],\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: 'ArtifactCommit_Enter'\n },\n commit: {\n title: 'commit',\n done: 'committed',\n successIndicators: deploymentStatesToSubstates.successes,\n failureIndicators: deploymentStatesToSubstates.failures,\n pauseConfigurationIndicator: undefined\n }\n};\n\nexport const DEPLOYMENT_STATES = {\n finished: 'finished',\n inprogress: 'inprogress',\n pending: 'pending',\n scheduled: 'scheduled'\n} as const;\n\nexport const listDefaultsByState = {\n [DEPLOYMENT_STATES.inprogress]: { page: 1, perPage: 10 },\n [DEPLOYMENT_STATES.pending]: { page: 1, perPage: 10 },\n [DEPLOYMENT_STATES.scheduled]: { ...DEVICE_LIST_DEFAULTS },\n [DEPLOYMENT_STATES.finished]: { ...DEVICE_LIST_DEFAULTS },\n sort: { direction: SORTING_OPTIONS.desc }\n};\n\nexport const DEFAULT_PENDING_INPROGRESS_COUNT = 10;\nexport const DEPLOYMENT_ROUTES = {\n active: {\n key: 'active',\n route: '/deployments/active',\n states: [DEPLOYMENT_STATES.pending, DEPLOYMENT_STATES.inprogress],\n title: 'Active'\n },\n finished: {\n key: 'finished',\n route: '/deployments/finished',\n states: [DEPLOYMENT_STATES.finished],\n title: 'Finished'\n },\n scheduled: {\n key: 'scheduled',\n route: '/deployments/scheduled',\n states: [DEPLOYMENT_STATES.scheduled],\n title: 'Scheduled'\n }\n} as const;\nexport const DEPLOYMENT_TYPES = {\n software: 'software',\n configuration: 'configuration'\n};\nexport const defaultStats = {\n [deploymentSubstates.aborted]: 0,\n [deploymentSubstates.alreadyInstalled]: 0,\n [deploymentSubstates.decommissioned]: 0,\n [deploymentSubstates.downloading]: 0,\n [deploymentSubstates.failure]: 0,\n [deploymentSubstates.installing]: 0,\n [deploymentSubstates.noartifact]: 0,\n [deploymentSubstates.pause_before_committing]: 0,\n [deploymentSubstates.pause_before_installing]: 0,\n [deploymentSubstates.pause_before_rebooting]: 0,\n [deploymentSubstates.pending]: 0,\n [deploymentSubstates.rebooting]: 0,\n [deploymentSubstates.success]: 0\n};\nexport const deploymentDisplayStates = {\n finished: 'Finished',\n scheduled: 'Scheduled',\n skipped: 'Skipped',\n paused: 'Paused',\n pending: 'Pending',\n inprogress: 'In Progress',\n success: 'Success',\n successes: 'Success',\n failure: 'Fail',\n failures: 'Fail'\n};\n\nexport const deploymentPrototype = {\n devices: {},\n name: undefined,\n statistics: { status: {} } as DeploymentStatistics\n};\n\nexport const pauseMap = {\n [deploymentSubstates.pause_before_installing]: {\n title: installationSubstatesMap.download.done,\n followUp: installationSubstatesMap.download.pauseConfigurationIndicator\n },\n [deploymentSubstates.pause_before_rebooting]: {\n title: installationSubstatesMap.install.done,\n followUp: installationSubstatesMap.install.pauseConfigurationIndicator\n },\n [deploymentSubstates.pause_before_committing]: {\n title: installationSubstatesMap.reboot.done,\n followUp: installationSubstatesMap.reboot.pauseConfigurationIndicator\n }\n};\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DEVICE_STATES, FilterOperator } from '../constants';\nimport { DEVICE_FILTERING_OPTIONS } from '../constants';\n\nexport const emptyFilter = { key: null, value: '', operator: DEVICE_FILTERING_OPTIONS.$eq.key as FilterOperator, scope: 'inventory' };\n\n// see https://github.com/mendersoftware/go-lib-micro/tree/master/ws\n// for the description of proto_header and the consts\n// *Note*: this needs to be aligned with mender-connect and deviceconnect.\nexport const DEVICE_MESSAGE_PROTOCOLS = {\n Shell: 1\n};\nexport const DEVICE_MESSAGE_TYPES = {\n Delay: 'delay',\n New: 'new',\n Ping: 'ping',\n Pong: 'pong',\n Resize: 'resize',\n Shell: 'shell',\n Stop: 'stop'\n};\n\n// we can't include the dismiss state with the rest since this would include dismissed devices in several queries\nexport const DEVICE_DISMISSAL_STATE = 'dismiss';\n\nexport type DeviceAuthState = (typeof DEVICE_STATES)[keyof typeof DEVICE_STATES];\n\nexport const DEVICE_CONNECT_STATES = {\n connected: 'connected',\n disconnected: 'disconnected',\n unknown: 'unknown'\n};\n\nexport const geoAttributes = ['geo-lat', 'geo-lon'].map(attribute => ({ attribute, scope: 'inventory' }));\n\nexport const REPORT_CHART_SIZE_LIMIT = 6;\n","// Copyright 2020 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.\nexport const onboardingSteps = {\n ONBOARDING_START: 'onboarding-start',\n DEVICES_PENDING_ONBOARDING_START: 'devices-pending-onboarding-start',\n DASHBOARD_ONBOARDING_START: 'dashboard-onboarding-start',\n DASHBOARD_ONBOARDING_PENDINGS: 'dashboard-onboarding-pendings',\n DEVICES_DELAYED_ONBOARDING: 'devices-delayed-onboarding',\n DEVICES_PENDING_ONBOARDING: 'devices-pending-onboarding',\n DEVICES_ACCEPTED_ONBOARDING: 'devices-accepted-onboarding',\n DEVICES_PENDING_ACCEPTING_ONBOARDING: 'devices-pending-accepting-onboarding',\n DEVICES_DEPLOY_RELEASE_ONBOARDING: 'devices-deploy-release-onboarding',\n SCHEDULING_ARTIFACT_SELECTION: 'scheduling-artifact-selection',\n SCHEDULING_ALL_DEVICES_SELECTION: 'scheduling-all-devices-selection',\n SCHEDULING_GROUP_SELECTION: 'scheduling-group-selection',\n SCHEDULING_RELEASE_TO_DEVICES: 'scheduling-release-to-devices',\n DEPLOYMENTS_INPROGRESS: 'deployments-inprogress',\n DEPLOYMENTS_COMPLETED: 'deployments-completed',\n DEPLOYMENTS_PAST: 'deployments-past',\n DEPLOYMENTS_PAST_COMPLETED: 'deployments-past-completed',\n DEPLOYMENTS_PAST_COMPLETED_FAILURE: 'deployments-past-completed-failure',\n ONBOARDING_CANCELED: 'onboarding-canceled'\n} as const;\n\nexport type OnboardingStepKey = keyof typeof onboardingSteps;\nexport type OnboardingStep = (typeof onboardingSteps)[OnboardingStepKey];\n\n// TODO: Update this to reflect the onboarding steps used in Mender?\nexport const orderedOnboardingSteps = [\n onboardingSteps.DASHBOARD_ONBOARDING_START,\n onboardingSteps.DEVICES_PENDING_ONBOARDING_START,\n onboardingSteps.DEVICES_DELAYED_ONBOARDING,\n onboardingSteps.DEVICES_PENDING_ONBOARDING,\n onboardingSteps.DEVICES_PENDING_ACCEPTING_ONBOARDING,\n onboardingSteps.DASHBOARD_ONBOARDING_PENDINGS,\n onboardingSteps.DEVICES_ACCEPTED_ONBOARDING,\n onboardingSteps.DEVICES_DEPLOY_RELEASE_ONBOARDING,\n onboardingSteps.SCHEDULING_ALL_DEVICES_SELECTION,\n onboardingSteps.SCHEDULING_GROUP_SELECTION,\n onboardingSteps.SCHEDULING_ARTIFACT_SELECTION,\n onboardingSteps.SCHEDULING_RELEASE_TO_DEVICES,\n onboardingSteps.DEPLOYMENTS_INPROGRESS,\n onboardingSteps.DEPLOYMENTS_PAST,\n onboardingSteps.DEPLOYMENTS_PAST_COMPLETED,\n onboardingSteps.DEPLOYMENTS_PAST_COMPLETED_FAILURE,\n onboardingSteps.ONBOARDING_CANCELED\n];\n","// Copyright 2020 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { useradmApiUrl } from '../constants';\n\nexport const XML_METADATA_FORMAT = 'xml';\nexport const JSON_METADATA_FORMAT = 'json';\n\nexport const getSamlStartUrl = id => `${window.location.origin}${useradmApiUrl}/auth/sso/${id}/login`;\nexport const getOidcStartUrl = id => `${window.location.origin}${useradmApiUrl}/oidc/${id}/start`;\n\nexport const SSO_TYPES = {\n saml: {\n id: 'saml',\n type: 'saml',\n title: 'SAML',\n metadataFormat: XML_METADATA_FORMAT,\n editorLanguage: XML_METADATA_FORMAT,\n contentType: 'application/samlmetadata+xml',\n getStartUrl: getSamlStartUrl,\n configDetails: [\n { key: 'entityID', label: 'Entity ID', getValue: id => `${window.location.origin}${useradmApiUrl}/sso/sp/metadata/${id}` },\n { key: 'acs', label: 'ACS URL', getValue: id => `${window.location.origin}${useradmApiUrl}/auth/sso/${id}/acs` },\n { key: 'startURL', label: 'Start URL', getValue: getSamlStartUrl }\n ]\n },\n oidc: {\n id: 'oidc',\n type: 'oidc',\n title: 'OpenID Connect',\n metadataFormat: JSON_METADATA_FORMAT,\n editorLanguage: JSON_METADATA_FORMAT,\n contentType: 'application/json',\n getStartUrl: getOidcStartUrl,\n configDetails: [{ key: 'startURL', label: 'Start Url', getValue: getOidcStartUrl }]\n }\n} as const;\n\nexport type ContentType = (typeof SSO_TYPES)[keyof typeof SSO_TYPES]['contentType'];\n\nexport const auditlogTypes = {\n artifact: { title: 'Artifact', queryParameter: 'object_type', value: 'artifact' },\n deployment: { title: 'Deployment', queryParameter: 'object_deployment_name', value: 'deployment' },\n device: { title: 'Device', queryParameter: 'object_id', value: 'device' },\n user_access_token: { title: 'Personal Access Token', queryParameter: 'user_access_token', value: 'user_access_token' },\n user: { title: 'User', queryParameter: 'object_id', value: 'user' },\n tenant: { title: 'Tenant', queryParameter: 'object_id', value: 'tenant' }\n};\n\nexport const AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];\nexport const SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];\n\nexport const TENANT_LIST_DEFAULT = {\n page: 1,\n perPage: 20\n};\n","// Copyright 2019 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.\nexport const ARTIFACT_GENERATION_TYPE = { SINGLE_FILE: 'single_file' };\n\nexport const currentArtifact = 'artifact_name';\nexport const softwareIndicator = '.version';\nexport const rootfsImageVersion = 'rootfs-image.version';\nexport const softwareTitleMap = { [rootfsImageVersion]: { title: 'Root filesystem', priority: 0, key: rootfsImageVersion } };\n","'use strict';\n\n// Copyright 2015 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { uiPermissionsById } from '../constants';\n\nexport type UiPermission = {\n explanations: object;\n permissionLevel: number;\n permissionSets: Record<string, string>;\n title: string;\n value: string;\n verbs: string[];\n};\n\ntype ExcessiveAccessConfig = {\n selector: string;\n warning: string;\n};\n\ntype EndpointDefinition = {\n path: RegExp;\n types: string[];\n uiPermissions: UiPermission[];\n};\n\n/**\n * _uiPermissions_ represent the possible permissions/ rights that can be given for the area\n * _endpoints_ represent the possible endpoints this definition might be affecting in the UI and what\n * functionality might be affected\n *\n */\nexport type PermissionsArea = {\n endpoints: EndpointDefinition[];\n excessiveAccessConfig?: ExcessiveAccessConfig;\n explanation: string;\n filter?: (object) => string[];\n key: string;\n placeholder?: string;\n scope?: string;\n title: string;\n uiPermissions: UiPermission[];\n};\n\nexport const itemUiPermissionsReducer = (accu, { item, uiPermissions }) => (item ? { ...accu, [item]: uiPermissions } : accu);\n\nconst checkSinglePermission = (permission, requiredPermission) =>\n requiredPermission === permission || uiPermissionsById[permission].permissionLevel > uiPermissionsById[requiredPermission].permissionLevel;\n\nexport const checkPermissionsObject = (permissions, requiredPermission, scopedAccess, superAccess) =>\n permissions[superAccess]?.some(permission => checkSinglePermission(permission, requiredPermission)) ||\n permissions[scopedAccess]?.some(permission => checkSinglePermission(permission, requiredPermission));\n\nexport const USER_LOGOUT = 'USER_LOGOUT';\n\nexport const OWN_USER_ID = 'me';\n\nexport const settingsKeys = { initialized: 'settings-initialized' };\n\nexport const READ_STATES = {\n read: 'read',\n seen: 'seen',\n unread: 'unread'\n} as const;\nexport type ReadState = keyof typeof READ_STATES;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { SnackbarProps } from '@mui/material';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { SortOptions } from '../constants';\nimport { SORTING_OPTIONS } from '../constants';\n\nexport const sliceName = 'app';\n\nconst getYesterday = () => {\n const today = new Date();\n today.setDate(today.getDate() - 1);\n return today.toISOString();\n};\n\nexport type Repository = {\n name: string;\n version: string;\n};\n\nexport type VersionRelease = Partial<{ [versionInfo: string]: VersionRelease }> & {\n release?: string;\n release_date?: string;\n repos?: Repository[];\n supported_until?: string;\n};\n\nexport type SaasVersion = {\n date: string;\n tag: string;\n};\n\nexport type ReleaseData = {\n lts: string[];\n releases: {\n [version: string]: VersionRelease;\n };\n saas: SaasVersion[];\n};\nexport type TagData = { name: string }[];\n\nexport interface SnackbarContent extends Pick<SnackbarProps, 'action' | 'autoHideDuration' | 'message' | 'open'> {\n preventClickToCopy?: boolean;\n}\n\nexport interface SearchState {\n deviceIds: string[];\n isSearching: boolean;\n page?: number;\n perPage?: number;\n searchTerm: string;\n searchTotal: number;\n sort: SortOptions;\n}\n\nexport interface Upload {\n cancelSource: any;\n inprogress?: boolean;\n name?: string;\n progress: number;\n size?: number;\n}\n\ntype UILatestRelease = {\n releaseDate: string;\n repos: Record<string, string>;\n};\n\ntype VersionInformation = {\n [key: string]: string | UILatestRelease | undefined;\n backend?: string;\n GUI?: string;\n latestRelease?: UILatestRelease;\n};\n\nexport type SentryConfig = {\n isReduxEnabled?: string; // no parsing done here as this has to be accessed outside of the store\n location: string;\n replaysSessionSampleRate?: number;\n tracesSampleRate?: number;\n};\n\nexport type AppSliceType = {\n appInitDone: boolean;\n cancelSource: any;\n commit: string;\n demoArtifactLink: string;\n docsVersion: string;\n features: Record<string, boolean>;\n feedbackProbability: number;\n firstLoginAfterSignup: boolean;\n hostAddress: string | null;\n hostedAnnouncement: string;\n newThreshold: string;\n offlineThreshold: string;\n recaptchaSiteKey: string;\n searchState: SearchState;\n sentry: SentryConfig;\n snackbar: SnackbarContent;\n stripeAPIKey: string;\n trackerCode: string;\n uploadsById: Record<string, Upload>;\n versionInformation: VersionInformation;\n yesterday?: string;\n};\n\nexport const initialState: AppSliceType = {\n appInitDone: false,\n cancelSource: undefined,\n commit: '',\n demoArtifactLink: 'https://dgsbl4vditpls.cloudfront.net/mender-demo-artifact.mender',\n hostAddress: null,\n snackbar: {\n action: undefined,\n autoHideDuration: undefined,\n message: '',\n open: false,\n preventClickToCopy: false\n },\n // return boolean rather than organization details\n features: {\n hasAiEnabled: false,\n hasAuditlogs: false,\n hasDeltaProgress: false,\n hasMultitenancy: false,\n hasDeviceConfig: false,\n hasDeviceConnect: false,\n hasFeedbackEnabled: false,\n hasManifestsEnabled: false,\n hasMonitor: false,\n hasMCUEnabled: false,\n isHosted: true,\n isEnterprise: false\n },\n feedbackProbability: 0.3,\n firstLoginAfterSignup: false,\n hostedAnnouncement: '',\n docsVersion: '',\n recaptchaSiteKey: '',\n searchState: {\n deviceIds: [],\n searchTerm: '',\n searchTotal: 0,\n isSearching: false,\n sort: {\n direction: SORTING_OPTIONS.desc\n // key: null,\n // scope: null\n }\n },\n sentry: {\n location: '',\n replaysSessionSampleRate: 0.1,\n tracesSampleRate: 1.0\n },\n stripeAPIKey: '',\n trackerCode: '',\n uploadsById: {\n // id: { progress: 0, cancelSource: undefined }\n },\n newThreshold: getYesterday(),\n offlineThreshold: getYesterday(),\n versionInformation: {\n Integration: '',\n 'Mender-Artifact': '',\n 'Meta-Mender': ''\n },\n yesterday: undefined\n};\n\nexport const appSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n setFeatures: (state, action: PayloadAction<Record<string, boolean>>) => {\n state.features = {\n ...state.features,\n ...action.payload\n };\n },\n setSnackbar: (state, { payload }: PayloadAction<SnackbarContent | string>) => {\n if (typeof payload === 'string' || payload instanceof String) {\n state.snackbar = {\n ...initialState.snackbar,\n message: payload,\n open: !!payload\n };\n return;\n }\n const { message, autoHideDuration, action, preventClickToCopy = false } = payload;\n state.snackbar = {\n message,\n autoHideDuration,\n action,\n preventClickToCopy,\n open: !!message\n };\n },\n setFirstLoginAfterSignup: (state, action: PayloadAction<boolean>) => {\n state.firstLoginAfterSignup = action.payload;\n },\n setAnnouncement: (state, action: PayloadAction<string>) => {\n state.hostedAnnouncement = action.payload;\n },\n setSearchState: (state, action) => {\n state.searchState = {\n ...state.searchState,\n ...action.payload\n };\n },\n setOfflineThreshold: (state, action: PayloadAction<string>) => {\n state.offlineThreshold = action.payload;\n },\n initUpload: (state, action: PayloadAction<{ id: string; upload: Upload }>) => {\n const { id, upload } = action.payload;\n state.uploadsById[id] = upload;\n },\n uploadProgress: (state, action: PayloadAction<{ id: string; progress: number }>) => {\n const { id, progress } = action.payload;\n state.uploadsById[id] = {\n ...state.uploadsById[id],\n progress\n };\n },\n cleanUpUpload: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: current, ...remainder } = state.uploadsById;\n state.uploadsById = remainder;\n },\n setVersionInformation: (state, action: PayloadAction<VersionInformation>) => {\n state.versionInformation = {\n ...state.versionInformation,\n ...action.payload\n };\n },\n setEnvironmentData: (state, action) => ({ ...state, ...action.payload }),\n setAppInitDone: state => {\n state.appInitDone = true;\n }\n }\n});\n\nexport const actions = appSlice.actions;\nexport default appSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n Filter as BackendFilter,\n DeviceWithImage,\n FilterPredicate,\n Limit,\n Scope\n} from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, limitDefault } from '../constants';\nimport { DEFAULT_PENDING_INPROGRESS_COUNT, DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, deploymentPrototype } from './constants';\n\nexport const sliceName = 'deployments';\n\ntype Filter = {\n key: string;\n operator: FilterPredicate['type'];\n scope: string;\n value: any;\n};\nexport type DeviceDeployment = DeviceWithImage & {\n deviceId: string;\n release: string;\n route: string;\n};\n\nexport type Deployment = BackendDeploymentV1 &\n BackendDeploymentV2 & {\n devices: Record<string, DeviceWithImage>;\n filter?: BackendFilter & { filters: Filter[]; name?: string; scope?: Scope };\n group?: string;\n totalDeviceCount: number;\n };\n\nexport type DeploymentStatus = { deploymentIds: string[]; total: number };\nexport type DeploymentByStatus = {\n finished: DeploymentStatus;\n inprogress: DeploymentStatus;\n pending: DeploymentStatus;\n scheduled: DeploymentStatus;\n};\nexport type DeploymentByStatusKey = keyof DeploymentByStatus;\nexport type DeploymentConfig = {\n binaryDelta: {\n compressionLevel: number;\n disableChecksum: boolean;\n disableDecompression: boolean;\n duplicatesWindow: number;\n inputWindow: number;\n instructionBuffer: number;\n sourceWindow: number;\n timeout: number;\n };\n binaryDeltaLimits: {\n duplicatesWindow: Limit;\n inputWindow: Limit;\n instructionBuffer: Limit;\n sourceWindow: Limit;\n timeout: Limit;\n };\n};\n\nexport type SelectionListState = {\n endDate?: string;\n page?: number;\n perPage?: number;\n search?: string;\n selection: string[];\n startDate?: string;\n total?: number;\n type?: string;\n};\nexport type SelectionState = {\n finished: SelectionListState;\n general: {\n reportType: string | null;\n showCreationDialog: boolean;\n showReportDialog: boolean;\n state: string;\n };\n inprogress: SelectionListState;\n pending: SelectionListState;\n scheduled: SelectionListState;\n\n selectedId?: string;\n};\n\nexport type DeploymentsSliceType = {\n byId: Record<string, Deployment>;\n byStatus: DeploymentByStatus;\n config: DeploymentConfig;\n deploymentDeviceLimit: number;\n selectedDeviceIds: string[];\n selectionState: SelectionState;\n};\n\nexport const initialState: DeploymentsSliceType = {\n byId: {\n // [id]: { statistics: { status: {}, total_size }, devices: { [deploymentId]: { id, log } }, totalDeviceCount }\n },\n byStatus: {\n finished: { deploymentIds: [], total: 0 },\n inprogress: { deploymentIds: [], total: 0 },\n pending: { deploymentIds: [], total: 0 },\n scheduled: { deploymentIds: [], total: 0 }\n },\n config: {\n binaryDelta: {\n timeout: -1,\n duplicatesWindow: -1,\n compressionLevel: -1,\n disableChecksum: false,\n disableDecompression: false,\n inputWindow: -1,\n instructionBuffer: -1,\n sourceWindow: -1\n },\n binaryDeltaLimits: {\n timeout: { ...limitDefault, default: 60, max: 3600, min: 60 },\n sourceWindow: limitDefault,\n inputWindow: limitDefault,\n duplicatesWindow: limitDefault,\n instructionBuffer: limitDefault\n }\n },\n deploymentDeviceLimit: 5000,\n selectedDeviceIds: [],\n selectionState: {\n finished: { ...DEVICE_LIST_DEFAULTS, endDate: undefined, search: '', selection: [], startDate: undefined, total: 0, type: '' },\n inprogress: { ...DEVICE_LIST_DEFAULTS, perPage: DEFAULT_PENDING_INPROGRESS_COUNT, selection: [] },\n pending: { ...DEVICE_LIST_DEFAULTS, perPage: DEFAULT_PENDING_INPROGRESS_COUNT, selection: [] },\n scheduled: { ...DEVICE_LIST_DEFAULTS, selection: [] },\n general: {\n state: DEPLOYMENT_ROUTES.active.key,\n showCreationDialog: false,\n showReportDialog: false,\n reportType: null // DeploymentConstants.DEPLOYMENT_TYPES.configuration|DeploymentConstants.DEPLOYMENT_TYPES.software\n },\n selectedId: undefined\n }\n};\n\nexport const deploymentsSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n createdDeployment: (state, action) => {\n state.byId[action.payload.id] = {\n ...deploymentPrototype,\n ...action.payload\n };\n state.byStatus[DEPLOYMENT_STATES.pending].total = state.byStatus[DEPLOYMENT_STATES.pending].total + 1;\n state.byStatus[DEPLOYMENT_STATES.pending].deploymentIds = [...state.byStatus.pending.deploymentIds, action.payload.id];\n state.selectionState[DEPLOYMENT_STATES.pending].selection = [action.payload.id, ...state.selectionState[DEPLOYMENT_STATES.pending].selection];\n state.selectionState[DEPLOYMENT_STATES.pending].total = (state.selectionState[DEPLOYMENT_STATES.pending].total || 0) + 1;\n },\n removedDeployment: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removedDeployment, ...remainder } = state.byId;\n state.byId = remainder;\n },\n receivedDeployment: (state, action: PayloadAction<Deployment>) => {\n state.byId[action.payload.id] = {\n ...(state.byId[action.payload.id] || {}),\n ...action.payload\n };\n },\n receivedDeploymentDeviceLog: (state, action: PayloadAction<{ deviceId: string; id: string; log: boolean }>) => {\n const { id, deviceId, log } = action.payload;\n const deployment = {\n ...deploymentPrototype,\n ...state.byId[id]\n };\n state.byId[id] = {\n ...deployment,\n devices: {\n ...deployment.devices,\n [deviceId]: {\n ...deployment.devices[deviceId],\n log\n }\n }\n };\n },\n receivedDeploymentDevices: (\n state,\n action: PayloadAction<{ devices: Record<string, DeviceWithImage>; id: string; selectedDeviceIds: string[]; totalDeviceCount: number }>\n ) => {\n const { id, devices, selectedDeviceIds, totalDeviceCount } = action.payload;\n state.byId[id] = {\n ...state.byId[id],\n devices,\n totalDeviceCount\n };\n state.selectedDeviceIds = selectedDeviceIds;\n },\n receivedDeployments: (state, action: PayloadAction<Record<string, Deployment>>) => {\n state.byId = {\n ...state.byId,\n ...action.payload\n };\n },\n receivedDeploymentsForStatus: (state, action: PayloadAction<{ deploymentIds: string[]; status: DeploymentByStatusKey; total: number }>) => {\n const { status, deploymentIds, total } = action.payload;\n state.byStatus[status].deploymentIds = deploymentIds;\n state.byStatus[status].total = total;\n },\n selectDeploymentsForStatus: (state, action: PayloadAction<{ deploymentIds: string[]; status: DeploymentByStatusKey; total: number }>) => {\n const { status, deploymentIds, total } = action.payload;\n state.selectionState[status].selection = deploymentIds;\n state.selectionState[status].total = total;\n },\n setDeploymentsState: (state, action: PayloadAction<SelectionState>) => {\n state.selectionState = action.payload;\n },\n setDeploymentsConfig: (state, action: PayloadAction<DeploymentConfig>) => {\n state.config = action.payload;\n }\n }\n});\n\nexport const actions = deploymentsSlice.actions;\nexport default deploymentsSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n Device as BackendDeviceAuth,\n ConnectionState,\n DeviceConfiguration,\n DeviceState,\n DeviceTierLimits,\n MonitorConfiguration,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\n// @ts-nocheck\nimport { deepCompare, duplicateFilter } from '@northern.tech/utils/helpers';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport type { ALL_DEVICE_STATES, DeviceIssueOptionKey, FilterOperator, SortOptions } from '../constants';\nimport { DEVICE_LIST_DEFAULTS, DEVICE_STATES, SORTING_OPTIONS } from '../constants';\nimport type { DeviceDeployment } from '../deploymentsSlice';\nimport type { DeviceAuthState } from './constants';\n\nexport const sliceName = 'devices';\nexport type DeviceSelectedAttribute = { attribute: string; scope: string };\nexport type DeviceListState = {\n detailsTab: string;\n deviceIds: string[];\n isLoading: boolean;\n open?: boolean;\n page: number;\n perPage: number;\n refreshTrigger: boolean;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedId?: string;\n selectedIssues: DeviceIssueOptionKey[];\n selection: number[];\n setOnly?: boolean;\n sort: SortOptions & Partial<SortCriteria>;\n state?: DeviceAuthState | typeof ALL_DEVICE_STATES;\n total: number;\n};\ntype DeviceReport = {\n items: { count: number; key: string }[];\n otherCount: number;\n total: number;\n};\nexport type DeviceGroup = { deviceIds?: string[]; filters?: DeviceFilter[]; id?: string; total?: number };\nexport type InventoryAttributes = {\n [key: string]: string | string[];\n artifact_name: string;\n device_type: string[];\n};\n\n// based on the api docs the Record values might be even: \"Supported types: number, string, array of numbers, array of strings\" - but I guess \"string\" or \"string | sting[]\" should be good enough\ntype UiDeviceAttributes = {\n attributes: InventoryAttributes;\n identity?: Record<string, string>;\n monitor?: Record<string, string>;\n system: Record<string, string>;\n tags?: Record<string, string>;\n};\n\nexport type Device = BackendDeviceAuth &\n UiDeviceAttributes & {\n check_in_time_exact?: string;\n check_in_time_rounded?: string;\n config?: DeviceConfiguration;\n connect_status?: ConnectionState['status'];\n connect_updated_ts?: string;\n deploymentsCount?: number;\n deviceDeployments?: DeviceDeployment;\n etag?: string;\n gatewayIds?: string[];\n group?: string;\n id: string;\n isNew?: boolean;\n isOffline?: boolean;\n monitors?: MonitorConfiguration[];\n status: Status;\n twinsByIntegration?: Record<string, DeviceState & { twinError?: string }>;\n };\nexport type DeviceFilter = {\n key: string;\n operator: FilterOperator;\n scope: string;\n value: string | string[];\n};\ntype FilteringAttributes = {\n identityAttributes: string[];\n inventoryAttributes: string[];\n systemAttributes: string[];\n tagAttributes: string[];\n};\ntype FilteringAttributesConfig = {\n attributes: Record<string, string[]>;\n count: number;\n limit: number;\n};\n\nexport type DeviceGroups = {\n byId: Record<string, DeviceGroup>;\n selectedGroup?: string;\n};\nexport type DeviceSliceType = {\n byId: Record<string, Device>;\n byStatus: Record<DeviceAuthState, { counts: DeviceTierLimits & { total: number }; deviceIds: string[] }>;\n deviceList: DeviceListState;\n filteringAttributes: FilteringAttributes;\n filteringAttributesConfig: FilteringAttributesConfig;\n filteringAttributesLimit: number;\n filters: DeviceFilter[];\n groups: DeviceGroups;\n limits: DeviceTierLimits;\n reports: DeviceReport[];\n total: number;\n};\nexport const initialState: DeviceSliceType = {\n byId: {\n // [deviceId]: {\n // ...,\n // twinsByIntegration: { [external.provider.id]: twinData }\n // }\n },\n byStatus: {\n [DEVICE_STATES.accepted]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.pending]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.preauth]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } },\n [DEVICE_STATES.rejected]: { deviceIds: [], counts: { standard: 0, micro: 0, system: 0, total: 0 } }\n },\n deviceList: {\n deviceIds: [],\n ...DEVICE_LIST_DEFAULTS,\n selectedAttributes: [],\n selectedIssues: [],\n selection: [],\n sort: {\n direction: SORTING_OPTIONS.desc\n // key: null,\n // scope: null\n },\n state: DEVICE_STATES.accepted,\n total: 0,\n refreshTrigger: false,\n isLoading: false,\n detailsTab: '',\n open: false\n },\n filters: [\n // { key: 'device_type', value: 'raspberry', operator: '$eq', scope: 'inventory' }\n ],\n filteringAttributes: { identityAttributes: [], inventoryAttributes: [], systemAttributes: [], tagAttributes: [] },\n filteringAttributesLimit: 10,\n filteringAttributesConfig: {\n attributes: {\n // inventory: ['some_attribute']\n },\n count: 0,\n limit: 100\n },\n reports: [\n // { items: [{ key: \"someKey\", count: 42 }], otherCount: 123, total: <otherCount + itemsCount> }\n ],\n total: 0,\n limits: {\n standard: 0,\n micro: 0,\n system: 0\n },\n groups: {\n byId: {\n // groupName: { deviceIds: [], total: 0, filters: [] },\n // dynamo: { deviceIds: [], total: 3, filters: [{ a: 1 }] }\n },\n selectedGroup: undefined\n }\n};\n\nexport const devicesSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receivedGroups: (state, action: PayloadAction<Record<string, DeviceGroup>>) => {\n state.groups.byId = action.payload;\n },\n addToGroup: (state, action: PayloadAction<{ deviceIds: string[]; group: string }>) => {\n const { group, deviceIds } = action.payload;\n const maybeExistingGroup = {\n filters: [],\n deviceIds: [],\n ...state.groups.byId[group]\n };\n state.groups.byId[group] = {\n ...maybeExistingGroup,\n deviceIds: [...maybeExistingGroup.deviceIds, ...deviceIds].filter(duplicateFilter),\n total: (maybeExistingGroup.total || 0) + 1\n };\n },\n removeFromGroup: (state, action: PayloadAction<{ deviceIds: string[]; group: string }>) => {\n const { group, deviceIds: removedIds } = action.payload;\n const { deviceIds = [], total = 0, ...maybeExistingGroup } = state.groups.byId[group] || {};\n const changedGroup = {\n ...maybeExistingGroup,\n deviceIds: deviceIds.filter(id => !removedIds.includes(id)),\n total: Math.max(total - removedIds.length, 0)\n };\n if (changedGroup.total || changedGroup.deviceIds.length) {\n state.groups.byId[group] = changedGroup;\n return;\n } else if (state.groups.selectedGroup === group) {\n state.groups.selectedGroup = undefined;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [group]: removal, ...remainingById } = state.groups.byId;\n state.groups.byId = remainingById;\n },\n addGroup: (state, action: PayloadAction<{ group: DeviceGroup; groupName: string }>) => {\n const { groupName, group } = action.payload;\n state.groups.byId[groupName] = {\n ...state.groups.byId[groupName],\n ...group\n };\n },\n selectGroup: (state, { payload: group }: PayloadAction<string | undefined>) => {\n state.deviceList.deviceIds =\n group && state.groups.byId[group] && state.groups.byId[group].deviceIds && state.groups.byId[group].deviceIds.length > 0\n ? state.groups.byId[group].deviceIds\n : [];\n state.groups.selectedGroup = group;\n },\n removeGroup: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: removal, ...remainingById } = state.groups.byId;\n state.groups.byId = remainingById;\n state.groups.selectedGroup = state.groups.selectedGroup === action.payload ? undefined : state.groups.selectedGroup;\n },\n setDeviceListState: (state, action: PayloadAction<Partial<DeviceListState>>) => {\n state.deviceList = {\n ...state.deviceList,\n ...action.payload,\n sort: {\n ...state.deviceList.sort,\n ...action.payload.sort\n }\n };\n },\n setFilterAttributes: (state, action: PayloadAction<FilteringAttributes>) => {\n state.filteringAttributes = action.payload;\n },\n setFilterablesConfig: (state, action: PayloadAction<FilteringAttributesConfig>) => {\n state.filteringAttributesConfig = action.payload;\n },\n receivedDevices: (state, action: PayloadAction<Record<string, Device>>) => {\n state.byId = {\n ...state.byId,\n ...action.payload\n };\n },\n setDeviceFilters: (state, action: PayloadAction<DeviceFilter[]>) => {\n if (deepCompare(action.payload, state.filters)) {\n return;\n }\n state.filters = action.payload.filter(filter => filter.key && filter.operator && filter.scope && typeof filter.value !== 'undefined');\n },\n setDeviceReports: (state, action: PayloadAction<DeviceReport[]>) => {\n state.reports = action.payload;\n },\n setDevicesByStatus: (state, action: PayloadAction<{ deviceIds: string[]; status: DeviceAuthState; total: number }>) => {\n const { status, total, deviceIds } = action.payload;\n if (total) {\n state.byStatus[status].deviceIds = deviceIds;\n state.byStatus[status].counts.total = total;\n }\n },\n setDevicesCountByStatus: (state, action: PayloadAction<{ countsPerTier: DeviceTierLimits; status: DeviceAuthState }>) => {\n const { countsPerTier, status } = action.payload;\n state.byStatus[status].counts = { ...countsPerTier, total: Object.values(countsPerTier).reduce((accu, tieredCount) => (accu += tieredCount), 0) };\n },\n setDeviceLimits: (state, action: PayloadAction<DeviceTierLimits>) => {\n state.limits = action.payload;\n },\n receivedDevice: (state, action: PayloadAction<{ id: string } & Partial<Device>>) => {\n state.byId[action.payload.id] = {\n ...state.byId[action.payload.id],\n ...action.payload\n };\n },\n maybeUpdateDevicesByStatus: (state, action: PayloadAction<{ authId?: string; deviceId: string }>) => {\n const { deviceId, authId } = action.payload;\n const device = state.byId[deviceId];\n const hasMultipleAuthSets = authId && device.auth_sets ? device.auth_sets.filter(authset => authset.id !== authId).length > 0 : false;\n if (!hasMultipleAuthSets && (Object.values(DEVICE_STATES) as string[]).includes(device.status)) {\n const deviceIds = state.byStatus[device.status].deviceIds.filter(id => id !== deviceId);\n const deviceTier = (device.attributes.tier as string) || 'standard';\n state.byStatus[device.status] = {\n deviceIds,\n counts: {\n ...state.byStatus[device.status].counts,\n [deviceTier]: Math.max(0, state.byStatus[device.status].counts[deviceTier] - 1),\n total: Math.max(0, state.byStatus[device.status].counts.total - 1)\n }\n };\n }\n }\n }\n});\n\nexport const actions = devicesSlice.actions;\nexport default devicesSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { Alert } from '@northern.tech/types/MenderTypes';\nimport { createSlice } from '@reduxjs/toolkit';\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\nimport type { DeviceIssueOptionKey } from '../constants';\nimport { DEVICE_ISSUE_OPTIONS, DEVICE_LIST_DEFAULTS, alertChannels } from '../constants';\nimport type { AlertChannelKey } from './constants';\n\nexport const sliceName = 'monitor';\ntype IssueCounts = Record<DeviceIssueOptionKey, { filtered: number; total: number }>;\ntype ChannelSettings = Record<AlertChannelKey, { enabled: boolean }>;\ntype SanitizedAlert = Alert & { fullName?: string };\n\nexport type MonitorSliceType = {\n alerts: {\n alertList: {\n page: number;\n perPage: number;\n total: number;\n };\n byDeviceId: { alerts?: Record<string, SanitizedAlert>; latest?: Record<string, SanitizedAlert> };\n };\n issueCounts: { byType: IssueCounts };\n settings: {\n global: {\n channels: ChannelSettings;\n };\n };\n};\nexport const initialState: MonitorSliceType = {\n alerts: {\n alertList: { ...DEVICE_LIST_DEFAULTS, total: 0 },\n byDeviceId: {}\n },\n issueCounts: {\n byType: Object.keys(DEVICE_ISSUE_OPTIONS).reduce<IssueCounts>((accu, key) => ({ ...accu, [key]: { filtered: 0, total: 0 } }), {} as IssueCounts)\n },\n settings: {\n global: {\n channels: {\n ...Object.keys(alertChannels).reduce((accu, item) => ({ ...accu, [item]: { enabled: true } }), {} as ChannelSettings)\n }\n }\n }\n};\n\nexport const monitorSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n changeAlertChannel: (state, action: PayloadAction<{ channel: AlertChannelKey; enabled: boolean }>) => {\n const { channel, enabled } = action.payload;\n state.settings.global.channels[channel] = { enabled };\n },\n receiveDeviceAlerts: (state, action: PayloadAction<{ alerts: SanitizedAlert[]; deviceId: string }>) => {\n const { deviceId, alerts } = action.payload;\n state.alerts.byDeviceId[deviceId] = { alerts };\n },\n receiveLatestDeviceAlerts: (state, action: PayloadAction<{ alerts: SanitizedAlert[]; deviceId: string }>) => {\n const { deviceId, alerts } = action.payload;\n state.alerts.byDeviceId[deviceId] = { ...state.alerts.byDeviceId[deviceId], latest: alerts };\n },\n receiveDeviceIssueCounts: (state, action: PayloadAction<{ counts: { filtered: number; total: number }; issueType: DeviceIssueOptionKey }>) => {\n const { issueType, counts } = action.payload;\n state.issueCounts.byType[issueType] = counts;\n },\n setAlertListState: (state, action) => {\n state.alerts.alertList = { ...state.alerts.alertList, ...action.payload };\n }\n }\n});\n\nexport const actions = monitorSlice.actions;\nexport default monitorSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nexport const sliceName = 'onboarding';\n\nexport type OnboardingApproach = 'virtual' | 'physical' | 'mcu';\n\nexport type OnboardingSliceType = {\n address?: string;\n approach: OnboardingApproach | null;\n complete: boolean;\n demoArtifactPort: number;\n deviceConnection?: string;\n deviceType: string[] | string | null;\n progress: string | null;\n showTips: boolean | null;\n showTipsDialog: boolean;\n};\n\nexport const initialState: OnboardingSliceType = {\n approach: null,\n complete: false,\n deviceType: null,\n demoArtifactPort: 85,\n progress: null,\n showTips: null,\n showTipsDialog: false\n};\n\nexport const onboardingSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n setOnboardingState: (state, action: PayloadAction<Partial<OnboardingSliceType>>) => ({ ...state, ...action.payload }),\n setDemoArtifactPort: (state, action: PayloadAction<number>) => {\n state.demoArtifactPort = action.payload;\n },\n setShowOnboardingHelp: (state, action: PayloadAction<boolean>) => {\n state.showTips = action.payload;\n },\n setShowDismissOnboardingTipsDialog: (state, action: PayloadAction<boolean>) => {\n state.showTipsDialog = action.payload;\n },\n setOnboardingComplete: (state, action: PayloadAction<boolean>) => {\n state.complete = action.payload;\n },\n setOnboardingProgress: (state, action: PayloadAction<string>) => {\n state.progress = action.payload;\n },\n setOnboardingDeviceType: (state, action: PayloadAction<string[] | string>) => {\n state.deviceType = action.payload;\n },\n setOnboardingApproach: (state, action: PayloadAction<OnboardingApproach>) => {\n state.approach = action.payload;\n }\n }\n});\n\nexport const actions = onboardingSlice.actions;\nexport default onboardingSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { AuditLog as AuditLogEvent, BillingProfile, Integration, Event as WebhookEvent } from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TENANT_LIST_DEFAULT } from '../constants';\nimport type { AuditLog, AuditLogSelectionState, Card, Organization, ProductConfig, SSOConfig, TenantList, Webhook } from './types';\n\nexport const sliceName = 'organization';\n\nexport type OrganizationSliceType = {\n auditlog: AuditLog;\n card: Card;\n externalDeviceIntegrations: Integration[];\n intentId: string | null;\n organization: Partial<Organization>;\n products?: ProductConfig;\n ssoConfigs: SSOConfig[];\n tenantList: TenantList;\n webhooks: Webhook;\n};\n\nexport const initialState: OrganizationSliceType = {\n card: {\n last4: '',\n expiration: { month: 1, year: 2020 },\n brand: ''\n },\n intentId: null,\n tenantList: {\n ...TENANT_LIST_DEFAULT,\n total: 0,\n tenants: [],\n selectedTenant: null,\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'name'\n }\n },\n organization: {\n // id, name, status, tenant_token, plan\n },\n auditlog: {\n events: [],\n selectionState: {\n ...DEVICE_LIST_DEFAULTS,\n detail: undefined,\n endDate: undefined,\n selectedIssue: undefined,\n sort: { direction: SORTING_OPTIONS.desc },\n startDate: undefined,\n total: 0,\n type: undefined,\n user: undefined,\n isLoading: false\n }\n },\n externalDeviceIntegrations: [\n // { <connection_string|x509|...>, id, provider }\n ],\n ssoConfigs: [],\n webhooks: {\n // [id]: { events: [] }\n // for now:\n events: [],\n eventsTotal: 0\n }\n};\n\nexport const organizationSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receiveAuditLogs: (state, action: PayloadAction<{ events: AuditLogEvent[]; total: number }>) => {\n const { events, total } = action.payload;\n state.auditlog.events = events;\n state.auditlog.selectionState.total = total;\n },\n setAuditLogState: (state, action: PayloadAction<Partial<AuditLogSelectionState>>) => {\n state.auditlog.selectionState = {\n ...state.auditlog.selectionState,\n ...action.payload\n };\n },\n receiveCurrentCard: (state, action: PayloadAction<Card>) => {\n state.card = action.payload;\n },\n receiveSetupIntent: (state, action: PayloadAction<string | null>) => {\n state.intentId = action.payload;\n },\n setOrganization: (state, action: PayloadAction<Partial<Organization>>) => {\n state.organization = { ...state.organization, ...action.payload };\n },\n setSubscription: (state, action) => {\n state.organization.subscription = { ...state.organization.subscription, ...action.payload };\n },\n setProducts: (state, action: PayloadAction<ProductConfig>) => {\n state.products = action.payload;\n },\n setBillingProfile: (state, action: PayloadAction<BillingProfile>) => {\n state.organization.billing_profile = action.payload;\n },\n setTenantListState: (state, action: PayloadAction<TenantList>) => {\n state.tenantList = action.payload;\n },\n receiveExternalDeviceIntegrations: (state, action: PayloadAction<Integration[]>) => {\n state.externalDeviceIntegrations = action.payload;\n },\n receiveSsoConfigs: (state, action: PayloadAction<SSOConfig[]>) => {\n state.ssoConfigs = action.payload;\n },\n receiveWebhookEvents: (state, action: PayloadAction<{ total: number; value: WebhookEvent[] }>) => {\n const { value, total } = action.payload;\n state.webhooks.events = value;\n state.webhooks.eventsTotal = total;\n }\n }\n});\n\nexport const actions = organizationSlice.actions;\nexport default organizationSlice.reducer;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type {\n ArtifactV1 as BackendArtifactV1,\n ArtifactV2 as BackendArtifactV2,\n ReleaseV1 as BackendReleaseV1,\n ReleaseV2 as BackendReleaseV2,\n Update as BackendUpdate,\n DeltaJobDetailsItem,\n DeltaJobsListItem\n} from '@northern.tech/types/MenderTypes';\nimport type { PayloadAction } from '@reduxjs/toolkit';\nimport { createSlice } from '@reduxjs/toolkit';\n\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS } from '../constants';\nimport type { SortOptions } from '../constants';\n\ntype Update = Omit<BackendUpdate, 'meta_data'>;\nexport type Artifact = Omit<BackendArtifactV1, 'updates'> &\n Omit<BackendArtifactV2, 'updates'> & { installCount?: number; updates?: Array<Update>; url?: string };\nexport type Release = BackendReleaseV1 & BackendReleaseV2 & { artifacts: Artifact[]; device_types_compatible: string[]; name: string };\n\nexport const sliceName = 'releases';\n\ntype EnhancedJobDetailsItem = DeltaJobDetailsItem & DeltaJobsListItem;\n\nexport type ReleasesList = {\n isLoading?: boolean;\n page: number;\n perPage: number;\n releaseIds: string[];\n searchedIds: string[];\n searchOnly?: boolean;\n searchTerm: string;\n searchTotal: number;\n selectedTags: string[];\n selection: number[];\n sort?: SortOptions;\n tab?: 'releases' | 'delta';\n total: number;\n type: string;\n};\n\nexport type ReleaseSliceType = {\n artifacts: never[];\n byId: Record<string, Release>;\n deltaJobs: Record<string, EnhancedJobDetailsItem>;\n deltaJobsList: {\n jobIds: string[];\n page: number;\n perPage: number;\n sort?: SortOptions;\n total: 0;\n };\n releasesList: ReleasesList;\n selectedJob: string | null;\n selectedRelease: string | null;\n tags: string[];\n updateTypes: string[];\n};\n\nexport const initialState: ReleaseSliceType = {\n /*\n * Return list of saved artifacts objects\n */\n /*\n * return list of artifacts where duplicate names are collated with device compatibility lists combined\n */\n // artifacts: AppStore.getCollatedArtifacts(AppStore.getArtifactsRepo()),\n artifacts: [],\n /*\n * Return list of saved release objects\n */\n byId: {\n /*\n [releaseName]: {\n artifacts: [\n {\n id: '',\n name: '',\n description: '',\n device_types_compatible: [],\n ...\n updates: [{\n files: [\n { size: 123, name: '' }\n ],\n type_info: { type: '' }\n }],\n url: '' // optional\n }\n ],\n modified: ''\n device_types_compatible,\n name: '',\n tags: ['something'],\n notes: ''\n }\n */\n },\n deltaJobs: {\n /*\n [jobId]: {\n id: '',\n ...\n }\n */\n },\n deltaJobsList: {\n ...DEVICE_LIST_DEFAULTS,\n jobIds: [],\n total: 0,\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'started'\n }\n },\n releasesList: {\n ...DEVICE_LIST_DEFAULTS,\n searchedIds: [],\n releaseIds: [],\n selection: [],\n sort: {\n direction: SORTING_OPTIONS.desc,\n key: 'modified'\n },\n isLoading: undefined,\n searchTerm: '',\n searchTotal: 0,\n selectedTags: [],\n total: 0,\n type: ''\n },\n tags: [],\n updateTypes: [],\n selectedJob: null,\n /*\n * Return single release with corresponding Artifacts\n */\n selectedRelease: null\n};\n\nexport const releaseSlice = createSlice({\n name: sliceName,\n initialState,\n reducers: {\n receiveRelease: (state, action: PayloadAction<Release>) => {\n const { name } = action.payload;\n state.byId[name] = action.payload;\n },\n receiveReleases: (state, action: PayloadAction<Record<string, Release>>) => {\n state.byId = action.payload;\n },\n receiveReleaseTags: (state, action: PayloadAction<string[]>) => {\n state.tags = action.payload;\n },\n receiveReleaseTypes: (state, action: PayloadAction<string[]>) => {\n state.updateTypes = action.payload;\n },\n removeRelease: (state, action: PayloadAction<string>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [action.payload]: toBeRemoved, ...byId } = state.byId;\n state.byId = byId;\n state.selectedRelease = action.payload === state.selectedRelease ? null : state.selectedRelease;\n },\n selectedRelease: (state, action: PayloadAction<string | null>) => {\n state.selectedRelease = action.payload;\n },\n setReleaseListState: (state, action) => {\n state.releasesList = action.payload;\n },\n receivedDeltaJobs: (state, action) => {\n const { jobs, total } = action.payload;\n state.deltaJobs = jobs.reduce(\n (accu, job) => {\n accu[job.id] = {\n ...accu[job.id],\n ...job\n };\n return accu;\n },\n { ...state.deltaJobs }\n );\n state.deltaJobsList.jobIds = jobs.map(job => job.id);\n state.deltaJobsList.total = total;\n },\n receivedDeltaJobDetails: (state, action) => {\n const job: DeltaJobDetailsItem & { id: string } = action.payload;\n state.deltaJobs[job.id] = {\n ...state.deltaJobs[job.id],\n ...job\n };\n },\n setDeltaJobsListState: (state, action) => {\n state.deltaJobsList = { ...state.deltaJobsList, ...action.payload };\n },\n setSelectedJob: (state, action) => {\n state.selectedJob = action.payload;\n }\n }\n});\n\nexport const actions = releaseSlice.actions;\nexport default releaseSlice.reducer;\n","// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { actions as appActions } from './appSlice';\nimport { actions as deploymentActions } from './deploymentsSlice';\nimport { actions as devicesActions } from './devicesSlice';\nimport { actions as monitorActions } from './monitorSlice';\nimport { actions as onboardingActions } from './onboardingSlice';\nimport { actions as organizationActions } from './organizationSlice';\nimport { actions as releaseActions } from './releasesSlice';\nimport { actions as userActions } from './usersSlice';\n\nexport default {\n ...appActions,\n ...deploymentActions,\n ...devicesActions,\n ...monitorActions,\n ...onboardingActions,\n ...organizationActions,\n ...releaseActions,\n ...userActions\n};\n","// Copyright 2017 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 axios, { isCancel } from 'axios';\nimport Cookies from 'universal-cookie';\n\nimport { cleanUp, getToken } from '../auth';\nimport { TIMEOUTS } from '../constants';\n\nconst cookies = new Cookies();\n\nconst unauthorizedRedirect = error => {\n if (!isCancel(error) && error.response?.status === 401 && getToken() && !window.location.pathname.endsWith('/subscription')) {\n // a new jwt might have been set by sso while the current request was in-flight with an old token\n // => reload instead of logging out\n if (cookies.get('JWT', { doNotParse: true })) {\n window.location.reload();\n return Promise.reject(error);\n }\n cleanUp();\n window.location.replace('/ui/');\n }\n return Promise.reject(error);\n};\n\nexport const commonRequestConfig = { timeout: TIMEOUTS.refreshDefault, headers: { 'Content-Type': 'application/json' } };\n\nexport const authenticatedRequest = axios.create(commonRequestConfig);\nauthenticatedRequest.interceptors.response.use(res => res, unauthorizedRedirect);\nauthenticatedRequest.interceptors.request.use(\n config => ({ ...config, headers: { ...config.headers, Authorization: `Bearer ${getToken()}` } }),\n error => Promise.reject(error)\n);\n\nconst Api = {\n get: authenticatedRequest.get,\n delete: (url, data?) => authenticatedRequest.request({ method: 'delete', url, data }),\n patch: authenticatedRequest.patch,\n post: authenticatedRequest.post,\n postUnauthorized: (url, data, config = {}) => axios.post(url, data, { ...commonRequestConfig, ...config }),\n put: authenticatedRequest.put,\n upload: (url, formData, progress, cancelSignal) =>\n authenticatedRequest.post(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: progress,\n timeout: 0,\n signal: cancelSignal\n }),\n uploadPut: (url, formData, progress, cancelSignal) =>\n authenticatedRequest.put(url, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: progress,\n timeout: 0,\n signal: cancelSignal\n })\n};\n\nexport default Api;\n","// Copyright 2016 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport Cookies from 'universal-cookie';\n\nimport { TIMEOUTS, maxSessionAge } from './constants';\nimport type { UserSession } from './usersSlice';\n\nconst cookies = new Cookies();\n\nconst emptySession = Object.freeze({ token: '', expiresAt: undefined }) as Readonly<UserSession>;\n\nlet tokenCache = '';\n\nexport const getSessionInfo = (): UserSession => {\n let sessionInfo = { ...emptySession } as UserSession;\n try {\n sessionInfo = JSON.parse(window.localStorage.getItem('JWT') ?? '');\n } catch {\n // most likely not logged in - nothing to do here\n }\n\n // check for cookie first to handles sso login while an old/expired token may still exist in cache/ localStorage\n const jwtTokenFromCookie = cookies.get('JWT', { doNotParse: true }) ?? '';\n if (jwtTokenFromCookie) {\n setSessionInfo({ token: jwtTokenFromCookie });\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n return { token: jwtTokenFromCookie, expiresAt: undefined };\n }\n if (sessionInfo.expiresAt && new Date(sessionInfo.expiresAt) < new Date()) {\n cleanUp();\n return { ...emptySession };\n }\n sessionInfo.token = sessionInfo.token || '';\n tokenCache = sessionInfo.token;\n return sessionInfo;\n};\n\nexport const getToken = () => (tokenCache ? tokenCache : getSessionInfo().token);\n\nexport const setSessionInfo = ({ token, expiresAt }: UserSession) => {\n tokenCache = token;\n window.localStorage.setItem('JWT', JSON.stringify({ token, expiresAt }));\n};\n\nexport const cleanUp = () => {\n tokenCache = '';\n cookies.remove('JWT');\n cookies.remove('JWT', { path: '/' });\n window.localStorage.removeItem('JWT');\n window.localStorage.removeItem('oauth');\n};\n\nexport const updateMaxAge = ({ expiresAt, token }) => {\n const oAuthExpiration = Number(window.localStorage.getItem('oauth'));\n let updateWithOAuth = false;\n if (oAuthExpiration) {\n const soon = Date.now() + maxSessionAge * TIMEOUTS.oneSecond;\n updateWithOAuth = oAuthExpiration <= soon;\n if (updateWithOAuth) {\n window.localStorage.removeItem('oauth');\n }\n }\n if (token && expiresAt && (!oAuthExpiration || updateWithOAuth)) {\n const expiration = new Date();\n expiration.setSeconds(expiration.getSeconds() + maxSessionAge);\n setSessionInfo({ token, expiresAt: expiration.toISOString() });\n }\n};\n","// Copyright 2016 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport axios from 'axios';\n\nimport { getToken } from '../auth';\nimport { commonRequestConfig } from './general-api';\n\ntype PostLoginBody = {\n email: string;\n no_expiry?: boolean;\n password?: string;\n token2fa?: string;\n};\n\nconst Api = {\n postLogin: (url: string, { email: username, password, ...body }: PostLoginBody) =>\n axios\n // @ts-ignore\n .post(url, body, { ...commonRequestConfig, auth: { username, password } })\n .then(res => ({ text: res.data, code: res.status, contentType: res.headers?.['content-type'] })),\n putVerifyTFA: (url, userData) => {\n let body = {};\n if (userData.hasOwnProperty('token2fa')) {\n body = { token2fa: userData.token2fa };\n }\n return axios.put(url, body, { ...commonRequestConfig, headers: { ...commonRequestConfig.headers, Authorization: `Bearer ${getToken()}` } });\n }\n};\n\nexport default Api;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { versionCompare } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { RootState } from '../store';\n\nexport const getDocsVersion = (state: RootState) => state.app.docsVersion;\nexport const getFeatures = (state: RootState) => state.app.features;\nexport const getFullVersionInformation = (state: RootState) => state.app.versionInformation;\nexport const getSearchState = (state: RootState) => state.app.searchState;\nexport const getUploads = (state: RootState) => state.app.uploadsById;\nexport const getSnackbar = (state: RootState) => state.app.snackbar;\nexport const getHostAddress = (state: RootState) => state.app.hostAddress;\nexport const getHostedAnnouncement = (state: RootState) => state.app.hostedAnnouncement;\nexport const getRecaptchaKey = (state: RootState) => state.app.recaptchaSiteKey;\nexport const getStripeKey = (state: RootState) => state.app.stripeAPIKey;\nexport const getTrackerCode = (state: RootState) => state.app.trackerCode;\nexport const getSentryConfig = (state: RootState) => state.app.sentry;\nexport const getCommit = (state: RootState) => state.app.commit;\nexport const getIsFirstLogin = (state: RootState) => state.app.firstLoginAfterSignup;\nexport const getFeedbackProbability = (state: RootState) => state.app.feedbackProbability;\nexport const getAppInitDone = (state: RootState) => state.app.appInitDone;\n\nexport const getIsUploading = createSelector([getUploads], uploadsById => !!Object.keys(uploadsById).length);\nexport const getSearchedDevices = createSelector([getSearchState], ({ deviceIds }) => deviceIds);\nexport const getVersionInformation = createSelector([getFullVersionInformation, getFeatures], ({ Integration, ...remainder }, { isHosted }) =>\n isHosted && Integration !== 'next' ? remainder : { ...remainder, Integration }\n);\nexport const getIsPreview = createSelector([getFullVersionInformation], ({ Integration }) => versionCompare(Integration, 'next') > -1);\n","// 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 { ALL_DEVICES, ATTRIBUTE_SCOPES, DEVICE_ISSUE_OPTIONS, rolesById, rolesByName, serviceProviderRolesById, uiPermissionsById } 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 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([getTenantCapabilities, getIssueCountsByType], ({ hasFullFiltering, hasMonitor }, issueCounts) =>\n Object.values(DEVICE_ISSUE_OPTIONS).reduce((accu, { isCategory, key, needsFullFiltering, needsMonitor, title }) => {\n if (isCategory || (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 isOAuth2 = !!currentUser?.sso?.length;\n const userVerified = !!currentUser.verified;\n\n const isHosted = features?.isHosted;\n const canHave2FA = isEnterprise || isHosted;\n const secureOAuthUser = isOAuth2 && userVerified;\n if (!currentUser || !settingsInitialized || has2FA || !canHave2FA || secureOAuthUser) {\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","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { Deployment } from '.';\nimport type { RootState } from '../store';\nimport { DEPLOYMENT_STATES } from './constants';\n\nexport const getDeploymentsById = (state: RootState) => state.deployments.byId;\nexport const getDeploymentsByStatus = (state: RootState) => state.deployments.byStatus;\nexport const getSelectedDeploymentDeviceIds = (state: RootState) => state.deployments.selectedDeviceIds;\nexport const getDeploymentsSelectionState = (state: RootState) => state.deployments.selectionState;\n\nexport const getDeploymentById = createSelector(\n [getDeploymentsById, (_, deploymentId) => deploymentId],\n (deploymentsById, deploymentId = '') => deploymentsById[deploymentId]\n);\n\nexport const getMappedDeploymentSelection = createSelector(\n [getDeploymentsSelectionState, (_, deploymentsState) => deploymentsState, getDeploymentsById],\n (selectionState, deploymentsState, deploymentsById) => {\n const { selection = [] } = selectionState[deploymentsState] ?? {};\n return selection.reduce((accu, id) => {\n if (deploymentsById[id]) {\n accu.push(deploymentsById[id]);\n }\n return accu;\n }, []);\n }\n);\n\nconst relevantDeploymentStates = [DEPLOYMENT_STATES.pending, DEPLOYMENT_STATES.inprogress, DEPLOYMENT_STATES.finished] as const;\nexport const DEPLOYMENT_CUTOFF = 3;\nexport const getRecentDeployments = createSelector([getDeploymentsById, getDeploymentsByStatus], (deploymentsById, deploymentsByStatus) =>\n Object.entries(deploymentsByStatus).reduce(\n (accu, [state, byStatus]) => {\n if (!relevantDeploymentStates.includes(state as (typeof relevantDeploymentStates)[number]) || !byStatus.deploymentIds.length) {\n return accu;\n }\n accu[state] = byStatus.deploymentIds\n .reduce<Deployment[]>((accu, id) => {\n if (deploymentsById[id]) {\n accu.push(deploymentsById[id]);\n }\n return accu;\n }, [])\n .slice(0, DEPLOYMENT_CUTOFF);\n accu.total += byStatus.total;\n return accu;\n },\n { total: 0 }\n )\n);\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { duplicateFilter } from '@northern.tech/utils/helpers';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { DeviceFilter, DeviceGroup } from '.';\nimport type { DeviceAuthState } from '../constants';\nimport { DEVICE_STATES, UNGROUPED_GROUP } from '../constants';\nimport type { RootState } from '../store';\n\nexport const getAcceptedDevices = (state: RootState) => state.devices.byStatus.accepted;\nexport const getDevicesByStatus = (state: RootState) => state.devices.byStatus;\nexport const getDevicesById = (state: RootState) => state.devices.byId;\nexport const getDeviceReports = (state: RootState) => state.devices.reports;\nexport const getGroupsById = (state: RootState) => state.devices.groups.byId;\nexport const getSelectedGroup = (state: RootState) => state.devices.groups.selectedGroup;\n\nexport const getDeviceListState = (state: RootState) => state.devices.deviceList;\nexport const getListedDevices = (state: RootState) => state.devices.deviceList.deviceIds;\nexport const getFilteringAttributes = (state: RootState) => state.devices.filteringAttributes;\nexport const getDeviceFilters = (state: RootState) => state.devices.filters || [];\nconst getFilteringAttributesFromConfig = (state: RootState) => state.devices.filteringAttributesConfig.attributes;\nexport const getSortedFilteringAttributes = createSelector([getFilteringAttributes], filteringAttributes => ({\n ...filteringAttributes,\n identityAttributes: [...filteringAttributes.identityAttributes, 'id']\n}));\nexport const getDeviceLimits = (state: RootState) => state.devices.limits;\nconst getFilteringAttributesLimit = (state: RootState) => state.devices.filteringAttributesLimit;\n\nexport const getDeviceIdentityAttributes = createSelector(\n [getFilteringAttributes, getFilteringAttributesLimit],\n ({ identityAttributes }, filteringAttributesLimit) => {\n // limit the selection of the available attribute to AVAILABLE_ATTRIBUTE_LIMIT\n const attributes = identityAttributes.slice(0, filteringAttributesLimit);\n return attributes.reduce(\n (accu, value) => {\n accu.push({ value, label: value, scope: 'identity' });\n return accu;\n },\n [\n { value: 'name', label: 'Name', scope: 'tags' },\n { value: 'id', label: 'Device ID', scope: 'identity' }\n ]\n );\n }\n);\n\nexport const getDeviceCountsByStatus = createSelector([getDevicesByStatus], byStatus =>\n Object.values(DEVICE_STATES).reduce<Record<DeviceAuthState, number>>(\n (accu, deviceState) => {\n const { counts } = byStatus[deviceState];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { total, ...tieredCounts } = counts;\n const count = Object.values(tieredCounts).reduce((accu, countPerTier) => accu + countPerTier, 0);\n accu[deviceState] = count;\n accu.total = accu.total + count;\n return accu;\n },\n { total: 0 }\n )\n);\n\nexport const getDeviceById = createSelector([getDevicesById, (_, deviceId) => deviceId], (devicesById, deviceId = '') => devicesById[deviceId] ?? {});\n\nexport const getSelectedGroupInfo = createSelector(\n [getDeviceCountsByStatus, getGroupsById, getSelectedGroup],\n ({ accepted: acceptedDeviceTotal }, groupsById, selectedGroup) => {\n let groupCount = acceptedDeviceTotal;\n let groupFilters: DeviceFilter[] = [];\n if (selectedGroup && groupsById[selectedGroup]) {\n groupCount = groupsById[selectedGroup].total || 0;\n groupFilters = groupsById[selectedGroup].filters || [];\n }\n return { groupCount, selectedGroup, groupFilters };\n }\n);\n\nexport const getCombinedLimit = createSelector(\n [getDeviceLimits],\n deviceLimits => Object.values(deviceLimits).reduce((accu, limit) => accu + Math.max(limit ?? 0, 0), 0) // limit might be -1 for unlimited devices\n);\n\nexport const getLimitMaxed = createSelector(\n [getDeviceCountsByStatus, getCombinedLimit],\n ({ accepted: acceptedDevices }, combinedLimit) => !!combinedLimit && combinedLimit <= acceptedDevices\n);\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport const getGroupsByIdWithoutUngrouped = createSelector([getGroupsById], ({ [UNGROUPED_GROUP.id]: ungrouped, ...groups }) => groups);\n\nexport const getGroupData = createSelector([getGroupsByIdWithoutUngrouped], groups => {\n const createdGroup = Object.keys(groups).length ? Object.keys(groups)[0] : undefined;\n const hasDynamicGroups = Object.values(groups).some(group => !!group.id);\n return { createdGroup, hasDynamicGroups, groups };\n});\n\ntype SelectorGroup = DeviceGroup & { groupId: string };\ntype SelectorGroups = { dynamic: SelectorGroup[]; static: SelectorGroup[]; ungrouped: SelectorGroup[] };\n\nexport const getGroups = createSelector([getGroupsById], groupsById => {\n const groupNames = Object.keys(groupsById).sort();\n const groupedGroups = Object.entries(groupsById)\n .sort((a, b) => a[0].localeCompare(b[0]))\n .reduce<SelectorGroups>(\n (accu, [groupname, group]) => {\n const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;\n const groupItem = { ...group, groupId: name, name: groupname };\n if ((group.filters ?? []).length > 0) {\n if (groupname !== UNGROUPED_GROUP.id) {\n accu.dynamic.push(groupItem);\n } else {\n accu.ungrouped.push(groupItem);\n }\n } else {\n accu.static.push(groupItem);\n }\n return accu;\n },\n { dynamic: [], static: [], ungrouped: [] }\n );\n return { groupNames, ...groupedGroups };\n});\nexport const getAttributesList = createSelector(\n [getFilteringAttributes, getFilteringAttributesFromConfig],\n ({ identityAttributes = [], inventoryAttributes = [] }, { identity = [], inventory = [] }) =>\n [...identityAttributes, ...inventoryAttributes, ...identity, ...inventory].filter(duplicateFilter)\n);\nconst getEnabledTierLimits = createSelector([getDeviceLimits], limits => Object.entries(limits).filter(([, limit]) => limit !== 0));\n\nexport const getEnabledTiers = createSelector([getEnabledTierLimits], enabledTierLimits => enabledTierLimits.map(([type]) => type));\n\nexport const getDeviceLimitStats = createSelector([getEnabledTierLimits, getAcceptedDevices], (enabledTierLimits, accepted) => {\n const { counts } = accepted;\n return enabledTierLimits.map(([type, limit]) => ({\n type,\n limit,\n total: counts[type] || 0\n }));\n});\n\nexport const getDeviceTypes = createSelector([getAcceptedDevices, getDevicesById], ({ deviceIds = [] }, devicesById) =>\n Object.keys(\n deviceIds.slice(0, 200).reduce((accu, item) => {\n const { device_type: deviceTypes = [] } = devicesById[item] ? devicesById[item].attributes : {};\n accu = deviceTypes.reduce((deviceTypeAccu, deviceType) => {\n if (deviceType.length > 1) {\n deviceTypeAccu[deviceType] = deviceTypeAccu[deviceType] ? deviceTypeAccu[deviceType] + 1 : 1;\n }\n return deviceTypeAccu;\n }, accu);\n return accu;\n }, {})\n )\n);\n","// Copyright 2023 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\nexport const getIssueCountsByType = state => state.monitor.issueCounts.byType;\n","// Copyright 2023 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\nexport const getOnboarding = state => state.onboarding;\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { Tenant } from '@northern.tech/types/MenderTypes';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { EXTERNAL_PROVIDER, productOrder } from '../constants';\nimport type { RootState } from '../store';\n\nexport const getOrganization = (state: RootState) => state.organization.organization;\nexport const getProducts = (state: RootState) => state.organization.products;\nexport const getExternalIntegrations = (state: RootState) => state.organization.externalDeviceIntegrations;\nexport const getAuditlogState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getAuditLog = (state: RootState) => state.organization.auditlog.events;\nexport const getAuditLogSelectionState = (state: RootState) => state.organization.auditlog.selectionState;\nexport const getBillingProfile = (state: RootState) => state.organization.organization.billing_profile;\nexport const getSubscription = (state: RootState) => state.organization.organization.subscription;\nexport const getCard = (state: RootState) => state.organization.card;\nexport const getSsoConfig = ({ organization: { ssoConfigs = [] } }: RootState) => ssoConfigs[0];\nexport const getTenantsList = (state: RootState) => state.organization.tenantList;\nexport const getWebhookEvents = (state: RootState) => state.organization.webhooks.events;\nexport const getWebhookEventTotal = (state: RootState) => state.organization.webhooks.eventsTotal;\n\nexport const getDeviceTwinIntegrations = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && EXTERNAL_PROVIDER[integration.provider]?.deviceTwin)\n);\nexport const getIsServiceProvider = (state: RootState) => state.organization.organization.service_provider;\n\nexport const getWebhooks = createSelector([getExternalIntegrations], integrations =>\n integrations.filter(integration => integration.id && integration.provider === EXTERNAL_PROVIDER.webhook.provider)\n);\nexport const getWebhookEventInfo = createSelector([getWebhooks, getWebhookEvents, getWebhookEventTotal], (webhooks, events, eventTotal) =>\n webhooks.length ? { events, eventTotal } : { events: [], eventTotal: 0 }\n);\n\nexport const getAuditLogEntry = createSelector([getAuditLog, getAuditLogSelectionState], (events, { selectedId }) => {\n if (!selectedId) {\n return;\n }\n const [eventAction, eventTime] = atob(selectedId).split('|');\n return events.find(item => item.action === eventAction && item.time === eventTime);\n});\n\nconst toTierName = (key: string) => key.replace(/max_|_?devices/g, '') || 'standard';\nconst processDeviceLimits = (deviceLimits: Tenant['device_limits'], skipFilter = false) => {\n const result: { disabled: string[]; limits: Record<string, object> } = { limits: {}, disabled: [] };\n if (!deviceLimits) return result;\n const tiersByName = Object.fromEntries(Object.entries(deviceLimits).map(([key, limit]) => [toTierName(key), { key, limit }]));\n return productOrder.reduce((accu, tierName) => {\n const entry = tiersByName[tierName];\n if (!entry) return accu;\n const { key, limit } = entry;\n if (limit.value === 0) {\n accu.disabled.push(tierName);\n if (!skipFilter) return accu;\n }\n accu.limits[tierName] = {\n id: tierName,\n backendId: key,\n limit: limit.value,\n current: limit.current_value,\n name: tierName,\n quotaLeft: Math.max(limit.value - limit.current_value, 0),\n limitReached: limit.value !== -1 && limit.value <= limit.current_value\n };\n return accu;\n }, result);\n};\nconst getDeviceLimitsInfo = createSelector([getOrganization], ({ device_limits }) => processDeviceLimits(device_limits));\nexport const getDisabledTiers = createSelector([getDeviceLimitsInfo], ({ disabled }) => disabled);\nexport const getSpLimits = createSelector([getDeviceLimitsInfo], ({ limits }) => limits);\nexport const getTenantListWithLimits = createSelector([getTenantsList], tenantList => ({\n ...tenantList,\n tenants: tenantList.tenants.map(tenant => ({\n ...tenant,\n device_limits: processDeviceLimits(tenant.device_limits, true).limits\n }))\n}));\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { ReleaseV2 } from '@northern.tech/types/MenderTypes';\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport type { RootState } from '../store';\nimport { listItemMapper } from '../utils';\n\nconst getSelectedReleaseId = (state: RootState) => state.releases.selectedRelease;\nexport const getReleasesById = (state: RootState) => state.releases.byId;\nexport const getReleaseTags = (state: RootState) => state.releases.tags;\nexport const getReleaseListState = (state: RootState) => state.releases.releasesList;\nconst getListedReleases = (state: RootState) => state.releases.releasesList.releaseIds;\nexport const getUpdateTypes = (state: RootState) => state.releases.updateTypes;\nconst releaseDefaults = {};\nconst getReleaseMappingDefaults = () => releaseDefaults;\nexport const getReleasesList = createSelector([getReleasesById, getListedReleases, getReleaseMappingDefaults], listItemMapper<ReleaseV2>);\n\nexport const getReleaseTagsById = createSelector([getReleaseTags], releaseTags => releaseTags.reduce((accu, key) => ({ ...accu, [key]: key }), {}));\nexport const getHasReleases = createSelector(\n [getReleaseListState, getReleasesById],\n ({ searchTotal, total }, byId) => !!(Object.keys(byId).length || total || searchTotal)\n);\n\nexport const getSelectedRelease = createSelector([getReleasesById, getSelectedReleaseId], (byId, id) => byId[id || ''] ?? {});\n\nexport const getSelectedReleases = createSelector([getReleaseListState, getReleasesList], ({ selection }, releases) => selection.map(index => releases[index]));\n\nexport const getDeltaJobsListState = (state: RootState) => state.releases.deltaJobsList;\nexport const getDeltaJobsById = (state: RootState) => state.releases.deltaJobs;\nexport const getDeltaJobById = createSelector([getDeltaJobsById, (_, jobId) => jobId], (byId, jobId: string) => byId[jobId]);\nconst getSelectedJobId = (state: RootState) => state.releases.selectedJob;\nexport const getSelectedJob = createSelector([getDeltaJobsById, getSelectedJobId], (byId, jobId) => byId[jobId || '']);\n","// Copyright 2024 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// @ts-nocheck\nimport type { DeviceAttribute } from '@northern.tech/types/DeviceAttribute';\nimport type { Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\n\nimport type { DeviceIssueOptionKey } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: val => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: val => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\nconst filterAliases = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\nexport const mapFiltersToTerms = filters =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: filterProcessors.hasOwnProperty(filter.operator) ? filterProcessors[filter.operator](filter.value) : filter.value\n }));\nexport const mapTermsToFilters = terms =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = aliasedFilter ? aliasedFilter[0] : term.type;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value };\n });\n\nconst convertIssueOptionsToFilters = (issuesSelection, filtersState = {}) =>\n issuesSelection.map(item => {\n if (typeof DEVICE_ISSUE_OPTIONS[item].filterRule.value === 'function') {\n return { ...DEVICE_ISSUE_OPTIONS[item].filterRule, value: DEVICE_ISSUE_OPTIONS[item].filterRule.value(filtersState) };\n }\n return DEVICE_ISSUE_OPTIONS[item].filterRule;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(\n ({ filterRule }) => filter.scope !== 'inventory' && filterRule.scope === filter.scope && filterRule.key === filter.key\n )\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter, item) => Object.keys(emptyFilter).every(key => item[key]?.toString() === filter[key]?.toString());\n\nexport const filtersFilter = (item, index, array) => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const listItemMapper = <T>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} }: { cutOffSize?: number; defaultObject?: T }\n): T[] =>\n ids.slice(0, cutOffSize).reduce((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\nexport const mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) =>\n Object.entries(existingPermissions).reduce(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...accu[key]].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value });\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles, roles) =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }) => {\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport const extractErrorMessage = (err, fallback = '') =>\n err.response?.data?.error?.message || err.response?.data?.error || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software, fallback) =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = version => (isNaN(version.charAt(0)) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = content => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport const groupDeploymentDevicesStats = deployment => {\n const deviceStatCollector = (deploymentStates, devices) =>\n Object.values(devices).reduce((accu, device) => (deploymentStates.includes(device.status) ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items, statistics) => items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\nexport const groupDeploymentStats = (deployment, withSkipped) => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let groupStates = deploymentStatesToSubstates;\n let result = {};\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = deployment => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\nexport const generateDeploymentGroupDetails = (filter, groupName) =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(filter => `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator].shortform} ${filter.value}`)\n .join(', ')})`\n : groupName;\n\nexport const mapDeviceAttributes = (\n attributes: DeviceAttribute[] = []\n): {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n} =>\n attributes.reduce(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n accu[attribute.scope || ATTRIBUTE_SCOPES.inventory] = {\n ...accu[attribute.scope || ATTRIBUTE_SCOPES.inventory],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = [].concat(attribute.value);\n }\n return accu;\n },\n { inventory: { device_type: [], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = mode => mode === DARK_MODE;\ntype Line = { addon?: string; amount: number; currency: string; description: string; product: 'mender_standard' | 'mender_micro'; quantity: number };\n\nexport const parseSubscriptionPreview = (lines: Line[]): Omit<PricePreview, 'total'> =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (limits, spLimits) =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const { backendId } = spLimits[key];\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n","// Copyright 2023 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { createSelector } from '@reduxjs/toolkit';\n\nimport { DEVICE_ONLINE_CUTOFF, defaultIdAttribute } from '../constants';\nimport { twoFAStates } from '../constants';\nimport type { RootState } from '../store';\nimport { isDarkMode } from '../utils';\nimport { READ_STATES } from './constants';\nimport type { User } from './index';\n\nconst emptyObject = {} as User;\n\nexport const getRolesById = (state: RootState) => state.users.rolesById;\nexport const getTooltipsById = (state: RootState) => state.users.tooltips.byId;\nexport const getGlobalSettings = (state: RootState) => state.users.globalSettings;\nexport const getGlobalSettingsInitialized = (state: RootState) => state.users.settingsInitialized;\nexport const getUserSettingsInitialized = (state: RootState) => state.users.userSettingsInitialized;\nconst getCurrentUserId = (state: RootState) => state.users.currentUser;\nexport const getUsersById = (state: RootState) => state.users.byId;\n\nexport const getUsersList = createSelector([getUsersById], usersById => Object.values(usersById));\nexport const getCurrentUser = createSelector([getUsersById, getCurrentUserId], (usersById, userId) =>\n userId ? (usersById[userId] ?? emptyObject) : emptyObject\n);\nexport const getUserSettings = (state: RootState) => state.users.userSettings;\nexport const getSelectedDeviceAttribute = createSelector([getUserSettings], ({ columnSelection }) =>\n columnSelection.map(attribute => ({ attribute: attribute.key, scope: attribute.scope }))\n);\nexport const getIsDarkMode = createSelector([getUserSettings], ({ mode }) => isDarkMode(mode));\n\nexport const getReadAllHelptips = createSelector([getTooltipsById], tooltips =>\n Object.values(tooltips).every(({ readState }) => readState === READ_STATES.read)\n);\n\nexport const getTooltipsState = createSelector([getTooltipsById, getUserSettings], (byId, { tooltips = {} }) =>\n Object.entries(byId).reduce(\n (accu, [id, value]) => {\n accu[id] = { ...accu[id], ...value };\n return accu;\n },\n { ...tooltips }\n )\n);\n\nexport const getHas2FA = createSelector(\n [getCurrentUser],\n currentUser => currentUser.hasOwnProperty('tfa_status') && (currentUser as User).tfa_status === twoFAStates.enabled\n);\n\nexport const getIdAttribute = createSelector([getGlobalSettings], ({ id_attribute = { ...defaultIdAttribute } }) => id_attribute);\n\nexport const getOfflineThresholdSettings = createSelector([getGlobalSettings], ({ offlineThreshold }) => ({\n interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,\n intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName\n}));\n\nexport const getRolesList = createSelector([getRolesById], rolesById => Object.entries(rolesById).map(([value, role]) => ({ value, ...role })));\n\nexport const getCurrentSession = (state: RootState) => state.users.currentSession;\nexport const getRolesInitialized = (state: RootState) => state.users.rolesInitialized;\n\nexport const getSecurityAlertDismissedTimestamp = (state: RootState) => state.users.userSettings.securityAlertDismissedTimestamp;\n","// Copyright 2019 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 { useDispatch } from 'react-redux';\n\nimport { extractErrorMessage, preformatWithRequestID } from '@northern.tech/utils/helpers';\nimport { combineReducers, configureStore, createAsyncThunk } from '@reduxjs/toolkit';\nimport { createReduxEnhancer } from '@sentry/react';\n\nimport actions from './actions';\nimport appSlice from './appSlice';\nimport { getToken } from './auth';\nimport { USER_LOGOUT, settingsKeys } from './constants';\nimport deploymentSlice from './deploymentsSlice';\nimport deviceSlice from './devicesSlice';\nimport monitorSlice from './monitorSlice';\nimport onboardingSlice from './onboardingSlice';\nimport organizationSlice, { actions as organizationActions } from './organizationSlice';\nimport releaseSlice from './releasesSlice';\nimport userSlice, { actions as userActions } from './usersSlice';\n\nconst { setSnackbar, uploadProgress } = actions;\n\n// exclude 'pendings-redirect' since this is expected to persist refreshes - the rest should be better to be redone\nconst keys = ['sessionDeploymentChecker', settingsKeys.initialized];\nconst resetEnvironment = () => keys.forEach(key => window.sessionStorage.removeItem(key));\n\nresetEnvironment();\n\nexport const commonErrorFallback = 'Please check your connection.';\nexport const commonErrorHandler = (err, errorContext, dispatch, fallback?: string, mightBeAuthRelated = false): Promise<never> => {\n const errMsg = extractErrorMessage(err, fallback);\n if (mightBeAuthRelated || getToken()) {\n dispatch(setSnackbar({ message: preformatWithRequestID(err.response, `${errorContext} ${errMsg}`), action: 'Copy to clipboard' }));\n }\n return Promise.reject(err);\n};\n\nconst rootReducer = combineReducers({\n app: appSlice,\n devices: deviceSlice,\n deployments: deploymentSlice,\n monitor: monitorSlice,\n onboarding: onboardingSlice,\n organization: organizationSlice,\n releases: releaseSlice,\n users: userSlice\n});\n\nexport const sessionReducer = (state, action) => {\n if (action.type === USER_LOGOUT) {\n state = undefined;\n }\n return rootReducer(state, action);\n};\n\nconst rejectionLoggerMiddleware = () => next => action => {\n if (action.type.endsWith('/rejected')) {\n const { error } = action;\n console.error('Rejection in action:', action);\n console.error(error.stack);\n }\n return next(action);\n};\n\nconst tracingActionIgnoreList = [userActions.successfullyLoggedIn.type, 'users/loginUser/pending', 'users/loginUser/fulfilled', 'users/loginUser/rejected'];\n\nconst sentryReduxEnhancer = createReduxEnhancer({\n actionTransformer: action => {\n if (tracingActionIgnoreList.includes(action.type)) {\n return null;\n }\n return action;\n },\n // Transform the state to remove sensitive information\n stateTransformer: (state: RootState) => {\n const transformedState = {\n ...state,\n users: { ...state.users, currentSession: null },\n organization: {\n ...state.organization,\n organization: {\n ...state.organization.organization,\n tenant_token: null\n }\n }\n };\n return transformedState;\n }\n});\n\nexport const getConfiguredStore = (options = {}) => {\n const { preloadedState = {}, ...config } = options;\n return configureStore({\n ...config,\n preloadedState,\n enhancers: getDefaultEnhancers => {\n // rely on the plain injected env object, as we're initializing the store only here\n if (window.mender_environment?.sentry?.isReduxEnabled) {\n return getDefaultEnhancers().concat(sentryReduxEnhancer);\n }\n return getDefaultEnhancers();\n },\n reducer: sessionReducer,\n middleware: getDefaultMiddleware =>\n getDefaultMiddleware({\n immutableCheck: {\n ignoredPaths: ['app.uploadsById']\n },\n serializableCheck: {\n ignoredActions: [organizationActions.receiveExternalDeviceIntegrations.name, uploadProgress.name],\n ignoredActionPaths: ['uploads', /payload\\..*$/, 'meta.arg.file', 'meta.arg.integration.configHint'],\n ignoredPaths: ['app.uploadsById', 'organization.externalDeviceIntegrations']\n }\n }).concat(rejectionLoggerMiddleware)\n });\n};\nexport const store = getConfiguredStore({\n preloadedState: {}\n});\nexport type AppDispatch = typeof store.dispatch;\nexport const useAppDispatch: () => AppDispatch = useDispatch;\nexport type RootState = ReturnType<typeof store.getState>;\n\nexport const createAppAsyncThunk = createAsyncThunk.withTypes<{\n dispatch: AppDispatch;\n state: RootState;\n}>();\n","// Copyright 2019 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { deepCompare, extractErrorMessage } from '@northern.tech/utils/helpers';\nimport Cookies from 'universal-cookie';\n\nimport type { ReleaseData, SearchState, TagData, VersionRelease } from '.';\nimport { actions, sliceName } from '.';\nimport GeneralApi from '../api/general-api';\nimport { getOfflineThresholdSettings } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { createAppAsyncThunk } from '../store';\nimport { searchDevices } from '../thunks';\nimport { getComparisonCompatibleVersion } from '../utils';\nimport { getFeatures, getSearchState } from './selectors';\n\nconst cookies = new Cookies();\n\n/*\n General\n*/\nexport const setFirstLoginAfterSignup = createAppAsyncThunk<void, boolean>(`${sliceName}/setFirstLoginAfterSignup`, (firstLoginAfterSignup, { dispatch }) => {\n cookies.set('firstLoginAfterSignup', !!firstLoginAfterSignup, { maxAge: 60, path: '/', domain: '.mender.io', sameSite: false });\n dispatch(actions.setFirstLoginAfterSignup(!!firstLoginAfterSignup));\n});\n\nconst dateFunctionMap = {\n getDays: 'getDate',\n setDays: 'setDate'\n};\nexport const setOfflineThreshold = createAppAsyncThunk(`${sliceName}/setOfflineThreshold`, (_, { dispatch, getState }) => {\n const { interval, intervalUnit } = getOfflineThresholdSettings(getState());\n const today = new Date();\n const intervalName = `${intervalUnit.charAt(0).toUpperCase()}${intervalUnit.substring(1)}`;\n const setter = dateFunctionMap[`set${intervalName}`] ?? `set${intervalName}`;\n const getter = dateFunctionMap[`get${intervalName}`] ?? `get${intervalName}`;\n today[setter](today[getter]() - interval);\n let value: string;\n try {\n value = today.toISOString();\n } catch {\n return Promise.resolve(dispatch(actions.setSnackbar('There was an error saving the offline threshold, please check your settings.')));\n }\n return Promise.resolve(dispatch(actions.setOfflineThreshold(value))) as ReturnType<AppDispatch>;\n});\n\nconst versionRegex = new RegExp(/\\d+\\.\\d+/);\n\nconst getLatestRelease = (thing: VersionRelease): VersionRelease => {\n const latestKey = Object.keys(thing)\n .filter(key => versionRegex.test(key))\n .sort()\n .reverse()[0];\n return thing[latestKey] as VersionRelease;\n};\n\nconst repoKeyMap = {\n integration: 'Integration',\n 'mender-artifact': 'Mender-Artifact'\n} as const;\n\nconst deductSaasState = (latestRelease: VersionRelease, guiTags: TagData): string | undefined => {\n const latestGuiTag = guiTags.length ? guiTags[0].name : '';\n return latestGuiTag ? latestGuiTag : latestRelease.release;\n};\n\nexport const getLatestReleaseInfo = createAppAsyncThunk(`${sliceName}/getLatestReleaseInfo`, (_, { dispatch, getState }) => {\n if (!getFeatures(getState()).isHosted) {\n return Promise.resolve();\n }\n return Promise.all([GeneralApi.get<ReleaseData>('/versions.json'), GeneralApi.get<TagData>('/tags.json')])\n .catch(err => {\n console.log('init error:', extractErrorMessage(err));\n return Promise.resolve([{ data: {} }, { data: [] }]) as any;\n })\n .then(([{ data }, { data: guiTags }]) => {\n if (!guiTags.length) {\n return Promise.resolve();\n }\n const { releases } = data;\n const latestRelease = getLatestRelease(getLatestRelease(releases));\n const { latestRepos, latestVersions } = latestRelease.repos!.reduce(\n (accu, item) => {\n if (repoKeyMap[item.name]) {\n accu.latestVersions[repoKeyMap[item.name]] = getComparisonCompatibleVersion(item.version);\n }\n accu.latestRepos[item.name] = getComparisonCompatibleVersion(item.version);\n return accu;\n },\n { latestVersions: { ...getState().app.versionInformation }, latestRepos: {} }\n );\n const info = deductSaasState(latestRelease, guiTags);\n return Promise.resolve(\n dispatch(\n actions.setVersionInformation({\n ...latestVersions,\n Server: info,\n latestRelease: {\n releaseDate: latestRelease.release_date!,\n repos: latestRepos\n }\n })\n )\n ) as ReturnType<AppDispatch>;\n });\n});\n\nexport const setSearchState = createAppAsyncThunk(`${sliceName}/setSearchState`, (searchState: Partial<SearchState>, { dispatch, getState }) => {\n const currentState = getSearchState(getState());\n const nextState = {\n ...currentState,\n ...searchState,\n sort: {\n ...currentState.sort,\n ...searchState.sort\n }\n };\n const tasks: ReturnType<AppDispatch>[] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: currentSearching, deviceIds: currentDevices, searchTotal: currentTotal, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isSearching: nextSearching, deviceIds: nextDevices, searchTotal: nextTotal, ...nextRequestState } = nextState;\n if (nextRequestState.searchTerm && !deepCompare(currentRequestState, nextRequestState)) {\n nextState.isSearching = true;\n tasks.push(\n dispatch(searchDevices(nextState))\n .unwrap()\n .then(results => {\n const searchResult = results[results.length - 1];\n return dispatch(actions.setSearchState({ ...searchResult, isSearching: false }));\n })\n .catch(() => dispatch(actions.setSearchState({ isSearching: false, searchTotal: 0 })))\n );\n }\n tasks.push(dispatch(actions.setSearchState(nextState)));\n return Promise.all(tasks);\n});\n","// 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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport type {\n DeploymentV1 as BackendDeploymentV1,\n DeploymentV2 as BackendDeploymentV2,\n DeviceWithImage,\n NewDeploymentTypeManagement as NewDeployment,\n NewDeploymentForGroup,\n NewDeploymentV2TypeManagement as NewDeploymentV2\n} from '@northern.tech/types/MenderTypes';\nimport { customSort, deepCompare, isEmpty, standardizePhases } from '@northern.tech/utils/helpers';\nimport Tracking from '@northern.tech/utils/tracking';\nimport validator from 'validator';\n\nimport type {\n Deployment,\n DeploymentByStatus,\n DeploymentByStatusKey,\n DeploymentConfig,\n DeploymentStatus,\n DeviceDeployment,\n SelectionListState,\n SelectionState\n} from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport { DEVICE_LIST_DEFAULTS, SORTING_OPTIONS, TIMEOUTS, apiRoot, deploymentsApiUrl, deploymentsApiUrlV2, headerNames } from '../constants';\nimport type { SortOptions } from '../constants';\nimport { getDevicesById, getGlobalSettings, getIdAttribute, getOrganization, getUserCapabilities } from '../selectors';\nimport { commonErrorHandler, createAppAsyncThunk } from '../store';\nimport type { AppDispatch } from '../store';\nimport { getDeviceAuth, getDeviceById, saveGlobalSettings } from '../thunks';\nimport { mapTermsToFilters } from '../utils';\nimport { DEPLOYMENT_ROUTES, DEPLOYMENT_STATES, DEPLOYMENT_TYPES, deploymentPrototype } from './constants';\nimport { getDeploymentsById, getDeploymentsByStatus as getDeploymentsByStatusSelector } from './selectors';\n\nconst { isUUID } = validator;\nconst { receivedDevice, setSnackbar } = storeActions;\n\n// default per page until pagination and counting integrated\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nexport const deriveDeploymentGroup = ({ filter, group, groups = [], name }: Deployment) =>\n group || (groups.length === 1 && !isUUID(name)) ? groups[0] : filter?.name;\n\ntype ReceivedDeployment = BackendDeploymentV1 | BackendDeploymentV2;\nconst transformDeployments = (deployments: ReceivedDeployment[], deploymentsById: Record<string, Deployment>) =>\n deployments.sort(customSort(true, 'created')).reduce<{ deploymentIds: string[]; deployments: Record<string, Deployment> }>(\n (accu, item) => {\n const filter = item.filter;\n let deployment: Deployment = {\n ...deploymentPrototype,\n ...deploymentsById[item.id],\n ...item,\n // TODO: explicitly set filter term types to address scope type mismatch in deployment specs\n // @ts-expect-error: type misalignment in filter terms type\n filter: filter ? { ...filter, name: filter.name ?? filter.id, filters: mapTermsToFilters(filter.terms) } : undefined,\n name: decodeURIComponent(item.name)\n };\n // deriving the group in a second step to potentially make use of the merged data from the existing group state + the decoded name\n deployment = { ...deployment, group: deriveDeploymentGroup(deployment) };\n accu.deployments[item.id] = deployment;\n accu.deploymentIds.push(item.id);\n return accu;\n },\n { deployments: {}, deploymentIds: [] }\n );\n\n/*Deployments */\nexport type GetDeploymentsByStatusPayload = Partial<SelectionListState> & {\n group?: string;\n shouldSelect?: boolean;\n sort?: SortOptions;\n status: DeploymentByStatusKey;\n};\nexport const getDeploymentsByStatus = createAppAsyncThunk(\n `${sliceName}/getDeploymentsByStatus`,\n (options: GetDeploymentsByStatusPayload, { dispatch, getState }) => {\n const { status, page = defaultPage, perPage = defaultPerPage, startDate, endDate, group, type, shouldSelect = true, sort = SORTING_OPTIONS.desc } = options;\n const created_after = startDate ? `&created_after=${startDate}` : '';\n const created_before = endDate ? `&created_before=${endDate}` : '';\n const { attribute, scope } = getIdAttribute(getState());\n const attributeHint = `&id_attribute=${attribute}&id_scope=${scope}`;\n const search = group ? `&name=${group}${attributeHint}` : '';\n const typeFilter = type ? `&type=${type}` : '';\n return GeneralApi.get<BackendDeploymentV1[]>(\n `${deploymentsApiUrlV2}/deployments?status=${status}&per_page=${perPage}&page=${page}${created_after}${created_before}${search}${typeFilter}&sort=${sort}`\n ).then(res => {\n const { deployments, deploymentIds } = transformDeployments(res.data, getState().deployments.byId);\n const total = Number(res.headers[headerNames.total]);\n let tasks: ReturnType<AppDispatch> = [\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(\n actions.receivedDeploymentsForStatus({\n deploymentIds,\n status,\n total: !(startDate || endDate || group || type) ? total : getState().deployments.byStatus[status].total\n })\n )\n ];\n tasks = deploymentIds.reduce((accu, deploymentId) => {\n if (deployments[deploymentId].type === DEPLOYMENT_TYPES.configuration) {\n accu.push(dispatch(getSingleDeployment(deploymentId)));\n }\n return accu;\n }, tasks);\n if (shouldSelect) {\n tasks.push(dispatch(actions.selectDeploymentsForStatus({ deploymentIds, status, total })));\n }\n tasks.push({ deploymentIds, total });\n return Promise.all(tasks);\n });\n }\n);\n\nconst isWithinFirstMonth = (expirationDate?: string) => {\n if (!expirationDate) {\n return false;\n }\n const endOfFirstMonth = new Date(expirationDate);\n endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);\n return endOfFirstMonth > new Date();\n};\n\nconst trackDeploymentCreation = (totalDeploymentCount: number, hasDeployments: boolean, trial_expiration?: string) => {\n Tracking.event({ category: 'deployments', action: 'create' });\n if (!totalDeploymentCount) {\n if (!hasDeployments) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment' });\n if (isWithinFirstMonth(trial_expiration)) {\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_first_month' });\n }\n }\n Tracking.event({ category: 'deployments', action: 'create_initial_deployment_user' });\n }\n};\n\nconst MAX_PREVIOUS_PHASES_COUNT = 5;\nexport const createDeployment = createAppAsyncThunk(\n `${sliceName}/createDeployment`,\n (\n {\n newDeployment,\n hasNewRetryDefault = false\n }: { hasNewRetryDefault: boolean; newDeployment: NewDeployment | (NewDeploymentForGroup & { group: string }) | NewDeploymentV2 },\n { dispatch, getState }\n ) => {\n let request;\n if ('filter_id' in newDeployment && newDeployment.filter_id) {\n request = GeneralApi.post(`${deploymentsApiUrlV2}/deployments`, newDeployment);\n } else if ('group' in newDeployment && newDeployment.group) {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments/group/${newDeployment.group}`, newDeployment);\n } else {\n request = GeneralApi.post(`${deploymentsApiUrl}/deployments`, newDeployment);\n }\n const totalDeploymentCount = (Object.values(getDeploymentsByStatusSelector(getState())) as DeploymentStatus[]).reduce<number>(\n (accu, item) => accu + item.total,\n 0\n );\n const { hasDeployments } = getGlobalSettings(getState());\n const { trial_expiration } = getOrganization(getState());\n return request\n .catch(err => commonErrorHandler(err, 'Error creating deployment.', dispatch))\n .then(data => {\n const lastslashindex = data.headers.location.lastIndexOf('/');\n const deploymentId = data.headers.location.substring(lastslashindex + 1);\n const deployment = {\n ...newDeployment,\n id: deploymentId,\n devices: 'devices' in newDeployment && newDeployment.devices ? newDeployment.devices.map(id => ({ id, status: 'pending' })) : [],\n statistics: { status: {} }\n };\n const tasks = [\n dispatch(actions.createdDeployment(deployment)),\n dispatch(getSingleDeployment(deploymentId)),\n dispatch(setSnackbar({ message: 'Deployment created successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ] as ReturnType<AppDispatch>;\n // track in GA\n trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);\n const { canManageUsers } = getUserCapabilities(getState());\n if (canManageUsers) {\n const { phases, retries } = newDeployment;\n const { previousPhases = [], retries: previousRetries = 0 } = getGlobalSettings(getState());\n const newSettings: any = { retries: hasNewRetryDefault ? retries : previousRetries, hasDeployments: true };\n if (phases) {\n const standardPhases = standardizePhases(phases);\n const prevPhases = previousPhases.map(standardizePhases);\n if (!prevPhases.find(previousPhaseList => previousPhaseList.every(oldPhase => standardPhases.find(phase => deepCompare(phase, oldPhase))))) {\n prevPhases.push(standardPhases);\n }\n newSettings.previousPhases = prevPhases.slice(-1 * MAX_PREVIOUS_PHASES_COUNT);\n }\n tasks.push(dispatch(saveGlobalSettings(newSettings)));\n }\n return Promise.all(tasks);\n });\n }\n);\n\nexport const getDeploymentDevices = createAppAsyncThunk(\n `${sliceName}/getDeploymentDevices`,\n (options: { id: string; page?: number; perPage?: number }, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage } = options;\n return GeneralApi.get<DeviceWithImage[]>(`${deploymentsApiUrl}/deployments/${id}/devices/list?&page=${page}&per_page=${perPage}`).then(response => {\n const { devices: deploymentDevices = {} } = getState().deployments.byId[id] || {};\n const devices = response.data.reduce<Record<string, DeviceWithImage>>((accu, item) => {\n accu[item.id] = item;\n const log: boolean = (deploymentDevices[item.id] || {}).log;\n if (log) {\n accu[item.id].log = log;\n }\n return accu;\n }, {});\n const selectedDeviceIds = Object.keys(devices);\n let tasks: ReturnType<AppDispatch> = [\n dispatch(\n actions.receivedDeploymentDevices({\n id,\n devices,\n selectedDeviceIds,\n totalDeviceCount: Number(response.headers[headerNames.total])\n })\n )\n ];\n const devicesById = getDevicesById(getState());\n // only update those that have changed & lack data\n const lackingData = selectedDeviceIds.reduce<string[]>((accu, deviceId) => {\n const device = devicesById[deviceId];\n if (!device || !device.identity_data || !device.attributes || Object.keys(device.attributes).length === 0) {\n accu.push(deviceId);\n }\n return accu;\n }, []);\n // get device artifact, inventory and identity details not listed in schedule data\n tasks = lackingData.reduce((accu, deviceId) => [...accu, dispatch(getDeviceById(deviceId)), dispatch(getDeviceAuth(deviceId))], tasks);\n return Promise.all(tasks);\n });\n }\n);\nconst parseDeviceDeployment = ({\n deployment: { id, artifact_name: release, status: deploymentStatus },\n device: { created, deleted, id: deviceId, finished, status, log }\n}: {\n deployment: Deployment;\n device: DeviceWithImage;\n}): DeviceDeployment => ({\n id,\n release,\n created,\n deleted,\n deviceId,\n finished,\n status,\n log,\n route: Object.values(DEPLOYMENT_ROUTES).reduce<string>((accu, { key, states }) => {\n if (!accu) {\n return (states as readonly string[]).includes(deploymentStatus) ? key : accu;\n }\n return accu;\n }, '')\n});\ntype GetDeviceDeploymentsPayload = {\n deviceId: string;\n filterSelection?: string[];\n page?: number;\n perPage?: number;\n};\n\nexport const getDeviceDeployments = createAppAsyncThunk(`${sliceName}/getDeviceDeployments`, (options: GetDeviceDeploymentsPayload, { dispatch }) => {\n const { deviceId, filterSelection = [], page = defaultPage, perPage = defaultPerPage } = options;\n const filters = filterSelection.map(item => `&status=${item}`).join('');\n return GeneralApi.get(`${deploymentsApiUrl}/deployments/devices/${deviceId}?page=${page}&per_page=${perPage}${filters}`)\n .then(({ data, headers }) =>\n Promise.resolve(\n dispatch(\n receivedDevice({\n id: deviceId,\n deviceDeployments: data.map(parseDeviceDeployment),\n deploymentsCount: Number(headers[headerNames.total])\n })\n )\n )\n )\n .catch(err => commonErrorHandler(err, 'There was an error retrieving the device deployment history:', dispatch));\n});\n\nexport const resetDeviceDeployments = createAppAsyncThunk(`${sliceName}/resetDeviceDeployments`, (deviceId: string, { dispatch }) =>\n GeneralApi.delete(`${deploymentsApiUrl}/deployments/devices/${deviceId}/history`)\n .then(() => Promise.resolve(dispatch(getDeviceDeployments({ deviceId }))))\n .catch(err => commonErrorHandler(err, 'There was an error resetting the device deployment history:', dispatch))\n);\n\nexport const getSingleDeployment = createAppAsyncThunk(`${sliceName}/getSingleDeployment`, (id: string, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${id}`).then(({ data }) => {\n const { deployments } = transformDeployments([data], getState().deployments.byId);\n return Promise.resolve(dispatch(actions.receivedDeployment(deployments[id])));\n })\n);\n\nexport const getDeviceLog = createAppAsyncThunk(\n `${sliceName}/getDeviceLog`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch }) =>\n GeneralApi.get(`${deploymentsApiUrl}/deployments/${deploymentId}/devices/${deviceId}/log`)\n .catch(e => {\n console.log('no log here', e);\n return Promise.reject();\n })\n .then(({ data: log }) =>\n Promise.all([Promise.resolve(dispatch(actions.receivedDeploymentDeviceLog({ id: deploymentId, deviceId, log }))), Promise.resolve(log)])\n )\n);\n\nexport const abortDeployment = createAppAsyncThunk(`${sliceName}/abortDeployment`, (deploymentId: string, { dispatch, getState }) =>\n GeneralApi.put(`${deploymentsApiUrl}/deployments/${deploymentId}/status`, { status: 'aborted' })\n .then(() => {\n const deploymentsByStatus: DeploymentByStatus = getDeploymentsByStatusSelector(getState());\n let status: DeploymentByStatusKey = DEPLOYMENT_STATES.pending;\n let index = deploymentsByStatus.pending.deploymentIds.findIndex((id: string) => id === deploymentId);\n if (index < 0) {\n status = DEPLOYMENT_STATES.inprogress;\n index = deploymentsByStatus.inprogress.deploymentIds.findIndex((id: string) => id === deploymentId);\n }\n const deploymentIds = [...deploymentsByStatus[status].deploymentIds.slice(0, index), ...deploymentsByStatus[status].deploymentIds.slice(index + 1)];\n const deploymentsById = getDeploymentsById(getState());\n const deployments = deploymentIds.reduce<Record<string, Deployment>>((accu, id) => {\n accu[id] = deploymentsById[id];\n return accu;\n }, {});\n const total = Math.max(deploymentsByStatus[status].total - 1, 0);\n return Promise.all([\n dispatch(actions.receivedDeployments(deployments)),\n dispatch(actions.receivedDeploymentsForStatus({ deploymentIds, status, total })),\n dispatch(actions.removedDeployment(deploymentId)),\n dispatch(setSnackbar('The deployment was successfully aborted'))\n ]);\n })\n .catch(err => commonErrorHandler(err, 'There was an error while aborting the deployment:', dispatch))\n);\n\nexport const updateDeploymentControlMap = createAppAsyncThunk(\n `${sliceName}/updateDeploymentControlMap`,\n ({ deploymentId, updateControlMap }: { deploymentId: string; updateControlMap: BackendDeploymentV1['update_control_map'] }, { dispatch }) =>\n GeneralApi.patch(`${deploymentsApiUrl}/deployments/${deploymentId}`, { update_control_map: updateControlMap })\n .catch(err => commonErrorHandler(err, 'There was an error while updating the deployment status:', dispatch))\n .then(() => Promise.resolve(dispatch(getSingleDeployment(deploymentId))))\n);\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\ntype SetDeploymentsStatePayload = DeepPartial<SelectionState> & { page?: number; perPage?: number };\nexport const setDeploymentsState = createAppAsyncThunk(`${sliceName}/setDeploymentsState`, (selection: SetDeploymentsStatePayload, { dispatch, getState }) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page, perPage, ...selectionState } = selection;\n const currentState = getState().deployments.selectionState;\n const nextState = {\n ...currentState,\n ...selectionState,\n ...Object.keys(DEPLOYMENT_STATES).reduce<Partial<SelectionState>>((accu, item) => {\n accu[item] = {\n ...currentState[item],\n ...selectionState[item]\n };\n return accu;\n }, {}),\n general: {\n ...currentState.general,\n ...selectionState.general\n }\n } as SelectionState;\n const tasks: ReturnType<AppDispatch> = [dispatch(actions.setDeploymentsState(nextState))];\n if (nextState.selectedId && currentState.selectedId !== nextState.selectedId) {\n tasks.push(dispatch(getSingleDeployment(nextState.selectedId)));\n }\n return Promise.all(tasks);\n});\n\nconst deltaAttributeMappings = [\n { here: 'compressionLevel', there: 'compression_level' },\n { here: 'disableChecksum', there: 'disable_checksum' },\n { here: 'disableDecompression', there: 'disable_external_decompression' },\n { here: 'sourceWindow', there: 'source_window_size' },\n { here: 'inputWindow', there: 'input_window_size' },\n { here: 'duplicatesWindow', there: 'compression_duplicates_window' },\n { here: 'instructionBuffer', there: 'instruction_buffer_size' }\n];\n\nconst mapExternalDeltaConfig = (config = {}) =>\n deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[there] !== undefined) {\n accu[here] = config[there];\n }\n return accu;\n }, {});\n\nexport const getDeploymentsConfig = createAppAsyncThunk(`${sliceName}/getDeploymentsConfig`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${deploymentsApiUrl}/config`).then(({ data }) => {\n const oldConfig = getState().deployments.config;\n const { delta = {} } = data;\n const { binary_delta = {}, binary_delta_limits = {} } = delta;\n const { xdelta_args = {} } = binary_delta;\n const { xdelta_args_limits = {} } = binary_delta_limits;\n const config = {\n ...oldConfig,\n hasDelta: Boolean(delta.enabled),\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...mapExternalDeltaConfig(xdelta_args)\n },\n binaryDeltaLimits: {\n ...oldConfig.binaryDeltaLimits,\n ...mapExternalDeltaConfig(xdelta_args_limits)\n }\n };\n return Promise.resolve(dispatch(actions.setDeploymentsConfig(config)));\n })\n);\n\n// traverse a source object and remove undefined & empty object properties to only return an attribute if there really is content worth sending\nconst deepClean = <T extends Record<string, any>>(source: T): Partial<T> | undefined =>\n Object.entries(source).reduce<Partial<T> | undefined>((accu, [key, value]) => {\n if (value !== undefined) {\n const cleanedValue = typeof value === 'object' ? deepClean(value) : value;\n if (cleanedValue === undefined || (typeof cleanedValue === 'object' && isEmpty(cleanedValue))) {\n return accu;\n }\n accu = { ...(accu ?? {}), [key]: cleanedValue } as Partial<T>;\n }\n return accu;\n }, undefined);\n\nexport const saveDeltaDeploymentsConfig = createAppAsyncThunk(\n `${sliceName}/saveDeltaDeploymentsConfig`,\n (config: DeploymentConfig['binaryDelta'], { dispatch, getState }) => {\n const configChange = {\n xdelta_args: deltaAttributeMappings.reduce((accu, { here, there }) => {\n if (config[here] !== undefined) {\n accu[there] = config[here];\n }\n return accu;\n }, {})\n };\n const result = deepClean(configChange);\n if (!result) {\n return Promise.resolve();\n }\n return GeneralApi.put(`${deploymentsApiUrl}/config/binary_delta`, result)\n .catch(err => commonErrorHandler(err, 'There was a problem storing your delta artifact generation configuration.', dispatch))\n .then(() => {\n const oldConfig = getState().deployments.config;\n const newConfig = {\n ...oldConfig,\n binaryDelta: {\n ...oldConfig.binaryDelta,\n ...config\n }\n };\n return Promise.all([dispatch(actions.setDeploymentsConfig(newConfig)), dispatch(setSnackbar('Settings saved successfully'))]);\n });\n }\n);\n\nexport const generateDeploymentLogAnalysis = createAppAsyncThunk(\n `${sliceName}/generateDeploymentLogAnalysis`,\n ({ deploymentId, deviceId }: { deploymentId: string; deviceId: string }, { dispatch, rejectWithValue }) =>\n GeneralApi.get(`${apiRoot}/v1alpha1/deployments/deployments/${deploymentId}/devices/${deviceId}/log/explain`, { timeout: 60 * TIMEOUTS.oneSecond })\n .then(({ data: result }) => Promise.resolve(result))\n .catch(err => {\n if (err.response.status === 429) {\n return rejectWithValue(err.response);\n }\n commonErrorHandler(err, 'There was an error analysing the deployment log:', dispatch);\n })\n);\n","// 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/*eslint import/namespace: ['error', { allowComputed: true }]*/\nimport { Link } from 'react-router-dom';\n\nimport type {\n AttributeV2,\n Device as BackendDevice,\n DeviceConfiguration,\n DeviceInventory,\n DeviceState,\n DeviceTierLimits,\n DeviceWithImage,\n Integration,\n ManagementApiConfiguration,\n NewConfigurationDeployment,\n PreAuthSet,\n SortCriteria,\n Status\n} from '@northern.tech/types/MenderTypes';\nimport { attributeDuplicateFilter, dateRangeToUnix, deepCompare, getSnackbarMessage } from '@northern.tech/utils/helpers';\nimport { isCancel } from 'axios';\nimport pluralize from 'pluralize';\nimport { v4 as uuid } from 'uuid';\n\nimport type { Device, DeviceFilter, DeviceGroup, DeviceGroups, DeviceListState, DeviceSelectedAttribute } from '.';\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport GeneralApi from '../api/general-api';\nimport type { SearchState } from '../appSlice';\nimport {\n ALL_DEVICE_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_LIST_DEFAULTS,\n DEVICE_STATES,\n EXTERNAL_PROVIDER,\n MAX_PAGE_SIZE,\n SORTING_OPTIONS,\n TIMEOUTS,\n UNGROUPED_GROUP,\n auditLogsApiUrl,\n deviceAuthV2,\n deviceConfig,\n deviceConnect,\n headerNames,\n inventoryApiUrl,\n inventoryApiUrlV2,\n iotManagerBaseURL,\n rootfsImageVersion\n} from '../constants';\nimport type { DeviceAuthState, DeviceIssueOptionKey } from '../constants';\nimport {\n getAcceptedDevices,\n getDeviceReports,\n getDeviceReportsForUser,\n getDeviceTwinIntegrations,\n getGlobalSettings,\n getIdAttribute,\n getSelectedDeviceAttribute,\n getTenantCapabilities,\n getUserCapabilities,\n getUserSettings\n} from '../selectors';\nimport type { AppDispatch, RootState } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { getDeviceMonitorConfig, getLatestDeviceAlerts, getSingleDeployment, saveGlobalSettings, saveUserSettings } from '../thunks';\nimport {\n convertDeviceListStateToFilters,\n extractErrorMessage,\n filtersFilter,\n mapDeviceAttributes,\n mapFiltersToTerms,\n mapTermsToFilters,\n progress\n} from '../utils';\nimport { emptyFilter } from './constants';\nimport {\n getDeviceById as getDeviceByIdSelector,\n getDeviceCountsByStatus,\n getDeviceFilters,\n getDeviceListState,\n getDevicesById,\n getGroupsById,\n getSelectedGroup\n} from './selectors';\n\nconst { cleanUpUpload, initUpload, setSnackbar, uploadProgress } = storeActions;\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst defaultAttributes = [\n { scope: 'identity', attribute: 'status' },\n { scope: 'inventory', attribute: 'artifact_name' },\n { scope: 'inventory', attribute: 'device_type' },\n { scope: 'inventory', attribute: 'mender_is_gateway' },\n { scope: 'inventory', attribute: 'mender_gateway_system_id' },\n { scope: 'inventory', attribute: rootfsImageVersion },\n { scope: 'monitor', attribute: 'alerts' },\n { scope: 'system', attribute: 'created_ts' },\n { scope: 'system', attribute: 'updated_ts' },\n { scope: 'system', attribute: 'check_in_time' },\n { scope: 'system', attribute: 'group' },\n { scope: 'tags', attribute: 'name' }\n];\n\nexport const getGroups = createAppAsyncThunk(`${sliceName}/getGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/groups`).then(res => {\n const state: Record<string, DeviceGroup> = getGroupsById(getState());\n const dynamicGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (group.id || (group.filters?.length && id !== UNGROUPED_GROUP.id)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = res.data.reduce((accu, group) => {\n accu[group] = { deviceIds: [], filters: [], total: 0, ...state[group] };\n return accu;\n }, dynamicGroups);\n const filters = [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }];\n return Promise.all([\n dispatch(actions.receivedGroups(groups)),\n dispatch(getDevicesByStatus({ filterSelection: filters, group: '', page: 1, perPage: 1, status: undefined }))\n ]).then((promises: [any, any]) => {\n const devicesRetrieval = promises[promises.length - 1] || [];\n const { payload } = devicesRetrieval || {};\n const result = payload[payload.length - 1] || {};\n if (!result.total) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName: UNGROUPED_GROUP.id,\n group: { filters: [{ key: 'group', value: res.data, operator: DEVICE_FILTERING_OPTIONS.$nin.key, scope: 'system' }] }\n })\n )\n );\n });\n })\n);\n\nexport const addDevicesToGroup = createAppAsyncThunk(\n `${sliceName}/addDevicesToGroup`,\n ({ group, deviceIds, isCreation }: { deviceIds: string[]; group: string; isCreation: boolean }, { dispatch }) =>\n GeneralApi.patch(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds)\n .then(() => dispatch(actions.addToGroup({ group, deviceIds })))\n .finally(() => (isCreation ? Promise.resolve(dispatch(getGroups())) : {}))\n);\n\nexport const removeDevicesFromGroup = createAppAsyncThunk(\n `${sliceName}/removeDevicesFromGroup`,\n ({ group, deviceIds }: { deviceIds: string[]; group: string }, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${group}/devices`, deviceIds).then(() =>\n Promise.all([\n dispatch(actions.removeFromGroup({ group, deviceIds })),\n dispatch(\n setSnackbar({\n message: `The ${pluralize('devices', deviceIds.length)} ${pluralize('were', deviceIds.length)} removed from the group`,\n autoHideDuration: TIMEOUTS.fiveSeconds\n })\n )\n ])\n )\n);\n\nconst getGroupNotification = (newGroup: string, selectedGroup?: string) => {\n const successMessage = 'The group was updated successfully';\n if (newGroup === selectedGroup) {\n return { message: successMessage, autoHideDuration: TIMEOUTS.fiveSeconds };\n }\n return {\n action: '',\n autoHideDuration: TIMEOUTS.fiveSeconds,\n message: (\n <>\n {successMessage} - <Link to={`/devices?inventory=group:eq:${newGroup}`}>click here</Link> to see it.\n </>\n ),\n preventClickToCopy: true\n };\n};\n\nexport const addStaticGroup = createAppAsyncThunk(\n `${sliceName}/addStaticGroup`,\n ({ group, devices }: { devices: Device[]; group: string }, { dispatch, getState }) =>\n Promise.resolve(dispatch(addDevicesToGroup({ group, deviceIds: devices.map(({ id }) => id), isCreation: true })))\n .then(() =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n group: { deviceIds: [], total: 0, filters: [], ...getState().devices.groups.byId[group] },\n groupName: group\n })\n )\n ).then(() =>\n Promise.all([\n dispatch(setDeviceListState({ setOnly: true })),\n dispatch(getGroups()),\n dispatch(setSnackbar(getGroupNotification(group, getState().devices.groups.selectedGroup)))\n ])\n )\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\nexport const removeReportsByGroupName = createAppAsyncThunk(`${sliceName}/removeReportsByGroupName`, (groupName: string, { dispatch, getState }) => {\n if (!groupName) return Promise.resolve();\n const reports = getDeviceReportsForUser(getState());\n const filteredReports = reports.filter(report => report.group !== groupName);\n dispatch(saveUserSettings({ reports: filteredReports }));\n});\n\nexport const removeStaticGroup = createAppAsyncThunk(`${sliceName}/removeStaticGroup`, (groupName: string, { dispatch }) =>\n GeneralApi.delete(`${inventoryApiUrl}/groups/${groupName}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(getGroups()),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n )\n);\nexport const getDynamicGroup = createAppAsyncThunk(`${sliceName}/getDynamicGroupById`, (id, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters/${id}`).catch(err => {\n if (err.response && err.response.status === 404) {\n throw new Error('Request failed with status code 404');\n }\n return commonErrorHandler(err, `Error retrieving the group: `, dispatch, commonErrorFallback);\n })\n);\n\nexport const getDynamicGroups = createAppAsyncThunk(`${sliceName}/getDynamicGroups`, (_, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters?per_page=${MAX_PAGE_SIZE}`)\n .then(({ data: filters }) => {\n const state: Record<string, DeviceGroup> = getGroupsById(getState());\n const staticGroups = Object.entries(state).reduce((accu, [id, group]) => {\n if (!(group.id || group.filters?.length)) {\n accu[id] = group;\n }\n return accu;\n }, {});\n const groups = (filters || []).reduce((accu, filter) => {\n accu[filter.name] = {\n deviceIds: [],\n total: 0,\n ...state[filter.name],\n id: filter.id,\n filters: mapTermsToFilters(filter.terms)\n };\n return accu;\n }, staticGroups);\n return Promise.resolve(dispatch(actions.receivedGroups(groups)));\n })\n .catch(() => console.log('Dynamic group retrieval failed - likely accessing a non-enterprise backend'))\n);\n\nexport const addDynamicGroup = createAppAsyncThunk(\n `${sliceName}/addDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters`, { name: groupName, terms: mapFiltersToTerms(filterPredicates) })\n .then(res =>\n Promise.resolve(\n dispatch(\n actions.addGroup({\n groupName,\n group: {\n id: res.headers[headerNames.location].substring(res.headers[headerNames.location].lastIndexOf('/') + 1),\n filters: filterPredicates\n }\n })\n )\n ).then(() => {\n const { cleanedFilters } = getGroupFilters(groupName, getState().devices.groups);\n return Promise.all([\n dispatch(actions.setDeviceFilters(cleanedFilters)),\n dispatch(setSnackbar(getGroupNotification(groupName, getState().devices.groups.selectedGroup))),\n dispatch(getDynamicGroups())\n ]);\n })\n )\n .catch(err => commonErrorHandler(err, `Group could not be updated:`, dispatch))\n);\n\nexport const updateDynamicGroup = createAppAsyncThunk(\n `${sliceName}/updateDynamicGroup`,\n ({ groupName, filterPredicates }: { filterPredicates: DeviceFilter[]; groupName: string }, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.resolve(dispatch(addDynamicGroup({ groupName, filterPredicates })) as ReturnType<AppDispatch>)\n );\n }\n);\n\nexport const removeDynamicGroup = createAppAsyncThunk(`${sliceName}/removeDynamicGroup`, (groupName: string, { dispatch, getState }) => {\n const filterId = getState().devices.groups.byId[groupName].id;\n return GeneralApi.delete(`${inventoryApiUrlV2}/filters/${filterId}`).then(() =>\n Promise.all([\n dispatch(actions.removeGroup(groupName)),\n dispatch(removeReportsByGroupName(groupName)),\n dispatch(setSnackbar({ message: 'Group was removed successfully', autoHideDuration: TIMEOUTS.fiveSeconds }))\n ])\n );\n});\n\n/*\n * Device inventory functions\n */\nconst getGroupFilters = (group: string, groupsState: DeviceGroups, filters: DeviceFilter[] = []) => {\n const groupName = group === UNGROUPED_GROUP.id || group === UNGROUPED_GROUP.name ? UNGROUPED_GROUP.id : group;\n const selectedGroup = groupsState.byId[groupName];\n const groupFilterLength = selectedGroup?.filters?.length || 0;\n const cleanedFilters = groupFilterLength ? [...filters, ...(selectedGroup.filters || [])].filter(filtersFilter) : filters;\n return { cleanedFilters, groupName, selectedGroup, groupFilterLength };\n};\n\nexport const selectGroup = createAppAsyncThunk(\n `${sliceName}/selectGroup`,\n ({ group, filters = [] }: { filters: DeviceFilter[]; group: string }, { dispatch, getState }) => {\n const { cleanedFilters, groupName, selectedGroup, groupFilterLength } = getGroupFilters(group, getState().devices.groups, filters);\n if (getSelectedGroup(getState()) === groupName && ((filters.length === 0 && !groupFilterLength) || filters.length === cleanedFilters.length)) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n const tasks: ReturnType<AppDispatch>[] = [];\n if (groupFilterLength) {\n tasks.push(dispatch(actions.setDeviceFilters(cleanedFilters)));\n } else {\n tasks.push(dispatch(actions.setDeviceFilters(filters)));\n tasks.push(dispatch(getGroupDevices({ group: groupName, perPage: 1, shouldIncludeAllStates: true })));\n }\n const selectedGroupName = selectedGroup || !Object.keys(getGroupsById(getState())).length ? groupName : undefined;\n tasks.push(dispatch(actions.selectGroup(selectedGroupName)));\n return Promise.all(tasks);\n }\n);\n\nconst getEarliestTs = (dateA = '', dateB = '') => (!dateA || !dateB ? dateA || dateB : dateA < dateB ? dateA : dateB);\n\ntype ReceivedDevice = BackendDevice & DeviceInventory & Omit<DeviceWithImage, 'status'>;\nconst reduceReceivedDevices = (devices: ReceivedDevice[], ids: string[], state: RootState, status?: DeviceAuthState) =>\n devices.reduce(\n (accu, device: any) => {\n const stateDevice = getDeviceByIdSelector(state, device.id);\n const {\n attributes: storedAttributes = {},\n identity_data: storedIdentity = {},\n monitor: storedMonitor = {},\n tags: storedTags = {},\n group: storedGroup\n } = stateDevice;\n const { identity, inventory, monitor, system = {}, tags } = mapDeviceAttributes(device.attributes);\n device.tags = { ...storedTags, ...tags };\n device.group = system.group ?? storedGroup;\n device.monitor = { ...storedMonitor, ...monitor };\n device.identity_data = { ...storedIdentity, ...identity, ...(device.identity_data ? device.identity_data : {}) };\n device.status = status ? status : device.status || identity.status;\n device.check_in_time_rounded = system.check_in_time ?? stateDevice.check_in_time_rounded;\n device.check_in_time_exact = device.check_in_time ?? stateDevice.check_in_time_exact;\n device.created_ts = getEarliestTs(getEarliestTs(system.created_ts, device.created_ts), stateDevice.created_ts);\n device.updated_ts = device.attributes ? device.updated_ts : stateDevice.updated_ts;\n device.isNew = new Date(device.created_ts) > new Date(state.app.newThreshold);\n device.isOffline = new Date(device.check_in_time_rounded) < new Date(state.app.offlineThreshold) || device.check_in_time_rounded === undefined;\n // all the other mapped attributes return as empty objects if there are no attributes to map, but identity will be initialized with an empty state\n // for device_type and artifact_name, potentially overwriting existing info, so rely on stored information instead if there are no attributes\n device.attributes = device.attributes ? { ...storedAttributes, ...inventory } : storedAttributes;\n accu.devicesById[device.id] = { ...stateDevice, ...device };\n accu.ids.push(device.id);\n return accu;\n },\n { ids, devicesById: {} }\n );\ntype getGroupDevicesPayload = {\n group: string;\n page?: number;\n perPage?: number;\n shouldIncludeAllStates: boolean;\n};\nexport const getGroupDevices = createAppAsyncThunk(`${sliceName}/getGroupDevices`, (options: getGroupDevicesPayload, { dispatch, getState }) => {\n const { group, shouldIncludeAllStates, ...remainder } = options;\n const { cleanedFilters: filterSelection } = getGroupFilters(group, getState().devices.groups);\n return dispatch(\n getDevicesByStatus({\n ...remainder,\n filterSelection,\n group,\n status: shouldIncludeAllStates ? undefined : DEVICE_STATES.accepted\n })\n )\n .unwrap()\n .then(results => {\n if (!group) {\n return Promise.resolve() as ReturnType<AppDispatch>;\n }\n const { deviceAccu, total } = results[results.length - 1];\n const stateGroup = getState().devices.groups.byId[group];\n if (!stateGroup && !total && !deviceAccu.ids.length) {\n return Promise.resolve();\n }\n return Promise.resolve(\n dispatch(\n actions.addGroup({\n group: {\n deviceIds:\n deviceAccu.ids.length === total || (stateGroup && stateGroup.deviceIds && deviceAccu.ids.length > stateGroup.deviceIds)\n ? deviceAccu.ids\n : stateGroup.deviceIds,\n total\n },\n groupName: group\n })\n )\n );\n });\n});\n\nexport const getAllGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { dispatch, getState }) => {\n if (!group || (!!group && (!getGroupsById(getState())[group] || getGroupsById(getState())[group].filters!.length))) {\n return Promise.resolve();\n }\n const { attributes, filterTerms } = prepareSearchArguments({\n filters: [],\n group,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n attributes: [...attributes, { scope: 'inventory', attribute }]\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total: deviceAccu.ids.length }, groupName: group })));\n });\n return getAllDevices();\n }\n);\n\nexport const getAllDynamicGroupDevices = createAppAsyncThunk(\n `${sliceName}/getAllDynamicGroupDevices`,\n ({ group, attribute }: { attribute: string; group: string }, { dispatch, getState }) => {\n if (!!group && (!getGroupsById(getState())[group] || !getGroupsById(getState())[group].filters!.length)) {\n return Promise.resolve();\n }\n const { attributes, filterTerms: filters } = prepareSearchArguments({\n filters: getState().devices.groups.byId[group].filters,\n state: getState(),\n status: DEVICE_STATES.accepted\n });\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = defaultPage, devices: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters,\n attributes: [...attributes, { scope: 'inventory', attribute }]\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > deviceAccu.ids.length) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve(dispatch(actions.addGroup({ group: { deviceIds: deviceAccu.ids, total }, groupName: group })));\n });\n return getAllDevices();\n }\n);\n\nexport const getDeviceById = createAppAsyncThunk(`${sliceName}/getDeviceById`, (id: string, { dispatch, getState }) =>\n GeneralApi.get(`${inventoryApiUrl}/devices/${id}`)\n .then(res => {\n const device = reduceReceivedDevices([res.data], [], getState()).devicesById[id];\n device.etag = res.headers.etag;\n dispatch(actions.receivedDevice(device));\n return Promise.resolve(device);\n })\n .catch(err => {\n const errMsg = extractErrorMessage(err);\n if (errMsg.includes('Not Found')) {\n console.log(`${id} does not have any inventory information`);\n const device = reduceReceivedDevices(\n [\n {\n id,\n attributes: [\n { name: 'status', value: 'decomissioned', scope: 'identity' },\n { name: 'decomissioned', value: 'true', scope: 'inventory' }\n ],\n log: false\n }\n ],\n [],\n getState()\n ).devicesById[id];\n dispatch(actions.receivedDevice(device));\n }\n })\n);\n\nexport const getDeviceInfo = createAppAsyncThunk(`${sliceName}/getDeviceInfo`, (deviceId: string, { dispatch, getState }) => {\n const device = getDeviceByIdSelector(getState(), deviceId) as Device;\n const { hasDeviceConfig, hasDeviceConnect, hasMonitor } = getTenantCapabilities(getState());\n const { canConfigure } = getUserCapabilities(getState());\n const integrations = getDeviceTwinIntegrations(getState());\n // Get full device identity details for single selected device\n const tasks: ReturnType<AppDispatch>[] = [\n dispatch(getDeviceAuth(deviceId)),\n dispatch(getDeviceById(deviceId)),\n ...integrations.map(integration => dispatch(getDeviceTwin({ deviceId, integration })))\n ];\n if (hasDeviceConfig && canConfigure && (device.status === DEVICE_STATES.accepted || device.status === DEVICE_STATES.preauth)) {\n tasks.push(dispatch(getDeviceConfig(deviceId)));\n }\n if (device.status === DEVICE_STATES.accepted) {\n if (hasDeviceConnect) {\n tasks.push(dispatch(getDeviceConnect(deviceId)));\n }\n if (hasMonitor) {\n tasks.push(dispatch(getLatestDeviceAlerts({ id: deviceId })));\n tasks.push(dispatch(getDeviceMonitorConfig(deviceId)));\n }\n }\n return Promise.all(tasks);\n});\n\n/*\n Device Auth + admission\n */\nexport const getAllDeviceCounts = createAppAsyncThunk(`${sliceName}/getAllDeviceCounts`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/statistics`).then(({ data }) => {\n const { devices_by_status }: { devices_by_status: Record<DeviceAuthState, DeviceTierLimits> } = data;\n Object.entries(devices_by_status).map(([status, countsPerTier]) => dispatch(actions.setDevicesCountByStatus({ countsPerTier, status })));\n return;\n })\n);\n\nexport const getDeviceLimits = createAppAsyncThunk(`${sliceName}/getDeviceLimit`, (_, { dispatch }) =>\n GeneralApi.get(`${deviceAuthV2}/limits/devices`).then(res => dispatch(actions.setDeviceLimits(res.data)))\n);\n\ntype SetDeviceListStatePayload = {\n fetchAuth?: boolean;\n forceRefresh?: boolean;\n shouldSelectDevices?: boolean;\n} & Partial<DeviceListState>;\nexport const setDeviceListState = createAppAsyncThunk(\n `${sliceName}/setDeviceListState`,\n ({ shouldSelectDevices = true, forceRefresh, fetchAuth = true, ...selectionState }: SetDeviceListStatePayload, { dispatch, getState }) => {\n const currentState = getDeviceListState(getState());\n const refreshTrigger = forceRefresh ? !currentState.refreshTrigger : selectionState.refreshTrigger;\n const nextState = {\n ...currentState,\n setOnly: false,\n refreshTrigger,\n ...selectionState,\n sort: { ...currentState.sort, ...selectionState.sort }\n };\n const tasks: ReturnType<AppDispatch>[] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: currentLoading, deviceIds: currentDevices, selection: currentSelection, ...currentRequestState } = currentState;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { isLoading: nextLoading, deviceIds: nextDevices, selection: nextSelection, ...nextRequestState } = nextState;\n if (!nextState.setOnly && !deepCompare(currentRequestState, nextRequestState)) {\n const { direction: sortDown = SORTING_OPTIONS.desc, key: sortCol, scope: sortScope = '' } = nextState.sort ?? {};\n const sortBy = sortCol ? ([{ attribute: sortCol, order: sortDown as SortCriteria['order'], scope: sortScope }] as SortCriteria[]) : undefined;\n const applicableSelectedState = nextState.state === ALL_DEVICE_STATES ? undefined : nextState.state;\n nextState.isLoading = true;\n tasks.push(\n dispatch(getDevicesByStatus({ ...nextState, status: applicableSelectedState as DeviceAuthState | undefined, sortOptions: sortBy, fetchAuth }))\n .unwrap()\n .then(results => {\n const { deviceAccu, total } = results[results.length - 1];\n const devicesState = shouldSelectDevices ? { deviceIds: deviceAccu.ids, total, isLoading: false } : { isLoading: false };\n return Promise.resolve(dispatch(actions.setDeviceListState(devicesState)));\n })\n // whatever happens, change \"loading\" back to null\n .catch(() => Promise.resolve({ isLoading: false }))\n );\n }\n if (\n currentState.page !== nextState.page ||\n currentState.perPage > nextState.perPage ||\n currentState.state !== nextState.state ||\n !deepCompare(currentState.sort, nextState.sort)\n ) {\n nextState.selection = [];\n }\n tasks.push(dispatch(actions.setDeviceListState(nextState)));\n return Promise.all(tasks);\n }\n);\n\ntype GetDevicesByStatusPayload = {\n fetchAuth: boolean;\n filterSelection: DeviceFilter[];\n group: string;\n page: number;\n perPage: number;\n selectedAttributes: DeviceSelectedAttribute[];\n selectedIssues: DeviceIssueOptionKey[];\n sortOptions: SortCriteria[];\n status: DeviceAuthState;\n};\n// get devices from inventory\nexport const getDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getDevicesByStatus`,\n (options: Partial<GetDevicesByStatusPayload>, { dispatch, getState }) => {\n const {\n status,\n fetchAuth = true,\n filterSelection,\n group,\n selectedIssues = [],\n page = defaultPage,\n perPage = defaultPerPage,\n sortOptions = [],\n selectedAttributes = getSelectedDeviceAttribute(getState())\n } = options;\n const state = getState();\n const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({\n filters: filterSelection ?? getDeviceFilters(state),\n group: group ?? getSelectedGroup(state),\n groups: state.devices.groups,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues,\n status\n });\n const attributes = [...defaultAttributes, getIdAttribute(getState()), ...selectedAttributes];\n return GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .then(response => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(response.data, [], state, status);\n let total = !applicableFilters.length ? Number(response.headers[headerNames.total]) : 0;\n if (status && state.devices.byStatus[status].counts.total === deviceAccu.ids.length) {\n total = deviceAccu.ids.length;\n }\n const tasks: ReturnType<AppDispatch>[] = [dispatch(actions.receivedDevices(deviceAccu.devicesById))];\n if (status) {\n tasks.push(dispatch(actions.setDevicesByStatus({ deviceIds: deviceAccu.ids, status, total })));\n }\n // for each device, get device identity info\n const receivedDevices: Device[] = Object.values(deviceAccu.devicesById);\n if (receivedDevices.length && fetchAuth) {\n tasks.push(dispatch(getDevicesWithAuth(receivedDevices)));\n }\n tasks.push(Promise.resolve({ deviceAccu, total: Number(response.headers[headerNames.total]) }));\n return Promise.all(tasks);\n })\n .catch(err => commonErrorHandler(err, `${status} devices couldn't be loaded.`, dispatch, commonErrorFallback));\n }\n);\n\nexport const getAllDevicesByStatus = createAppAsyncThunk(\n `${sliceName}/getAllDevicesByStatus`,\n ({ status, attribute }: { attribute: string; status: DeviceAuthState }, { dispatch, getState }) => {\n const attributes = [...defaultAttributes, getIdAttribute(getState())];\n const getAllDevices = (perPage = MAX_PAGE_SIZE, page = 1, devices: string[] = []) =>\n GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: mapFiltersToTerms([{ key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'identity' }]),\n attributes: [...attributes, { scope: 'inventory', attribute }]\n }).then(res => {\n const state = getState();\n const deviceAccu = reduceReceivedDevices(res.data, devices, state, status);\n dispatch(actions.receivedDevices(deviceAccu.devicesById));\n const total = Number(res.headers[headerNames.total]);\n if (total > state.deployments.deploymentDeviceLimit) {\n return Promise.resolve();\n }\n if (total > perPage * page) {\n return getAllDevices(perPage, page + 1, deviceAccu.ids);\n }\n return Promise.resolve();\n });\n return getAllDevices();\n }\n);\n\ntype SearchDevicesPayload = SearchState & { sortOptions: SortCriteria[] };\nexport const searchDevices = createAppAsyncThunk(`${sliceName}/searchDevices`, (passedOptions: Partial<SearchDevicesPayload> = {}, { dispatch, getState }) => {\n const state = getState();\n const options = { ...state.app.searchState, ...passedOptions };\n const { page = defaultPage, searchTerm, sortOptions = [] } = options;\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = attributeDuplicateFilter([...defaultAttributes, getIdAttribute(state), ...selectedAttributes], 'attribute');\n return GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: 10,\n filters: [],\n sort: sortOptions,\n text: searchTerm,\n attributes\n })\n .then(response => {\n const deviceAccu = reduceReceivedDevices(response.data, [], getState());\n return Promise.all([\n dispatch(actions.receivedDevices(deviceAccu.devicesById)),\n Promise.resolve({ deviceIds: deviceAccu.ids, searchTotal: Number(response.headers[headerNames.total]) })\n ]);\n })\n .catch(err => commonErrorHandler(err, `devices couldn't be searched.`, dispatch, commonErrorFallback));\n});\n\nconst ATTRIBUTE_LIST_CUTOFF = 100;\nconst attributeReducer = (attributes: AttributeV2[] = []) =>\n attributes.slice(0, ATTRIBUTE_LIST_CUTOFF).reduce(\n (accu, { name, scope }) => {\n if (!accu[scope]) {\n accu[scope] = [];\n }\n accu[scope].push(name);\n return accu;\n },\n { identity: [], inventory: [], system: [], tags: [] }\n );\n\nexport const getDeviceAttributes = createAppAsyncThunk(`${sliceName}/getDeviceAttributes`, (_, { dispatch }) =>\n GeneralApi.get(`${inventoryApiUrlV2}/filters/attributes`).then(({ data }) => {\n // TODO: remove the array fallback once the inventory attributes endpoint is fixed\n const { identity: identityAttributes, inventory: inventoryAttributes, system: systemAttributes, tags: tagAttributes } = attributeReducer(data || []);\n return dispatch(actions.setFilterAttributes({ identityAttributes, inventoryAttributes, systemAttributes, tagAttributes }));\n })\n);\n\nconst initializeDistributionData = (report, groups: Record<string, DeviceGroup>, devices: Record<string, Device>, totalDeviceCount: number) => {\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const { deviceIds, total = 0 } = groups[group] || {};\n const relevantDevices: Device[] = deviceIds ? deviceIds.map(id => devices[id]) : Object.values(devices);\n const distributionByAttribute = relevantDevices.reduce<Record<string, number>>((accu, item) => {\n if (!item.attributes || item.status !== DEVICE_STATES.accepted) return accu;\n const attributeValue: string = item.attributes[effectiveAttribute] as string;\n if (!accu[attributeValue]) {\n accu[attributeValue] = 0;\n }\n accu[attributeValue] = accu[attributeValue] + 1;\n return accu;\n }, {});\n const distributionByAttributeSorted = Object.entries(distributionByAttribute).sort((pairA, pairB) => pairB[1] - pairA[1]);\n const items: { count: number; key: string }[] = distributionByAttributeSorted.map(([key, count]) => ({ key, count }));\n const dataCount = items.reduce<number>((accu, item) => accu + item.count, 0);\n // the following is needed to show reports including both old (artifact_name) & current style (rootfs-image.version) device software\n const otherCount = (groups[group] ? total : totalDeviceCount) - dataCount;\n return { items, otherCount, total: otherCount + dataCount };\n};\n\nexport const updateReportData = createAppAsyncThunk(`${sliceName}/updateReportData`, (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n const { group = '' } = report;\n const devicesById = getDevicesById(getState());\n const groups = getGroupsById(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const totalDeviceCount = groups[group] ? (groups[group].total as number) : acceptedDevicesCount;\n\n const reportsData = getDeviceReports(getState());\n const newReports = [...reportsData];\n newReports[reportIndex] = initializeDistributionData(report, groups, devicesById, totalDeviceCount);\n return Promise.resolve(dispatch(actions.setDeviceReports(newReports)));\n});\n\nexport const getReportDataWithoutBackendSupport = createAppAsyncThunk(\n `${sliceName}/getReportDataWithoutBackendSupport`,\n (reportIndex: number, { dispatch, getState }) => {\n const reports = getDeviceReportsForUser(getState());\n const report = reports[reportIndex];\n if (!report) {\n return;\n }\n const { attribute, group = '', software = '' } = report;\n const effectiveAttribute = software ? software : attribute;\n const devicesById = getDevicesById(getState());\n const acceptedDevices = getAcceptedDevices(getState());\n const { accepted: acceptedDevicesCount } = getDeviceCountsByStatus(getState());\n const groups = getGroupsById(getState());\n const { deviceIds = [], filters = [], total = 0 } = groups[group] || {};\n let groupDevicesRequest = Promise.resolve({\n payload: { groupName: '', group: { deviceIds: Object.keys(devicesById), total: Object.keys(devicesById).length } }\n });\n if (group && (!(deviceIds.length && total) || deviceIds.length !== total || !deviceIds.every(id => !!devicesById[id]))) {\n groupDevicesRequest = filters.length\n ? dispatch(getAllDynamicGroupDevices({ group, attribute: effectiveAttribute })).unwrap()\n : dispatch(getAllGroupDevices({ group, attribute: effectiveAttribute })).unwrap();\n } else if (!group && (acceptedDevices.deviceIds.length !== acceptedDevicesCount || !acceptedDevices.deviceIds.every(id => !!devicesById[id]))) {\n groupDevicesRequest = dispatch(getAllDevicesByStatus({ status: DEVICE_STATES.accepted, attribute: effectiveAttribute })).unwrap();\n }\n return groupDevicesRequest.then(() => dispatch(updateReportData(reportIndex)));\n }\n);\n\nexport const getDeviceConnect = createAppAsyncThunk(`${sliceName}/getDeviceConnect`, (id: string, { dispatch }) =>\n GeneralApi.get(`${deviceConnect}/devices/${id}`).then(({ data }) =>\n Promise.all([dispatch(actions.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])\n )\n);\n\nconst updateTypeMap = { deploymentUpdate: 'check-update', inventoryUpdate: 'send-inventory' };\nexport const triggerDeviceUpdate = createAppAsyncThunk(`${sliceName}/triggerDeviceUpdate`, ({ id, type }: { id: string; type: string }, { dispatch }) =>\n GeneralApi.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`)\n .catch(err => commonErrorHandler(err, `The request couldn’t be sent.`, dispatch))\n .then(() => {\n dispatch(setSnackbar('Request has been sent.'));\n return new Promise(resolve => setTimeout(() => resolve(dispatch(getDeviceById(id)) as ReturnType<AppDispatch>), TIMEOUTS.threeSeconds));\n })\n);\n\ntype GetSessionDetailsPayload = { deviceId: string; endDate: string; sessionId: string; startDate: string; userId: string };\nexport const getSessionDetails = createAppAsyncThunk(\n `${sliceName}/getSessionDetails`,\n ({ sessionId, deviceId, userId, startDate, endDate }: GetSessionDetailsPayload) => {\n const { start: startUnix, end: endUnix } = dateRangeToUnix(startDate, endDate);\n const createdAfter = startDate ? `&created_after=${startUnix}` : '';\n const createdBefore = endDate ? `&created_before=${endUnix}` : '';\n const objectSearch = `&object_id=${deviceId}`;\n return GeneralApi.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(\n ({ data: auditLogEntries }) => {\n const { start, end } = auditLogEntries.reduce(\n (accu, item) => {\n if (item.meta?.session_id?.includes(sessionId)) {\n accu.start = new Date(item.action.startsWith('open') ? item.time : accu.start);\n accu.end = new Date(item.action.startsWith('close') ? item.time : accu.end);\n }\n return accu;\n },\n { start: startDate || endDate, end: endDate || startDate }\n );\n return Promise.resolve({ start, end });\n }\n );\n }\n);\n\nexport const getDeviceFileDownloadLink = createAppAsyncThunk(\n `${sliceName}/getDeviceFileDownloadLink`,\n ({ deviceId, path }: { deviceId: string; path: string }) =>\n Promise.resolve(`${window.location.origin}${deviceConnect}/devices/${deviceId}/download?path=${encodeURIComponent(path)}`)\n);\n\nexport const deviceFileUpload = createAppAsyncThunk(\n `${sliceName}/deviceFileUpload`,\n ({ deviceId, path, file }: { deviceId: string; file: File; path: string }, { dispatch }) => {\n const formData = new FormData();\n formData.append('path', path);\n formData.append('file', file);\n const uploadId = uuid();\n const cancelSource = new AbortController();\n return Promise.all([\n dispatch(setSnackbar('Uploading file')),\n dispatch(initUpload({ id: uploadId, upload: { progress: 0, cancelSource } })),\n GeneralApi.uploadPut(\n `${deviceConnect}/devices/${deviceId}/upload`,\n formData,\n e => dispatch(uploadProgress({ id: uploadId, progress: progress(e) })),\n cancelSource.signal\n )\n ])\n .then(() => Promise.resolve(dispatch(setSnackbar({ message: 'Upload successful', autoHideDuration: TIMEOUTS.fiveSeconds }))))\n .catch(err => {\n if (isCancel(err)) {\n return dispatch(setSnackbar({ message: 'The upload has been cancelled', autoHideDuration: TIMEOUTS.fiveSeconds }));\n }\n return commonErrorHandler(err, `Error uploading file to device.`, dispatch);\n })\n .finally(() => dispatch(cleanUpUpload(uploadId)));\n }\n);\n\nexport const getDeviceAuth = createAppAsyncThunk(`${sliceName}/getDeviceAuth`, (id: string, { dispatch }) =>\n dispatch(getDevicesWithAuth([{ id }]))\n .unwrap()\n .then(results => {\n if (results[results.length - 1]) {\n return Promise.resolve(results[results.length - 1][0]);\n }\n return Promise.resolve();\n })\n);\n\nexport const getDevicesWithAuth = createAppAsyncThunk(`${sliceName}/getDevicesWithAuth`, (devices: { id: string }[], { dispatch, getState }) =>\n devices.length\n ? GeneralApi.get(`${deviceAuthV2}/devices?id=${devices.map(device => device.id).join('&id=')}`)\n .then(({ data: receivedDevices }) => {\n const { devicesById } = reduceReceivedDevices(receivedDevices, [], getState());\n return Promise.all([dispatch(actions.receivedDevices(devicesById)), Promise.resolve(receivedDevices)]);\n })\n .catch(err => commonErrorHandler(err, `Error: ${err}`, dispatch))\n : (Promise.resolve([[], []]) as ReturnType<AppDispatch>)\n);\n\nexport const updateDeviceAuth = createAppAsyncThunk(\n `${sliceName}/updateDeviceAuth`,\n ({ deviceId, authId, status }: { authId: string; deviceId: string; status: Status['status'] }, { dispatch, getState }) =>\n GeneralApi.put(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}/status`, { status })\n .then(() => Promise.all([dispatch(getDeviceAuth(deviceId)), dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getDeviceListState(getState()).refreshTrigger })))\n);\n\nexport const updateDevicesAuth = createAppAsyncThunk(\n `${sliceName}/updateDevicesAuth`,\n ({ deviceIds, status }: { deviceIds: string[]; status: Status['status'] }, { dispatch, getState }) => {\n let devices = getDevicesById(getState());\n const deviceIdsWithoutAuth = deviceIds.reduce<{ id: string }[]>((accu, id) => (devices[id].auth_sets ? accu : [...accu, { id }]), []);\n return dispatch(getDevicesWithAuth(deviceIdsWithoutAuth)).then(() => {\n devices = getDevicesById(getState());\n // for each device, get id and id of authset & make api call to accept\n // if >1 authset, skip instead\n const deviceAuthUpdates = deviceIds.map(id => {\n const device = devices[id];\n if (device.auth_sets && device.auth_sets.length !== 1) {\n return Promise.reject();\n }\n // api call device.id and device.authsets[0].id\n return dispatch(updateDeviceAuth({ authId: device.auth_sets![0].id!, deviceId: device.id, status }))\n .unwrap()\n .catch(err => commonErrorHandler(err, 'The action was stopped as there was a problem updating a device authorization status: ', dispatch, '', false));\n });\n return Promise.allSettled(deviceAuthUpdates).then(results => {\n const { skipped, count } = results.reduce(\n (accu, item) => {\n if (item.status === 'rejected') {\n accu.skipped = accu.skipped + 1;\n } else {\n accu.count = accu.count + 1;\n }\n return accu;\n },\n { skipped: 0, count: 0 }\n );\n const message = getSnackbarMessage(skipped, count);\n // break if an error occurs, display status up til this point before error message\n return dispatch(setSnackbar(message));\n });\n });\n }\n);\n\nexport const deleteAuthset = createAppAsyncThunk(\n `${sliceName}/deleteAuthset`,\n ({ deviceId, authId }: { authId: string; deviceId: string }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}/auth/${authId}`)\n .then(() => Promise.all([dispatch(setSnackbar('Device authorization status was updated successfully'))]))\n .catch(err => commonErrorHandler(err, 'There was a problem updating the device authorization status:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const preauthDevice = createAppAsyncThunk(`${sliceName}/preauthDevice`, (authset: PreAuthSet, { dispatch, rejectWithValue }) =>\n GeneralApi.post(`${deviceAuthV2}/devices`, authset)\n .then(() =>\n Promise.resolve(dispatch(setSnackbar({ message: 'Device was successfully added to the preauthorization list', autoHideDuration: TIMEOUTS.fiveSeconds })))\n )\n .catch(err => {\n if (err.response.status === 409) {\n return rejectWithValue('A device with a matching identity data set already exists');\n }\n return commonErrorHandler(err, 'The device could not be added:', dispatch);\n })\n);\n\nexport const decommissionDevice = createAppAsyncThunk(\n `${sliceName}/decommissionDevice`,\n ({ deviceId, authId }: { authId?: string; deviceId: string }, { dispatch, getState }) =>\n GeneralApi.delete(`${deviceAuthV2}/devices/${deviceId}`)\n .then(() => Promise.resolve(dispatch(setSnackbar('Device was decommissioned successfully'))))\n .catch(err => commonErrorHandler(err, 'There was a problem decommissioning the device:', dispatch))\n .then(() => Promise.resolve(dispatch(actions.maybeUpdateDevicesByStatus({ deviceId, authId }))))\n // trigger reset of device list list!\n .finally(() => dispatch(setDeviceListState({ refreshTrigger: !getState().devices.deviceList.refreshTrigger })))\n);\n\nexport const getDeviceConfig = createAppAsyncThunk(`${sliceName}/getDeviceConfig`, (deviceId: string, { dispatch }) =>\n GeneralApi.get<DeviceConfiguration>(`${deviceConfig}/${deviceId}`)\n .then(({ data }) => Promise.all([dispatch(actions.receivedDevice({ id: deviceId, config: data })), Promise.resolve(data)]))\n .catch(err => {\n // if we get a proper error response we most likely queried a device without an existing config check-in and we can just ignore the call\n if (err.response?.data?.error.status_code !== 404) {\n return commonErrorHandler(err, `There was an error retrieving the configuration for device ${deviceId}.`, dispatch, commonErrorFallback);\n }\n })\n);\n\nexport const setDeviceConfig = createAppAsyncThunk(\n `${sliceName}/setDeviceConfig`,\n ({ deviceId, config }: { config: ManagementApiConfiguration; deviceId: string }, { dispatch }) =>\n GeneralApi.put(`${deviceConfig}/${deviceId}`, config)\n .catch(err => commonErrorHandler(err, `There was an error setting the configuration for device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(() => Promise.resolve(dispatch(getDeviceConfig(deviceId))))\n);\ntype ApplyDeviceConfigPayload = {\n config: DeviceConfiguration;\n configDeploymentConfiguration: NewConfigurationDeployment;\n deviceId: string;\n isDefault: boolean;\n};\nexport const applyDeviceConfig = createAppAsyncThunk(\n `${sliceName}/applyDeviceConfig`,\n ({ deviceId, configDeploymentConfiguration, isDefault, config }: ApplyDeviceConfigPayload, { dispatch, getState }) =>\n GeneralApi.post(`${deviceConfig}/${deviceId}/deploy`, configDeploymentConfiguration)\n .catch(err => commonErrorHandler(err, `There was an error deploying the configuration to device ${deviceId}.`, dispatch, commonErrorFallback))\n .then(({ data }) => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { canManageUsers } = getUserCapabilities(getState());\n const tasks: ReturnType<AppDispatch>[] = [\n dispatch(actions.receivedDevice({ ...device, config: { ...device.config, deployment_id: data.deployment_id } })),\n new Promise(resolve => setTimeout(() => resolve(dispatch(getSingleDeployment(data.deployment_id))), TIMEOUTS.oneSecond))\n ];\n if (isDefault && canManageUsers) {\n const { previous } = getGlobalSettings(getState()).defaultDeviceConfig ?? {};\n tasks.push(dispatch(saveGlobalSettings({ defaultDeviceConfig: { current: config, previous } })));\n }\n return Promise.all(tasks);\n })\n);\n\nexport const setDeviceTags = createAppAsyncThunk(\n `${sliceName}/setDeviceTags`,\n ({ deviceId, tags }: { deviceId: string; tags: Record<string, string> }, { dispatch }) =>\n // to prevent tag set failures, retrieve the device & use the freshest etag we can get\n dispatch(getDeviceById(deviceId))\n .unwrap()\n .then(device => {\n const headers = device.etag ? { 'If-Match': device.etag } : {};\n const tagList = Object.entries(tags).map(([name, value]) => ({ name, value }));\n const isNameChange = tagList.some(({ name }) => name === 'name');\n return GeneralApi.put(`${inventoryApiUrl}/devices/${deviceId}/tags`, tagList, { headers })\n .catch(err => commonErrorHandler(err, `There was an error setting tags for device ${deviceId}.`, dispatch, 'Please check your connection.'))\n .then(() =>\n Promise.all([\n dispatch(actions.receivedDevice({ ...device, id: deviceId, tags })),\n dispatch(setSnackbar(`Device ${tagList.length === 1 && isNameChange ? 'name' : 'tags'} changed`))\n ])\n );\n })\n);\n\ntype DeviceTwinPayload = { deviceId: string; integration: Integration };\nexport const getDeviceTwin = createAppAsyncThunk(`${sliceName}/getDeviceTwin`, ({ deviceId, integration }: DeviceTwinPayload, { dispatch, getState }) => {\n let providerResult = {};\n return GeneralApi.get<DeviceState>(`${iotManagerBaseURL}/devices/${deviceId}/state`)\n .then(({ data }) => {\n providerResult = { ...data, twinError: '' };\n })\n .catch(err => {\n providerResult = {\n twinError: `There was an error getting the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}. ${err}`\n };\n })\n .finally(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n Promise.resolve(dispatch(actions.receivedDevice({ ...device, twinsByIntegration: { ...device.twinsByIntegration, ...providerResult } })));\n });\n});\n\ntype SetDeviceTwinPayload = { deviceId: string; integration: Integration; settings: any };\nexport const setDeviceTwin = createAppAsyncThunk(\n `${sliceName}/setDeviceTwin`,\n ({ deviceId, integration, settings }: SetDeviceTwinPayload, { dispatch, getState }) =>\n GeneralApi.put(`${iotManagerBaseURL}/devices/${deviceId}/state/${integration.id}`, { desired: settings })\n .catch(err =>\n commonErrorHandler(\n err,\n `There was an error updating the ${EXTERNAL_PROVIDER[integration.provider].twinTitle.toLowerCase()} for device ${deviceId}.`,\n dispatch\n )\n )\n .then(() => {\n const device = getDeviceByIdSelector(getState(), deviceId);\n const { twinsByIntegration = {} } = device;\n const { [integration.id!]: currentState = {} } = twinsByIntegration;\n return Promise.resolve(\n dispatch(\n actions.receivedDevice({ ...device, twinsByIntegration: { ...twinsByIntegration, [integration.id!]: { ...currentState, desired: settings } } })\n )\n );\n })\n);\n\nconst prepareSearchArguments = ({ filters, group, state, status }: { filters?: DeviceFilter[]; group?: string; state: RootState; status?: string }) => {\n const { filterTerms } = convertDeviceListStateToFilters({ filters, group, offlineThreshold: state.app.offlineThreshold, selectedIssues: [], status });\n const { columnSelection = [] } = getUserSettings(state);\n const selectedAttributes = columnSelection.map(column => ({ attribute: column.key, scope: column.scope }));\n const attributes = [...defaultAttributes, getIdAttribute(state), ...selectedAttributes];\n return { attributes, filterTerms };\n};\ntype GetSystemDevicesPayload = { id: string; page?: number; perPage?: number; sortOptions: SortCriteria[] };\nexport const getSystemDevices = createAppAsyncThunk(`${sliceName}/getSystemDevices`, (options: GetSystemDevicesPayload, { dispatch, getState }) => {\n const { id, page = defaultPage, perPage = defaultPerPage, sortOptions = [] } = options;\n const state = getState();\n const { hasFullFiltering } = getTenantCapabilities(state);\n if (!hasFullFiltering) {\n return Promise.resolve();\n }\n const { attributes: deviceAttributes = {} } = getDeviceByIdSelector(state, id);\n const { mender_gateway_system_id = '' } = deviceAttributes as { mender_gateway_system_id?: string };\n const filters: DeviceFilter[] = [\n { ...emptyFilter, key: 'mender_is_gateway', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page,\n per_page: perPage,\n filters: filterTerms,\n sort: sortOptions,\n attributes\n })\n .catch(err => commonErrorHandler(err, `There was an error getting system devices device ${id}.`, dispatch, 'Please check your connection.'))\n .then(({ data, headers }) => {\n const state = getState();\n const { devicesById, ids } = reduceReceivedDevices(data, [], state);\n const device = {\n ...getDeviceByIdSelector(state, id),\n systemDeviceIds: ids,\n systemDeviceTotal: Number(headers[headerNames.total])\n };\n return Promise.resolve(dispatch(actions.receivedDevices({ ...devicesById, [id]: device })));\n });\n});\n\nexport const getGatewayDevices = createAppAsyncThunk(`${sliceName}/getGatewayDevices`, (deviceId: string, { dispatch, getState }) => {\n const state = getState();\n const { attributes = {} } = getDeviceByIdSelector(state, deviceId);\n const { mender_gateway_system_id = '' } = attributes as { mender_gateway_system_id?: string };\n const filters = [\n { ...emptyFilter, key: 'id', operator: DEVICE_FILTERING_OPTIONS.$ne.key, value: deviceId, scope: 'identity' },\n { ...emptyFilter, key: 'mender_is_gateway', value: 'true', scope: 'inventory' },\n { ...emptyFilter, key: 'mender_gateway_system_id', value: mender_gateway_system_id, scope: 'inventory' }\n ];\n const { attributes: attributeSelection, filterTerms } = prepareSearchArguments({ filters, state });\n return GeneralApi.post(`${inventoryApiUrlV2}/filters/search`, {\n page: 1,\n per_page: MAX_PAGE_SIZE,\n filters: filterTerms,\n attributes: attributeSelection\n }).then(({ data }) => {\n const { ids } = reduceReceivedDevices(data, [], getState());\n const tasks: ReturnType<AppDispatch> = ids.map(deviceId => dispatch(getDeviceInfo(deviceId)));\n tasks.push(dispatch(actions.receivedDevice({ id: deviceId, gatewayIds: ids })));\n return Promise.all(tasks);\n });\n});\n","// Copyright 2021 Northern.tech AS\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport type { DeviceFilter } from '@/src/devicesSlice';\nimport type { Alert } from '@northern.tech/types/MenderTypes';\n\nimport { actions, sliceName } from '.';\nimport storeActions from '../actions';\nimport Api from '../api/general-api';\nimport type { AlertChannelKey, DeviceIssueOptionKey } from '../constants';\nimport { DEVICE_LIST_DEFAULTS, TIMEOUTS, alertChannels, headerNames, inventoryApiUrlV2, monitorApiUrlv1 } from '../constants';\nimport { getDeviceFilters } from '../selectors';\nimport type { AppDispatch } from '../store';\nimport { commonErrorFallback, commonErrorHandler, createAppAsyncThunk } from '../store';\nimport { convertDeviceListStateToFilters } from '../utils';\n\nconst { page: defaultPage, perPage: defaultPerPage } = DEVICE_LIST_DEFAULTS;\n\nconst cutoffLength = 75;\nconst ellipsis = '...';\nconst longTextTrimmer = (text: string): string =>\n text.length >= cutoffLength + ellipsis.length ? `${text.substring(0, cutoffLength + ellipsis.length)}${ellipsis}` : text;\n\nconst sanitizeDeviceAlerts = (alerts: Alert[]) => alerts.map(alert => ({ ...alert, fullName: alert.name, name: longTextTrimmer(alert.name || '') }));\n\ninterface GetDeviceAlertsPayload {\n config?: { issuedAfter?: string; issuedBefore?: string; page?: number; perPage?: number; sortAscending?: boolean };\n id: string;\n}\nexport const getDeviceAlerts = createAppAsyncThunk(`${sliceName}/getDeviceAlerts`, ({ id, config = {} }: GetDeviceAlertsPayload, { dispatch }) => {\n const { page = defaultPage, perPage = defaultPerPage, issuedBefore, issuedAfter, sortAscending = false } = config;\n const issued_after = issuedAfter ? `&issued_after=${issuedAfter}` : '';\n const issued_before = issuedBefore ? `&issued_before=${issuedBefore}` : '';\n return Api.get<Alert[]>(\n `${monitorApiUrlv1}/devices/${id}/alerts?page=${page}&per_page=${perPage}${issued_after}${issued_before}&sort_ascending=${sortAscending}`\n )\n .catch(err => commonErrorHandler(err, `Retrieving device alerts for device ${id} failed:`, dispatch))\n .then(res =>\n Promise.all([\n dispatch(actions.receiveDeviceAlerts({ deviceId: id, alerts: sanitizeDeviceAlerts(res.data) })),\n dispatch(actions.setAlertListState({ total: Number(res.headers[headerNames.total]) }))\n ])\n );\n});\n\ninterface GetLatestDeviceAlertsPayload {\n config?: { page?: number; perPage?: number };\n id: string;\n}\nexport const getLatestDeviceAlerts = createAppAsyncThunk(\n `${sliceName}/getLatestDeviceAlerts`,\n ({ id, config = {} }: GetLatestDeviceAlertsPayload, { dispatch }) => {\n const { page = defaultPage, perPage = 10 } = config;\n return Api.get<Alert[]>(`${monitorApiUrlv1}/devices/${id}/alerts/latest?page=${page}&per_page=${perPage}`)\n .catch(err => commonErrorHandler(err, `Retrieving device alerts for device ${id} failed:`, dispatch))\n .then(res => Promise.resolve(dispatch(actions.receiveLatestDeviceAlerts({ deviceId: id, alerts: sanitizeDeviceAlerts(res.data) }))));\n }\n);\n\ninterface GetIssueCountsByTypePayload {\n options?: Partial<{ filters: DeviceFilter[]; group: string; status: string; type: string }>;\n type: DeviceIssueOptionKey;\n}\nexport const getIssueCountsByType = createAppAsyncThunk(\n `${sliceName}/getIssueCountsByType`,\n ({ type, options = {} }: GetIssueCountsByTypePayload, { dispatch, getState }) => {\n const state = getState();\n const { filters = getDeviceFilters(state), group, status, ...remainder } = options;\n const { applicableFilters: nonMonitorFilters, filterTerms } = convertDeviceListStateToFilters({\n ...remainder,\n filters,\n group,\n offlineThreshold: state.app.offlineThreshold,\n selectedIssues: [type],\n status\n });\n return Api.post(`${inventoryApiUrlV2}/filters/search`, {\n page: 1,\n per_page: 1,\n filters: filterTerms,\n attributes: [{ scope: 'identity', attribute: 'status' }]\n })\n .catch(err => commonErrorHandler(err, `Retrieving issue counts failed:`, dispatch, commonErrorFallback))\n .then(res => {\n const total = nonMonitorFilters.length ? state.monitor.issueCounts.byType[type].total : Number(res.headers[headerNames.total]);\n const filtered = nonMonitorFilters.length ? Number(res.headers[headerNames.total]) : total;\n if (total === state.monitor.issueCounts.byType[type].total && filtered === state.monitor.issueCounts.byType[type].filtered) {\n return Promise.resolve();\n }\n return Promise.resolve(dispatch(actions.receiveDeviceIssueCounts({ counts: { filtered, total }, issueType: type }))) as ReturnType<AppDispatch>;\n });\n }\n);\n\nexport const getDeviceMonitorConfig = createAppAsyncThunk(`${sliceName}/getDeviceMonitorConfig`, (id: string, { dispatch }) =>\n Api.get(`${monitorApiUrlv1}/devices/${id}/config`)\n .catch(err => commonErrorHandler(err, `Retrieving device monitor config for device ${id} failed:`, dispatch))\n .then(({ data }) => Promise.all([dispatch(storeActions.receivedDevice({ id, monitors: data }), Promise.resolve(data))]))\n);\n\ninterface ChangeNotificationSettingPayload {\n channel?: AlertChannelKey;\n enabled: boolean;\n}\nexport const changeNotificationSetting = createAppAsyncThunk(\n `${sliceName}/changeNotificationSetting`,\n ({ enabled, channel = alertChannels.email as AlertChannelKey }: ChangeNotificationSettingPayload, { dispatch }) =>\n Api.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled })\n .catch(err => commonErrorHandler(err, `${enabled ? 'En' : 'Dis'}abling ${channel} alerts failed:`, dispatch))\n .then(() =>\n Promise.all([\n dispatch(actions.changeAlertChannel({ channel, enabled })),\n dispatch(\n storeActions.setSnackbar({ message: `Successfully ${enabled ? 'en' : 'dis'}abled ${channel} alerts`, autoHideDuration: TIMEOUTS.fiveSeconds })\n )\n ])\n )\n);\n"],"mappings":"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AAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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","names":["getGlobalSettings","getUserSettings","import_helpers","import_dayjs","import_universal_cookie","import_constants","BarChartIcon","PieChartIcon","AWS","Azure","rolesById","import_toolkit","sliceName","initialState","progress","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","import_toolkit","sliceName","initialState","actions","actions","import_universal_cookie","Cookies","cookies","Cookies","axios","progress","import_axios","Api","axios","import_helpers","import_toolkit","import_helpers","import_toolkit","import_toolkit","accu","import_helpers","import_toolkit","accu","import_toolkit","import_toolkit","import_helpers","uploadProgress","import_toolkit","rolesById","rolesById","progress","getDemoDeviceAddressHelper","dayjs","import_helpers","import_toolkit","actions","import_helpers","import_universal_cookie","cookies","Cookies","sliceName","actions","import_helpers","validator","setSnackbar","getDeploymentsByStatus","sliceName","actions","Tracking","getDeviceById","import_helpers","import_axios","import_jsx_runtime","setSnackbar","uploadProgress","defaultPage","defaultPerPage","getGroups","sliceName","actions","getDevicesByStatus","pluralize","getDeviceById","getDeviceLimits","state","uuid","deviceId","defaultPage","defaultPerPage","sliceName","actions","getIssueCountsByType","cookies","Cookies","setSnackbar","permission","scope","rolesById","accu","permissionSet","getGlobalSettings","getUserSettings","dayjs","hashString"]}