@northern.tech/store 0.3.1 → 0.3.3

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 (197) hide show
  1. package/dist/actions.cjs +20 -17
  2. package/dist/actions.cjs.map +1 -1
  3. package/dist/actions.js +8 -8
  4. package/dist/api/general-api.js +2 -2
  5. package/dist/api/types/Tenant.ts +17 -12
  6. package/dist/api/users-api.js +2 -2
  7. package/dist/appSlice/constants.cjs +18 -10
  8. package/dist/appSlice/constants.cjs.map +1 -1
  9. package/dist/appSlice/constants.d.cts +41 -84
  10. package/dist/appSlice/constants.d.ts +41 -84
  11. package/dist/appSlice/constants.js +1 -1
  12. package/dist/appSlice/index.js +2 -2
  13. package/dist/appSlice/thunks.cjs +140 -96
  14. package/dist/appSlice/thunks.cjs.map +1 -1
  15. package/dist/appSlice/thunks.js +19 -19
  16. package/dist/auth.js +2 -2
  17. package/dist/{chunk-Q6M5TTDQ.js → chunk-2CYOM4BK.js} +1 -1
  18. package/dist/chunk-2CYOM4BK.js.map +1 -0
  19. package/dist/{chunk-APHL4JZP.js → chunk-2JHFUQ6B.js} +141 -102
  20. package/dist/chunk-2JHFUQ6B.js.map +1 -0
  21. package/dist/{chunk-YETZPQFR.js → chunk-4XJMRVFI.js} +12 -11
  22. package/dist/chunk-4XJMRVFI.js.map +1 -0
  23. package/dist/{chunk-RX55KAKX.js → chunk-7JKWI5FK.js} +2 -2
  24. package/dist/{chunk-A6CT6GTI.js → chunk-C5NEDBJI.js} +17 -11
  25. package/dist/chunk-C5NEDBJI.js.map +1 -0
  26. package/dist/{chunk-NNADGHSL.js → chunk-DAPAXWA5.js} +8 -8
  27. package/dist/{chunk-ANB5BM5J.js → chunk-DCK2DBOA.js} +27 -20
  28. package/dist/chunk-DCK2DBOA.js.map +1 -0
  29. package/dist/{chunk-E5LEU5PF.js → chunk-HPBE6KYY.js} +2 -2
  30. package/dist/{chunk-2RJIDREZ.js → chunk-LEMVXAYP.js} +25 -16
  31. package/dist/chunk-LEMVXAYP.js.map +1 -0
  32. package/dist/{chunk-NI4SZOCF.js → chunk-LGNOTPUG.js} +9 -9
  33. package/dist/{chunk-MDC7Y3EX.js → chunk-LTKOV26W.js} +22 -20
  34. package/dist/chunk-LTKOV26W.js.map +1 -0
  35. package/dist/{chunk-YTQUNAZP.js → chunk-QRGTG4YB.js} +2 -2
  36. package/dist/{chunk-XTRPX7JZ.js → chunk-TI2RL5P2.js} +2 -2
  37. package/dist/chunk-TI2RL5P2.js.map +1 -0
  38. package/dist/{chunk-YGBFDXXA.js → chunk-TUACATJA.js} +2 -2
  39. package/dist/{chunk-25AKG5HH.js → chunk-UWMYZNUB.js} +19 -11
  40. package/dist/chunk-UWMYZNUB.js.map +1 -0
  41. package/dist/{chunk-UEP36GCI.js → chunk-VMNMD6KF.js} +2 -2
  42. package/dist/{chunk-KAQJH2YL.js → chunk-WXL7PVI5.js} +12 -4
  43. package/dist/chunk-WXL7PVI5.js.map +1 -0
  44. package/dist/{chunk-VOCOFE4I.js → chunk-X7IEZBM4.js} +2 -2
  45. package/dist/{chunk-XXHONFSQ.js → chunk-YDS36ALB.js} +3 -3
  46. package/dist/{chunk-XXHONFSQ.js.map → chunk-YDS36ALB.js.map} +1 -1
  47. package/dist/commonSelectors.cjs +40 -18
  48. package/dist/commonSelectors.cjs.map +1 -1
  49. package/dist/commonSelectors.d.cts +54 -46
  50. package/dist/commonSelectors.d.ts +54 -46
  51. package/dist/commonSelectors.js +9 -9
  52. package/dist/constants.cjs +35 -19
  53. package/dist/constants.cjs.map +1 -1
  54. package/dist/constants.d.cts +3 -3
  55. package/dist/constants.d.ts +3 -3
  56. package/dist/constants.js +6 -2
  57. package/dist/deploymentdevicehook.cjs +146 -101
  58. package/dist/deploymentdevicehook.cjs.map +1 -1
  59. package/dist/deploymentdevicehook.d.cts +1 -1
  60. package/dist/deploymentdevicehook.d.ts +1 -1
  61. package/dist/deploymentdevicehook.js +24 -22
  62. package/dist/deploymentdevicehook.js.map +1 -1
  63. package/dist/deploymentsSlice/constants.cjs +8 -8
  64. package/dist/deploymentsSlice/constants.cjs.map +1 -1
  65. package/dist/deploymentsSlice/constants.js +2 -2
  66. package/dist/deploymentsSlice/index.cjs +8 -8
  67. package/dist/deploymentsSlice/index.cjs.map +1 -1
  68. package/dist/deploymentsSlice/index.js +3 -3
  69. package/dist/deploymentsSlice/selectors.cjs +8 -8
  70. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  71. package/dist/deploymentsSlice/selectors.js +3 -3
  72. package/dist/deploymentsSlice/thunks.cjs +140 -96
  73. package/dist/deploymentsSlice/thunks.cjs.map +1 -1
  74. package/dist/deploymentsSlice/thunks.js +19 -19
  75. package/dist/devicesSlice/constants.cjs +11 -8
  76. package/dist/devicesSlice/constants.cjs.map +1 -1
  77. package/dist/devicesSlice/constants.d.cts +2 -1
  78. package/dist/devicesSlice/constants.d.ts +2 -1
  79. package/dist/devicesSlice/constants.js +4 -2
  80. package/dist/devicesSlice/index.cjs +8 -8
  81. package/dist/devicesSlice/index.cjs.map +1 -1
  82. package/dist/devicesSlice/index.js +3 -3
  83. package/dist/devicesSlice/selectors.cjs +9 -9
  84. package/dist/devicesSlice/selectors.cjs.map +1 -1
  85. package/dist/devicesSlice/selectors.js +3 -3
  86. package/dist/devicesSlice/thunks.cjs +142 -96
  87. package/dist/devicesSlice/thunks.cjs.map +1 -1
  88. package/dist/devicesSlice/thunks.d.cts +12 -2
  89. package/dist/devicesSlice/thunks.d.ts +12 -2
  90. package/dist/devicesSlice/thunks.js +21 -19
  91. package/dist/flag-eu-5477R2P4.svg +130 -0
  92. package/dist/flag-us-HNQAF66I.svg +63 -0
  93. package/dist/monitorSlice/constants.cjs +8 -8
  94. package/dist/monitorSlice/constants.cjs.map +1 -1
  95. package/dist/monitorSlice/constants.js +2 -2
  96. package/dist/monitorSlice/index.cjs +8 -8
  97. package/dist/monitorSlice/index.cjs.map +1 -1
  98. package/dist/monitorSlice/index.js +3 -3
  99. package/dist/monitorSlice/thunks.cjs +59 -37
  100. package/dist/monitorSlice/thunks.cjs.map +1 -1
  101. package/dist/monitorSlice/thunks.js +17 -17
  102. package/dist/onboardingSlice/thunks.cjs +149 -102
  103. package/dist/onboardingSlice/thunks.cjs.map +1 -1
  104. package/dist/onboardingSlice/thunks.d.cts +1 -32
  105. package/dist/onboardingSlice/thunks.d.ts +1 -32
  106. package/dist/onboardingSlice/thunks.js +19 -19
  107. package/dist/organizationSlice/constants.cjs +22 -17
  108. package/dist/organizationSlice/constants.cjs.map +1 -1
  109. package/dist/organizationSlice/constants.d.cts +33 -1
  110. package/dist/organizationSlice/constants.d.ts +33 -1
  111. package/dist/organizationSlice/constants.js +4 -2
  112. package/dist/organizationSlice/index.cjs +18 -15
  113. package/dist/organizationSlice/index.cjs.map +1 -1
  114. package/dist/organizationSlice/index.d.cts +26 -1012
  115. package/dist/organizationSlice/index.d.ts +26 -1012
  116. package/dist/organizationSlice/index.js +3 -3
  117. package/dist/organizationSlice/selectors.cjs.map +1 -1
  118. package/dist/organizationSlice/selectors.d.cts +9 -1
  119. package/dist/organizationSlice/selectors.d.ts +9 -1
  120. package/dist/organizationSlice/selectors.js +3 -3
  121. package/dist/organizationSlice/thunks.cjs +1608 -1540
  122. package/dist/organizationSlice/thunks.cjs.map +1 -1
  123. package/dist/organizationSlice/thunks.d.cts +61 -36
  124. package/dist/organizationSlice/thunks.d.ts +61 -36
  125. package/dist/organizationSlice/thunks.js +19 -19
  126. package/dist/organizationSlice/types.cjs +19 -0
  127. package/dist/organizationSlice/types.cjs.map +1 -0
  128. package/dist/organizationSlice/types.d.cts +114 -0
  129. package/dist/organizationSlice/types.d.ts +114 -0
  130. package/dist/organizationSlice/types.js +1 -0
  131. package/dist/organizationSlice/types.js.map +1 -0
  132. package/dist/releasesSlice/index.js +2 -2
  133. package/dist/releasesSlice/selectors.cjs +11 -0
  134. package/dist/releasesSlice/selectors.cjs.map +1 -1
  135. package/dist/releasesSlice/selectors.js +4 -4
  136. package/dist/releasesSlice/thunks.cjs +73 -49
  137. package/dist/releasesSlice/thunks.cjs.map +1 -1
  138. package/dist/releasesSlice/thunks.d.cts +1 -4
  139. package/dist/releasesSlice/thunks.d.ts +1 -4
  140. package/dist/releasesSlice/thunks.js +17 -17
  141. package/dist/selectors.cjs +46 -18
  142. package/dist/selectors.cjs.map +1 -1
  143. package/dist/selectors.d.cts +9 -1
  144. package/dist/selectors.d.ts +9 -1
  145. package/dist/selectors.js +36 -30
  146. package/dist/store.cjs +36 -23
  147. package/dist/store.cjs.map +1 -1
  148. package/dist/store.d.cts +12 -231
  149. package/dist/store.d.ts +12 -231
  150. package/dist/store.js +13 -11
  151. package/dist/storehooks.cjs +222 -141
  152. package/dist/storehooks.cjs.map +1 -1
  153. package/dist/storehooks.js +36 -24
  154. package/dist/storehooks.js.map +1 -1
  155. package/dist/thunks.cjs +199 -126
  156. package/dist/thunks.cjs.map +1 -1
  157. package/dist/thunks.d.cts +5 -1
  158. package/dist/thunks.d.ts +5 -1
  159. package/dist/thunks.js +21 -19
  160. package/dist/usersSlice/constants.cjs +10 -10
  161. package/dist/usersSlice/constants.cjs.map +1 -1
  162. package/dist/usersSlice/constants.js +2 -2
  163. package/dist/usersSlice/index.cjs +10 -10
  164. package/dist/usersSlice/index.cjs.map +1 -1
  165. package/dist/usersSlice/index.js +3 -3
  166. package/dist/usersSlice/selectors.cjs +35 -13
  167. package/dist/usersSlice/selectors.cjs.map +1 -1
  168. package/dist/usersSlice/selectors.d.cts +44 -1
  169. package/dist/usersSlice/selectors.d.ts +44 -1
  170. package/dist/usersSlice/selectors.js +12 -6
  171. package/dist/usersSlice/thunks.cjs +138 -96
  172. package/dist/usersSlice/thunks.cjs.map +1 -1
  173. package/dist/usersSlice/thunks.d.cts +10 -9
  174. package/dist/usersSlice/thunks.d.ts +10 -9
  175. package/dist/usersSlice/thunks.js +19 -19
  176. package/dist/utils.cjs +17 -16
  177. package/dist/utils.cjs.map +1 -1
  178. package/dist/utils.js +3 -3
  179. package/package.json +7 -7
  180. package/dist/chunk-25AKG5HH.js.map +0 -1
  181. package/dist/chunk-2RJIDREZ.js.map +0 -1
  182. package/dist/chunk-A6CT6GTI.js.map +0 -1
  183. package/dist/chunk-ANB5BM5J.js.map +0 -1
  184. package/dist/chunk-APHL4JZP.js.map +0 -1
  185. package/dist/chunk-KAQJH2YL.js.map +0 -1
  186. package/dist/chunk-MDC7Y3EX.js.map +0 -1
  187. package/dist/chunk-Q6M5TTDQ.js.map +0 -1
  188. package/dist/chunk-XTRPX7JZ.js.map +0 -1
  189. package/dist/chunk-YETZPQFR.js.map +0 -1
  190. /package/dist/{chunk-RX55KAKX.js.map → chunk-7JKWI5FK.js.map} +0 -0
  191. /package/dist/{chunk-NNADGHSL.js.map → chunk-DAPAXWA5.js.map} +0 -0
  192. /package/dist/{chunk-E5LEU5PF.js.map → chunk-HPBE6KYY.js.map} +0 -0
  193. /package/dist/{chunk-NI4SZOCF.js.map → chunk-LGNOTPUG.js.map} +0 -0
  194. /package/dist/{chunk-YTQUNAZP.js.map → chunk-QRGTG4YB.js.map} +0 -0
  195. /package/dist/{chunk-YGBFDXXA.js.map → chunk-TUACATJA.js.map} +0 -0
  196. /package/dist/{chunk-UEP36GCI.js.map → chunk-VMNMD6KF.js.map} +0 -0
  197. /package/dist/{chunk-VOCOFE4I.js.map → chunk-X7IEZBM4.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: {
@@ -2142,7 +2146,7 @@ var getGroups = (0, import_toolkit11.createSelector)([getGroupsById], (groupsByI
2142
2146
  (accu, [groupname, group]) => {
2143
2147
  const name = groupname === UNGROUPED_GROUP.id ? UNGROUPED_GROUP.name : groupname;
2144
2148
  const groupItem = { ...group, groupId: name, name: groupname };
2145
- if (group.filters.length > 0) {
2149
+ if (group.filters?.length > 0) {
2146
2150
  if (groupname !== UNGROUPED_GROUP.id) {
2147
2151
  accu.dynamic.push(groupItem);
2148
2152
  } else {
@@ -2215,14 +2219,15 @@ var getAuditLogEntry = (0, import_toolkit12.createSelector)([getAuditLog, getAud
2215
2219
  // src/utils.ts
2216
2220
  var import_helpers4 = require("@northern.tech/utils/helpers");
2217
2221
  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
2222
+ [DEVICE_FILTERING_OPTIONS.$gt.key]: (val) => Number(val) || val,
2223
+ [DEVICE_FILTERING_OPTIONS.$gte.key]: (val) => Number(val) || val,
2224
+ [DEVICE_FILTERING_OPTIONS.$lt.key]: (val) => Number(val) || val,
2225
+ [DEVICE_FILTERING_OPTIONS.$lte.key]: (val) => Number(val) || val,
2226
+ [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val) => Number(val) || val,
2227
+ [DEVICE_FILTERING_OPTIONS.$in.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2228
+ [DEVICE_FILTERING_OPTIONS.$nin.key]: (val) => ("" + val).split(",").map((i) => i.trim()),
2229
+ [DEVICE_FILTERING_OPTIONS.$exists.key]: import_helpers4.yes,
2230
+ [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false
2226
2231
  };
2227
2232
  var filterAliases = {
2228
2233
  $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }
@@ -2346,8 +2351,13 @@ var getTooltipsById = (state) => state.users.tooltips.byId;
2346
2351
  var getGlobalSettings = (state) => state.users.globalSettings;
2347
2352
  var getCurrentUserId = (state) => state.users.currentUser;
2348
2353
  var getUsersById = (state) => state.users.byId;
2354
+ var getUsersList = (0, import_toolkit14.createSelector)([getUsersById], (usersById) => Object.values(usersById));
2349
2355
  var getCurrentUser = (0, import_toolkit14.createSelector)([getUsersById, getCurrentUserId], (usersById, userId) => usersById[userId] ?? {});
2350
2356
  var getUserSettings = (state) => state.users.userSettings;
2357
+ var getSelectedDeviceAttribute = (0, import_toolkit14.createSelector)(
2358
+ [getUserSettings],
2359
+ ({ columnSelection }) => columnSelection.map((attribute) => ({ attribute: attribute.key, scope: attribute.scope }))
2360
+ );
2351
2361
  var getIsDarkMode = (0, import_toolkit14.createSelector)([getUserSettings], ({ mode }) => isDarkMode(mode));
2352
2362
  var getShowHelptips = (0, import_toolkit14.createSelector)(
2353
2363
  [getTooltipsById],
@@ -2372,7 +2382,7 @@ var getOfflineThresholdSettings = (0, import_toolkit14.createSelector)([getGloba
2372
2382
  interval: offlineThreshold?.interval || DEVICE_ONLINE_CUTOFF.interval,
2373
2383
  intervalUnit: offlineThreshold?.intervalUnit || DEVICE_ONLINE_CUTOFF.intervalName
2374
2384
  }));
2375
- var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([id, role]) => ({ id, ...role })));
2385
+ var getRolesList = (0, import_toolkit14.createSelector)([getRolesById], (rolesById2) => Object.entries(rolesById2).map(([value, role]) => ({ value, ...role })));
2376
2386
 
2377
2387
  // src/commonSelectors.ts
2378
2388
  var getIsEnterprise = (0, import_toolkit15.createSelector)(
@@ -2433,12 +2443,18 @@ var getUserCapabilities = (0, import_toolkit15.createSelector)([getUserRoles, ge
2433
2443
  });
2434
2444
  var getTenantCapabilities = (0, import_toolkit15.createSelector)(
2435
2445
  [getFeatures, getOrganization, getIsEnterprise],
2436
- ({ hasAuditlogs: isAuditlogEnabled, hasDeviceConfig: isDeviceConfigEnabled, hasDeviceConnect: isDeviceConnectEnabled, hasMonitor: isMonitorEnabled }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2446
+ ({
2447
+ hasAuditlogs: isAuditlogEnabled,
2448
+ hasDeviceConfig: isDeviceConfigEnabled,
2449
+ hasDeviceConnect: isDeviceConnectEnabled,
2450
+ hasMonitor: isMonitorEnabled,
2451
+ isHosted
2452
+ }, { addons = [], plan = PLANS.os.id }, isEnterprise) => {
2437
2453
  const canDelta = isEnterprise || plan === PLANS.professional.id;
2438
2454
  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));
2455
+ const hasDeviceConfig = addons.some((addon) => addon.name === ADDONS.configure.id && addon.enabled) || isDeviceConfigEnabled && !isHosted;
2456
+ const hasDeviceConnect = addons.some((addon) => addon.name === ADDONS.troubleshoot.id && addon.enabled) || isDeviceConnectEnabled && !isHosted;
2457
+ const hasMonitor = isMonitorEnabled && addons.some((addon) => addon.name === ADDONS.monitor.id && addon.enabled);
2442
2458
  return {
2443
2459
  canDelta,
2444
2460
  canRetry: canDelta,
@@ -2568,7 +2584,7 @@ var getAuditlogDevice = (0, import_toolkit15.createSelector)([getAuditLogEntry,
2568
2584
  var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, getRolesList], ({ service_provider }, roles) => {
2569
2585
  if (service_provider) {
2570
2586
  return roles.reduce((accu, role) => {
2571
- if (rolesById[role.id]) {
2587
+ if (rolesById[role.value]) {
2572
2588
  return accu;
2573
2589
  }
2574
2590
  accu.push(role);
@@ -2576,20 +2592,19 @@ var getRelevantRoles = (0, import_toolkit15.createSelector)([getOrganization, ge
2576
2592
  }, Object.values(serviceProviderRolesById));
2577
2593
  }
2578
2594
  return Object.keys(rolesById).reverse().reduce((accu, key) => {
2579
- const index = accu.findIndex(({ id }) => id === key);
2595
+ const index = accu.findIndex(({ value }) => value === key);
2580
2596
  accu = [accu[index], ...accu.filter((item, itemIndex) => index !== itemIndex)];
2581
2597
  return accu;
2582
2598
  }, roles);
2583
2599
  });
2584
2600
 
2585
2601
  // src/store.ts
2602
+ var import_react_redux = require("react-redux");
2586
2603
  var import_helpers6 = require("@northern.tech/utils/helpers");
2587
2604
  var import_toolkit16 = require("@reduxjs/toolkit");
2588
2605
  var { setSnackbar, uploadProgress } = actions_default;
2589
2606
  var keys = ["sessionDeploymentChecker", settingsKeys.initialized];
2590
- var resetEnvironment = () => {
2591
- keys.map((key) => window.sessionStorage.removeItem(key));
2592
- };
2607
+ var resetEnvironment = () => keys.forEach((key) => window.sessionStorage.removeItem(key));
2593
2608
  resetEnvironment();
2594
2609
  var commonErrorFallback = "Please check your connection.";
2595
2610
  var commonErrorHandler = (err, errorContext, dispatch, fallback, mightBeAuthRelated = false) => {
@@ -2615,6 +2630,14 @@ var sessionReducer = (state, action) => {
2615
2630
  }
2616
2631
  return rootReducer(state, action);
2617
2632
  };
2633
+ var rejectionLoggerMiddleware = () => (next) => (action) => {
2634
+ if (action.type.endsWith("/rejected")) {
2635
+ const { error } = action;
2636
+ console.error("Rejection in action:", action);
2637
+ console.error(error.stack);
2638
+ }
2639
+ return next(action);
2640
+ };
2618
2641
  var getConfiguredStore = (options = {}) => {
2619
2642
  const { preloadedState = {}, ...config } = options;
2620
2643
  return (0, import_toolkit16.configureStore)({
@@ -2630,7 +2653,7 @@ var getConfiguredStore = (options = {}) => {
2630
2653
  ignoredActionPaths: ["uploads", "snackbar", /payload\..*$/],
2631
2654
  ignoredPaths: ["app.uploadsById", "app.snackbar", "organization.externalDeviceIntegrations"]
2632
2655
  }
2633
- })
2656
+ }).concat(rejectionLoggerMiddleware)
2634
2657
  });
2635
2658
  };
2636
2659
  var store = getConfiguredStore({
@@ -3182,7 +3205,7 @@ var getDevicesByStatus2 = (0, import_toolkit18.createAsyncThunk)(`${sliceName3}/
3182
3205
  page = defaultPage,
3183
3206
  perPage = defaultPerPage,
3184
3207
  sortOptions = [],
3185
- selectedAttributes = []
3208
+ selectedAttributes = getSelectedDeviceAttribute(getState())
3186
3209
  } = options;
3187
3210
  const state = getState();
3188
3211
  const { applicableFilters, filterTerms } = convertDeviceListStateToFilters({
@@ -3295,7 +3318,6 @@ var getReportingLimits = (0, import_toolkit18.createAsyncThunk)(
3295
3318
  })
3296
3319
  );
3297
3320
  var ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}.version` : fallback;
3298
- var REPORT_CHART_SIZE_LIMIT = 6;
3299
3321
  var getSingleReportData = (reportConfig, groups) => {
3300
3322
  const { attribute, group, software = "" } = reportConfig;
3301
3323
  const filters = [{ key: "status", scope: "identity", operator: DEVICE_FILTERING_OPTIONS.$eq.key, value: "accepted" }];
@@ -3375,9 +3397,17 @@ var getDeviceConnect = (0, import_toolkit18.createAsyncThunk)(
3375
3397
  ({ data }) => Promise.all([dispatch(actions3.receivedDevice({ connect_status: data.status, connect_updated_ts: data.updated_ts, id })), Promise.resolve(data)])
3376
3398
  )
3377
3399
  );
3400
+ var updateTypeMap = { deploymentUpdate: "check-update", inventoryUpdate: "send-inventory" };
3401
+ var triggerDeviceUpdate = (0, import_toolkit18.createAsyncThunk)(
3402
+ `${sliceName3}/triggerDeviceUpdate`,
3403
+ ({ id, type }, { dispatch }) => general_api_default.post(`${deviceConnect}/devices/${id}/${updateTypeMap[type] ?? updateTypeMap.deploymentUpdate}`).then(
3404
+ () => new Promise((resolve) => setTimeout(() => resolve(dispatch(getDeviceById2(id))), TIMEOUTS.threeSeconds))
3405
+ )
3406
+ );
3378
3407
  var getSessionDetails = (0, import_toolkit18.createAsyncThunk)(`${sliceName3}/getSessionDetails`, ({ sessionId, deviceId, userId, startDate, endDate }) => {
3379
- const createdAfter = startDate ? `&created_after=${Math.round(Date.parse(startDate) / 1e3)}` : "";
3380
- const createdBefore = endDate ? `&created_before=${Math.round(Date.parse(endDate) / 1e3)}` : "";
3408
+ const { start: startUnix, end: endUnix } = (0, import_helpers8.dateRangeToUnix)(startDate, endDate);
3409
+ const createdAfter = startDate ? `&created_after=${startUnix}` : "";
3410
+ const createdBefore = endDate ? `&created_before=${endUnix}` : "";
3381
3411
  const objectSearch = `&object_id=${deviceId}`;
3382
3412
  return general_api_default.get(`${auditLogsApiUrl}/logs?per_page=500${createdAfter}${createdBefore}&actor_id=${userId}${objectSearch}`).then(
3383
3413
  ({ data: auditLogEntries }) => {
@@ -3476,12 +3506,12 @@ var deleteAuthset = (0, import_toolkit18.createAsyncThunk)(
3476
3506
  );
3477
3507
  var preauthDevice = (0, import_toolkit18.createAsyncThunk)(
3478
3508
  `${sliceName3}/preauthDevice`,
3479
- (authset, { dispatch }) => general_api_default.post(`${deviceAuthV2}/devices`, authset).catch((err) => {
3509
+ (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) => {
3480
3510
  if (err.response.status === 409) {
3481
- return Promise.reject("A device with a matching identity data set already exists");
3511
+ return rejectWithValue("A device with a matching identity data set already exists");
3482
3512
  }
3483
3513
  return commonErrorHandler(err, "The device could not be added:", dispatch);
3484
- }).then(() => Promise.resolve(dispatch(setSnackbar2("Device was successfully added to the preauthorization list", TIMEOUTS.fiveSeconds))))
3514
+ })
3485
3515
  );
3486
3516
  var decommissionDevice = (0, import_toolkit18.createAsyncThunk)(
3487
3517
  `${sliceName3}/decommissionDevice`,
@@ -3708,6 +3738,9 @@ var changeNotificationSetting = (0, import_toolkit19.createAsyncThunk)(
3708
3738
  }
3709
3739
  );
3710
3740
 
3741
+ // src/usersSlice/thunks.ts
3742
+ var import_helptips = require("@northern.tech/common-ui/helptips");
3743
+
3711
3744
  // src/api/users-api.ts
3712
3745
  var import_axios3 = __toESM(require("axios"), 1);
3713
3746
  var Api2 = {
@@ -3741,7 +3774,7 @@ var handleLoginError = (err, { token2fa: has2FA, password }, rejectWithValue) =>
3741
3774
  }
3742
3775
  const twoFAError = is2FABackend ? " and verification code" : "";
3743
3776
  const errorMessage = `There was a problem logging in. Please check your email${twoFAError ? "," : " and"} password${twoFAError}. If you still have problems, contact an administrator.`;
3744
- return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.preformatWithRequestID)(err.response, errorMessage), null, "Copy to clipboard")));
3777
+ return Promise.reject(dispatch(setSnackbar3({ message: (0, import_helpers9.preformatWithRequestID)(err.response, errorMessage), action: "Copy to clipboard" })));
3745
3778
  };
3746
3779
  var loginUser = (0, import_toolkit20.createAsyncThunk)(
3747
3780
  `${sliceName8}/loginUser`,
@@ -3765,19 +3798,16 @@ var loginUser = (0, import_toolkit20.createAsyncThunk)(
3765
3798
  const expiresAt = stayLoggedIn ? void 0 : now.toISOString();
3766
3799
  setSessionInfo({ token, expiresAt });
3767
3800
  cookies3.remove("JWT", { path: "/" });
3768
- return (
3769
- // @ts-ignore
3770
- Promise.resolve(dispatch(getUser(OWN_USER_ID))).unwrap().catch((e) => {
3771
- cleanUp();
3772
- return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.extractErrorMessage)(e))));
3773
- }).then(() => {
3774
- window.sessionStorage.removeItem("pendings-redirect");
3775
- if (window.location.pathname !== "/ui/") {
3776
- window.location.replace("/ui/");
3777
- }
3778
- return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
3779
- })
3780
- );
3801
+ return dispatch(getUser(OWN_USER_ID)).unwrap().catch((e) => {
3802
+ cleanUp();
3803
+ return Promise.reject(dispatch(setSnackbar3((0, import_helpers9.extractErrorMessage)(e))));
3804
+ }).then(() => {
3805
+ window.sessionStorage.removeItem("pendings-redirect");
3806
+ if (window.location.pathname !== "/ui/") {
3807
+ window.location.replace("/ui/");
3808
+ }
3809
+ return Promise.resolve(dispatch(actions8.successfullyLoggedIn({ expiresAt, token })));
3810
+ });
3781
3811
  })
3782
3812
  );
3783
3813
  var logoutUser = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/logoutUser`, (_, { dispatch, getState }) => {
@@ -3795,6 +3825,7 @@ var switchUserOrganization = (0, import_toolkit20.createAsyncThunk)(`${sliceName
3795
3825
  return Promise.reject();
3796
3826
  }
3797
3827
  return general_api_default.get(`${useradmApiUrlv1}/users/tenants/${tenantId}/token`).then(({ data: token }) => {
3828
+ window.sessionStorage.setItem("tenantChanged", "true");
3798
3829
  setSessionInfo({ ...getSessionInfo(), token });
3799
3830
  window.location.reload();
3800
3831
  });
@@ -3835,11 +3866,18 @@ var verify2FA = (0, import_toolkit20.createAsyncThunk)(
3835
3866
  );
3836
3867
  var getUserList = (0, import_toolkit20.createAsyncThunk)(
3837
3868
  `${sliceName8}/getUserList`,
3838
- (_, { dispatch }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
3839
- const users = res.data.reduce((accu, item) => {
3840
- accu[item.id] = item;
3841
- return accu;
3842
- }, {});
3869
+ (_, { dispatch, getState }) => general_api_default.get(`${useradmApiUrlv1}/users`).then((res) => {
3870
+ const currentUsersById = getUsersById(getState());
3871
+ const users = res.data.reduce(
3872
+ (accu, item) => {
3873
+ accu[item.id] = {
3874
+ ...accu[item.id],
3875
+ ...item
3876
+ };
3877
+ return accu;
3878
+ },
3879
+ { ...currentUsersById }
3880
+ );
3843
3881
  return dispatch(actions8.receivedUserList(users));
3844
3882
  }).catch((err) => commonErrorHandler(err, `Users couldn't be loaded.`, dispatch, commonErrorFallback))
3845
3883
  );
@@ -3848,9 +3886,7 @@ var getUser = (0, import_toolkit20.createAsyncThunk)(
3848
3886
  (id, { dispatch, rejectWithValue }) => general_api_default.get(`${useradmApiUrlv1}/users/${id}`).then(
3849
3887
  ({ data: user }) => Promise.all([
3850
3888
  dispatch(actions8.receivedUser(user)),
3851
- // @ts-ignore
3852
3889
  dispatch(setHideAnnouncement({ shouldHide: false, userId: user.id })),
3853
- // @ts-ignore
3854
3890
  dispatch(updateUserColumnSettings({ currentUserId: user.id })),
3855
3891
  user
3856
3892
  ])
@@ -3897,10 +3933,7 @@ var createUser = (0, import_toolkit20.createAsyncThunk)(
3897
3933
  );
3898
3934
  var removeUser = (0, import_toolkit20.createAsyncThunk)(
3899
3935
  `${sliceName8}/removeUser`,
3900
- (userId, { dispatch }) => (
3901
- // @ts-ignore
3902
- 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))
3903
- )
3936
+ (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))
3904
3937
  );
3905
3938
  var editUser = (0, import_toolkit20.createAsyncThunk)(
3906
3939
  `${sliceName8}/editUser`,
@@ -3921,7 +3954,7 @@ var enableUser2fa = (0, import_toolkit20.createAsyncThunk)(
3921
3954
  );
3922
3955
  var disableUser2fa = (0, import_toolkit20.createAsyncThunk)(
3923
3956
  `${sliceName8}/disableUser2fa`,
3924
- (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))))
3957
+ (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))]))
3925
3958
  );
3926
3959
  var mapHttpPermission = (permission) => Object.entries(uiPermissionsByArea).reduce(
3927
3960
  (accu, [area, definition]) => {
@@ -4074,7 +4107,6 @@ var getPermissionSets = (0, import_toolkit20.createAsyncThunk)(
4074
4107
  accu[permissionSet.name] = permissionSetObject;
4075
4108
  return accu;
4076
4109
  },
4077
- // @ts-ignore
4078
4110
  { ...getState().users.permissionSetsById }
4079
4111
  );
4080
4112
  return Promise.all([dispatch(actions8.receivedPermissionSets(permissionSets)), permissionSets]);
@@ -4167,7 +4199,6 @@ var transformRoleDataToRole = (roleData, roleState = {}) => {
4167
4199
  role: {
4168
4200
  ...emptyRole,
4169
4201
  name,
4170
- // @ts-ignore
4171
4202
  description: description ? description : roleState.description,
4172
4203
  uiPermissions: {
4173
4204
  ...emptyUiPermissions,
@@ -4210,10 +4241,7 @@ var editRole = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/editRole`,
4210
4241
  });
4211
4242
  var removeRole = (0, import_toolkit20.createAsyncThunk)(
4212
4243
  `${sliceName8}/removeRole`,
4213
- (roleId, { dispatch }) => (
4214
- // @ts-ignore
4215
- 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))
4216
- )
4244
+ (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))
4217
4245
  );
4218
4246
  var getGlobalSettings2 = (0, import_toolkit20.createAsyncThunk)(
4219
4247
  `${sliceName8}/getGlobalSettings`,
@@ -4224,7 +4252,6 @@ var getGlobalSettings2 = (0, import_toolkit20.createAsyncThunk)(
4224
4252
  );
4225
4253
  var saveGlobalSettings = (0, import_toolkit20.createAsyncThunk)(
4226
4254
  `${sliceName8}/saveGlobalSettings`,
4227
- // @ts-ignore
4228
4255
  ({ beOptimistic = false, notify = false, ...settings }, { dispatch, getState }) => {
4229
4256
  if (!window.sessionStorage.getItem(settingsKeys.initialized) && !beOptimistic) {
4230
4257
  return;
@@ -4270,11 +4297,9 @@ var saveUserSettings = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/sav
4270
4297
  const tooltipState = getTooltipsState(getState());
4271
4298
  const updatedSettings = {
4272
4299
  ...userSettings,
4273
- // @ts-ignore
4274
4300
  ...settings,
4275
4301
  onboarding: {
4276
4302
  ...onboardingState,
4277
- // @ts-ignore
4278
4303
  ...settings.onboarding
4279
4304
  },
4280
4305
  tooltips: tooltipState
@@ -4318,10 +4343,7 @@ var generateToken = (0, import_toolkit20.createAsyncThunk)(
4318
4343
  );
4319
4344
  var revokeToken = (0, import_toolkit20.createAsyncThunk)(
4320
4345
  `${sliceName8}/revokeToken`,
4321
- (token, { dispatch }) => (
4322
- // @ts-ignore
4323
- general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
4324
- )
4346
+ (token, { dispatch }) => general_api_default.delete(`${useradmApiUrlv1}/settings/tokens/${token.id}`).then(() => Promise.resolve(dispatch(getTokens())))
4325
4347
  );
4326
4348
  var setTooltipReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/setTooltipReadState`, ({ persist, ...remainder }, { dispatch }) => {
4327
4349
  let tasks = [dispatch(actions8.setTooltipState(remainder))];
@@ -4330,27 +4352,25 @@ var setTooltipReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/
4330
4352
  }
4331
4353
  return Promise.all(tasks);
4332
4354
  });
4333
- var setAllTooltipsReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/toggleHelptips`, ({ readState = READ_STATES.read, tooltips }, { dispatch }) => {
4334
- const updatedTips = tooltips.reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
4355
+ var setAllTooltipsReadState = (0, import_toolkit20.createAsyncThunk)(`${sliceName8}/toggleHelptips`, (readState = READ_STATES.read, { dispatch }) => {
4356
+ const updatedTips = Object.keys(import_helptips.HELPTOOLTIPS).reduce((accu, id) => ({ ...accu, [id]: { readState } }), {});
4335
4357
  return Promise.resolve(dispatch(actions8.setTooltipsState(updatedTips))).then(() => dispatch(saveUserSettings()));
4336
4358
  });
4337
4359
  var submitFeedback = (0, import_toolkit20.createAsyncThunk)(
4338
4360
  `${sliceName8}/submitFeedback`,
4339
- // @ts-ignore
4340
- ({ satisfaction, feedback, ...meta }, { dispatch }) => {
4341
- return general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
4342
- subject: "feedback submission",
4343
- body: JSON.stringify({ feedback, satisfaction, meta })
4344
- }).then(() => {
4345
- const today = /* @__PURE__ */ new Date();
4346
- dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
4347
- setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
4348
- });
4349
- }
4361
+ ({ satisfaction, feedback, ...meta }, { dispatch }) => general_api_default.post(`${tenantadmApiUrlv2}/contact/support`, {
4362
+ subject: "feedback submission",
4363
+ body: JSON.stringify({ feedback, satisfaction, meta })
4364
+ }).then(() => {
4365
+ const today = /* @__PURE__ */ new Date();
4366
+ dispatch(saveUserSettings({ feedbackCollectedAt: today.toISOString().split("T")[0] }));
4367
+ setTimeout(() => dispatch(actions8.setShowFeedbackDialog(false)), TIMEOUTS.threeSeconds);
4368
+ })
4350
4369
  );
4351
4370
 
4352
4371
  // src/deploymentsSlice/thunks.ts
4353
4372
  var import_helpers10 = require("@northern.tech/utils/helpers");
4373
+ var import_tracking = __toESM(require("@northern.tech/utils/tracking"), 1);
4354
4374
  var import_toolkit21 = require("@reduxjs/toolkit");
4355
4375
  var import_validator = require("validator");
4356
4376
  var { receivedDevice, setSnackbar: setSnackbar4 } = actions_default;
@@ -4407,6 +4427,26 @@ var getDeploymentsByStatus2 = (0, import_toolkit21.createAsyncThunk)(`${sliceNam
4407
4427
  return Promise.all(tasks);
4408
4428
  });
4409
4429
  });
