@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,140 @@
1
+ /* eslint-disable indent,react/jsx-indent,prefer-arrow-callback */
2
+ import React, { useState, useRef, useEffect } from 'react';
3
+ import {
4
+ createStyles,
5
+ Table,
6
+ ScrollArea,
7
+ Text,
8
+ } from '@mantine/core';
9
+
10
+ import InfinityScrollSkeleton from './InfinityScrollSkeleton';
11
+ import PagesCountAffix from './PagesCountAffix';
12
+ import ILog from '../../../../shared/interfaces/ILog';
13
+ import { testsCreateStyle } from './testsCreateStyle';
14
+ import Rows from './Rows';
15
+ import Heads from './Heads';
16
+ import { CheckModal } from './Checks/CheckModal';
17
+ import RemoveTestsButton from './RemoveTestsButton';
18
+ import AcceptTestsButton from './AcceptTestsButton';
19
+ import { useParams } from '../../../hooks/useParams';
20
+
21
+ const useStyles = createStyles(testsCreateStyle as any);
22
+
23
+ interface Props {
24
+ infinityQuery: any
25
+ firstPageQuery: any,
26
+ visibleFields: any
27
+ updateToolbar: any
28
+ size?: string
29
+ }
30
+
31
+ export default function TestsTable(
32
+ {
33
+ infinityQuery,
34
+ firstPageQuery,
35
+ visibleFields,
36
+ updateToolbar,
37
+ size = '100%',
38
+ }: Props,
39
+ ) {
40
+ const { query } = useParams();
41
+ const { data } = infinityQuery;
42
+ const flatData = data ? data.pages.flat().map((x: any) => x.results).flat() : [];
43
+
44
+ // eslint-disable-next-line no-unused-vars
45
+ const { classes } = useStyles();
46
+ const [selection, setSelection]: [string[], any] = useState([]);
47
+
48
+ useEffect(function resetSelection() {
49
+ setSelection(() => ([]));
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, [JSON.stringify(query.base_filter), query.app]);
52
+
53
+ const scrollAreaRef = useRef(null);
54
+ // eslint-disable-next-line max-len
55
+ const toggleAllRows = () => setSelection((current: string) => (current.length === flatData.length ? [] : flatData.map((item: ILog) => item.id)));
56
+
57
+ useEffect(function onSelectionUpdate() {
58
+ updateToolbar(
59
+ <RemoveTestsButton
60
+ selection={selection}
61
+ setSelection={setSelection}
62
+ infinityQuery={infinityQuery}
63
+ />,
64
+ 31,
65
+ );
66
+ updateToolbar(
67
+ <AcceptTestsButton
68
+ selection={selection}
69
+ setSelection={setSelection}
70
+ infinityQuery={infinityQuery}
71
+ // firstPageQuery={firstPageQuery}
72
+ />,
73
+ 32,
74
+ );
75
+ }, [selection.length]);
76
+
77
+ return (
78
+ <>
79
+ <ScrollArea.Autosize
80
+ data-test="table-scroll-area"
81
+ ref={scrollAreaRef}
82
+ maxHeight="100vh"
83
+ sx={{ width: size }}
84
+ pb={124}
85
+ styles={{ scrollbar: { marginTop: '46px' } }}
86
+ >
87
+
88
+ <Table
89
+ sx={{ width: '100%' }}
90
+ // mb={100}
91
+ verticalSpacing="sm"
92
+ highlightOnHover
93
+ >
94
+ <thead
95
+ style={{ zIndex: 10 }}
96
+ className={classes.header}
97
+ >
98
+ <Heads
99
+ data={data}
100
+ toggleAllRows={toggleAllRows}
101
+ selection={selection}
102
+ visibleFields={visibleFields}
103
+ />
104
+ </thead>
105
+
106
+ {
107
+ // eslint-disable-next-line no-nested-ternary
108
+ infinityQuery.isLoading
109
+ ? (<InfinityScrollSkeleton infinityQuery={null} visibleFields={visibleFields} />)
110
+ : infinityQuery.isError
111
+ ? (
112
+ <Text color="red">
113
+ Error:
114
+ {infinityQuery.error.message}
115
+ </Text>
116
+ )
117
+ : (
118
+ <tbody className={classes.tableBody}>
119
+ <Rows
120
+ updateToolbar={updateToolbar}
121
+ infinityQuery={infinityQuery}
122
+ selection={selection}
123
+ setSelection={setSelection}
124
+ visibleFields={visibleFields}
125
+ />
126
+ </tbody>
127
+ )
128
+ }
129
+ <InfinityScrollSkeleton infinityQuery={infinityQuery} visibleFields={visibleFields} />
130
+ </Table>
131
+ </ScrollArea.Autosize>
132
+ <PagesCountAffix
133
+ loaded={infinityQuery.data?.pages?.length.toString()}
134
+ total={infinityQuery.data?.pages && infinityQuery.data?.pages[0].totalPages}
135
+ scrollAreaRef={scrollAreaRef}
136
+ />
137
+ <CheckModal firstPageQuery={firstPageQuery} />
138
+ </>
139
+ );
140
+ }
@@ -0,0 +1,39 @@
1
+ import { ActionIcon, Transition, useMantineTheme } from '@mantine/core';
2
+ import { IconArrowsVertical, IconFold } from '@tabler/icons';
3
+ import React from 'react';
4
+ import { useToggle } from '@mantine/hooks';
5
+
6
+ interface Props {
7
+ expandSelected: any
8
+ collapseSelected: any
9
+ mounted: boolean
10
+ }
11
+
12
+ export default function UnfoldActionIcon({ expandSelected, collapseSelected, mounted }: Props) {
13
+ const theme = useMantineTheme();
14
+ const [foldMode, toggleFoldMode] = useToggle([true, false]);
15
+ return (
16
+ <Transition mounted={mounted} transition="fade" duration={400} timingFunction="ease">
17
+ {
18
+ (styles) => (
19
+ <ActionIcon
20
+ color={theme.colorScheme === 'dark' ? 'green.8' : 'green.6'}
21
+ data-test="folding-table-items"
22
+ variant="subtle"
23
+ onClick={() => {
24
+ if (foldMode) {
25
+ expandSelected();
26
+ } else {
27
+ collapseSelected();
28
+ }
29
+ toggleFoldMode();
30
+ }}
31
+ style={styles}
32
+ >
33
+ {foldMode ? <IconArrowsVertical size={24} stroke={1} /> : <IconFold size={24} stroke={1} />}
34
+ </ActionIcon>
35
+ )
36
+ }
37
+ </Transition>
38
+ );
39
+ }
@@ -0,0 +1,80 @@
1
+ export const tableColumns: { [key: string]: any } = {
2
+ _id: {
3
+ label: 'Id',
4
+ headStyle: { width: '15%' },
5
+ cellStyle: { width: '15%' },
6
+ type: 'IdFilter',
7
+ },
8
+ name: {
9
+ label: 'Name',
10
+ headStyle: { width: '35%' },
11
+ cellStyle: { width: '35%' },
12
+ type: 'StringFilter',
13
+ },
14
+ status: {
15
+ label: 'Status',
16
+ headStyle: { width: '10%' },
17
+ cellStyle: { width: '10%' },
18
+ type: 'StatusFilter',
19
+ },
20
+ creatorUsername: {
21
+ label: 'Created',
22
+ headStyle: { width: '10%' },
23
+ cellStyle: { width: '10%' },
24
+ type: 'StringFilter',
25
+ },
26
+ markedAs: {
27
+ label: 'Accepted',
28
+ headStyle: { width: '7%' },
29
+ cellStyle: { width: '7%' },
30
+ type: 'AcceptedFilter',
31
+ },
32
+ startDate: {
33
+ label: 'Date',
34
+ headStyle: { width: '15%' },
35
+ cellStyle: { width: '15%' },
36
+ type: 'DateFilter',
37
+ },
38
+ browserName: {
39
+ label: 'Browser',
40
+ headStyle: { width: '10%' },
41
+ cellStyle: { width: '10%' },
42
+ type: 'BrowserNameFilter',
43
+ },
44
+ browserVersion: {
45
+ label: 'Browser Ver.',
46
+ headStyle: { width: '10%' },
47
+ cellStyle: { width: '10%' },
48
+ type: 'StringFilter',
49
+ },
50
+ os: {
51
+ label: 'Platform',
52
+ headStyle: { width: '10%' },
53
+ cellStyle: { width: '10%' },
54
+ type: 'OsFilter',
55
+ },
56
+ run: {
57
+ label: 'Run',
58
+ headStyle: { width: '15%' },
59
+ cellStyle: { width: '15%' },
60
+ type: 'IdFilter',
61
+ },
62
+ suite: {
63
+ label: 'Suite',
64
+ headStyle: { width: '15%' },
65
+ cellStyle: { width: '15%' },
66
+ type: 'IdFilter',
67
+ },
68
+ branch: {
69
+ label: 'Branch',
70
+ headStyle: { width: '10%' },
71
+ cellStyle: { width: '10%' },
72
+ type: 'StringFilter',
73
+ },
74
+ viewport: {
75
+ label: 'Viewport',
76
+ headStyle: { width: '10%' },
77
+ cellStyle: { width: '10%' },
78
+ type: 'StringFilter',
79
+ },
80
+ };
@@ -0,0 +1,35 @@
1
+ export const testsCreateStyle = (theme: any) => ({
2
+ rowSelected: {
3
+ backgroundColor:
4
+ theme.colorScheme === 'dark'
5
+ ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)
6
+ : theme.colors[theme.primaryColor][0],
7
+ },
8
+ header: {
9
+ position: 'sticky',
10
+ top: 0,
11
+ backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,
12
+ transition: 'box-shadow 150ms ease',
13
+
14
+ '&::after': {
15
+ content: '""',
16
+ position: 'absolute',
17
+ left: 0,
18
+ right: 0,
19
+ bottom: 0,
20
+ borderBottom: `1px solid ${
21
+ theme.colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[2]
22
+ }`,
23
+ },
24
+ },
25
+ scrolled: {
26
+ boxShadow: theme.shadows.sm,
27
+ },
28
+ tableBody: {
29
+ // '&::before': {
30
+ // content: '""',
31
+ // display: 'block',
32
+ // height: '42px',
33
+ // },
34
+ },
35
+ });
@@ -0,0 +1,157 @@
1
+ /* eslint-disable prefer-arrow-callback */
2
+ import * as React from 'react';
3
+ import {
4
+ Group,
5
+ useMantineTheme,
6
+ ActionIcon,
7
+ } from '@mantine/core';
8
+ import { useSearchParams } from 'react-router-dom';
9
+ import { useLocalStorage } from '@mantine/hooks';
10
+ import { useEffect, useState } from 'react';
11
+ import { IconAdjustments, IconFilter } from '@tabler/icons';
12
+ import RefreshActionIcon from './Table/RefreshActionIcon';
13
+ import useInfinityScroll from '../../../shared/hooks/useInfinityScroll';
14
+ import TestsTable from './Table/TestsTable';
15
+ import Settings from './Table/Settings';
16
+ import Filter from './Table/Filter';
17
+ import { useNavProgressFetchEffect } from '../../../shared/hooks';
18
+ import { useParams } from '../../hooks/useParams';
19
+
20
+ interface Props {
21
+ updateToolbar: any
22
+ }
23
+
24
+ export default function Tests({ updateToolbar }: Props) {
25
+ const { query } = useParams();
26
+
27
+ const theme = useMantineTheme();
28
+ // useIndexSubpageEffect('By Runs');
29
+
30
+ const [searchParams, setSearchParams] = useSearchParams();
31
+ const [sortOpen, setSortOpen] = useState(false);
32
+ const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);
33
+ const baseFilter = query.base_filter ? query.base_filter : {};
34
+ if (query.app) baseFilter.app = { $oid: query?.app || '' };
35
+
36
+ const { firstPageQuery, infinityQuery, newestItemsQuery } = useInfinityScroll({
37
+ baseFilterObj: baseFilter,
38
+ filterObj: { ...query.filter, ...query.quick_filter },
39
+ resourceName: 'tests',
40
+ newestItemsFilterKey: 'startDate',
41
+ sortBy: query.sortBy || '',
42
+ });
43
+ useNavProgressFetchEffect(infinityQuery.isFetching);
44
+
45
+ const [visibleFields, setVisibleFields] = useLocalStorage(
46
+ {
47
+ key: 'visibleFields',
48
+ defaultValue: [
49
+ '_id',
50
+ 'name',
51
+ 'status',
52
+ 'creatorUsername',
53
+ 'markedAs',
54
+ 'startDate',
55
+ 'browserName',
56
+ 'os',
57
+ 'viewport',
58
+ ],
59
+ },
60
+ );
61
+
62
+ useEffect(
63
+ function addToolbarSortAndSettingsIcons() {
64
+ updateToolbar(
65
+ <ActionIcon
66
+ title="Table settings, sorting, and columns visibility"
67
+ color={theme.colorScheme === 'dark' ? 'green.8' : 'green.6'}
68
+ data-test="table-sorting"
69
+ variant="subtle"
70
+ onClick={() => {
71
+ setIsFilterDrawerOpen(false);
72
+ setSortOpen((prev) => !prev);
73
+ }}
74
+ >
75
+ <IconAdjustments stroke={1} size={24} />
76
+ </ActionIcon>,
77
+ 48,
78
+ );
79
+
80
+ updateToolbar(
81
+ <ActionIcon
82
+ title="Filter the Table Data"
83
+ color={theme.colorScheme === 'dark' ? 'green.8' : 'green.6'}
84
+ data-test="table-filtering"
85
+ variant="subtle"
86
+ onClick={() => {
87
+ setSortOpen(false);
88
+ setIsFilterDrawerOpen((prev) => !prev);
89
+ }}
90
+ >
91
+ <IconFilter size={24} stroke={1} />
92
+ </ActionIcon>,
93
+ 47,
94
+ );
95
+ },
96
+ [],
97
+ );
98
+
99
+ useEffect(
100
+ function updateRefreshIcon() {
101
+ updateToolbar(
102
+ <RefreshActionIcon
103
+ key="reload"
104
+ newestItemsQuery={newestItemsQuery}
105
+ firstPageQuery={firstPageQuery}
106
+ infinityQuery={infinityQuery}
107
+ />,
108
+ 52,
109
+ );
110
+ },
111
+ [
112
+ newestItemsQuery?.data?.results.length,
113
+ newestItemsQuery.status,
114
+ theme.colorScheme,
115
+ ],
116
+ );
117
+
118
+ useEffect(
119
+ function refetchData() {
120
+ firstPageQuery.refetch();
121
+ }, [
122
+ query.base_filter,
123
+ query.quick_filter,
124
+ query.filter,
125
+ query.app,
126
+ query.sortBy,
127
+ ],
128
+ );
129
+
130
+ return (
131
+ <Group position="apart" align="start" noWrap>
132
+ <TestsTable
133
+ updateToolbar={updateToolbar}
134
+ firstPageQuery={firstPageQuery}
135
+ infinityQuery={infinityQuery}
136
+ visibleFields={visibleFields}
137
+ size={(sortOpen || isFilterDrawerOpen) ? '80%' : '100%'}
138
+ />
139
+
140
+ <Settings
141
+ open={sortOpen}
142
+ setSortOpen={setSortOpen}
143
+ visibleFields={visibleFields}
144
+ setVisibleFields={setVisibleFields}
145
+ searchParams={searchParams}
146
+ setSearchParams={setSearchParams}
147
+ />
148
+
149
+ <Filter
150
+ open={isFilterDrawerOpen}
151
+ setOpen={setIsFilterDrawerOpen}
152
+ searchParams={searchParams}
153
+ setSearchParams={setSearchParams}
154
+ />
155
+ </Group>
156
+ );
157
+ }
@@ -0,0 +1,14 @@
1
+ /* eslint-disable indent,react/jsx-indent */
2
+ // import { resetNavigationProgress, stopNavigationProgress } from '@mantine/nprogress';
3
+ // import { useEffect } from 'react';
4
+ // import * as React from 'react';
5
+ //
6
+ // export function useIndexSubpageEffect(title: string) {
7
+ // useEffect(() => {
8
+ // return () => {
9
+ // // clearToolbar();
10
+ // stopNavigationProgress();
11
+ // resetNavigationProgress();
12
+ // };
13
+ // }, [title]);
14
+ // }
@@ -0,0 +1,66 @@
1
+ /* eslint-disable prefer-arrow-callback */
2
+ import { useEffect, useState } from 'react';
3
+ import { useParams } from './useParams';
4
+
5
+ interface Props {
6
+ groupByValue: string
7
+ classes: any,
8
+ }
9
+
10
+ export function useNavbarActiveItems({ groupByValue, classes }: Props) {
11
+ const { query, setQuery } = useParams();
12
+ const [activeItems, setActiveItems] = useState<string[]>([]);
13
+
14
+ const activeItemsHandler = {
15
+ get: () => activeItems,
16
+ addOrRemove: (item: string) => {
17
+ setActiveItems(
18
+ (prevItems: any[]) => {
19
+ const newItems = [...prevItems];
20
+ if (newItems.includes(item)) {
21
+ return newItems.filter((x) => x !== item);
22
+ }
23
+ return newItems.concat(item);
24
+ },
25
+ );
26
+ },
27
+ clear: () => {
28
+ setActiveItems(() => []);
29
+ },
30
+ set: (items: any) => {
31
+ setActiveItems(() => items);
32
+ },
33
+ navbarItemClass: () => classes.navbarItem,
34
+ activeNavbarItemClass: () => classes.activeNavbarItem,
35
+ };
36
+
37
+ const baseFilterMap = (
38
+ {
39
+ suites: 'suite',
40
+ runs: 'run',
41
+ 'test-distinct/browserName': 'browserName',
42
+ 'test-distinct/os': 'os',
43
+ 'test-distinct/status': 'status',
44
+ 'test-distinct/markedAs': 'markedAs',
45
+ }[groupByValue] || groupByValue
46
+ );
47
+
48
+ useEffect(function setActiveItemsFromQueryFirstTime() {
49
+ if (
50
+ (query?.base_filter && query?.base_filter[baseFilterMap]?.$in?.length > 0)
51
+ && (activeItemsHandler.get().length < 1)
52
+ ) {
53
+ activeItemsHandler.set(query?.base_filter[baseFilterMap]?.$in);
54
+ }
55
+ }, []);
56
+
57
+ useEffect(function onActiveItemsChange() {
58
+ if (activeItemsHandler.get().length > 0) {
59
+ setQuery({ base_filter: { [baseFilterMap]: { $in: activeItemsHandler.get() } } });
60
+ } else {
61
+ setQuery({ base_filter: null });
62
+ }
63
+ }, [JSON.stringify(activeItemsHandler.get())]);
64
+
65
+ return activeItemsHandler;
66
+ }
@@ -0,0 +1,25 @@
1
+ import { JsonParam, StringParam, useQueryParams } from 'use-query-params';
2
+
3
+ export function useParams() {
4
+ const queryConfig = {
5
+ groupBy: StringParam,
6
+ sortBy: StringParam,
7
+ sortByNavbar: StringParam,
8
+ app: StringParam,
9
+ filter: JsonParam,
10
+ base_filter: JsonParam,
11
+ checkId: StringParam,
12
+ quick_filter: JsonParam,
13
+ modalIsOpen: StringParam,
14
+ };
15
+ const [query, setQuery] = useQueryParams(queryConfig);
16
+ const updateQueryJsonParam = (section: string, key: string, value: string) => {
17
+ const current = query[section as keyof typeof query];
18
+ const newParam = {
19
+ ...current,
20
+ [key]: value,
21
+ };
22
+ setQuery({ [section]: (newParam) });
23
+ };
24
+ return { query, setQuery, updateQueryJsonParam, queryConfig };
25
+ }
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en" style="height: 100%">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport"
6
+ content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
8
+ <link rel="stylesheet" href="../asserts/css/styles.css">
9
+ <link rel="icon" href="/asserts/images/favicon.svg">
10
+ <title>Syngrisi</title>
11
+ </head>
12
+ <div></div>
13
+ <body style="overflow-y: hidden">
14
+ <div id="root" style="position: relative; height: 100%"></div>
15
+ <script type="module" src="./main.tsx"></script>
16
+ </body>
17
+ </html>
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import * as ReactDOM from 'react-dom/client';
3
+ import { BrowserRouter } from 'react-router-dom';
4
+ import { QueryParamProvider } from 'use-query-params';
5
+ import { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';
6
+ import { parse, stringify } from 'query-string';
7
+ import { ErrorBoundary } from 'react-error-boundary';
8
+ import { ErrorFallback } from '../shared/components/errors/ErrorFallback';
9
+
10
+ import App from './App';
11
+
12
+ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
13
+ <React.StrictMode>
14
+ <ErrorBoundary
15
+ FallbackComponent={ErrorFallback}
16
+ onReset={() => {
17
+ // reset the state of your app so the error doesn't happen again
18
+ }}
19
+ >
20
+ <BrowserRouter>
21
+ <QueryParamProvider
22
+ adapter={ReactRouter6Adapter}
23
+ options={{
24
+ searchStringToObject: parse,
25
+ objectToSearchString: stringify,
26
+ }}
27
+ >
28
+ <App />
29
+ </QueryParamProvider>
30
+ </BrowserRouter>
31
+ </ErrorBoundary>
32
+ </React.StrictMode>,
33
+ );