@northern.tech/store 0.3.2 → 0.3.4

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 (251) hide show
  1. package/dist/BillingProfile-ChP2_Sqw.d.cts +45 -0
  2. package/dist/BillingProfile-ChP2_Sqw.d.ts +45 -0
  3. package/dist/actions.cjs +22 -23
  4. package/dist/actions.cjs.map +1 -1
  5. package/dist/actions.js +12 -12
  6. package/dist/api/general-api.cjs.map +1 -1
  7. package/dist/api/general-api.js +5 -5
  8. package/dist/api/types/Tenant.ts +17 -12
  9. package/dist/api/users-api.cjs.map +1 -1
  10. package/dist/api/users-api.js +6 -6
  11. package/dist/appSlice/constants.cjs +18 -10
  12. package/dist/appSlice/constants.cjs.map +1 -1
  13. package/dist/appSlice/constants.d.cts +41 -84
  14. package/dist/appSlice/constants.d.ts +41 -84
  15. package/dist/appSlice/constants.js +1 -1
  16. package/dist/appSlice/index.cjs +1 -3
  17. package/dist/appSlice/index.cjs.map +1 -1
  18. package/dist/appSlice/index.js +4 -4
  19. package/dist/appSlice/thunks.cjs +153 -120
  20. package/dist/appSlice/thunks.cjs.map +1 -1
  21. package/dist/appSlice/thunks.js +28 -27
  22. package/dist/auth.cjs.map +1 -1
  23. package/dist/auth.js +4 -4
  24. package/dist/{chunk-NI4SZOCF.js → chunk-4RWZR3BN.js} +23 -25
  25. package/dist/{chunk-NI4SZOCF.js.map → chunk-4RWZR3BN.js.map} +1 -1
  26. package/dist/{chunk-YGBFDXXA.js → chunk-7YZCUAXZ.js} +2 -2
  27. package/dist/{chunk-7PVGDMNM.js → chunk-AFICTIVU.js} +3 -5
  28. package/dist/{chunk-7PVGDMNM.js.map → chunk-AFICTIVU.js.map} +1 -1
  29. package/dist/{chunk-YT73QWCN.js → chunk-AUBJUUP3.js} +3 -3
  30. package/dist/{chunk-UEP36GCI.js → chunk-AVX7VVOK.js} +3 -3
  31. package/dist/{chunk-4B3IMP4I.js → chunk-BSN2TOQC.js} +1 -1
  32. package/dist/{chunk-4B3IMP4I.js.map → chunk-BSN2TOQC.js.map} +1 -1
  33. package/dist/{chunk-VOCOFE4I.js → chunk-DCEKU6UV.js} +2 -2
  34. package/dist/{chunk-E5LEU5PF.js → chunk-DGQKXSRI.js} +3 -3
  35. package/dist/{chunk-74OJIKXF.js → chunk-EQLHIPPR.js} +182 -142
  36. package/dist/chunk-EQLHIPPR.js.map +1 -0
  37. package/dist/{chunk-MDC7Y3EX.js → chunk-EYCORLYU.js} +44 -40
  38. package/dist/chunk-EYCORLYU.js.map +1 -0
  39. package/dist/{chunk-KAQJH2YL.js → chunk-FQDSV3NK.js} +13 -5
  40. package/dist/chunk-FQDSV3NK.js.map +1 -0
  41. package/dist/{chunk-XTRPX7JZ.js → chunk-FRSA2YB5.js} +3 -3
  42. package/dist/chunk-FRSA2YB5.js.map +1 -0
  43. package/dist/{chunk-ANB5BM5J.js → chunk-FVCYB5OP.js} +37 -32
  44. package/dist/chunk-FVCYB5OP.js.map +1 -0
  45. package/dist/{chunk-AMGWP7A4.js → chunk-GAI4VYRZ.js} +2 -2
  46. package/dist/{chunk-YETZPQFR.js → chunk-GWJIY56H.js} +19 -20
  47. package/dist/chunk-GWJIY56H.js.map +1 -0
  48. package/dist/{chunk-Q6M5TTDQ.js → chunk-JO33IORF.js} +2 -2
  49. package/dist/chunk-JO33IORF.js.map +1 -0
  50. package/dist/chunk-K4MMUDYT.js +391 -0
  51. package/dist/chunk-K4MMUDYT.js.map +1 -0
  52. package/dist/{chunk-XXHONFSQ.js → chunk-L3SY3J5M.js} +4 -4
  53. package/dist/{chunk-XXHONFSQ.js.map → chunk-L3SY3J5M.js.map} +1 -1
  54. package/dist/{chunk-JAROCU6M.js → chunk-NCSKCF2S.js} +3 -3
  55. package/dist/{chunk-CYV6632F.js → chunk-NOQR3TE7.js} +2 -2
  56. package/dist/{chunk-A6CT6GTI.js → chunk-OEP2D6QL.js} +18 -12
  57. package/dist/chunk-OEP2D6QL.js.map +1 -0
  58. package/dist/{chunk-2RJIDREZ.js → chunk-PAIB5V27.js} +32 -23
  59. package/dist/chunk-PAIB5V27.js.map +1 -0
  60. package/dist/{chunk-FGKMJS3B.js → chunk-RX32WLVJ.js} +2 -4
  61. package/dist/chunk-RX32WLVJ.js.map +1 -0
  62. package/dist/{chunk-YTQUNAZP.js → chunk-X3GZILYD.js} +3 -3
  63. package/dist/{chunk-25AKG5HH.js → chunk-Y575RZHR.js} +19 -11
  64. package/dist/chunk-Y575RZHR.js.map +1 -0
  65. package/dist/{chunk-RX55KAKX.js → chunk-ZWOAFHAR.js} +2 -2
  66. package/dist/{chunk-NNADGHSL.js → chunk-ZZMFXRQK.js} +14 -14
  67. package/dist/commonConstants.cjs.map +1 -1
  68. package/dist/commonConstants.d.cts +1 -1
  69. package/dist/commonConstants.d.ts +1 -1
  70. package/dist/commonConstants.js +1 -1
  71. package/dist/commonSelectors.cjs +47 -29
  72. package/dist/commonSelectors.cjs.map +1 -1
  73. package/dist/commonSelectors.d.cts +55 -46
  74. package/dist/commonSelectors.d.ts +55 -46
  75. package/dist/commonSelectors.js +11 -11
  76. package/dist/constants.cjs +35 -19
  77. package/dist/constants.cjs.map +1 -1
  78. package/dist/constants.d.cts +3 -3
  79. package/dist/constants.d.ts +3 -3
  80. package/dist/constants.js +7 -3
  81. package/dist/deploymentdevicehook.cjs +159 -125
  82. package/dist/deploymentdevicehook.cjs.map +1 -1
  83. package/dist/deploymentdevicehook.d.cts +1 -1
  84. package/dist/deploymentdevicehook.d.ts +1 -1
  85. package/dist/deploymentdevicehook.js +34 -31
  86. package/dist/deploymentdevicehook.js.map +1 -1
  87. package/dist/deploymentsSlice/constants.cjs +8 -8
  88. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  89. package/dist/deploymentsSlice/constants.js +3 -3
  90. package/dist/deploymentsSlice/index.cjs +8 -8
  91. package/dist/deploymentsSlice/index.cjs.map +1 -1
  92. package/dist/deploymentsSlice/index.js +4 -4
  93. package/dist/deploymentsSlice/selectors.cjs +8 -8
  94. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  95. package/dist/deploymentsSlice/selectors.js +4 -4
  96. package/dist/deploymentsSlice/thunks.cjs +153 -120
  97. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  98. package/dist/deploymentsSlice/thunks.js +28 -27
  99. package/dist/devicesSlice/constants.cjs +11 -8
  100. package/dist/devicesSlice/constants.cjs.map +1 -1
  101. package/dist/devicesSlice/constants.d.cts +2 -1
  102. package/dist/devicesSlice/constants.d.ts +2 -1
  103. package/dist/devicesSlice/constants.js +5 -3
  104. package/dist/devicesSlice/index.cjs +8 -8
  105. package/dist/devicesSlice/index.cjs.map +1 -1
  106. package/dist/devicesSlice/index.js +4 -4
  107. package/dist/devicesSlice/selectors.cjs +9 -9
  108. package/dist/devicesSlice/selectors.cjs.map +1 -1
  109. package/dist/devicesSlice/selectors.js +4 -4
  110. package/dist/devicesSlice/thunks.cjs +155 -120
  111. package/dist/devicesSlice/thunks.cjs.map +1 -1
  112. package/dist/devicesSlice/thunks.d.cts +12 -2
  113. package/dist/devicesSlice/thunks.d.ts +12 -2
  114. package/dist/devicesSlice/thunks.js +30 -27
  115. package/dist/flag-eu-5477R2P4.svg +130 -0
  116. package/dist/flag-us-HNQAF66I.svg +63 -0
  117. package/dist/liststatehook.cjs +971 -0
  118. package/dist/liststatehook.cjs.map +1 -0
  119. package/dist/liststatehook.d.cts +246 -0
  120. package/dist/liststatehook.d.ts +246 -0
  121. package/dist/liststatehook.js +88 -0
  122. package/dist/liststatehook.js.map +1 -0
  123. package/dist/locationutils.cjs +942 -0
  124. package/dist/locationutils.cjs.map +1 -0
  125. package/dist/locationutils.d.cts +113 -0
  126. package/dist/locationutils.d.ts +113 -0
  127. package/dist/locationutils.js +46 -0
  128. package/dist/locationutils.js.map +1 -0
  129. package/dist/monitorSlice/constants.cjs +8 -8
  130. package/dist/monitorSlice/constants.cjs.map +1 -1
  131. package/dist/monitorSlice/constants.js +3 -3
  132. package/dist/monitorSlice/index.cjs +8 -8
  133. package/dist/monitorSlice/index.cjs.map +1 -1
  134. package/dist/monitorSlice/index.js +4 -4
  135. package/dist/monitorSlice/thunks.cjs +74 -62
  136. package/dist/monitorSlice/thunks.cjs.map +1 -1
  137. package/dist/monitorSlice/thunks.js +24 -24
  138. package/dist/onboardingSlice/index.cjs +1 -3
  139. package/dist/onboardingSlice/index.cjs.map +1 -1
  140. package/dist/onboardingSlice/index.js +1 -1
  141. package/dist/onboardingSlice/thunks.cjs +157 -124
  142. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  143. package/dist/onboardingSlice/thunks.d.cts +2 -34
  144. package/dist/onboardingSlice/thunks.d.ts +2 -34
  145. package/dist/onboardingSlice/thunks.js +28 -29
  146. package/dist/organizationSlice/constants.cjs +22 -17
  147. package/dist/organizationSlice/constants.cjs.map +1 -1
  148. package/dist/organizationSlice/constants.d.cts +33 -1
  149. package/dist/organizationSlice/constants.d.ts +33 -1
  150. package/dist/organizationSlice/constants.js +5 -3
  151. package/dist/organizationSlice/index.cjs +18 -15
  152. package/dist/organizationSlice/index.cjs.map +1 -1
  153. package/dist/organizationSlice/index.d.cts +27 -1012
  154. package/dist/organizationSlice/index.d.ts +27 -1012
  155. package/dist/organizationSlice/index.js +4 -4
  156. package/dist/organizationSlice/selectors.cjs.map +1 -1
  157. package/dist/organizationSlice/selectors.d.cts +10 -1
  158. package/dist/organizationSlice/selectors.d.ts +10 -1
  159. package/dist/organizationSlice/selectors.js +4 -4
  160. package/dist/organizationSlice/thunks.cjs +1619 -1559
  161. package/dist/organizationSlice/thunks.cjs.map +1 -1
  162. package/dist/organizationSlice/thunks.d.cts +62 -37
  163. package/dist/organizationSlice/thunks.d.ts +62 -37
  164. package/dist/organizationSlice/thunks.js +28 -27
  165. package/dist/organizationSlice/types.cjs +19 -0
  166. package/dist/organizationSlice/types.cjs.map +1 -0
  167. package/dist/organizationSlice/types.d.cts +5 -0
  168. package/dist/organizationSlice/types.d.ts +5 -0
  169. package/dist/organizationSlice/types.js +1 -0
  170. package/dist/organizationSlice/types.js.map +1 -0
  171. package/dist/releasesSlice/index.cjs.map +1 -1
  172. package/dist/releasesSlice/index.js +4 -4
  173. package/dist/releasesSlice/selectors.cjs +17 -8
  174. package/dist/releasesSlice/selectors.cjs.map +1 -1
  175. package/dist/releasesSlice/selectors.js +5 -5
  176. package/dist/releasesSlice/thunks.cjs +123 -94
  177. package/dist/releasesSlice/thunks.cjs.map +1 -1
  178. package/dist/releasesSlice/thunks.d.cts +1 -4
  179. package/dist/releasesSlice/thunks.d.ts +1 -4
  180. package/dist/releasesSlice/thunks.js +25 -24
  181. package/dist/selectors.cjs +53 -29
  182. package/dist/selectors.cjs.map +1 -1
  183. package/dist/selectors.d.cts +10 -1
  184. package/dist/selectors.d.ts +10 -1
  185. package/dist/selectors.js +49 -43
  186. package/dist/sockethook.cjs +529 -0
  187. package/dist/sockethook.cjs.map +1 -0
  188. package/dist/sockethook.d.cts +10 -0
  189. package/dist/sockethook.d.ts +10 -0
  190. package/dist/sockethook.js +141 -0
  191. package/dist/sockethook.js.map +1 -0
  192. package/dist/store.cjs +38 -29
  193. package/dist/store.cjs.map +1 -1
  194. package/dist/store.d.cts +13 -231
  195. package/dist/store.d.ts +13 -231
  196. package/dist/store.js +18 -16
  197. package/dist/storehooks.cjs +273 -198
  198. package/dist/storehooks.cjs.map +1 -1
  199. package/dist/storehooks.js +38 -37
  200. package/dist/storehooks.js.map +1 -1
  201. package/dist/thunks.cjs +259 -184
  202. package/dist/thunks.cjs.map +1 -1
  203. package/dist/thunks.d.cts +6 -2
  204. package/dist/thunks.d.ts +6 -2
  205. package/dist/thunks.js +30 -29
  206. package/dist/types-DBj17FZO.d.cts +135 -0
  207. package/dist/types-DnfZa6xd.d.ts +135 -0
  208. package/dist/usersSlice/constants.cjs +10 -10
  209. package/dist/usersSlice/constants.cjs.map +1 -1
  210. package/dist/usersSlice/constants.d.cts +6 -6
  211. package/dist/usersSlice/constants.d.ts +6 -6
  212. package/dist/usersSlice/constants.js +3 -3
  213. package/dist/usersSlice/index.cjs +10 -10
  214. package/dist/usersSlice/index.cjs.map +1 -1
  215. package/dist/usersSlice/index.js +4 -4
  216. package/dist/usersSlice/selectors.cjs +35 -13
  217. package/dist/usersSlice/selectors.cjs.map +1 -1
  218. package/dist/usersSlice/selectors.d.cts +44 -1
  219. package/dist/usersSlice/selectors.d.ts +44 -1
  220. package/dist/usersSlice/selectors.js +13 -7
  221. package/dist/usersSlice/thunks.cjs +151 -120
  222. package/dist/usersSlice/thunks.cjs.map +1 -1
  223. package/dist/usersSlice/thunks.d.cts +10 -9
  224. package/dist/usersSlice/thunks.d.ts +10 -9
  225. package/dist/usersSlice/thunks.js +28 -27
  226. package/dist/utils.cjs +23 -24
  227. package/dist/utils.cjs.map +1 -1
  228. package/dist/utils.js +4 -4
  229. package/package.json +7 -6
  230. package/dist/chunk-25AKG5HH.js.map +0 -1
  231. package/dist/chunk-2RJIDREZ.js.map +0 -1
  232. package/dist/chunk-74OJIKXF.js.map +0 -1
  233. package/dist/chunk-A6CT6GTI.js.map +0 -1
  234. package/dist/chunk-ANB5BM5J.js.map +0 -1
  235. package/dist/chunk-FGKMJS3B.js.map +0 -1
  236. package/dist/chunk-KAQJH2YL.js.map +0 -1
  237. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  238. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  239. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  240. package/dist/chunk-YETZPQFR.js.map +0 -1
  241. /package/dist/{chunk-YGBFDXXA.js.map → chunk-7YZCUAXZ.js.map} +0 -0
  242. /package/dist/{chunk-YT73QWCN.js.map → chunk-AUBJUUP3.js.map} +0 -0
  243. /package/dist/{chunk-UEP36GCI.js.map → chunk-AVX7VVOK.js.map} +0 -0
  244. /package/dist/{chunk-VOCOFE4I.js.map → chunk-DCEKU6UV.js.map} +0 -0
  245. /package/dist/{chunk-E5LEU5PF.js.map → chunk-DGQKXSRI.js.map} +0 -0
  246. /package/dist/{chunk-AMGWP7A4.js.map → chunk-GAI4VYRZ.js.map} +0 -0
  247. /package/dist/{chunk-JAROCU6M.js.map → chunk-NCSKCF2S.js.map} +0 -0
  248. /package/dist/{chunk-CYV6632F.js.map → chunk-NOQR3TE7.js.map} +0 -0
  249. /package/dist/{chunk-YTQUNAZP.js.map → chunk-X3GZILYD.js.map} +0 -0
  250. /package/dist/{chunk-RX55KAKX.js.map → chunk-ZWOAFHAR.js.map} +0 -0
  251. /package/dist/{chunk-NNADGHSL.js.map → chunk-ZZMFXRQK.js.map} +0 -0
