@northern.tech/store 0.12.0 → 0.13.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 (176) hide show
  1. package/dist/actions.cjs +20 -16
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.d.cts +7 -22
  4. package/dist/actions.d.ts +7 -22
  5. package/dist/actions.js +8 -8
  6. package/dist/appSlice/index.cjs.map +1 -1
  7. package/dist/appSlice/index.d.cts +1 -1
  8. package/dist/appSlice/index.d.ts +1 -1
  9. package/dist/appSlice/index.js +1 -1
  10. package/dist/appSlice/mocks.cjs.map +1 -1
  11. package/dist/appSlice/mocks.js +1 -1
  12. package/dist/appSlice/selectors.d.cts +34 -528
  13. package/dist/appSlice/selectors.d.ts +34 -528
  14. package/dist/appSlice/thunks.cjs +45 -41
  15. package/dist/appSlice/thunks.cjs.map +1 -1
  16. package/dist/appSlice/thunks.d.cts +5 -3
  17. package/dist/appSlice/thunks.d.ts +5 -3
  18. package/dist/appSlice/thunks.js +14 -14
  19. package/dist/{chunk-QOFVCPRW.js → chunk-5PUF4LA5.js} +1 -1
  20. package/dist/chunk-5PUF4LA5.js.map +1 -0
  21. package/dist/{chunk-TKIOEF3B.js → chunk-6KAV62BW.js} +6 -6
  22. package/dist/{chunk-OFGCC3GM.js → chunk-7MTM3BDT.js} +1 -1
  23. package/dist/chunk-7MTM3BDT.js.map +1 -0
  24. package/dist/{chunk-4HSH7RH3.js → chunk-AR4FTKSL.js} +8 -8
  25. package/dist/{chunk-ZRMB4U7Z.js → chunk-BZAXFAGT.js} +4 -4
  26. package/dist/{chunk-ZNAJKEP2.js → chunk-CQXDAXQF.js} +1 -1
  27. package/dist/chunk-CQXDAXQF.js.map +1 -0
  28. package/dist/{chunk-5ZCZTTYX.js → chunk-EOZ665GA.js} +2 -2
  29. package/dist/{chunk-C5NXNZ7F.js → chunk-ETZVJXPD.js} +23 -30
  30. package/dist/chunk-ETZVJXPD.js.map +1 -0
  31. package/dist/{chunk-WCBHYLUK.js → chunk-KJ4BPXMB.js} +1 -1
  32. package/dist/chunk-KJ4BPXMB.js.map +1 -0
  33. package/dist/{chunk-C2LGE3P6.js → chunk-OLKM53RL.js} +1 -1
  34. package/dist/chunk-OLKM53RL.js.map +1 -0
  35. package/dist/{chunk-HLX5L3IM.js → chunk-PVCHKW35.js} +1 -1
  36. package/dist/chunk-PVCHKW35.js.map +1 -0
  37. package/dist/{chunk-REZWSU22.js → chunk-VODRLEDP.js} +21 -17
  38. package/dist/chunk-VODRLEDP.js.map +1 -0
  39. package/dist/{chunk-MH5WPYQI.js → chunk-X7NEALMI.js} +16 -9
  40. package/dist/chunk-X7NEALMI.js.map +1 -0
  41. package/dist/{chunk-OGUVURJ5.js → chunk-YFAIYNQG.js} +9 -9
  42. package/dist/commonSelectors.cjs +15 -8
  43. package/dist/commonSelectors.cjs.map +1 -1
  44. package/dist/commonSelectors.d.cts +178 -3523
  45. package/dist/commonSelectors.d.ts +178 -3523
  46. package/dist/commonSelectors.js +2 -2
  47. package/dist/deploymentsSlice/index.cjs.map +1 -1
  48. package/dist/deploymentsSlice/index.d.cts +1 -1
  49. package/dist/deploymentsSlice/index.d.ts +1 -1
  50. package/dist/deploymentsSlice/index.js +1 -1
  51. package/dist/deploymentsSlice/mocks.cjs.map +1 -1
  52. package/dist/deploymentsSlice/mocks.js +1 -1
  53. package/dist/deploymentsSlice/selectors.d.cts +16 -138
  54. package/dist/deploymentsSlice/selectors.d.ts +16 -138
  55. package/dist/deploymentsSlice/thunks.cjs +45 -41
  56. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  57. package/dist/deploymentsSlice/thunks.d.cts +4 -2
  58. package/dist/deploymentsSlice/thunks.d.ts +4 -2
  59. package/dist/deploymentsSlice/thunks.js +14 -14
  60. package/dist/devicesSlice/index.cjs +20 -16
  61. package/dist/devicesSlice/index.cjs.map +1 -1
  62. package/dist/devicesSlice/index.d.cts +11 -20
  63. package/dist/devicesSlice/index.d.ts +11 -20
  64. package/dist/devicesSlice/index.js +1 -1
  65. package/dist/devicesSlice/mocks.cjs +24 -22
  66. package/dist/devicesSlice/mocks.cjs.map +1 -1
  67. package/dist/devicesSlice/mocks.d.cts +20 -12
  68. package/dist/devicesSlice/mocks.d.ts +20 -12
  69. package/dist/devicesSlice/mocks.js +5 -7
  70. package/dist/devicesSlice/mocks.js.map +1 -1
  71. package/dist/devicesSlice/selectors.cjs +15 -8
  72. package/dist/devicesSlice/selectors.cjs.map +1 -1
  73. package/dist/devicesSlice/selectors.d.cts +207 -1730
  74. package/dist/devicesSlice/selectors.d.ts +207 -1730
  75. package/dist/devicesSlice/selectors.js +1 -1
  76. package/dist/devicesSlice/thunks.cjs +45 -43
  77. package/dist/devicesSlice/thunks.cjs.map +1 -1
  78. package/dist/devicesSlice/thunks.d.cts +12 -46
  79. package/dist/devicesSlice/thunks.d.ts +12 -46
  80. package/dist/devicesSlice/thunks.js +14 -16
  81. package/dist/monitorSlice/index.cjs.map +1 -1
  82. package/dist/monitorSlice/index.d.cts +1 -1
  83. package/dist/monitorSlice/index.d.ts +1 -1
  84. package/dist/monitorSlice/index.js +1 -1
  85. package/dist/monitorSlice/mocks.cjs.map +1 -1
  86. package/dist/monitorSlice/mocks.js +1 -1
  87. package/dist/monitorSlice/thunks.cjs +35 -24
  88. package/dist/monitorSlice/thunks.cjs.map +1 -1
  89. package/dist/monitorSlice/thunks.d.cts +3 -2
  90. package/dist/monitorSlice/thunks.d.ts +3 -2
  91. package/dist/monitorSlice/thunks.js +12 -12
  92. package/dist/onboardingSlice/index.cjs.map +1 -1
  93. package/dist/onboardingSlice/index.d.cts +1 -1
  94. package/dist/onboardingSlice/index.d.ts +1 -1
  95. package/dist/onboardingSlice/index.js +1 -1
  96. package/dist/onboardingSlice/mocks.cjs.map +1 -1
  97. package/dist/onboardingSlice/mocks.js +1 -1
  98. package/dist/onboardingSlice/thunks.cjs +45 -41
  99. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  100. package/dist/onboardingSlice/thunks.d.cts +7 -15
  101. package/dist/onboardingSlice/thunks.d.ts +7 -15
  102. package/dist/onboardingSlice/thunks.js +14 -14
  103. package/dist/organizationSlice/index.cjs.map +1 -1
  104. package/dist/organizationSlice/index.d.cts +41 -31
  105. package/dist/organizationSlice/index.d.ts +41 -31
  106. package/dist/organizationSlice/index.js +1 -1
  107. package/dist/organizationSlice/mocks.cjs.map +1 -1
  108. package/dist/organizationSlice/mocks.js +1 -1
  109. package/dist/organizationSlice/selectors.d.cts +42 -659
  110. package/dist/organizationSlice/selectors.d.ts +42 -659
  111. package/dist/organizationSlice/thunks.cjs +45 -41
  112. package/dist/organizationSlice/thunks.cjs.map +1 -1
  113. package/dist/organizationSlice/thunks.d.cts +4 -1
  114. package/dist/organizationSlice/thunks.d.ts +4 -1
  115. package/dist/organizationSlice/thunks.js +14 -14
  116. package/dist/organizationSlice/types.cjs.map +1 -1
  117. package/dist/organizationSlice/types.d.cts +2 -12
  118. package/dist/organizationSlice/types.d.ts +2 -12
  119. package/dist/releasesSlice/mocks.d.cts +7 -1
  120. package/dist/releasesSlice/mocks.d.ts +7 -1
  121. package/dist/releasesSlice/selectors.d.cts +155 -930
  122. package/dist/releasesSlice/selectors.d.ts +155 -930
  123. package/dist/releasesSlice/thunks.cjs +35 -24
  124. package/dist/releasesSlice/thunks.cjs.map +1 -1
  125. package/dist/releasesSlice/thunks.d.cts +4 -2
  126. package/dist/releasesSlice/thunks.d.ts +4 -2
  127. package/dist/releasesSlice/thunks.js +12 -12
  128. package/dist/selectors.cjs +15 -8
  129. package/dist/selectors.cjs.map +1 -1
  130. package/dist/selectors.d.cts +6 -3
  131. package/dist/selectors.d.ts +6 -3
  132. package/dist/selectors.js +2 -2
  133. package/dist/store.cjs +20 -16
  134. package/dist/store.cjs.map +1 -1
  135. package/dist/store.d.cts +40 -658
  136. package/dist/store.d.ts +40 -658
  137. package/dist/store.js +9 -9
  138. package/dist/storehooks.cjs +45 -41
  139. package/dist/storehooks.cjs.map +1 -1
  140. package/dist/storehooks.js +14 -14
  141. package/dist/thunks.cjs +45 -43
  142. package/dist/thunks.cjs.map +1 -1
  143. package/dist/thunks.d.cts +7 -5
  144. package/dist/thunks.d.ts +7 -5
  145. package/dist/thunks.js +14 -16
  146. package/dist/useDeploymentDevice.cjs +45 -41
  147. package/dist/useDeploymentDevice.cjs.map +1 -1
  148. package/dist/useDeploymentDevice.js +14 -14
  149. package/dist/usersSlice/index.cjs.map +1 -1
  150. package/dist/usersSlice/index.d.cts +46 -46
  151. package/dist/usersSlice/index.d.ts +46 -46
  152. package/dist/usersSlice/index.js +1 -1
  153. package/dist/usersSlice/mocks.cjs.map +1 -1
  154. package/dist/usersSlice/mocks.js +1 -1
  155. package/dist/usersSlice/selectors.d.cts +75 -1436
  156. package/dist/usersSlice/selectors.d.ts +75 -1436
  157. package/dist/usersSlice/thunks.cjs +45 -41
  158. package/dist/usersSlice/thunks.cjs.map +1 -1
  159. package/dist/usersSlice/thunks.d.cts +3 -1
  160. package/dist/usersSlice/thunks.d.ts +3 -1
  161. package/dist/usersSlice/thunks.js +14 -14
  162. package/package.json +1 -1
  163. package/dist/chunk-C2LGE3P6.js.map +0 -1
  164. package/dist/chunk-C5NXNZ7F.js.map +0 -1
  165. package/dist/chunk-HLX5L3IM.js.map +0 -1
  166. package/dist/chunk-MH5WPYQI.js.map +0 -1
  167. package/dist/chunk-OFGCC3GM.js.map +0 -1
  168. package/dist/chunk-QOFVCPRW.js.map +0 -1
  169. package/dist/chunk-REZWSU22.js.map +0 -1
  170. package/dist/chunk-WCBHYLUK.js.map +0 -1
  171. package/dist/chunk-ZNAJKEP2.js.map +0 -1
  172. /package/dist/{chunk-TKIOEF3B.js.map → chunk-6KAV62BW.js.map} +0 -0
  173. /package/dist/{chunk-4HSH7RH3.js.map → chunk-AR4FTKSL.js.map} +0 -0
  174. /package/dist/{chunk-ZRMB4U7Z.js.map → chunk-BZAXFAGT.js.map} +0 -0
  175. /package/dist/{chunk-5ZCZTTYX.js.map → chunk-EOZ665GA.js.map} +0 -0
  176. /package/dist/{chunk-OGUVURJ5.js.map → chunk-YFAIYNQG.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/monitorSlice/index.ts"],"sourcesContent":["// 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\ntype 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"],"mappings":";;;;;;;AAcA,SAAS,mBAAmB;AAOrB,IAAM,YAAY;AAqBlB,IAAM,eAAiC;AAAA,EAC5C,QAAQ;AAAA,IACN,WAAW,EAAE,GAAG,sBAAsB,OAAO,EAAE;AAAA,IAC/C,YAAY,CAAC;AAAA,EACf;AAAA,EACA,aAAa;AAAA,IACX,QAAQ,OAAO,KAAK,oBAAoB,EAAE,OAAoB,CAAC,MAAM,SAAS,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,UAAU,GAAG,OAAO,EAAE,EAAE,IAAI,CAAC,CAAgB;AAAA,EACjJ;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,UAAU;AAAA,QACR,GAAG,OAAO,KAAK,aAAa,EAAE,OAAO,CAAC,MAAM,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,SAAS,KAAK,EAAE,IAAI,CAAC,CAAoB;AAAA,MACtH;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACR,oBAAoB,CAAC,OAAO,WAA0E;AACpG,YAAM,EAAE,SAAS,QAAQ,IAAI,OAAO;AACpC,YAAM,SAAS,OAAO,SAAS,OAAO,IAAI,EAAE,QAAQ;AAAA,IACtD;AAAA,IACA,qBAAqB,CAAC,OAAO,WAA0E;AACrG,YAAM,EAAE,UAAU,OAAO,IAAI,OAAO;AACpC,YAAM,OAAO,WAAW,QAAQ,IAAI,EAAE,OAAO;AAAA,IAC/C;AAAA,IACA,2BAA2B,CAAC,OAAO,WAA0E;AAC3G,YAAM,EAAE,UAAU,OAAO,IAAI,OAAO;AACpC,YAAM,OAAO,WAAW,QAAQ,IAAI,EAAE,GAAG,MAAM,OAAO,WAAW,QAAQ,GAAG,QAAQ,OAAO;AAAA,IAC7F;AAAA,IACA,0BAA0B,CAAC,OAAO,WAA4G;AAC5I,YAAM,EAAE,WAAW,OAAO,IAAI,OAAO;AACrC,YAAM,YAAY,OAAO,SAAS,IAAI;AAAA,IACxC;AAAA,IACA,mBAAmB,CAAC,OAAO,WAAW;AACpC,YAAM,OAAO,YAAY,EAAE,GAAG,MAAM,OAAO,WAAW,GAAG,OAAO,QAAQ;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAEM,IAAM,UAAU,aAAa;AACpC,IAAO,uBAAQ,aAAa;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/devicesSlice/selectors.ts"],"sourcesContent":["// 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 { 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((accu, state) => {\n accu[state] = byStatus[state].total || 0;\n return accu;\n }, {})\n);\n\nexport const getDeviceById = createSelector([getDevicesById, (_, deviceId) => deviceId], (devicesById, deviceId = '') => devicesById[deviceId] ?? {});\n\nexport const getSelectedGroupInfo = createSelector(\n [getAcceptedDevices, getGroupsById, getSelectedGroup],\n ({ total: 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 [getAcceptedDevices, getCombinedLimit],\n ({ total: acceptedDevices = 0 }, 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);\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"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/appSlice/index.ts"],"sourcesContent":["// 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\ntype AppSliceType = {\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 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 hasMonitor: 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-Client': '',\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 }\n});\n\nexport const actions = appSlice.actions;\nexport default appSlice.reducer;\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/organizationSlice/index.ts"],"sourcesContent":["// 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, 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 { AuditLogSelectionState, Card, Organization, OrganizationState, SSOConfig, TenantList } from '../organizationSlice/types';\n\nexport const sliceName = 'organization';\n\nexport const initialState: OrganizationState = {\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: AuditLog[]; 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 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"],"mappings":";;;;;;;AAeA,SAAS,mBAAmB;AAKrB,IAAM,YAAY;AAElB,IAAM,eAAkC;AAAA,EAC7C,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,YAAY,EAAE,OAAO,GAAG,MAAM,KAAK;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,IACV,GAAG;AAAA,IACH,OAAO;AAAA,IACP,SAAS,CAAC;AAAA,IACV,gBAAgB;AAAA,IAChB,MAAM;AAAA,MACJ,WAAW,gBAAgB;AAAA,MAC3B,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,cAAc;AAAA;AAAA,EAEd;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,gBAAgB;AAAA,MACd,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,eAAe;AAAA,MACf,MAAM,EAAE,WAAW,gBAAgB,KAAK;AAAA,MACxC,WAAW;AAAA,MACX,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,4BAA4B;AAAA;AAAA,EAE5B;AAAA,EACA,YAAY,CAAC;AAAA,EACb,UAAU;AAAA;AAAA;AAAA,IAGR,QAAQ,CAAC;AAAA,IACT,aAAa;AAAA,EACf;AACF;AAEO,IAAM,oBAAoB,YAAY;AAAA,EAC3C,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACR,kBAAkB,CAAC,OAAO,WAAiE;AACzF,YAAM,EAAE,QAAQ,MAAM,IAAI,OAAO;AACjC,YAAM,SAAS,SAAS;AACxB,YAAM,SAAS,eAAe,QAAQ;AAAA,IACxC;AAAA,IACA,kBAAkB,CAAC,OAAO,WAA2D;AACnF,YAAM,SAAS,iBAAiB;AAAA,QAC9B,GAAG,MAAM,SAAS;AAAA,QAClB,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,IACA,oBAAoB,CAAC,OAAO,WAAgC;AAC1D,YAAM,OAAO,OAAO;AAAA,IACtB;AAAA,IACA,oBAAoB,CAAC,OAAO,WAAyC;AACnE,YAAM,WAAW,OAAO;AAAA,IAC1B;AAAA,IACA,iBAAiB,CAAC,OAAO,WAAiD;AACxE,YAAM,eAAe,EAAE,GAAG,MAAM,cAAc,GAAG,OAAO,QAAQ;AAAA,IAClE;AAAA,IACA,iBAAiB,CAAC,OAAO,WAAW;AAClC,YAAM,aAAa,eAAe,EAAE,GAAG,MAAM,aAAa,cAAc,GAAG,OAAO,QAAQ;AAAA,IAC5F;AAAA,IACA,mBAAmB,CAAC,OAAO,WAA0C;AACnE,YAAM,aAAa,kBAAkB,OAAO;AAAA,IAC9C;AAAA,IACA,oBAAoB,CAAC,OAAO,WAAsC;AAChE,YAAM,aAAa,OAAO;AAAA,IAC5B;AAAA,IACA,mCAAmC,CAAC,OAAO,WAAyC;AAClF,YAAM,6BAA6B,OAAO;AAAA,IAC5C;AAAA,IACA,mBAAmB,CAAC,OAAO,WAAuC;AAChE,YAAM,aAAa,OAAO;AAAA,IAC5B;AAAA,IACA,sBAAsB,CAAC,OAAO,WAAoE;AAChG,YAAM,EAAE,OAAO,MAAM,IAAI,OAAO;AAChC,YAAM,SAAS,SAAS;AACxB,YAAM,SAAS,cAAc;AAAA,IAC/B;AAAA,EACF;AACF,CAAC;AAEM,IAAM,UAAU,kBAAkB;AACzC,IAAO,4BAAQ,kBAAkB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/devicesSlice/index.ts"],"sourcesContent":["// 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};\nexport type DeviceStatus = DeviceAuthState | 'active' | 'inactive';\n\nexport type DeviceGroups = {\n byId: Record<string, DeviceGroup>;\n selectedGroup?: string;\n};\nexport type DeviceSliceType = {\n byId: Record<string, Device>;\n byStatus: Record<DeviceStatus, { deviceIds: string[]; total: number }>;\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: [], total: 0 },\n active: { deviceIds: [], total: 0 },\n inactive: { deviceIds: [], total: 0 },\n [DEVICE_STATES.pending]: { deviceIds: [], total: 0 },\n [DEVICE_STATES.preauth]: { deviceIds: [], total: 0 },\n [DEVICE_STATES.rejected]: { deviceIds: [], 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 setInactiveDevices: (state, action: PayloadAction<{ activeDeviceTotal: number; inactiveDeviceTotal: number }>) => {\n const { activeDeviceTotal, inactiveDeviceTotal } = action.payload;\n state.byStatus.active.total = activeDeviceTotal;\n state.byStatus.inactive.total = inactiveDeviceTotal;\n },\n setDeviceReports: (state, action: PayloadAction<DeviceReport[]>) => {\n state.reports = action.payload;\n },\n setDevicesByStatus: (state, action: PayloadAction<{ deviceIds: string[]; forceUpdate?: boolean; status: DeviceStatus; total: number }>) => {\n const { forceUpdate, status, total, deviceIds } = action.payload;\n state.byStatus[status] = total || forceUpdate ? { deviceIds, total } : state.byStatus[status];\n },\n setDevicesCountByStatus: (state, action: PayloadAction<{ count: number; status: DeviceStatus }>) => {\n const { count, status } = action.payload;\n state.byStatus[status].total = count;\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 state.byStatus[device.status] = { deviceIds, total: Math.max(0, state.byStatus[device.status].total - 1) };\n }\n }\n }\n});\n\nexport const actions = devicesSlice.actions;\nexport default devicesSlice.reducer;\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/usersSlice/index.ts"],"sourcesContent":["// 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 tooltips?: object;\n trackingConsentGiven?: boolean;\n};\ntype UserSliceState = {\n activationCode?: string;\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};\nexport const initialState: UserSliceState = {\n activationCode: undefined,\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 },\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 receivedActivationCode: (state, action: PayloadAction<string>) => {\n state.activationCode = 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<UserSliceState['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"],"mappings":"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","names":["rolesById"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/onboardingSlice/index.ts"],"sourcesContent":["// 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';\ntype 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"],"mappings":";AAcA,SAAS,mBAAmB;AAErB,IAAM,YAAY;AAelB,IAAM,eAAoC;AAAA,EAC/C,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,gBAAgB;AAClB;AAEO,IAAM,kBAAkB,YAAY;AAAA,EACzC,MAAM;AAAA,EACN;AAAA,EACA,UAAU;AAAA,IACR,oBAAoB,CAAC,OAAO,YAAyD,EAAE,GAAG,OAAO,GAAG,OAAO,QAAQ;AAAA,IACnH,qBAAqB,CAAC,OAAO,WAAkC;AAC7D,YAAM,mBAAmB,OAAO;AAAA,IAClC;AAAA,IACA,uBAAuB,CAAC,OAAO,WAAmC;AAChE,YAAM,WAAW,OAAO;AAAA,IAC1B;AAAA,IACA,oCAAoC,CAAC,OAAO,WAAmC;AAC7E,YAAM,iBAAiB,OAAO;AAAA,IAChC;AAAA,IACA,uBAAuB,CAAC,OAAO,WAAmC;AAChE,YAAM,WAAW,OAAO;AAAA,IAC1B;AAAA,IACA,uBAAuB,CAAC,OAAO,WAAkC;AAC/D,YAAM,WAAW,OAAO;AAAA,IAC1B;AAAA,IACA,yBAAyB,CAAC,OAAO,WAA6C;AAC5E,YAAM,aAAa,OAAO;AAAA,IAC5B;AAAA,IACA,uBAAuB,CAAC,OAAO,WAA8C;AAC3E,YAAM,WAAW,OAAO;AAAA,IAC1B;AAAA,EACF;AACF,CAAC;AAEM,IAAM,UAAU,gBAAgB;AACvC,IAAO,0BAAQ,gBAAgB;","names":[]}