@syngrisi/syngrisi 2.2.1

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 (387) hide show
  1. package/.nvmrc +1 -0
  2. package/LICENSE.md +9 -0
  3. package/README.md +139 -0
  4. package/config.js +17 -0
  5. package/dist/config.js +16 -0
  6. package/dist/src/server/models/index.js +508 -0
  7. package/dist/src/server/models/plugins/index.js +4 -0
  8. package/dist/src/server/models/plugins/paginate.plugin.js +76 -0
  9. package/dist/src/server/models/plugins/paginateDistinct.plugin.js +76 -0
  10. package/dist/src/server/models/plugins/toJSON.plugin.js +39 -0
  11. package/dist/src/server/schemas/createCheck.shema.js +17 -0
  12. package/dist/src/server/schemas/getBaseline.shema.js +12 -0
  13. package/dist/src/server/utils/paramsGuard.js +18 -0
  14. package/dist/src/tasks/backup.js +68 -0
  15. package/dist/src/tasks/lib/common.js +14 -0
  16. package/dist/src/tasks/lib/utils.js +14 -0
  17. package/dist/src/tasks/migrations/2.0.migration.js +86 -0
  18. package/dist/src/tasks/migrations/2.0.migration_mql.js +57 -0
  19. package/dist/src/tasks/reindex.js +28 -0
  20. package/dist/src/tasks/restore.js +86 -0
  21. package/dist/tsconfig.tsbuildinfo +1 -0
  22. package/docker-compose.yml +70 -0
  23. package/mvc/views/react/admin/index.html +22 -0
  24. package/mvc/views/react/assets/LogicalGroup.95929360.js +15993 -0
  25. package/mvc/views/react/assets/PasswordInput.8a73fdd2.js +299 -0
  26. package/mvc/views/react/assets/admin.94703bdc.js +14448 -0
  27. package/mvc/views/react/assets/auth.748478ef.js +673 -0
  28. package/mvc/views/react/assets/bg_2_0_dark_L2.3a31edc0.png +0 -0
  29. package/mvc/views/react/assets/favicon.bf5828d5.svg +7 -0
  30. package/mvc/views/react/assets/index.a5606313.css +23 -0
  31. package/mvc/views/react/assets/roboto-v30-latin-100.0f303f31.woff2 +0 -0
  32. package/mvc/views/react/assets/roboto-v30-latin-100.34e9582c.woff +0 -0
  33. package/mvc/views/react/assets/roboto-v30-latin-500.9ce7f3ac.woff +0 -0
  34. package/mvc/views/react/assets/roboto-v30-latin-500.b0195382.woff2 +0 -0
  35. package/mvc/views/react/assets/roboto-v30-latin-700.e0fd57c0.woff +0 -0
  36. package/mvc/views/react/assets/roboto-v30-latin-700.f5aebdfe.woff2 +0 -0
  37. package/mvc/views/react/assets/roboto-v30-latin-regular.f2abf7fb.woff +0 -0
  38. package/mvc/views/react/assets/roboto-v30-latin-regular.f6734f81.woff2 +0 -0
  39. package/mvc/views/react/assets/root.136e0ea3.js +25451 -0
  40. package/mvc/views/react/assets/use-form.57ebe175.js +24472 -0
  41. package/mvc/views/react/assets/use-form.ecb4391b.css +36 -0
  42. package/mvc/views/react/auth/index.html +22 -0
  43. package/mvc/views/react/index.html +19 -0
  44. package/mvc/views/react/index2/index.html +21 -0
  45. package/package.json +144 -0
  46. package/server.js +166 -0
  47. package/src/server/controllers/app.controller.js +21 -0
  48. package/src/server/controllers/auth.controller.js +156 -0
  49. package/src/server/controllers/baseline.controller.js +24 -0
  50. package/src/server/controllers/check.controller.js +56 -0
  51. package/src/server/controllers/client.controller.js +173 -0
  52. package/src/server/controllers/index.js +12 -0
  53. package/src/server/controllers/logs.controller.js +30 -0
  54. package/src/server/controllers/runs.controller.js +25 -0
  55. package/src/server/controllers/settings.controller.js +23 -0
  56. package/src/server/controllers/snapshots.controller.js +17 -0
  57. package/src/server/controllers/suite.controller.js +24 -0
  58. package/src/server/controllers/tasks.controller.js +47 -0
  59. package/src/server/controllers/test.controller.js +70 -0
  60. package/src/server/controllers/users.controller.js +79 -0
  61. package/src/server/data/custom_devices.json +8 -0
  62. package/src/server/data/devices.json +773 -0
  63. package/src/server/data/get_devices.sh +2 -0
  64. package/src/server/lib/AppSettings.js +56 -0
  65. package/src/server/lib/admin.json +9 -0
  66. package/src/server/lib/comparator.js +147 -0
  67. package/src/server/lib/compareImagesNode.js +60 -0
  68. package/src/server/lib/dbItems.js +215 -0
  69. package/src/server/lib/ensureLogin/ensureLoggedIn.js +223 -0
  70. package/src/server/lib/ensureLogin/ensureLoggedOut.js +44 -0
  71. package/src/server/lib/getElementsByPixPositionsFromDump.js +72 -0
  72. package/src/server/lib/guest.json +9 -0
  73. package/src/server/lib/initialAppSettings.json +18 -0
  74. package/src/server/lib/logger.js +95 -0
  75. package/src/server/lib/onStart.js +53 -0
  76. package/src/server/lib/parseDiff.js.bak +72 -0
  77. package/src/server/lib/testAdmin.json +9 -0
  78. package/src/server/lib/testUsers.json +41 -0
  79. package/src/server/middlewares/authorization.js +50 -0
  80. package/src/server/middlewares/disableCors.js +19 -0
  81. package/src/server/models/index.js +534 -0
  82. package/src/server/models/plugins/index.js +3 -0
  83. package/src/server/models/plugins/paginate.plugin.js +83 -0
  84. package/src/server/models/plugins/paginateDistinct.plugin.js +80 -0
  85. package/src/server/models/plugins/toJSON.plugin.js +44 -0
  86. package/src/server/routes/ui/admin.js +20 -0
  87. package/src/server/routes/ui/auth.js +15 -0
  88. package/src/server/routes/ui/index.js +19 -0
  89. package/src/server/routes/v1/app.route.js +9 -0
  90. package/src/server/routes/v1/auth.route.js +12 -0
  91. package/src/server/routes/v1/baselines.route.js +14 -0
  92. package/src/server/routes/v1/checks.route.js +25 -0
  93. package/src/server/routes/v1/client.route.js +39 -0
  94. package/src/server/routes/v1/index.js +82 -0
  95. package/src/server/routes/v1/logs.route.js +16 -0
  96. package/src/server/routes/v1/runs.route.js +15 -0
  97. package/src/server/routes/v1/settings.route.js +23 -0
  98. package/src/server/routes/v1/snapshots.route.js +11 -0
  99. package/src/server/routes/v1/suites.route.js +15 -0
  100. package/src/server/routes/v1/tasks.route.js +59 -0
  101. package/src/server/routes/v1/test.route.js +20 -0
  102. package/src/server/routes/v1/test_distinct.route.js +14 -0
  103. package/src/server/routes/v1/users.route.js +36 -0
  104. package/src/server/schemas/createCheck.shema.ts +17 -0
  105. package/src/server/schemas/getBaseline.shema.ts +12 -0
  106. package/src/server/services/app.service.js +23 -0
  107. package/src/server/services/check.service.js +178 -0
  108. package/src/server/services/client.service.js +648 -0
  109. package/src/server/services/generic.service.js +51 -0
  110. package/src/server/services/index.js +12 -0
  111. package/src/server/services/logs.service.js +38 -0
  112. package/src/server/services/run.service.js +40 -0
  113. package/src/server/services/suite.service.js +39 -0
  114. package/src/server/services/tasks.service.js +536 -0
  115. package/src/server/services/test.service.js +72 -0
  116. package/src/server/services/user.service.js +128 -0
  117. package/src/server/utils/ApiError.js +14 -0
  118. package/src/server/utils/catchAsync.js +8 -0
  119. package/src/server/utils/check.js +58 -0
  120. package/src/server/utils/dateToISO8601.js +2 -0
  121. package/src/server/utils/deserializeIfJSON.js +9 -0
  122. package/src/server/utils/formatISOToDateTime.js +6 -0
  123. package/src/server/utils/index.js +10 -0
  124. package/src/server/utils/isJSON.js +6 -0
  125. package/src/server/utils/paramsGuard.ts +15 -0
  126. package/src/server/utils/pick.js +15 -0
  127. package/src/server/utils/prettyCheckParams.js +13 -0
  128. package/src/server/utils/snapshots.js +73 -0
  129. package/src/server/utils/subDays.js +7 -0
  130. package/src/server/utils/tests.js +36 -0
  131. package/src/server/utils/utils.js +146 -0
  132. package/src/tasks/backup.js.bak +84 -0
  133. package/src/tasks/backup.ts +53 -0
  134. package/src/tasks/lib/common.js +24 -0
  135. package/src/tasks/lib/utils.js +15 -0
  136. package/src/tasks/migrations/2.0.migration.js +86 -0
  137. package/src/tasks/migrations/2.0.migration.ts +95 -0
  138. package/src/tasks/migrations/2.0.migration_mql.js +63 -0
  139. package/src/tasks/reindex.js +36 -0
  140. package/src/tasks/restore.js.bak +100 -0
  141. package/src/tasks/restore.ts +75 -0
  142. package/src/ui-app/.eslintrc.json +119 -0
  143. package/src/ui-app/README.md +15 -0
  144. package/src/ui-app/admin/AdminLayout.tsx +38 -0
  145. package/src/ui-app/admin/App.tsx +108 -0
  146. package/src/ui-app/admin/AppContext.ts +3 -0
  147. package/src/ui-app/admin/components/Header/AdminHeader.tsx +148 -0
  148. package/src/ui-app/admin/components/Logs/AdminLogs.tsx +142 -0
  149. package/src/ui-app/admin/components/Logs/RefreshActionIcon.tsx +60 -0
  150. package/src/ui-app/admin/components/Logs/Table/AdminLogsTable.tsx +81 -0
  151. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableFilter.tsx +170 -0
  152. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableHeads.tsx +50 -0
  153. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableRows.tsx +207 -0
  154. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableSettings.tsx +95 -0
  155. package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeleton.tsx +77 -0
  156. package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeletonFIller.tsx +57 -0
  157. package/src/ui-app/admin/components/Logs/Table/PagesCountAffix.tsx +61 -0
  158. package/src/ui-app/admin/components/Logs/Table/adminLogsCreateStyle.tsx +36 -0
  159. package/src/ui-app/admin/components/Logs/Table/adminLogsTableColumns.ts +52 -0
  160. package/src/ui-app/admin/components/Logs/UnfoldActionIcon.tsx +39 -0
  161. package/src/ui-app/admin/components/Navbar/AdminNavbar.tsx +50 -0
  162. package/src/ui-app/admin/components/Navbar/NavbarLinksGroup.tsx +104 -0
  163. package/src/ui-app/admin/components/Settings/AdminSettings.tsx +51 -0
  164. package/src/ui-app/admin/components/Settings/Forms/Boolean.tsx +59 -0
  165. package/src/ui-app/admin/components/Settings/Forms/FormWrapper.tsx +45 -0
  166. package/src/ui-app/admin/components/Settings/Forms/index.tsx +5 -0
  167. package/src/ui-app/admin/components/Settings/Forms/interfaces.tsx +17 -0
  168. package/src/ui-app/admin/components/Tasks/Task.tsx +138 -0
  169. package/src/ui-app/admin/components/Tasks/TaskWrapper.tsx +11 -0
  170. package/src/ui-app/admin/components/Tasks/tasksList.ts +59 -0
  171. package/src/ui-app/admin/components/Users/AdminUsers.tsx +182 -0
  172. package/src/ui-app/admin/components/Users/UserAddForm.tsx +137 -0
  173. package/src/ui-app/admin/components/Users/UserForm.tsx +196 -0
  174. package/src/ui-app/admin/hooks/useParams.tsx +18 -0
  175. package/src/ui-app/admin/index.html +17 -0
  176. package/src/ui-app/admin/main.tsx +24 -0
  177. package/src/ui-app/asserts/css/auth/index.css +23 -0
  178. package/src/ui-app/asserts/css/styles.css +36 -0
  179. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.eot +0 -0
  180. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.svg +313 -0
  181. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.ttf +0 -0
  182. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff +0 -0
  183. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff2 +0 -0
  184. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.eot +0 -0
  185. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.svg +305 -0
  186. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.ttf +0 -0
  187. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff +0 -0
  188. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff2 +0 -0
  189. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.eot +0 -0
  190. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.svg +309 -0
  191. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.ttf +0 -0
  192. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff +0 -0
  193. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff2 +0 -0
  194. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.eot +0 -0
  195. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.svg +308 -0
  196. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.ttf +0 -0
  197. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff +0 -0
  198. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff2 +0 -0
  199. package/src/ui-app/asserts/images/background.jpg +0 -0
  200. package/src/ui-app/asserts/images/bg_2_0_dark_L2.png +0 -0
  201. package/src/ui-app/asserts/images/favicon.svg +7 -0
  202. package/src/ui-app/auth/App.tsx +82 -0
  203. package/src/ui-app/auth/commonStyles.tsx +26 -0
  204. package/src/ui-app/auth/components/AuthFooter.tsx +51 -0
  205. package/src/ui-app/auth/components/AuthLogo.tsx +58 -0
  206. package/src/ui-app/auth/components/ChangePasswordForm.tsx +216 -0
  207. package/src/ui-app/auth/components/ChangePasswordSuccessForm.tsx +38 -0
  208. package/src/ui-app/auth/components/LoginForm.tsx +148 -0
  209. package/src/ui-app/auth/components/LogoutForm.tsx +89 -0
  210. package/src/ui-app/auth/components/ToggleThemeButton.tsx +41 -0
  211. package/src/ui-app/auth/components/change-password/Bars.tsx +45 -0
  212. package/src/ui-app/auth/components/change-password/PasswordRequirement.tsx +14 -0
  213. package/src/ui-app/auth/components/change-password/requirements.tsx +6 -0
  214. package/src/ui-app/auth/index.html +17 -0
  215. package/src/ui-app/auth/main.tsx +12 -0
  216. package/src/ui-app/auth/routes.tsx +26 -0
  217. package/src/ui-app/config.ts +15 -0
  218. package/src/ui-app/index.html +12 -0
  219. package/src/ui-app/index2/App.tsx +162 -0
  220. package/src/ui-app/index2/AppContext.ts +3 -0
  221. package/src/ui-app/index2/IndexLayout.tsx +34 -0
  222. package/src/ui-app/index2/components/Header/HeaderIndex.tsx +248 -0
  223. package/src/ui-app/index2/components/Header/QuickFilter.tsx +312 -0
  224. package/src/ui-app/index2/components/Navbar/Items/AcceptStatusItem.tsx +42 -0
  225. package/src/ui-app/index2/components/Navbar/Items/BaseItemWrapper.tsx +94 -0
  226. package/src/ui-app/index2/components/Navbar/Items/BrowserItem.tsx +42 -0
  227. package/src/ui-app/index2/components/Navbar/Items/PlatformItem.tsx +42 -0
  228. package/src/ui-app/index2/components/Navbar/Items/RemoveItemModalAsk.tsx +71 -0
  229. package/src/ui-app/index2/components/Navbar/Items/RemoveItemPopover.tsx +58 -0
  230. package/src/ui-app/index2/components/Navbar/Items/RemoveSuiteModalAsk.tsx +61 -0
  231. package/src/ui-app/index2/components/Navbar/Items/RunItem.tsx +149 -0
  232. package/src/ui-app/index2/components/Navbar/Items/StatusItem.tsx +42 -0
  233. package/src/ui-app/index2/components/Navbar/Items/SuiteItem.tsx +109 -0
  234. package/src/ui-app/index2/components/Navbar/Items/index.tsx +6 -0
  235. package/src/ui-app/index2/components/Navbar/NavbarFilter.tsx +93 -0
  236. package/src/ui-app/index2/components/Navbar/NavbarGroupBySelect.tsx +83 -0
  237. package/src/ui-app/index2/components/Navbar/NavbarIndex.tsx +247 -0
  238. package/src/ui-app/index2/components/Navbar/NavbarItems.tsx +38 -0
  239. package/src/ui-app/index2/components/Navbar/NavbarSort.tsx +105 -0
  240. package/src/ui-app/index2/components/Navbar/Skeletons/RunsDummySkeleton.tsx +27 -0
  241. package/src/ui-app/index2/components/Navbar/Skeletons/SimpleDummySkeleton.tsx +23 -0
  242. package/src/ui-app/index2/components/Navbar/Skeletons/SkeletonWrapper.tsx +45 -0
  243. package/src/ui-app/index2/components/Navbar/Skeletons/SuitesDummySkeleton.tsx +27 -0
  244. package/src/ui-app/index2/components/Tests/Table/AcceptTestModalAsk.tsx +68 -0
  245. package/src/ui-app/index2/components/Tests/Table/AcceptTestsButton.tsx +44 -0
  246. package/src/ui-app/index2/components/Tests/Table/Cells/Branch.tsx +35 -0
  247. package/src/ui-app/index2/components/Tests/Table/Cells/BrowserName.tsx +33 -0
  248. package/src/ui-app/index2/components/Tests/Table/Cells/BrowserVersion.tsx +31 -0
  249. package/src/ui-app/index2/components/Tests/Table/Cells/CellWrapper.tsx +49 -0
  250. package/src/ui-app/index2/components/Tests/Table/Cells/Os.tsx +32 -0
  251. package/src/ui-app/index2/components/Tests/Table/Cells/StartDate.tsx +34 -0
  252. package/src/ui-app/index2/components/Tests/Table/Cells/Status.tsx +50 -0
  253. package/src/ui-app/index2/components/Tests/Table/Cells/ViewPort.tsx +46 -0
  254. package/src/ui-app/index2/components/Tests/Table/Checks/AcceptButton.tsx +142 -0
  255. package/src/ui-app/index2/components/Tests/Table/Checks/Check.tsx +281 -0
  256. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/Canvas.tsx +36 -0
  257. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/helpers.ts +72 -0
  258. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/mainView.ts +495 -0
  259. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/sideToSideView.ts +398 -0
  260. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/simpleView.ts +21 -0
  261. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/CheckDetails.tsx +237 -0
  262. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Header.tsx +221 -0
  263. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckItem.tsx +167 -0
  264. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckSort.tsx +81 -0
  265. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecks.tsx +197 -0
  266. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksItems.tsx +31 -0
  267. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksSkeleton.tsx +37 -0
  268. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/HighlightButton.tsx +56 -0
  269. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/RegionsToolbar.tsx +150 -0
  270. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ScreenshotDetails.tsx +137 -0
  271. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/Toolbar.tsx +101 -0
  272. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ViewSegmentedControl.tsx +159 -0
  273. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ZoomToolbar.tsx +326 -0
  274. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/highlightDiff.ts +167 -0
  275. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/hooks/useRelatedChecks.tsx +43 -0
  276. package/src/ui-app/index2/components/Tests/Table/Checks/CheckModal.tsx +119 -0
  277. package/src/ui-app/index2/components/Tests/Table/Checks/Checks.tsx +91 -0
  278. package/src/ui-app/index2/components/Tests/Table/Checks/ChecksSkeleton.tsx +21 -0
  279. package/src/ui-app/index2/components/Tests/Table/Checks/PreviewCheckTooltipLabel.tsx +121 -0
  280. package/src/ui-app/index2/components/Tests/Table/Checks/RemoveButton.tsx +63 -0
  281. package/src/ui-app/index2/components/Tests/Table/Checks/ViewPortLabel.tsx +94 -0
  282. package/src/ui-app/index2/components/Tests/Table/Checks/checkSizes.ts +27 -0
  283. package/src/ui-app/index2/components/Tests/Table/Filter.tsx +179 -0
  284. package/src/ui-app/index2/components/Tests/Table/Heads.tsx +54 -0
  285. package/src/ui-app/index2/components/Tests/Table/InfinityScrollSkeleton.tsx +71 -0
  286. package/src/ui-app/index2/components/Tests/Table/PagesCountAffix.tsx +61 -0
  287. package/src/ui-app/index2/components/Tests/Table/RefreshActionIcon.tsx +65 -0
  288. package/src/ui-app/index2/components/Tests/Table/RemoveTestModalAsk.tsx +66 -0
  289. package/src/ui-app/index2/components/Tests/Table/RemoveTestsButton.tsx +43 -0
  290. package/src/ui-app/index2/components/Tests/Table/Row.tsx +128 -0
  291. package/src/ui-app/index2/components/Tests/Table/Rows.tsx +87 -0
  292. package/src/ui-app/index2/components/Tests/Table/Settings.tsx +121 -0
  293. package/src/ui-app/index2/components/Tests/Table/TestsTable.tsx +140 -0
  294. package/src/ui-app/index2/components/Tests/Table/UnfoldActionIcon.tsx +39 -0
  295. package/src/ui-app/index2/components/Tests/Table/tableColumns.ts +80 -0
  296. package/src/ui-app/index2/components/Tests/Table/testsCreateStyle.tsx +35 -0
  297. package/src/ui-app/index2/components/Tests/Tests.tsx +157 -0
  298. package/src/ui-app/index2/hooks/useIndexSubpageEffect.tsx +14 -0
  299. package/src/ui-app/index2/hooks/useNavbarActiveItems.tsx +66 -0
  300. package/src/ui-app/index2/hooks/useParams.tsx +25 -0
  301. package/src/ui-app/index2/index.html +17 -0
  302. package/src/ui-app/index2/main.tsx +33 -0
  303. package/src/ui-app/package-lock.json +6150 -0
  304. package/src/ui-app/package.json +58 -0
  305. package/src/ui-app/shared/components/ActionPopoverIcon.tsx +116 -0
  306. package/src/ui-app/shared/components/Check/AcceptedStatusIcon.tsx +51 -0
  307. package/src/ui-app/shared/components/Check/BrowserIcon.tsx +50 -0
  308. package/src/ui-app/shared/components/Check/OsIcon.tsx +73 -0
  309. package/src/ui-app/shared/components/Check/Status.tsx +37 -0
  310. package/src/ui-app/shared/components/Check/StatusIcon.tsx +66 -0
  311. package/src/ui-app/shared/components/Email.tsx +83 -0
  312. package/src/ui-app/shared/components/Header/ApiKeyModalAsk.tsx +31 -0
  313. package/src/ui-app/shared/components/Header/ApiKeyModalResult.tsx +89 -0
  314. package/src/ui-app/shared/components/Header/HeaderLogo.tsx +82 -0
  315. package/src/ui-app/shared/components/Header/UserInfoModal.tsx +92 -0
  316. package/src/ui-app/shared/components/Header/UserMenu.tsx +151 -0
  317. package/src/ui-app/shared/components/Password.tsx +95 -0
  318. package/src/ui-app/shared/components/RelativeDrawer.tsx +43 -0
  319. package/src/ui-app/shared/components/SafeSelect.tsx +95 -0
  320. package/src/ui-app/shared/components/Tests/StatusesRing.tsx +66 -0
  321. package/src/ui-app/shared/components/ToggleThemeButton.tsx +33 -0
  322. package/src/ui-app/shared/components/Users/LabelUser.tsx +60 -0
  323. package/src/ui-app/shared/components/errors/ErrorFallback.tsx +66 -0
  324. package/src/ui-app/shared/components/filter/AcceptedFilter.tsx +20 -0
  325. package/src/ui-app/shared/components/filter/BrowserNameFilter.tsx +20 -0
  326. package/src/ui-app/shared/components/filter/CommonDistinctFilter.tsx +104 -0
  327. package/src/ui-app/shared/components/filter/DateFilter.tsx +54 -0
  328. package/src/ui-app/shared/components/filter/FilterWrapper.tsx +80 -0
  329. package/src/ui-app/shared/components/filter/IdFilter.tsx +60 -0
  330. package/src/ui-app/shared/components/filter/LogLevelFilter.tsx +77 -0
  331. package/src/ui-app/shared/components/filter/LogicalGroup.tsx +179 -0
  332. package/src/ui-app/shared/components/filter/OsFilter.tsx +20 -0
  333. package/src/ui-app/shared/components/filter/StatusFilter.tsx +20 -0
  334. package/src/ui-app/shared/components/filter/StringFilter.tsx +55 -0
  335. package/src/ui-app/shared/components/filter/index.ts +19 -0
  336. package/src/ui-app/shared/components/heaserLinks.tsx +4 -0
  337. package/src/ui-app/shared/hooks/index.ts +3 -0
  338. package/src/ui-app/shared/hooks/useColorSheme.ts +22 -0
  339. package/src/ui-app/shared/hooks/useDistinctLogQuery.tsx +33 -0
  340. package/src/ui-app/shared/hooks/useDistinctQuery.tsx +37 -0
  341. package/src/ui-app/shared/hooks/useInfinityScroll.tsx +163 -0
  342. package/src/ui-app/shared/hooks/useInfinityScrollRelatedChecks.tsx +60 -0
  343. package/src/ui-app/shared/hooks/useNavProgressFetchEffect.tsx +17 -0
  344. package/src/ui-app/shared/hooks/useSubpageEffect.tsx +28 -0
  345. package/src/ui-app/shared/hooks/user.hooks.ts +49 -0
  346. package/src/ui-app/shared/interfaces/ILog.tsx +13 -0
  347. package/src/ui-app/shared/interfaces/IUser.tsx +13 -0
  348. package/src/ui-app/shared/interfaces/logQueries.tsx +31 -0
  349. package/src/ui-app/shared/navigation/interfaces.tsx +7 -0
  350. package/src/ui-app/shared/navigation/navigationData.tsx +191 -0
  351. package/src/ui-app/shared/services/checks.service.ts +39 -0
  352. package/src/ui-app/shared/services/generic.service.ts +115 -0
  353. package/src/ui-app/shared/services/index.ts +6 -0
  354. package/src/ui-app/shared/services/runs.service.ts +20 -0
  355. package/src/ui-app/shared/services/suites.service.ts +20 -0
  356. package/src/ui-app/shared/services/tests.service.ts +39 -0
  357. package/src/ui-app/shared/services/users.service.ts +29 -0
  358. package/src/ui-app/shared/utils/Logger.ts +12 -0
  359. package/src/ui-app/shared/utils/SearchParams.ts +17 -0
  360. package/src/ui-app/shared/utils/filters.tsx +14 -0
  361. package/src/ui-app/shared/utils/index.ts +5 -0
  362. package/src/ui-app/shared/utils/utils.tsx +70 -0
  363. package/src/ui-app/stub.html +12 -0
  364. package/src/ui-app/stub.tsx +58 -0
  365. package/src/ui-app/stubDemoColors.tsx +47 -0
  366. package/src/ui-app/stubDemoNav.tsx +41 -0
  367. package/src/ui-app/tsconfig.json +21 -0
  368. package/src/ui-app/tsconfig.node.json +12 -0
  369. package/static/A.png +0 -0
  370. package/static/B.png +0 -0
  371. package/static/affected.html +39 -0
  372. package/static/affected_2.html +40 -0
  373. package/static/data/custom_devices.json +14 -0
  374. package/static/grids/desktop-higher.html +72 -0
  375. package/static/grids/desktop-wider.html +72 -0
  376. package/static/grids/desktop.html +61 -0
  377. package/static/grids/fit-in-view.html +62 -0
  378. package/static/js/canvasjs.min.js.bak +957 -0
  379. package/static/js/chart.js.bak +92 -0
  380. package/static/js/jquery-3.3.1.slim.js.bak +8269 -0
  381. package/static/js/jquery-3.3.1.slim.min.js.bak +2 -0
  382. package/static/js/moment.min.js.bak +2 -0
  383. package/static/low_diff_0.png +0 -0
  384. package/static/low_diff_1.png +0 -0
  385. package/static/vShift.png +0 -0
  386. package/static/vShift_bottom.png +0 -0
  387. package/static/vShift_top.png +0 -0