@@ -74,28 +74,28 @@ var PLANS = {
74
74
  id: "os",
75
75
  name: "Basic",
76
76
  offer: true,
77
- price: "$32/month",
77
+ price: "$32 / month",
78
78
  deviceCount: startingDeviceCount.os,
79
- offerprice: "$23/month for first 50 devices",
79
+ offerprice: "$23 / month for first 50 devices",
80
80
  price2: "for first 6 months;\n$29/month thereafter",
81
- features: ["Basic OTA features"]
81
+ features: ["Access to core features of Mender", "Basic support"]
82
82
  },
83
83
  professional: {
84
84
  id: "professional",
85
85
  name: "Professional",
86
86
  offer: true,
87
- price: "$269/month",
87
+ price: "$269 / month",
88
88
  deviceCount: startingDeviceCount.professional,
89
- offerprice: "$200/month for first 50 devices",
89
+ offerprice: "$200 / month for first 50 devices",
90
90
  price2: "for first 6 months;\n$249/month thereafter",
91
- features: ["+ Advanced OTA features", "+ Standard support"]
91
+ features: ["Advanced OTA features", "Higher priority support"]
92
92
  },
93
93
  enterprise: {
94
94
  id: "enterprise",
95
95
  name: "Enterprise",
96
96
  price: "Custom pricing",
97
- deviceCount: "unlimited devices",
98
- features: ["+ Enterprise-grade OTA features", "+ Premium support"]
97
+ deviceCount: "Unlimited devices",
98
+ features: ["All Mender features", "Advanced security features", "SLA-backed support"]
99
99
  }