4430
+ var isWithinFirstMonth = (expirationDate) => {
4431
+ if (!expirationDate) {
4432
+ return false;
4433
+ }
4434
+ const endOfFirstMonth = new Date(expirationDate);
4435
+ endOfFirstMonth.setMonth(endOfFirstMonth.getMonth() - 11);
4436
+ return endOfFirstMonth > /* @__PURE__ */ new Date();
4437
+ };
4438
+ var trackDeploymentCreation = (totalDeploymentCount, hasDeployments, trial_expiration) => {
4439
+ import_tracking.default.event({ category: "deployments", action: "create" });
4440
+ if (!totalDeploymentCount) {
4441
+ if (!hasDeployments) {
4442
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment" });
4443
+ if (isWithinFirstMonth(trial_expiration)) {
4444
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_first_month" });
4445
+ }
4446
+ }
4447
+ import_tracking.default.event({ category: "deployments", action: "create_initial_deployment_user" });
4448
+ }
4449
+ };
4410
4450
  var MAX_PREVIOUS_PHASES_COUNT = 5;
4411
4451
  var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/createDeployment`, ({ newDeployment, hasNewRetryDefault = false }, { dispatch, getState }) => {
4412
4452
  let request;
@@ -4417,6 +4457,9 @@ var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/cre
4417
4457
  } else {
4418
4458
  request = general_api_default.post(`${deploymentsApiUrl}/deployments`, newDeployment);
4419
4459
  }
4460
+ const totalDeploymentCount = Object.values(getDeploymentsByStatus(getState())).reduce((accu, item) => accu + item.total, 0);
4461
+ const { hasDeployments } = getGlobalSettings(getState());
4462
+ const { trial_expiration } = getOrganization(getState());
4420
4463
  return request.catch((err) => commonErrorHandler(err, "Error creating deployment.", dispatch)).then((data) => {
4421
4464
  const lastslashindex = data.headers.location.lastIndexOf("/");
4422
4465
  const deploymentId = data.headers.location.substring(lastslashindex + 1);
@@ -4431,6 +4474,7 @@ var createDeployment = (0, import_toolkit21.createAsyncThunk)(`${sliceName2}/cre
4431
4474
  dispatch(getSingleDeployment(deploymentId)),
4432
4475
  dispatch(setSnackbar4("Deployment created successfully", TIMEOUTS.fiveSeconds))
4433
4476
  ];
4477
+ trackDeploymentCreation(totalDeploymentCount, hasDeployments, trial_expiration);
4434
4478
  const { canManageUsers } = getUserCapabilities(getState());
4435
4479
  if (canManageUsers) {
4436
4480
  const { phases, retries } = newDeployment;