@@ -0,0 +1,221 @@
1
+ import * as React from 'react';
2
+ import { ActionIcon, Group, Loader, Text, Tooltip, useMantineTheme } from '@mantine/core';
3
+ import { useLocalStorage } from '@mantine/hooks';
4
+ import { useMemo } from 'react';
5
+ import { Status } from '../../../../../../shared/components/Check/Status';
6
+ import { ViewPortLabel } from '../ViewPortLabel';
7
+ import { sizes } from '../checkSizes';
8
+ import { OsIcon } from '../../../../../../shared/components/Check/OsIcon';
9
+ import { BrowserIcon } from '../../../../../../shared/components/Check/BrowserIcon';
10
+ import { getStatusMessage } from '../../../../../../shared/utils/utils';
11
+
12
+ interface Props {
13
+ classes: any
14
+ currentCheck: any
15
+ }
16
+
17
+ export function Header(
18
+ {
19
+ classes,
20
+ currentCheck,
21
+ }: Props,
22
+ ) {
23
+ const theme = useMantineTheme();
24
+ const [checksViewSize] = useLocalStorage({ key: 'check-view-size', defaultValue: 'medium' });
25
+ const textLoader = <Loader size="xs" color="blue" variant="dots" />;
26
+ const statusMsg = currentCheck.status ? getStatusMessage(currentCheck) : textLoader;
27
+
28
+ const iconsColor = useMemo(
29
+ () => (theme.colorScheme === 'dark'
30
+ ? theme.colors.gray[3]
31
+ : theme.colors.dark[9]), [theme.colorScheme],
32
+ );
33
+
34
+ return (
35
+ <Group position="apart" sx={{ width: '98%' }} data-check-header-name={currentCheck.name} noWrap>
36
+ <Group
37
+ position="left"
38
+ align="center"
39
+ spacing="xs"
40
+ sx={{ position: 'relative' }}
41
+ noWrap
42
+ data-test="full-check-path"
43
+ >
44
+ <Tooltip
45
+ label={
46
+ (
47
+ <Group spacing={4}>
48
+ {
49
+ currentCheck.status
50
+ ? (<Status size="lg" check={currentCheck} variant="filled" />)
51
+ : textLoader
52
+ }
53
+ {statusMsg}
54
+ </Group>
55
+ )
56
+ }
57
+ withinPortal
58
+ >
59
+ <Group align="center" data-check="status">
60
+ <Status size="lg" check={currentCheck} variant="filled" />
61
+ </Group>
62
+ </Tooltip>
63
+
64
+ <Group
65
+ noWrap
66
+ spacing={0}
67
+ >
68
+ <Tooltip
69
+ withinPortal
70
+ label={`Project: ${currentCheck?.app?.name}`}
71
+ >
72
+ <Text
73
+ data-check="app-name"
74
+ sx={{ flexShrink: 1 }}
75
+ className={classes.checkPathFragment}
76
+ >
77
+ {currentCheck?.app?.name}
78
+ </Text>
79
+ </Tooltip>
80
+ <Tooltip
81
+ withinPortal
82
+ label={`Suite: ${currentCheck?.suite?.name}`}
83
+ >
84
+ <Text
85
+ data-check="suite-name"
86
+ sx={{ flexShrink: 500 }}
87
+ className={classes.checkPathFragment}
88
+ >
89
+ &nbsp;/&nbsp;
90
+ {currentCheck?.suite?.name}
91
+ </Text>
92
+ </Tooltip>
93
+ <Tooltip
94
+ withinPortal
95
+ label={`Test: ${currentCheck?.test?.name}`}
96
+ >
97
+ <Text
98
+ data-check="test-name"
99
+ sx={{ flexShrink: 5 }}
100
+ className={classes.checkPathFragment}
101
+ >
102
+ &nbsp;/&nbsp;
103
+ {currentCheck?.test?.name}
104
+ </Text>
105
+ </Tooltip>
106
+ <Tooltip
107
+ withinPortal
108
+ label={`Check: ${currentCheck.name}`}
109
+
110
+ >
111
+ <Text
112
+ data-check="check-name"
113
+ sx={{ flexShrink: 1 }}
114
+ lineClamp={1}
115
+ // className={classes.checkPathFragment}
116
+ >
117
+ &nbsp;/&nbsp;
118
+ {currentCheck.name || textLoader}
119
+ </Text>
120
+ </Tooltip>
121
+ </Group>
122
+ </Group>
123
+
124
+ <Group
125
+ noWrap
126
+ spacing="xs"
127
+ >
128
+ <Tooltip
129
+ label={
130
+ currentCheck?.viewport
131
+ }
132
+ withinPortal
133
+ >
134
+ <Text lineClamp={1} sx={{ overflow: 'visible' }} data-check="viewport">
135
+ {
136
+ currentCheck?.viewport
137
+ ? (
138
+ <ViewPortLabel
139
+ check={currentCheck}
140
+ color="blue"
141
+ sizes={sizes}
142
+ size="lg"
143
+ checksViewSize={checksViewSize}
144
+ fontSize="12px"
145
+ />
146
+ )
147
+ : textLoader
148
+ }
149
+
150
+ </Text>
151
+ </Tooltip>
152
+
153
+ <Tooltip
154
+ data-check="os-label"
155
+ label={
156
+ currentCheck?.os
157
+ }
158
+ withinPortal
159
+ >
160
+ <Group spacing={8} noWrap>
161
+ <ActionIcon variant="light" size={32} p={4} ml={4}>
162
+ {
163
+ currentCheck?.os
164
+ ? (
165
+ <OsIcon
166
+ data-check="os-icon"
167
+ size={20}
168
+ color={iconsColor}
169
+ os={currentCheck?.os}
170
+ />
171
+ )
172
+ : textLoader
173
+ }
174
+ </ActionIcon>
175
+ <Text data-check="os" size={12} lineClamp={1}>{currentCheck?.os}</Text>
176
+ </Group>
177
+ </Tooltip>
178
+
179
+ <Tooltip
180
+ label={
181
+ currentCheck?.browserFullVersion
182
+ ? `${currentCheck?.browserFullVersion}`
183
+ : `${currentCheck?.browserVersion}`
184
+ }
185
+ withinPortal
186
+ >
187
+ <Group spacing={8} noWrap>
188
+ <ActionIcon variant="light" size={32} p={4}>
189
+ {
190
+ currentCheck?.browserName
191
+ ? (
192
+ <BrowserIcon
193
+ data-check="browser-icon"
194
+ size={20}
195
+ color={iconsColor}
196
+ browser={currentCheck?.browserName}
197
+ />
198
+ )
199
+ : textLoader
200
+ }
201
+ </ActionIcon>
202
+ <Text
203
+ data-check="browser"
204
+ lineClamp={1}
205
+ size={12}
206
+ >
207
+
208
+ {currentCheck?.browserName}
209
+ {
210
+ currentCheck?.browserVersion
211
+ ? ` - ${currentCheck?.browserVersion}`
212
+ : ''
213
+ }
214
+ </Text>
215
+ </Group>
216
+ </Tooltip>
217
+ </Group>
218
+ </Group>
219
+
220
+ );
221
+ }
@@ -0,0 +1,167 @@
1
+ /* eslint-disable no-underscore-dangle,react/jsx-one-expression-per-line */
2
+ import * as React from 'react';
3
+ import { Group, Image, Paper, useMantineTheme, Text, Stack, Badge, Tooltip } from '@mantine/core';
4
+ import { useLocalStorage } from '@mantine/hooks';
5
+ import { IconGitBranch } from '@tabler/icons';
6
+ import config from '../../../../../../../config';
7
+ import { Status } from '../../../../../../../shared/components/Check/Status';
8
+ import { ViewPortLabel } from '../../ViewPortLabel';
9
+ import { sizes } from '../../checkSizes';
10
+ import { BrowserIcon } from '../../../../../../../shared/components/Check/BrowserIcon';
11
+ import { OsIcon } from '../../../../../../../shared/components/Check/OsIcon';
12
+ import { PreviewCheckTooltipLabel } from '../../PreviewCheckTooltipLabel';
13
+ import { useParams } from '../../../../../../hooks/useParams';
14
+
15
+ interface Props {
16
+ checkData: any
17
+ setRelatedActiveCheckId: any
18
+ activeCheckId: any
19
+ index: number
20
+ }
21
+
22
+ export function RelatedCheckItem({ checkData, activeCheckId, setRelatedActiveCheckId, index }: Props) {
23
+ const { setQuery } = useParams();
24
+ const check = checkData;
25
+ const theme = useMantineTheme();
26
+ const imageFilename = check.diffId?.filename || check.actualSnapshotId?.filename || check.baselineId?.filename;
27
+ const imagePreviewSrc = `${config.baseUri}/snapshoots/${imageFilename}`;
28
+
29
+ const [checksViewSize] = useLocalStorage({ key: 'check-view-size', defaultValue: 'medium' });
30
+
31
+ const handleItemClick = () => {
32
+ setQuery({ checkId: checkData._id });
33
+ setRelatedActiveCheckId(() => check._id);
34
+ };
35
+
36
+ return (
37
+ <Group
38
+ data-related-check-index={index}
39
+ onClick={handleItemClick}
40
+ spacing={4}
41
+ mt={1}
42
+ mb={8}
43
+ pr={8}
44
+ pl={8}
45
+ pt={0}
46
+ pb={0}
47
+ sx={{
48
+ cursor: 'pointer',
49
+ width: '88%',
50
+ borderBottom: `1px solid ${theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[2]}`,
51
+ // eslint-disable-next-line no-nested-ternary
52
+ backgroundColor: (check._id === activeCheckId)
53
+ ? (theme.colorScheme === 'dark' ? theme.colors.blue[9] : theme.colors.blue[3])
54
+ : '',
55
+
56
+ '&:hover': {
57
+ // border: `1px solid ${theme.colors.gray[3]}`,
58
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.blue[5] : theme.colors.blue[4],
59
+ },
60
+ }}
61
+ position="center"
62
+
63
+ >
64
+ <Tooltip.Floating
65
+ multiline
66
+ zIndex={1000}
67
+ withinPortal
68
+ position="right-start"
69
+ color="dark"
70
+ label={
71
+ <PreviewCheckTooltipLabel check={check} />
72
+ }
73
+ >
74
+ <Paper
75
+ radius={0}
76
+ shadow="sm"
77
+ pt={6}
78
+ pr={0}
79
+ pl={0}
80
+ mr={4}
81
+ ml={4}
82
+ mt={2}
83
+ mb={2}
84
+ >
85
+ <div
86
+ style={{ position: 'relative' }}
87
+ data-related-check-item={check.name}
88
+ >
89
+ <Stack align="center" mb={4}>
90
+ <Image
91
+ data-related-check="image"
92
+ src={imagePreviewSrc}
93
+ width="125px"
94
+ fit="contain"
95
+ withPlaceholder
96
+ alt={check.name}
97
+ styles={
98
+ () => ({
99
+ image: {
100
+ maxHeight: 150,
101
+ },
102
+ })
103
+ }
104
+ />
105
+ </Stack>
106
+ <Stack p={4} pt={8} align="start" spacing={8}>
107
+ <Group position="center" spacing={4} sx={{ width: '100%' }} noWrap>
108
+ <ViewPortLabel
109
+ fontSize="8px"
110
+ color="blue"
111
+ check={check}
112
+ sizes={sizes}
113
+ checksViewSize={checksViewSize}
114
+ />
115
+ <Badge
116
+ leftSection={<IconGitBranch style={{ marginTop: '4', marginRight: -2 }} size={9} />}
117
+ color="dark"
118
+ size="xs"
119
+ >
120
+ <Text lineClamp={1} sx={{ maxWidth: 40 }} data-related-check="branch">
121
+ {check.branch}
122
+ </Text>
123
+ </Badge>
124
+ </Group>
125
+ <Group pl={8} position="center" spacing={4} sx={{ width: '100%' }} noWrap>
126
+ <OsIcon os={check.os} size={14} data-related-check="os-icon" />
127
+ <Text size="xs" lineClamp={1} data-related-check="os-label">{check.os}</Text>
128
+ </Group>
129
+
130
+ <Group pl={8} position="center" spacing={4} sx={{ width: '100%' }} noWrap>
131
+ <BrowserIcon
132
+ data-related-check-browser-name={check.browserName}
133
+ data-related-check="browser-icon"
134
+ browser={check.browserName}
135
+ size={14}
136
+ />
137
+ <Text
138
+ size="xs"
139
+ lineClamp={1}
140
+ data-related-check="browser-name"
141
+ >
142
+ {check.browserName}
143
+ </Text>
144
+ <Text
145
+ data-related-check="browser-version"
146
+ size="xs"
147
+ sx={{ minWidth: '30%' }}
148
+ >
149
+ - {check.browserVersion}
150
+ </Text>
151
+ </Group>
152
+ </Stack>
153
+
154
+ <div style={{ position: 'absolute', top: -14, left: 6, opacity: 1 }}>
155
+ <Status
156
+ data-related-check="status"
157
+ check={check}
158
+ size="xs"
159
+ variant="filled"
160
+ />
161
+ </div>
162
+ </div>
163
+ </Paper>
164
+ </Tooltip.Floating>
165
+ </Group>
166
+ );
167
+ }
@@ -0,0 +1,81 @@
1
+ import * as React from 'react';
2
+ import { ActionIcon, Group, Transition } from '@mantine/core';
3
+ import { IconSortAscending, IconSortDescending, IconX } from '@tabler/icons';
4
+ import SafeSelect from '../../../../../../../shared/components/SafeSelect';
5
+
6
+ type Props = {
7
+ setSortBy: any,
8
+ sortBy: string,
9
+ setSortOrder: any,
10
+ sortOrder: string,
11
+ openedSort: any,
12
+ toggleOpenedSort: any,
13
+ };
14
+
15
+ export function RelatedCheckSort(
16
+ {
17
+ sortBy,
18
+ setSortBy,
19
+ setSortOrder,
20
+ toggleOpenedSort,
21
+ sortOrder,
22
+ openedSort,
23
+ }: Props,
24
+ ) {
25
+ return (
26
+ <Transition
27
+ mounted={openedSort}
28
+ transition="fade"
29
+ duration={400}
30
+ timingFunction="ease"
31
+ >
32
+ {(styles) => (
33
+ <Group align="end" spacing={4} pr={10} ml={-10} mr={-10} noWrap style={styles}>
34
+ <SafeSelect
35
+ label="Sort by"
36
+ data-test="navbar-sort-by-select"
37
+ // sx={{ width: '230px' }}
38
+ value={sortBy}
39
+ onChange={(value: string) => setSortBy(() => value)}
40
+ optionsData={
41
+ [
42
+ { value: 'createdDate', label: 'Created Date' },
43
+ { value: 'browserName', label: 'Browser' },
44
+ { value: 'os', label: 'Platform' },
45
+ { value: 'viewport', label: 'Viewport' },
46
+ ]
47
+ }
48
+ />
49
+ <Group spacing={2} position="right" noWrap>
50
+ <ActionIcon
51
+ title="Sort Order"
52
+ data-test="navbar-sort-by-order"
53
+ mb={4}
54
+ onClick={
55
+ () => {
56
+ if (sortOrder === 'asc') {
57
+ setSortOrder('desc');
58
+ return;
59
+ }
60
+ setSortOrder('asc');
61
+ }
62
+ }
63
+ >
64
+ {
65
+ (sortOrder === 'asc')
66
+ ? <IconSortAscending stroke={1} />
67
+ : <IconSortDescending stroke={1} />
68
+ }
69
+ </ActionIcon>
70
+ <ActionIcon
71
+ mb={4}
72
+ onClick={() => toggleOpenedSort()}
73
+ >
74
+ <IconX stroke={1} />
75
+ </ActionIcon>
76
+ </Group>
77
+ </Group>
78
+ )}
79
+ </Transition>
80
+ );
81
+ }
@@ -0,0 +1,197 @@
1
+ /* eslint-disable no-underscore-dangle,no-nested-ternary,prefer-arrow-callback,max-len */
2
+ import * as React from 'react';
3
+ import { ActionIcon, Group, ScrollArea, Stack, Text, Transition, Chip, Burger, Divider, Tooltip } from '@mantine/core';
4
+ import { useDisclosure } from '@mantine/hooks';
5
+ import { IconArrowsSort, IconFilter, IconRefresh, IconX } from '@tabler/icons';
6
+ import { useEffect, useState } from 'react';
7
+ import { useQueryClient } from '@tanstack/react-query';
8
+ import { RelatedChecksSkeleton } from './RelatedChecksSkeleton';
9
+ import { RelatedChecksItems } from './RelatedChecksItems';
10
+ import { RelatedCheckSort } from './RelatedCheckSort';
11
+
12
+ interface Props {
13
+ currentCheck: any
14
+ related: any
15
+ }
16
+
17
+ export function RelatedChecks(
18
+ {
19
+ currentCheck,
20
+ related,
21
+ }: Props,
22
+ ) {
23
+ const [openedSort, sortHandler] = useDisclosure(false);
24
+ const [openedFilter, filterHandler] = useDisclosure(false);
25
+ const [filter, setFilter] = useState(['name']);
26
+ const title = related.opened ? 'Close related checks' : 'Open related checks';
27
+ const queryClient = useQueryClient();
28
+
29
+ const hideRelatedChecks = () => {
30
+ sortHandler.close();
31
+ filterHandler.close();
32
+ related.handler.toggle();
33
+ };
34
+
35
+ const updateFilter = (value: any) => {
36
+ setFilter(() => {
37
+ if (!value.includes('name')) return [...['name'], ...value];
38
+ return value;
39
+ });
40
+ };
41
+
42
+ useEffect(function onFilterChange() {
43
+ const newFilter = filter.map((item) => ({ [item]: encodeURIComponent(currentCheck[item]) }));
44
+ related.setRelatedFilter(() => ({
45
+ $and: newFilter,
46
+ }));
47
+ }, [filter.length]);
48
+
49
+ return (
50
+ <Stack spacing={4} pr={0}>
51
+ <Stack pr="sm" align="end" sx={{ width: '100%' }} spacing={0}>
52
+
53
+ <Group position="apart" align="center" sx={{ width: '100%' }} spacing={0}>
54
+ <Group />
55
+ {
56
+ related.opened && (
57
+ <Group position="left" ml={0}>
58
+ <Text size="sm">Related Checks</Text>
59
+ </Group>
60
+ )
61
+ }
62
+ <Group>
63
+ <Tooltip label={title} withinPortal>
64
+ <Burger
65
+ opened={related.opened}
66
+ styles={{
67
+ // burger
68
+ }}
69
+ size={16}
70
+ onClick={() => {
71
+ hideRelatedChecks();
72
+ }}
73
+ title={title}
74
+ />
75
+ </Tooltip>
76
+ </Group>
77
+
78
+ </Group>
79
+
80
+ {
81
+ related.opened && (
82
+ <Group position="center" spacing="xs" sx={{ width: '100%' }} mb={4}>
83
+ <Tooltip label={`${openedSort ? 'Close ' : ' Open'} sorting`} withinPortal>
84
+ <ActionIcon
85
+ data-test="related-check-icon-open-sort"
86
+ onClick={() => sortHandler.toggle()}
87
+ mb={4}
88
+ >
89
+ <IconArrowsSort stroke={1} />
90
+ </ActionIcon>
91
+ </Tooltip>
92
+
93
+ <Tooltip label={`${openedSort ? 'Close ' : ' Open'} filtering`} withinPortal>
94
+ <ActionIcon
95
+ data-test="related-check-icon-open-filter"
96
+ onClick={() => filterHandler.toggle()}
97
+ mb={4}
98
+ >
99
+ <IconFilter stroke={1} />
100
+ </ActionIcon>
101
+ </Tooltip>
102
+
103
+ <Tooltip label="Refresh items" withinPortal>
104
+ <ActionIcon
105
+ data-test="related-check-icon-refresh"
106
+ onClick={
107
+ async () => {
108
+ await queryClient.invalidateQueries({ queryKey: ['related_checks_infinity_pages', currentCheck._id] });
109
+ }
110
+ }
111
+ mb={4}
112
+ >
113
+ <IconRefresh stroke={1} />
114
+ </ActionIcon>
115
+ </Tooltip>
116
+ </Group>
117
+ )
118
+ }
119
+
120
+ <Divider sx={{ width: '100%' }} size="xs" p={1} />
121
+
122
+ <RelatedCheckSort
123
+ toggleOpenedSort={sortHandler.toggle}
124
+ sortBy={related.sortBy}
125
+ setSortBy={related.setSortBy}
126
+ setSortOrder={related.setSortOrder}
127
+ sortOrder={related.sortOrder}
128
+ openedSort={openedSort}
129
+ />
130
+
131
+ {
132
+ openedFilter && (
133
+ <Group mb="xs" mt="xs" ml={-10} mr={-10} spacing={4}>
134
+ <Group position="apart" align="center" noWrap>
135
+ <Text size="sm" mb={-8}>
136
+ Show checks with same parameters
137
+ </Text>
138
+ <ActionIcon onClick={filterHandler.close}>
139
+ <IconX size={24} stroke={1} />
140
+ </ActionIcon>
141
+ </Group>
142
+
143
+ <Chip.Group spacing={6} value={filter} onChange={updateFilter} multiple>
144
+ <Chip size="xs" value="name" disabled>Name</Chip>
145
+ <Chip size="xs" value="browserName">Browser</Chip>
146
+ <Chip size="xs" value="browserVersion">Browser ver.</Chip>
147
+ <Chip size="xs" value="os">Platform</Chip>
148
+ <Chip size="xs" value="viewport">Viewport</Chip>
149
+ <Chip size="xs" value="branch">Branch</Chip>
150
+ </Chip.Group>
151
+ </Group>
152
+ )
153
+ }
154
+ </Stack>
155
+
156
+ {
157
+ related.opened && (
158
+ <Transition mounted={related.opened} transition="fade" duration={400} timingFunction="ease">
159
+ {
160
+ (styles: any) => (
161
+
162
+ <ScrollArea
163
+ mt={4}
164
+ style={{ height: '75vh' }}
165
+ styles={styles}
166
+ >
167
+ {
168
+ related.relatedChecksQuery.infinityQuery.isLoading
169
+ ? (<RelatedChecksSkeleton num={5} infinityQuery={null} />)
170
+ : (
171
+ related.relatedChecksQuery.infinityQuery.isError
172
+ ? (<Text size="xs" color="red"> Fail to load</Text>)
173
+ : (
174
+ <Stack spacing={4}>
175
+ <RelatedChecksItems
176
+ infinityQuery={related.relatedChecksQuery.infinityQuery}
177
+ relatedActiveCheckId={related.relatedActiveCheckId}
178
+ setRelatedActiveCheckId={related.setRelatedActiveCheckId}
179
+ />
180
+ </Stack>
181
+ )
182
+ )
183
+ }
184
+
185
+ <RelatedChecksSkeleton
186
+ num={3}
187
+ infinityQuery={related.relatedChecksQuery.infinityQuery}
188
+ />
189
+ </ScrollArea>
190
+ )
191
+ }
192
+ </Transition>
193
+ )
194
+ }
195
+ </Stack>
196
+ );
197
+ }