100
100
  };
101
101
  var ADDONS = {
@@ -566,6 +566,7 @@ var DEVICE_STATES = {
566
566
  rejected: "rejected"
567
567
  };
568
568
  var geoAttributes = ["geo-lat", "geo-lon"].map((attribute) => ({ attribute, scope: "inventory" }));
569
+ var REPORT_CHART_SIZE_LIMIT = 6;
569
570
 
570
571
  // src/monitorSlice/constants.ts
571
572
  var alertChannels = { email: "email" };
@@ -647,13 +648,16 @@ var SSO_TYPES = {
647
648
  configDetails: [{ key: "startURL", label: "Start Url", getValue: getOidcStartUrl }]
648
649
  }
649
650
  };
650
- var AUDIT_LOGS_TYPES = [
651
- { title: "Artifact", queryParameter: "object_type", value: "artifact" },
652
- { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
653
- { title: "Device", queryParameter: "object_id", value: "device" },
654
- { title: "User", queryParameter: "object_id", value: "user" }
655
- ];
656
- var SP_AUDIT_LOGS_TYPES = [AUDIT_LOGS_TYPES[3], { title: "Tenant", queryParameter: "object_id", value: "tenant" }];
651
+ var auditlogTypes = {
652
+ artifact: { title: "Artifact", queryParameter: "object_type", value: "artifact" },
653
+ deployment: { title: "Deployment", queryParameter: "object_deployment_name", value: "deployment" },
654
+ device: { title: "Device", queryParameter: "object_id", value: "device" },
655
+ user_access_token: { title: "Personal Access Token", queryParameter: "user_access_token", value: "user_access_token" },
656
+ user: { title: "User", queryParameter: "object_id", value: "user" },
657
+ tenant: { title: "Tenant", queryParameter: "object_id", value: "tenant" }
658
+ };
659
+ var AUDIT_LOGS_TYPES = [auditlogTypes.artifact, auditlogTypes.deployment, auditlogTypes.device, auditlogTypes.user_access_token, auditlogTypes.user];
660
+ var SP_AUDIT_LOGS_TYPES = [auditlogTypes.user, auditlogTypes.tenant];
657
661
  var emptyWebhook = {
658
662
  description: "",
659
663
  enabled: true,
@@ -786,7 +790,7 @@ var uiPermissionsByArea = {
786
790
  explanation: "Granting access to the audit log will allow tracing changes to devices, releases and user accounts, as well as providing information about deployments.",
787
791
  key: "auditlog",
788
792
  uiPermissions: [uiPermissionsById.read],
789
- title: "System audit log"
793
+ title: "System Audit Log"
790
794
  },
791
795
  deployments: {
792
796
  endpoints: [
@@ -937,7 +941,7 @@ var serviceProviderRolesById = {
937
941
  },
938
942
  readOnly: {
939
943
  name: "Read access",
940
- value: staticRolesByName.admin,
944
+ value: staticRolesByName.readOnly,
941
945
  description: "This role can see all linked organizations but cannot make any changes",
942
946
  permissions: [],
943
947
  uiPermissions: {
@@ -1195,9 +1199,7 @@ var appSlice = (0, import_toolkit.createSlice)({
1195
1199
  ...action.payload
1196
1200
  };
1197
1201
  },
1198
- setEnvironmentData: (state, action) => {
1199
- return { ...state, ...action.payload };
1200
- }
1202
+ setEnvironmentData: (state, action) => ({ ...state, ...action.payload })
1201
1203
  }
1202
1204
  });
1203
1205
  var actions = appSlice.actions;
@@ -1572,9 +1574,7 @@ var onboardingSlice = (0, import_toolkit5.createSlice)({
1572
1574
  name: sliceName5,
1573
1575
  initialState: initialState5,
1574
1576
  reducers: {
1575
- setOnboardingState: (state, action) => {
1576
- return { ...state, ...action.payload };
1577
- },
1577
+ setOnboardingState: (state, action) => ({ ...state, ...action.payload }),
1578
1578
  setDemoArtifactPort: (state, action) => {
1579
1579
  state.demoArtifactPort = action.payload;
1580
1580
  },
@@ -2142,7 +2142,7 @@ var getGroups = (0, import_toolkit11.createSelector)([getGroupsById], (groupsByI
2142
2142
  (accu, [groupname, group]) => {
2143
2143
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
2144
2144
  const groupItem = { ...group, groupId: name, name: groupname };
2145
- if (group.filters.length > 0) {
2145
+ if (group.filters?.length > 0) {
2146
2146
  if (groupname !== UNGROUPED_GROUP.id) {
2147
2147
  accu.dynamic.push(groupItem);
2148
2148
  } else {
@@ -2215,14 +2215,15 @@ var getAuditLogEntry = (0, import_toolkit12.createSelector)([getAuditLog, getAud
2215
2215
  // src/utils.ts
2216
2216
  var import_helpers4 = require("@northern.tech/utils/helpers");
2217
2217
  var filterProcessors = {
2218
- $gt: (val) => Number(val) || val,
2219
- $gte: (val) => Number(val) || val,
2220
- $lt: (val) => Number(val) || val,
2221
- $lte: (val) => Number(val) || val,
2222
- $in: (val) => ("" + val).split(",").map((i) => i.trim()),
2223
- $nin: (val) => ("" + val).split(",").map((i) => i.trim()),
2224
- $exists: import_helpers4.yes,
2225
- $nexists: () => false
2218
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
2219
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
2220
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
2221
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
2222
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
2223
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2224
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2225
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers4.yes,
2226
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
2226
2227
  };
2227
2228
  var filterAliases = {
2228
2229
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -2266,14 +2267,12 @@ var filtersFilter = (item, index, array) => {
2266
2267
  const firstIndex = array.findIndex((filter) => filterCompare(filter, item));
2267
2268
  return firstIndex === index;
2268
2269
  };
2269
- var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => {
2270
- return ids.slice(0, cutOffSize).reduce((accu, id) => {
2271
- if (id && byId[id]) {
2272
- accu.push({ ...defaultObject, ...byId[id] });
2273
- }
2274
- return accu;
2275
- }, []);
2276
- };
2270
+ var listItemMapper = (byId, ids, { defaultObject = {}, cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH }) => ids.slice(0, cutOffSize).reduce((accu, id) => {
2271
+ if (id && byId[id]) {
2272
+ accu.push({ ...defaultObject, ...byId[id] });
2273
+ }
2274
+ return accu;
2275
+ }, []);
2277
2276
  var mergePermissions = (existingPermissions = { ...emptyUiPermissions }, addedPermissions) => Object.entries(existingPermissions).reduce(
2278
2277
  (accu, [key, value]) => {
2279
2278
  let values;
@@ -2346,8 +2345,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
2346
2345
  var getGlobalSettings = (state) => state.users.globalSettings;
2347
2346
  var getCurrentUserId = (state) => state.users.currentUser;
2348
2347
  var getUsersById = (state) => state.users.byId;
2348
+ var getUsersList = (0, import_toolkit14.createSelector)([getUsersById], (usersById) => Object.values(usersById));
2349
2349
  var getCurrentUser = (0, import_toolkit14.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
2350
2350
  var getUserSettings = (state) => state.users.userSettings;
2351
+ var getSelectedDeviceAttribute = (0, import_toolkit14.createSelector)(
2352
+ [getUserSettings],
2353
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
2354
+ );
2351
2355
  var getIsDarkMode = (0, import_toolkit14.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
2352
2356
  var getShowHelptips = (0, import_toolkit14.createSelector)(
2353
2357
  [getTooltipsById],
@@ -2372,7 +2376,7 @@ var getOfflineThresholdSettings = (0, import_toolkit14.createSelector)([getGloba
2372
2376
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
2373
2377
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
2374
2378
  }));
2375
- var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
2379
+ var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
2376
2380
 
2377
2381
  // src/commonSelectors.ts
2378
2382
  var getIsEnterprise = (0, import_toolkit15.createSelector)(
@@ -2433,12 +2437,18 @@ var getUserCapabilities = (0, import_toolkit15.createSelector)([getUserRoles, ge
2433
2437
  });
2434
2438
  var getTenantCapabilities = (0, import_toolkit15.createSelector)(
2435
2439
  [getFeatures, getOrganization, getIsEnterprise],
2436
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2440
+ ({
2441
+ hasAuditlogs: isAuditlogEnabled,
2442
+ hasDeviceConfig: isDeviceConfigEnabled,
2443
+ hasDeviceConnect: isDeviceConnectEnabled,
2444
+ hasMonitor: isMonitorEnabled,
2445
+ isHosted
2446
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2437
2447
  const canDelta = isEnterprise || plan === PLANS.professional.id;
2438
2448
  const hasAuditlogs = isAuditlogEnabled && isEnterprise;
2439
- const hasDeviceConfig = isDeviceConfigEnabled && addons.some((addon) => addon.name === "configure" && Boolean(addon.enabled));
2440
- const hasDeviceConnect = isDeviceConnectEnabled && (!isEnterprise || addons.some((addon) => addon.name === "troubleshoot" && Boolean(addon.enabled)));
2441
- const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === "monitor" && Boolean(addon.enabled));
2449
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
2450
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
2451
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
2442
2452
  return {
2443
2453
  canDelta,
2444
2454
  canRetry: canDelta,
@@ -2542,9 +2552,7 @@ var getGroupNames = (0, import_toolkit15.createSelector)([getGroupsById, getUser
2542
2552
  });
2543
2553
  var getDeviceReportsForUser = (0, import_toolkit15.createSelector)(
2544
2554
  [getUserSettings, getCurrentUser, getGlobalSettings, getDevicesById],
2545
- ({ reports }, { id: currentUserId }, globalSettings, devicesById) => {
2546
- return reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : []);
2547
- }
2555
+ ({ reports }, { id: currentUserId }, globalSettings, devicesById) => reports || globalSettings[`${currentUserId}-reports`] || (Object.keys(devicesById).length ? defaultReports : [])
2548
2556
  );
2549
2557
  var listTypeDeviceIdMap = {
2550
2558
  deviceList: getListedDevices,
@@ -2568,7 +2576,7 @@ var getAuditlogDevice = (0, import_toolkit15.createSelector)([getAuditLogEntry,
2568
2576
  var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
2569
2577
  if (service_provider) {
2570
2578
  return roles.reduce((accu, role) => {
2571
- if (rolesById[role.id]) {
2579
+ if (rolesById[role.value]) {
2572
2580
  return accu;
2573
2581
  }
2574
2582
  accu.push(role);
@@ -2576,20 +2584,19 @@ var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, ge
2576
2584
  }, Object.values(serviceProviderRolesById));
2577
2585
  }
2578
2586
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
2579
- const index = accu.findIndex(({ id }) => id === key);
2587
+ const index = accu.findIndex(({ value }) => value === key);
2580
2588
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
2581
2589
  return accu;
2582
2590
  }, roles);
2583
2591
  });
2584
2592
 
2585
2593
  // src/store.ts
2594
+ var import_react_redux = require("react-redux");
2586
2595
  var import_helpers6 = require("@northern.tech/utils/helpers");
2587
2596
  var import_toolkit16 = require("@reduxjs/toolkit");
2588
2597
  var { setSnackbar, uploadProgress } = actions_default;
2589
2598
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2590
- var resetEnvironment = () => {
2591
- keys.map((key) => window.sessionStorage.removeItem(key));
2592
- };
2599
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2593
2600
  resetEnvironment();
2594
2601
  var commonErrorFallback = "Please check your connection.";
2595
2602
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2615,6 +2622,14 @@ var sessionReducer = (state, action) => {
2615
2622
  }
2616
2623
  return rootReducer(state, action);
2617
2624
  };
2625
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2626
+ if (action.type.endsWith("/rejected")) {
2627
+ const { error } = action;
2628
+ console.error("Rejection in action:", action);
2629
+ console.error(error.stack);
2630
+ }
2631
+ return next(action);
2632
+ };
2618
2633
  var getConfiguredStore = (options = {}) => {
2619
2634
  const { preloadedState = {}, ...config } = options;
2620
2635
  return (0, import_toolkit16.configureStore)({
@@ -2630,7 +2645,7 @@ var getConfiguredStore = (options = {}) => {
2630
2645
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2631
2646
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2632
2647
  }
2633
- })
2648
+ }).concat(rejectionLoggerMiddleware)
2634
2649
  });
2635
2650
  };
2636
2651
  var store = getConfiguredStore({
@@ -3182,7 +3197,7 @@ var getDevicesByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceName3}/
3182
3197
  page = defaultPage,
3183
3198
  perPage = defaultPerPage,
3184
3199
  sortOptions = [],
3185
- selectedAttributes = []
3200
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3186
3201
  } = options;
3187
3202
  const state = getState();
3188
3203
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3295,7 +3310,6 @@ var getReportingLimits = (0, import_toolkit18.createAsyncThunk)(
3295
3310
  })
3296
3311
  );
3297
3312
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3298
- var REPORT_CHART_SIZE_LIMIT = 6;
3299
3313
  var getSingleReportData = (reportConfig, groups) => {
3300
3314
  const { attribute, group, software = "" } = reportConfig;
3301
3315
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3375,6 +3389,13 @@ var getDeviceConnect = (0, import_toolkit18.createAsyncThunk)(
3375
3389
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3376
3390
  )
3377
3391
  );
3392
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3393
+ var triggerDeviceUpdate = (0, import_toolkit18.createAsyncThunk)(
3394
+ `${sliceName3}/triggerDeviceUpdate`,
3395
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3396
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3397
+ )
3398
+ );
3378
3399
  var getSessionDetails = (0, import_toolkit18.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3379
3400
  const { start: startUnix, end: endUnix } = (0, import_helpers8.dateRangeToUnix)(startDate, endDate);
3380
3401
  const createdAfter = startDate ? `&created_after=${startUnix}` : "";
@@ -3477,12 +3498,12 @@ var deleteAuthset = (0, import_toolkit18.createAsyncThunk)(
3477
3498
  );
3478
3499
  var preauthDevice = (0, import_toolkit18.createAsyncThunk)(
3479
3500
  `${sliceName3}/preauthDevice`,
3480
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
3501
+ (authset, { dispatch, rejectWithValue }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).then(() => Promise.resolve(dispatch(setSnackbar2("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds)))).catch((err) => {
3481
3502
  if (err.response.status === 409) {
3482
- return Promise.reject("A device with a matching identity data set already exists");
3503
+ return rejectWithValue("A device with a matching identity data set already exists");
3483
3504
  }
3484
3505
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3485
- }).then(() => Promise.resolve(dispatch(setSnackbar2("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
3506
+ })
3486
3507
  );
3487
3508
  var decommissionDevice = (0, import_toolkit18.createAsyncThunk)(
3488
3509
  `${sliceName3}/decommissionDevice`,
@@ -3699,16 +3720,17 @@ var getDeviceMonitorConfig = (0, import_toolkit19.createAsyncThunk)(
3699
3720
  );
3700
3721
  var changeNotificationSetting = (0, import_toolkit19.createAsyncThunk)(
3701
3722
  `${sliceName4}/changeNotificationSetting`,
3702
- ({ enabled, channel = alertChannels.email }, { dispatch }) => {
3703
- return general_api_default.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled }).catch((err) => commonErrorHandler(err, `${enabled ? "En" : "Dis"}abling ${channel} alerts failed:`, dispatch)).then(
3704
- () => Promise.all([
3705
- dispatch(actions4.changeAlertChannel({ channel, enabled })),
3706
- dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
3707
- ])
3708
- );
3709
- }
3723
+ ({ enabled, channel = alertChannels.email }, { dispatch }) => general_api_default.put(`${monitorApiUrlv1}/settings/global/channel/alerts/${channel}/status`, { enabled }).catch((err) => commonErrorHandler(err, `${enabled ? "En" : "Dis"}abling ${channel} alerts failed:`, dispatch)).then(
3724
+ () => Promise.all([
3725
+ dispatch(actions4.changeAlertChannel({ channel, enabled })),
3726
+ dispatch(actions_default.setSnackbar(`Successfully ${enabled ? "en" : "dis"}abled ${channel} alerts`, TIMEOUTS.fiveSeconds))
3727
+ ])
3728
+ )
3710
3729
  );
3711
3730
 
3731
+ // src/usersSlice/thunks.ts
3732
+ var import_helptips = require("@northern.tech/common-ui/helptips");
3733
+
3712
3734
  // src/api/users-api.ts
3713
3735
  var import_axios3 = __toESM(require("axios"), 1);
3714
3736
  var Api2 = {
@@ -3742,7 +3764,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
3742
3764
  }
3743
3765
  const twoFAError = is2FABackend ? " and verification code" : "";
3744
3766
  const errorMessage = `There was a problem logging in. Please check your email${twoFAError ? "," : " and"} password${twoFAError}. If you still have problems, contact an administrator.`;
3745
- return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.preformatWithRequestID)(err.response, errorMessage), null, "Copy to clipboard")));
3767
+ return Promise.reject(dispatch(setSnackbar3({ message: (0, import_helpers9.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
3746
3768
  };
3747
3769
  var loginUser = (0, import_toolkit20.createAsyncThunk)(
3748
3770
  `${sliceName8}/loginUser`,
@@ -3766,19 +3788,16 @@ var loginUser = (0, import_toolkit20.createAsyncThunk)(
3766
3788
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
3767
3789
  setSessionInfo({ token, expiresAt });
3768
3790
  cookies3.remove("JWT", { path: "/" });
3769
- return (
3770
- // @ts-ignore
3771
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
3772
- cleanUp();
3773
- return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.extractErrorMessage)(e))));
3774
- }).then(() => {
3775
- window.sessionStorage.removeItem("pendings-redirect");
3776
- if (window.location.pathname !== "/ui/") {
3777
- window.location.replace("/ui/");
3778
- }
3779
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
3780
- })
3781
- );
3791
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
3792
+ cleanUp();
3793
+ return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.extractErrorMessage)(e))));
3794
+ }).then(() => {
3795
+ window.sessionStorage.removeItem("pendings-redirect");
3796
+ if (window.location.pathname !== "/ui/") {
3797
+ window.location.replace("/ui/");
3798
+ }
3799
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
3800
+ });
3782
3801
  })
3783
3802
  );
3784
3803
  var logoutUser = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -3796,6 +3815,7 @@ var switchUserOrganization = (0, import_toolkit20.createAsyncThunk)(`${sliceName
3796
3815
  return Promise.reject();
3797
3816
  }
3798
3817
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
3818
+ window.sessionStorage.setItem("tenantChanged", "true");
3799
3819
  setSessionInfo({ ...getSessionInfo(), token });
3800
3820
  window.location.reload();
3801
3821
  });
@@ -3836,11 +3856,18 @@ var verify2FA = (0, import_toolkit20.createAsyncThunk)(
3836
3856
  );
3837
3857
  var getUserList = (0, import_toolkit20.createAsyncThunk)(
3838
3858
  `${sliceName8}/getUserList`,
3839
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
3840
- const users = res.data.reduce((accu, item) => {
3841
- accu[item.id] = item;
3842
- return accu;
3843
- }, {});
3859
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
3860
+ const currentUsersById = getUsersById(getState());
3861
+ const users = res.data.reduce(
3862
+ (accu, item) => {
3863
+ accu[item.id] = {
3864
+ ...accu[item.id],
3865
+ ...item
3866
+ };
3867
+ return accu;
3868
+ },
3869
+ { ...currentUsersById }
3870
+ );
3844
3871
  return dispatch(actions8.receivedUserList(users));
3845
3872
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
3846
3873
  );
@@ -3849,9 +3876,7 @@ var getUser = (0, import_toolkit20.createAsyncThunk)(
3849
3876
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
3850
3877
  ({ data: user }) => Promise.all([
3851
3878
  dispatch(actions8.receivedUser(user)),
3852
- // @ts-ignore
3853
3879
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
3854
- // @ts-ignore
3855
3880
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
3856
3881
  user
3857
3882
  ])
@@ -3898,10 +3923,7 @@ var createUser = (0, import_toolkit20.createAsyncThunk)(
3898
3923
  );
3899
3924
  var removeUser = (0, import_toolkit20.createAsyncThunk)(
3900
3925
  `${sliceName8}/removeUser`,
3901
- (userId, { dispatch }) => (
3902
- // @ts-ignore
3903
- general_api_default.delete(`${useradmApiUrlv1}/users/${userId}`).then(() => Promise.all([dispatch(actions8.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar3(userActions.remove.successMessage))])).catch((err) => userActionErrorHandler(err, "remove", dispatch))
3904
- )
3926
+ (userId, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/users/${userId}`).then(() => Promise.all([dispatch(actions8.removedUser(userId)), dispatch(getUserList()), dispatch(setSnackbar3(userActions.remove.successMessage))])).catch((err) => userActionErrorHandler(err, "remove", dispatch))
3905
3927
  );
3906
3928
  var editUser = (0, import_toolkit20.createAsyncThunk)(
3907
3929
  `${sliceName8}/editUser`,
@@ -3922,7 +3944,7 @@ var enableUser2fa = (0, import_toolkit20.createAsyncThunk)(
3922
3944
  );
3923
3945
  var disableUser2fa = (0, import_toolkit20.createAsyncThunk)(
3924
3946
  `${sliceName8}/disableUser2fa`,
3925
- (userId = OWN_USER_ID, { dispatch }) => general_api_default.post(`${useradmApiUrlv1}/users/${userId}/2fa/disable`).catch((err) => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch)).then(() => Promise.resolve(dispatch(getUser(userId))))
3947
+ (userId = OWN_USER_ID, { dispatch }) => general_api_default.post(`${useradmApiUrlv1}/users/${userId}/2fa/disable`).catch((err) => commonErrorHandler(err, `There was an error disabling Two Factor authentication for the user.`, dispatch)).then(() => Promise.all([dispatch(getUser(userId)), dispatch(actions8.receivedQrCode(null))]))
3926
3948
  );
3927
3949
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
3928
3950
  (accu, [area, definition]) => {
@@ -4075,7 +4097,6 @@ var getPermissionSets = (0, import_toolkit20.createAsyncThunk)(
4075
4097
  accu[permissionSet.name] = permissionSetObject;
4076
4098
  return accu;
4077
4099
  },
4078
- // @ts-ignore
4079
4100
  { ...getState().users.permissionSetsById }
4080
4101
  );
4081
4102
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -4168,7 +4189,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
4168
4189
  role: {
4169
4190
  ...emptyRole,
4170
4191
  name,
4171
- // @ts-ignore
4172
4192
  description: description ? description : roleState.description,
4173
4193
  uiPermissions: {
4174
4194
  ...emptyUiPermissions,
@@ -4211,10 +4231,7 @@ var editRole = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/editRole`,
4211
4231
  });
4212
4232
  var removeRole = (0, import_toolkit20.createAsyncThunk)(
4213
4233
  `${sliceName8}/removeRole`,
4214
- (roleId, { dispatch }) => (
4215
- // @ts-ignore
4216
- general_api_default.delete(`${useradmApiUrlv2}/roles/${roleId}`).then(() => Promise.all([dispatch(actions8.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar3(roleActions.remove.successMessage))])).catch((err) => roleActionErrorHandler(err, "remove", dispatch))
4217
- )
4234
+ (roleId, { dispatch }) => general_api_default.delete(`${useradmApiUrlv2}/roles/${roleId}`).then(() => Promise.all([dispatch(actions8.removedRole(roleId)), dispatch(getRoles()), dispatch(setSnackbar3(roleActions.remove.successMessage))])).catch((err) => roleActionErrorHandler(err, "remove", dispatch))
4218
4235
  );
4219
4236
  var getGlobalSettings2 = (0, import_toolkit20.createAsyncThunk)(
4220
4237
  `${sliceName8}/getGlobalSettings`,
@@ -4225,7 +4242,6 @@ var getGlobalSettings2 = (0, import_toolkit20.createAsyncThunk)(
4225
4242
  );
4226
4243
  var saveGlobalSettings = (0, import_toolkit20.createAsyncThunk)(
4227
4244
  `${sliceName8}/saveGlobalSettings`,
4228
- // @ts-ignore
4229
4245
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
4230
4246
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
4231
4247
  return;
@@ -4271,11 +4287,9 @@ var saveUserSettings = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/sav
4271
4287
  const tooltipState = getTooltipsState(getState());
4272
4288
  const updatedSettings = {
4273
4289
  ...userSettings,
4274
- // @ts-ignore
4275
4290
  ...settings,
4276
4291
  onboarding: {
4277
4292
  ...onboardingState,
4278
- // @ts-ignore
4279
4293
  ...settings.onboarding
4280
4294
  },
4281
4295
  tooltips: tooltipState
@@ -4319,10 +4333,7 @@ var generateToken = (0, import_toolkit20.createAsyncThunk)(
4319
4333
  );
4320
4334
  var revokeToken = (0, import_toolkit20.createAsyncThunk)(
4321
4335
  `${sliceName8}/revokeToken`,
4322
- (token, { dispatch }) => (
4323
- // @ts-ignore
4324
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
4325
- )
4336
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
4326
4337
  );
4327
4338
  var setTooltipReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
4328
4339
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -4331,33 +4342,31 @@ var setTooltipReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/
4331
4342
  }
4332
4343
  return Promise.all(tasks);
4333
4344
  });
4334
- var setAllTooltipsReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
4335
- const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
4345
+ var setAllTooltipsReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
4346
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
4336
4347
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
4337
4348
  });
4338
4349
  var submitFeedback = (0, import_toolkit20.createAsyncThunk)(
4339
4350
  `${sliceName8}/submitFeedback`,
4340
- // @ts-ignore
4341
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
4342
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
4343
- subject: "feedback submission",
4344
- body: JSON.stringify({ feedback, satisfaction, meta })
4345
- }).then(() => {
4346
- const today = /* @__PURE__ */ new Date();
4347
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
4348
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
4349
- });
4350
- }
4351
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
4352
+ subject: "feedback submission",
4353
+ body: JSON.stringify({ feedback, satisfaction, meta })
4354
+ }).then(() => {
4355
+ const today = /* @__PURE__ */ new Date();
4356
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
4357
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
4358
+ })
4351
4359
  );
4352
4360
 
4353
4361
  // src/deploymentsSlice/thunks.ts
4354
4362
  var import_helpers10 = require("@northern.tech/utils/helpers");
4363
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
4355
4364
  var import_toolkit21 = require("@reduxjs/toolkit");
4356
4365
  var import_validator = require("validator");
4357
4366
  var { receivedDevice, setSnackbar: setSnackbar4 } = actions_default;
4358
4367
  var { page: defaultPage3, perPage: defaultPerPage3 } = DEVICE_LIST_DEFAULTS;
4359
4368
  var deriveDeploymentGroup = ({ filter = {}, group, groups = [], name }) => group || groups.length === 1 && !(0, import_validator.isUUID)(name) ? groups[0] : filter.name;
4360
- var transformDeployments = (deployments, deploymentsById) => deployments.sort(import_helpers10.startTimeSort).reduce(
4369
+ var transformDeployments = (deployments, deploymentsById) => deployments.sort((0, import_helpers10.customSort)(true, "created")).reduce(
4361
4370
  (accu, item) => {
4362
4371
  const filter = item.filter ?? {};
4363
4372
  let deployment = {
@@ -4408,6 +4417,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit21.createAsyncThunk)(`${sliceNam
4408
4417
  return Promise.all(tasks);
4409
4418
  });
4410
4419
  });
4420
+ var isWithinFirstMonth = (expirationDate) => {
4421
+ if (!expirationDate) {
4422
+ return false;
4423
+ }
4424
+ const endOfFirstMonth = new Date(expirationDate);
4425
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
4426
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
4427
+ };
4428
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
4429
+ import_tracking.default.event({ category: "deployments", action: "create" });
4430
+ if (!totalDeploymentCount) {
4431
+ if (!hasDeployments) {
4432
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
4433
+ if (isWithinFirstMonth(trial_expiration)) {
4434
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
4435
+ }
4436
+ }
4437
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
4438
+ }
4439
+ };
4411
4440
  var MAX_PREVIOUS_PHASES_COUNT = 5;
4412
4441
  var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
4413
4442
  let request;
@@ -4418,6 +4447,9 @@ var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/cre
4418
4447
  } else {
4419
4448
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
4420
4449
  }
4450
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
4451
+ const { hasDeployments } = getGlobalSettings(getState());
4452
+ const { trial_expiration } = getOrganization(getState());
4421
4453
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
4422
4454
  const lastslashindex = data.headers.location.lastIndexOf("/");
4423
4455
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -4432,6 +4464,7 @@ var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/cre
4432
4464
  dispatch(getSingleDeployment(deploymentId)),
4433
4465
  dispatch(setSnackbar4("Deployment created successfully", TIMEOUTS.fiveSeconds))
4434
4466
  ];
4467
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
4435
4468
  const { canManageUsers } = getUserCapabilities(getState());
4436
4469
  if (canManageUsers) {
4437
4470
  const { phases, retries } = newDeployment;