plum-e2e 2.6.9 → 2.7.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.
- package/CLAUDE.md +17 -2
- package/LICENSE +21 -677
- package/README.md +1 -1
- package/backend/Dockerfile +1 -13
- package/backend/app.js +4 -14
- package/backend/config/scripts/create-step.mjs +1 -13
- package/backend/config/scripts/create-test.mjs +1 -13
- package/backend/config/scripts/generate-report.js +5 -15
- package/backend/config/scripts/run-tests.js +5 -16
- package/backend/constants/defaults.js +8 -0
- package/backend/constants/env.js +16 -0
- package/backend/constants/jobStatus.js +21 -0
- package/backend/constants/socketEvents.js +40 -0
- package/backend/constants/triggers.js +6 -14
- package/backend/entrypoint.sh +1 -13
- package/backend/lib/authHeader.js +16 -0
- package/backend/lib/globalRegistry.js +1 -13
- package/backend/lib/nodeRegister.js +1 -13
- package/backend/lib/reportFilename.js +1 -13
- package/backend/lib/retryRunner.js +1 -13
- package/backend/lib/runnerProcess.js +5 -16
- package/backend/lib/screenshotPoller.js +1 -13
- package/backend/lib/serverBootstrap.js +189 -0
- package/backend/lib/serverConfig.js +1 -13
- package/backend/lib/testChunker.js +1 -13
- package/backend/lib/testEnv.js +1 -13
- package/backend/mcp/server.js +5 -15
- package/backend/middleware/auth.js +4 -14
- package/backend/middleware/jwtAuth.js +5 -16
- package/backend/middleware/requireAdmin.js +1 -13
- package/backend/package.json +3 -3
- package/backend/playwright.config.js +1 -13
- package/backend/routes/active-runs.routes.js +18 -0
- package/backend/routes/auth.routes.js +1 -13
- package/backend/routes/backup.routes.js +10 -21
- package/backend/routes/cron.routes.js +1 -13
- package/backend/routes/node.routes.js +11 -148
- package/backend/routes/reports.routes.js +1 -13
- package/backend/routes/runners.routes.js +11 -21
- package/backend/routes/settings.routes.js +6 -17
- package/backend/routes/test-cases.routes.js +1 -13
- package/backend/routes/test-runs.routes.js +1 -13
- package/backend/routes/test-suites.routes.js +1 -13
- package/backend/routes/tests.routes.js +1 -13
- package/backend/routes/trigger.routes.js +23 -165
- package/backend/routes/users.routes.js +1 -13
- package/backend/scripts/manage-runners.mjs +1 -13
- package/backend/server.js +34 -151
- package/backend/services/activeRunsService.js +55 -0
- package/backend/services/backupCronService.js +1 -13
- package/backend/services/backupService.js +7 -17
- package/backend/services/cronService.js +57 -39
- package/backend/services/envService.js +1 -13
- package/backend/services/nodeExecutionService.js +140 -0
- package/backend/services/notificationService.js +7 -17
- package/backend/services/prisma.js +1 -13
- package/backend/services/reportService.js +21 -17
- package/backend/services/runnerService.js +46 -27
- package/backend/services/settingsService.js +19 -19
- package/backend/services/testCaseService.js +1 -13
- package/backend/services/testRunService.js +1 -13
- package/backend/services/testService.js +1 -13
- package/backend/services/testSuiteService.js +1 -13
- package/backend/services/triggerService.js +246 -0
- package/backend/services/userService.js +1 -13
- package/backend/websockets/socketHandler.js +99 -48
- package/bin/plum.js +1 -13
- package/bin/postinstall.js +1 -13
- package/bin/scaffold-tests.js +1 -13
- package/docker-compose.node.yml +1 -13
- package/docker-compose.yml +1 -13
- package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +3 -3
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page._h2o67kg.css +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +1 -23
- package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -23
- package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +2 -24
- package/frontend/.svelte-kit/adapter-node/chunks/Modal.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +1 -23
- package/frontend/.svelte-kit/adapter-node/chunks/attributes.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/auth.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/auth2.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/client.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/common.js +9 -29
- package/frontend/.svelte-kit/adapter-node/chunks/constants.js +4 -23
- package/frontend/.svelte-kit/adapter-node/chunks/escaping.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/exports.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/format.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/index-server.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/index.js +4 -26
- package/frontend/.svelte-kit/adapter-node/chunks/index2.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -23
- package/frontend/.svelte-kit/adapter-node/chunks/reports.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/reports2.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/repository.js +10 -34
- package/frontend/.svelte-kit/adapter-node/chunks/runner.js +2 -25
- package/frontend/.svelte-kit/adapter-node/chunks/stores.js +0 -22
- package/frontend/.svelte-kit/adapter-node/chunks/theme.js +0 -22
- package/frontend/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +0 -22
- package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.js +0 -22
- package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +0 -22
- package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +114 -103
- package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +2 -24
- package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/adapter-node/index.js +0 -22
- package/frontend/.svelte-kit/adapter-node/internal.js +0 -22
- package/frontend/.svelte-kit/adapter-node/manifest-full.js +1 -23
- package/frontend/.svelte-kit/adapter-node/manifest.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/0.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/10.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/11.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/12.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/2.js +2 -24
- package/frontend/.svelte-kit/adapter-node/nodes/3.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/4.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/5.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/6.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/7.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/8.js +1 -23
- package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -23
- package/frontend/.svelte-kit/ambient.d.ts +2 -22
- package/frontend/.svelte-kit/generated/client/app.js +0 -22
- package/frontend/.svelte-kit/generated/client/matchers.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/0.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/1.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/10.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/11.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/12.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/2.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/3.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/4.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/5.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/6.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/7.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/8.js +0 -22
- package/frontend/.svelte-kit/generated/client/nodes/9.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/app.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/matchers.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/1.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/10.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/11.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/12.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/2.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/7.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/8.js +0 -22
- package/frontend/.svelte-kit/generated/client-optimized/nodes/9.js +0 -22
- package/frontend/.svelte-kit/generated/root.js +0 -22
- package/frontend/.svelte-kit/generated/root.svelte +0 -22
- package/frontend/.svelte-kit/generated/server/internal.js +1 -23
- package/frontend/.svelte-kit/non-ambient.d.ts +0 -22
- package/frontend/.svelte-kit/output/client/.vite/manifest.json +225 -224
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/11.BWAH0Beh.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.DvMkmYA-.css +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/7.CBHi6pzT.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.BwgOqeMo.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/9._h2o67kg.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page._h2o67kg.css +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2zMvi6fR.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAACMRH5.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAMUGSh7.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKuh57WU.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bfc47y5P.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DYlaQsvN.js → BmZ9upwL.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1Vid6wz.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8OURRSs.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CGeZlCaI.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CKDtmZUQ.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{BjUpWNbl.js → CMEtqUfQ.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CNdcuGR0.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUC98kMZ.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CgnwuKKO.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{B98sHkeB.js → Co3xKhEp.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CuqnZUex.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DCgHuuvs.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DHM6H-es.js +2 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DMyTUV-Y.js +3 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{D2gYTmAA.js → DSLBMEpr.js} +1 -23
- package/frontend/{build/client/_app/immutable/chunks/DDblTLLE.js → .svelte-kit/output/client/_app/immutable/chunks/DbgD7JLa.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dlnxgs49.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/TOCyHP97.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/nURnIknV.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/t-La0hgu.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/w0D4Uzlq.js +0 -22
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -24
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.BxeX1Uxs.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.ChjDHxSJ.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.DBSWa36f.js +1 -0
- package/frontend/{build/client/_app/immutable/nodes/10.Bn4Ma-MU.js → .svelte-kit/output/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -23
- package/frontend/{build/client/_app/immutable/nodes/11.BacEu7sW.js → .svelte-kit/output/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.BWQdeRdX.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.BnHalSCi.js +1 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{4.CnaMiirx.js → 4.D-YT_JJe.js} +1 -23
- package/frontend/{build/client/_app/immutable/nodes/5.B6m-zTVe.js → .svelte-kit/output/client/_app/immutable/nodes/5.BiFBiWcW.js} +1 -23
- package/frontend/{build/client/_app/immutable/nodes/6.BPDag1zv.js → .svelte-kit/output/client/_app/immutable/nodes/6.BNS-W0R_.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{7.D7LwxSvT.js → 7.C-pKvVZy.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -23
- package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
- package/frontend/.svelte-kit/output/server/.vite/manifest.json +3 -3
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page._h2o67kg.css +0 -22
- package/frontend/.svelte-kit/output/server/chunks/BackLink.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/Badge.js +1 -23
- package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -23
- package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +2 -24
- package/frontend/.svelte-kit/output/server/chunks/Modal.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/Toast.js +1 -23
- package/frontend/.svelte-kit/output/server/chunks/attributes.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/auth.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/auth2.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/client.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/common.js +9 -29
- package/frontend/.svelte-kit/output/server/chunks/constants.js +4 -23
- package/frontend/.svelte-kit/output/server/chunks/escaping.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/exports.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/format.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/index-server.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/index.js +4 -26
- package/frontend/.svelte-kit/output/server/chunks/index2.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -23
- package/frontend/.svelte-kit/output/server/chunks/reports.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/reports2.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/repository.js +10 -34
- package/frontend/.svelte-kit/output/server/chunks/runner.js +2 -25
- package/frontend/.svelte-kit/output/server/chunks/stores.js +0 -22
- package/frontend/.svelte-kit/output/server/chunks/theme.js +0 -22
- package/frontend/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +0 -22
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.js +0 -22
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +0 -22
- package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +114 -103
- package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +2 -24
- package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +1 -23
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -25
- package/frontend/.svelte-kit/output/server/index.js +0 -22
- package/frontend/.svelte-kit/output/server/internal.js +0 -22
- package/frontend/.svelte-kit/output/server/manifest-full.js +1 -23
- package/frontend/.svelte-kit/output/server/manifest.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/0.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/1.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/10.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/11.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/12.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/2.js +2 -24
- package/frontend/.svelte-kit/output/server/nodes/3.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/4.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/5.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/6.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/7.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/8.js +1 -23
- package/frontend/.svelte-kit/output/server/nodes/9.js +1 -23
- package/frontend/Dockerfile +1 -13
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +0 -22
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +0 -22
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css +0 -22
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -22
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css +1 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -22
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +0 -22
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +0 -22
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +0 -22
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css +0 -22
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css +0 -22
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css +0 -22
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css +0 -22
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js +1 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js +1 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DYlaQsvN.js → BmZ9upwL.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js +1 -0
- package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{BjUpWNbl.js → CMEtqUfQ.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js +1 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{B98sHkeB.js → Co3xKhEp.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.br +1 -21
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js +2 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js +3 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{D2gYTmAA.js → DSLBMEpr.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DDblTLLE.js → build/client/_app/immutable/chunks/DbgD7JLa.js} +1 -23
- package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js +1 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js +0 -22
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -24
- package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js +1 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.br +2 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js +1 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/10.Bn4Ma-MU.js → build/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/11.BacEu7sW.js → build/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js +1 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js +1 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{4.CnaMiirx.js → 4.D-YT_JJe.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/5.B6m-zTVe.js → build/client/_app/immutable/nodes/5.BiFBiWcW.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/6.BPDag1zv.js → build/client/_app/immutable/nodes/6.BNS-W0R_.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{7.D7LwxSvT.js → 7.C-pKvVZy.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -23
- package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.gz +0 -0
- package/frontend/build/client/_app/version.json +1 -1
- package/frontend/build/client/_app/version.json.br +0 -0
- package/frontend/build/client/_app/version.json.gz +0 -0
- package/frontend/build/env.js +0 -22
- package/frontend/build/handler.js +0 -22
- package/frontend/build/index.js +0 -22
- package/frontend/build/server/chunks/0-Cn_2hzqk.js +17 -0
- package/frontend/build/server/chunks/0-Cn_2hzqk.js.map +1 -0
- package/frontend/build/server/chunks/1-BrRGJFSB.js +9 -0
- package/frontend/build/server/chunks/1-BrRGJFSB.js.map +1 -0
- package/frontend/build/server/chunks/10-l6_ikL_D.js +9 -0
- package/frontend/build/server/chunks/10-l6_ikL_D.js.map +1 -0
- package/frontend/build/server/chunks/11-BLPbHJqB.js +9 -0
- package/frontend/build/server/chunks/11-BLPbHJqB.js.map +1 -0
- package/frontend/build/server/chunks/12-S1ujUrHy.js +9 -0
- package/frontend/build/server/chunks/12-S1ujUrHy.js.map +1 -0
- package/frontend/build/server/chunks/2-Cte30Dgy.js +9 -0
- package/frontend/build/server/chunks/2-Cte30Dgy.js.map +1 -0
- package/frontend/build/server/chunks/3-BHkXVoNI.js +9 -0
- package/frontend/build/server/chunks/3-BHkXVoNI.js.map +1 -0
- package/frontend/build/server/chunks/4-Bo04DC5Z.js +9 -0
- package/frontend/build/server/chunks/4-Bo04DC5Z.js.map +1 -0
- package/frontend/build/server/chunks/5-F1ZsXMt2.js +9 -0
- package/frontend/build/server/chunks/5-F1ZsXMt2.js.map +1 -0
- package/frontend/build/server/chunks/6-FlZLnYJ6.js +9 -0
- package/frontend/build/server/chunks/6-FlZLnYJ6.js.map +1 -0
- package/frontend/build/server/chunks/7-DiQJZEF_.js +9 -0
- package/frontend/build/server/chunks/{7-DekQfQHu.js.map → 7-DiQJZEF_.js.map} +1 -21
- package/frontend/build/server/chunks/8-DXReUGxi.js +9 -0
- package/frontend/build/server/chunks/8-DXReUGxi.js.map +1 -0
- package/frontend/build/server/chunks/9-Cy_mGmt4.js +9 -0
- package/frontend/build/server/chunks/9-Cy_mGmt4.js.map +1 -0
- package/frontend/build/server/chunks/BackLink-BJ8NaemM.js +13 -0
- package/frontend/build/server/chunks/{BackLink-KxZNqsaq.js.map → BackLink-BJ8NaemM.js.map} +1 -21
- package/frontend/build/server/chunks/Badge-44ZTDx0V.js +13 -0
- package/frontend/build/server/chunks/{Badge-B5V-z6pI.js.map → Badge-44ZTDx0V.js.map} +1 -21
- package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js → ConfirmModal-C0EAXcq_.js} +4 -26
- package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js.map → ConfirmModal-C0EAXcq_.js.map} +1 -21
- package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js → EmptyState-BA_eXaeR.js} +3 -25
- package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js.map → EmptyState-BA_eXaeR.js.map} +1 -21
- package/frontend/build/server/chunks/{Modal-DG-6c5si.js → Modal-DChG187n.js} +2 -24
- package/frontend/build/server/chunks/{Modal-DG-6c5si.js.map → Modal-DChG187n.js.map} +1 -21
- package/frontend/build/server/chunks/{Toast-CIG4edEp.js → Toast-v-q4ZnYq.js} +2 -24
- package/frontend/build/server/chunks/{Toast-CIG4edEp.js.map → Toast-v-q4ZnYq.js.map} +1 -21
- package/frontend/build/server/chunks/_layout.svelte-CHVI3Prt.js +24 -0
- package/frontend/build/server/chunks/{_layout.svelte-BjPrZpoG.js.map → _layout.svelte-CHVI3Prt.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js → _page.svelte-1as75nPc.js} +14 -35
- package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js.map → _page.svelte-1as75nPc.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js → _page.svelte-1jo8MapI.js} +11 -33
- package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js.map → _page.svelte-1jo8MapI.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js → _page.svelte-BuFusRK1.js} +12 -34
- package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js.map → _page.svelte-BuFusRK1.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js → _page.svelte-CAVyp70V.js} +14 -35
- package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js.map → _page.svelte-CAVyp70V.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js → _page.svelte-CB8-QBNg.js} +11 -33
- package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js.map → _page.svelte-CB8-QBNg.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js → _page.svelte-CWWeZuid.js} +11 -33
- package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js.map → _page.svelte-CWWeZuid.js.map} +1 -21
- package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js +219 -0
- package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js.map +1 -0
- package/frontend/build/server/chunks/_page.svelte-D3E6Eojd.js +27 -0
- package/frontend/build/server/chunks/{_page.svelte-B9rjnZWE.js.map → _page.svelte-D3E6Eojd.js.map} +1 -21
- package/frontend/build/server/chunks/_page.svelte-Kg69DDaM.js +27 -0
- package/frontend/build/server/chunks/{_page.svelte-D1aYn1PL.js.map → _page.svelte-Kg69DDaM.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js → _page.svelte-L9fuiN_q.js} +10 -32
- package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js.map → _page.svelte-L9fuiN_q.js.map} +1 -21
- package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js → _page.svelte-wKyUmA2e.js} +12 -34
- package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js.map → _page.svelte-wKyUmA2e.js.map} +1 -21
- package/frontend/build/server/chunks/attributes-BeaNKpgU.js +0 -22
- package/frontend/build/server/chunks/attributes-BeaNKpgU.js.map +0 -20
- package/frontend/build/server/chunks/{auth-rlH-cIzn.js → auth-Chw-wBpI.js} +2 -24
- package/frontend/build/server/chunks/{auth-rlH-cIzn.js.map → auth-Chw-wBpI.js.map} +1 -21
- package/frontend/build/server/chunks/auth2-C02yYDpz.js +0 -22
- package/frontend/build/server/chunks/auth2-C02yYDpz.js.map +0 -20
- package/frontend/build/server/chunks/client-DEmxR_a-.js +40 -0
- package/frontend/build/server/chunks/{client-DyII78e0.js.map → client-DEmxR_a-.js.map} +1 -21
- package/frontend/build/server/chunks/common-DYYTVHPw.js +21 -0
- package/frontend/build/server/chunks/common-DYYTVHPw.js.map +1 -0
- package/frontend/build/server/chunks/constants-CXTaQaB6.js +22 -0
- package/frontend/build/server/chunks/constants-CXTaQaB6.js.map +1 -0
- package/frontend/build/server/chunks/error.svelte-BD3xNemk.js +28 -0
- package/frontend/build/server/chunks/{error.svelte-BDW3iP1O.js.map → error.svelte-BD3xNemk.js.map} +1 -21
- package/frontend/build/server/chunks/escaping-CqgfEcN3.js +0 -22
- package/frontend/build/server/chunks/escaping-CqgfEcN3.js.map +0 -20
- package/frontend/build/server/chunks/exports-D0QHgeSL.js +0 -22
- package/frontend/build/server/chunks/exports-D0QHgeSL.js.map +0 -20
- package/frontend/build/server/chunks/{format-0SSB1oGG.js → format-CiNRMfHu.js} +2 -24
- package/frontend/build/server/chunks/{format-0SSB1oGG.js.map → format-CiNRMfHu.js.map} +1 -21
- package/frontend/build/server/chunks/index-server-B3M9vyh2.js +14 -0
- package/frontend/build/server/chunks/index-server-B3M9vyh2.js.map +1 -0
- package/frontend/build/server/chunks/{index2-DG8XHU5D.js → index2-5R1tbrep.js} +2 -24
- package/frontend/build/server/chunks/{index2-DG8XHU5D.js.map → index2-5R1tbrep.js.map} +1 -21
- package/frontend/build/server/chunks/reports-D_ApeeNh.js +23 -0
- package/frontend/build/server/chunks/{reports-DnYbvluH.js.map → reports-D_ApeeNh.js.map} +1 -21
- package/frontend/build/server/chunks/{reports2-DR4XlcJg.js → reports2-BtElN_53.js} +2 -24
- package/frontend/build/server/chunks/{reports2-DR4XlcJg.js.map → reports2-BtElN_53.js.map} +1 -21
- package/frontend/build/server/chunks/{repository-D9Derhnk.js → repository-FYYV_vKE.js} +3 -26
- package/frontend/build/server/chunks/repository-FYYV_vKE.js.map +1 -0
- package/frontend/build/server/chunks/runner-DC7hXbnY.js +32 -0
- package/frontend/build/server/chunks/runner-DC7hXbnY.js.map +1 -0
- package/frontend/build/server/chunks/stores-BLenR3c1.js +27 -0
- package/frontend/build/server/chunks/{stores-DlkXV308.js.map → stores-BLenR3c1.js.map} +1 -21
- package/frontend/build/server/chunks/theme-nAx-GvX_.js +10 -0
- package/frontend/build/server/chunks/theme-nAx-GvX_.js.map +1 -0
- package/frontend/build/server/index.js +2 -24
- package/frontend/build/server/index.js.map +1 -21
- package/frontend/build/server/manifest.js +14 -36
- package/frontend/build/server/manifest.js.map +1 -21
- package/frontend/build/shims.js +0 -22
- package/frontend/package.json +1 -0
- package/frontend/src/app.css +1 -13
- package/frontend/src/app.html +1 -13
- package/frontend/src/lib/api/activeRuns.js +18 -0
- package/frontend/src/lib/api/auth.js +1 -13
- package/frontend/src/lib/api/reports.js +1 -13
- package/frontend/src/lib/api/repository.js +1 -13
- package/frontend/src/lib/api/runners.js +26 -21
- package/frontend/src/lib/api/schedules.js +1 -13
- package/frontend/src/lib/api/settings.js +11 -23
- package/frontend/src/lib/api/tests.js +1 -13
- package/frontend/src/lib/api/users.js +1 -13
- package/frontend/src/lib/components/icons/BrowserIcon.svelte +1 -13
- package/frontend/src/lib/components/layout/Nav.svelte +1 -13
- package/frontend/src/lib/components/layout/PageShell.svelte +1 -13
- package/frontend/src/lib/components/layout/RunnerPanel.svelte +146 -105
- package/frontend/src/lib/components/ui/AutomatedBadge.svelte +2 -31
- package/frontend/src/lib/components/ui/BackLink.svelte +1 -30
- package/frontend/src/lib/components/ui/Badge.svelte +1 -13
- package/frontend/src/lib/components/ui/Button.svelte +1 -13
- package/frontend/src/lib/components/ui/CaseIdChip.svelte +1 -30
- package/frontend/src/lib/components/ui/ConfirmModal.svelte +8 -17
- package/frontend/src/lib/components/ui/EmptyState.svelte +26 -15
- package/frontend/src/lib/components/ui/Modal.svelte +1 -13
- package/frontend/src/lib/components/ui/Pagination.svelte +1 -13
- package/frontend/src/lib/components/ui/PriorityBadge.svelte +1 -30
- package/frontend/src/lib/components/ui/ResultChip.svelte +1 -30
- package/frontend/src/lib/components/ui/StatusDot.svelte +1 -30
- package/frontend/src/lib/components/ui/StepKeyword.svelte +1 -30
- package/frontend/src/lib/components/ui/StepStatusIcon.svelte +1 -30
- package/frontend/src/lib/components/ui/TagChip.svelte +1 -30
- package/frontend/src/lib/components/ui/Terminal.svelte +1 -13
- package/frontend/src/lib/components/ui/Toast.svelte +1 -13
- package/frontend/src/lib/constants.js +5 -17
- package/frontend/src/lib/copy/auth.js +29 -0
- package/frontend/src/lib/copy/common.js +39 -0
- package/frontend/src/lib/copy/dashboard.js +28 -0
- package/frontend/src/lib/copy/reports.js +83 -0
- package/frontend/src/lib/copy/repository.js +153 -0
- package/frontend/src/lib/copy/runners.js +59 -0
- package/frontend/src/lib/copy/schedules.js +96 -0
- package/frontend/src/lib/copy/settings.js +295 -0
- package/frontend/src/lib/index.js +1 -13
- package/frontend/src/lib/socketEvents.js +36 -0
- package/frontend/src/lib/stores/auth.js +1 -13
- package/frontend/src/lib/stores/runner.js +10 -18
- package/frontend/src/lib/stores/theme.js +1 -13
- package/frontend/src/lib/styles/global.css +1 -13
- package/frontend/src/lib/styles/reset.css +1 -13
- package/frontend/src/lib/styles/tokens.css +1 -13
- package/frontend/src/lib/utils/format.js +1 -13
- package/frontend/src/routes/+layout.js +1 -13
- package/frontend/src/routes/+layout.svelte +1 -13
- package/frontend/src/routes/+page.svelte +296 -115
- package/frontend/src/routes/login/+page.svelte +22 -23
- package/frontend/src/routes/reports/+page.svelte +37 -38
- package/frontend/src/routes/reports/[id]/+page.svelte +54 -43
- package/frontend/src/routes/reports/live/+page.svelte +57 -42
- package/frontend/src/routes/scheduled-tests/+page.svelte +134 -117
- package/frontend/src/routes/settings/+page.svelte +490 -267
- package/frontend/src/routes/setup/+page.svelte +30 -27
- package/frontend/src/routes/test-repository/+page.svelte +120 -91
- package/frontend/src/routes/test-repository/runs/[id]/+page.svelte +95 -60
- package/frontend/src/routes/test-repository/suites/[id]/+page.svelte +145 -91
- package/frontend/svelte.config.js +1 -13
- package/frontend/vite.config.js +1 -13
- package/package.json +2 -2
- package/resources/mit-license.txt +2 -0
- package/backend/scripts/create-test.js +0 -149
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1sukchk.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW85KPAh.js +0 -24
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/oN0Z3NSF.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js +0 -24
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.br +0 -22
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.gz +0 -0
- package/frontend/build/server/chunks/0-Di4jNU9J.js +0 -39
- package/frontend/build/server/chunks/0-Di4jNU9J.js.map +0 -21
- package/frontend/build/server/chunks/1-DR5YRUTa.js +0 -31
- package/frontend/build/server/chunks/1-DR5YRUTa.js.map +0 -21
- package/frontend/build/server/chunks/10-Bhe409bL.js +0 -31
- package/frontend/build/server/chunks/10-Bhe409bL.js.map +0 -21
- package/frontend/build/server/chunks/11-DqyXW7n1.js +0 -31
- package/frontend/build/server/chunks/11-DqyXW7n1.js.map +0 -21
- package/frontend/build/server/chunks/12-BCpjMUbs.js +0 -31
- package/frontend/build/server/chunks/12-BCpjMUbs.js.map +0 -21
- package/frontend/build/server/chunks/2-D-0buH5i.js +0 -31
- package/frontend/build/server/chunks/2-D-0buH5i.js.map +0 -21
- package/frontend/build/server/chunks/3-y2kzPO2X.js +0 -31
- package/frontend/build/server/chunks/3-y2kzPO2X.js.map +0 -21
- package/frontend/build/server/chunks/4-CFrK8HST.js +0 -31
- package/frontend/build/server/chunks/4-CFrK8HST.js.map +0 -21
- package/frontend/build/server/chunks/5-B0lJu5bT.js +0 -31
- package/frontend/build/server/chunks/5-B0lJu5bT.js.map +0 -21
- package/frontend/build/server/chunks/6-BD4CEJ3Z.js +0 -31
- package/frontend/build/server/chunks/6-BD4CEJ3Z.js.map +0 -21
- package/frontend/build/server/chunks/7-DekQfQHu.js +0 -31
- package/frontend/build/server/chunks/8-BMqmu7WF.js +0 -31
- package/frontend/build/server/chunks/8-BMqmu7WF.js.map +0 -21
- package/frontend/build/server/chunks/9-C5sKo9aY.js +0 -31
- package/frontend/build/server/chunks/9-C5sKo9aY.js.map +0 -21
- package/frontend/build/server/chunks/BackLink-KxZNqsaq.js +0 -35
- package/frontend/build/server/chunks/Badge-B5V-z6pI.js +0 -35
- package/frontend/build/server/chunks/_layout.svelte-BjPrZpoG.js +0 -46
- package/frontend/build/server/chunks/_page.svelte-B9rjnZWE.js +0 -49
- package/frontend/build/server/chunks/_page.svelte-D1aYn1PL.js +0 -49
- package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js +0 -206
- package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js.map +0 -21
- package/frontend/build/server/chunks/client-DyII78e0.js +0 -62
- package/frontend/build/server/chunks/common-Db-bgKYG.js +0 -42
- package/frontend/build/server/chunks/common-Db-bgKYG.js.map +0 -21
- package/frontend/build/server/chunks/constants-cZ2kUwWa.js +0 -41
- package/frontend/build/server/chunks/constants-cZ2kUwWa.js.map +0 -21
- package/frontend/build/server/chunks/error.svelte-BDW3iP1O.js +0 -50
- package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js +0 -36
- package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js.map +0 -21
- package/frontend/build/server/chunks/reports-DnYbvluH.js +0 -45
- package/frontend/build/server/chunks/repository-D9Derhnk.js.map +0 -21
- package/frontend/build/server/chunks/runner-DE5sufZH.js +0 -54
- package/frontend/build/server/chunks/runner-DE5sufZH.js.map +0 -21
- package/frontend/build/server/chunks/stores-DlkXV308.js +0 -49
- package/frontend/build/server/chunks/theme-D_NKm6iI.js +0 -32
- package/frontend/build/server/chunks/theme-D_NKm6iI.js.map +0 -21
- package/resources/gpl-3.0-license.txt +0 -14
|
@@ -1,18 +1,6 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
* This file is part of Plum.
|
|
3
|
-
*
|
|
4
|
-
* Plum is free software: you can redistribute it and/or modify
|
|
5
|
-
* it under the terms of the GNU General Public License as published by
|
|
6
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
7
|
-
* (at your option) any later version.
|
|
8
|
-
*
|
|
9
|
-
* Plum is distributed in the hope that it will be useful,
|
|
10
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
-
* GNU General Public License for more details.
|
|
13
|
-
*
|
|
14
|
-
* You should have received a copy of the GNU General Public License
|
|
15
|
-
* along with Plum. If not, see https://www.gnu.org/licenses/.
|
|
3
|
+
* Licensed under the MIT License. See LICENSE file in the project root for details.
|
|
16
4
|
-->
|
|
17
5
|
|
|
18
6
|
<script>
|
|
@@ -53,11 +41,231 @@
|
|
|
53
41
|
import { builtInEnabled } from '$lib/stores/runner';
|
|
54
42
|
import { auth } from '$lib/stores/auth';
|
|
55
43
|
import { theme } from '$lib/stores/theme';
|
|
56
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
API_BASE,
|
|
46
|
+
BROWSERS,
|
|
47
|
+
TOAST_TIMEOUT_MS,
|
|
48
|
+
MAX_TEST_RETRIES,
|
|
49
|
+
COPY_TIMEOUT_MS
|
|
50
|
+
} from '$lib/constants';
|
|
57
51
|
import Button from '$lib/components/ui/Button.svelte';
|
|
58
52
|
import Toast from '$lib/components/ui/Toast.svelte';
|
|
59
53
|
import ConfirmModal from '$lib/components/ui/ConfirmModal.svelte';
|
|
60
54
|
import Badge from '$lib/components/ui/Badge.svelte';
|
|
55
|
+
import { CANCEL_LABEL, EDIT_LABEL, SAVE_LABEL, EMAIL_LABEL } from '$lib/copy/common';
|
|
56
|
+
import {
|
|
57
|
+
PAGE_TITLE,
|
|
58
|
+
HEADING,
|
|
59
|
+
NAME_LABEL,
|
|
60
|
+
NETWORK_ERROR,
|
|
61
|
+
PROJECT_LABEL,
|
|
62
|
+
RUNNERS_LABEL,
|
|
63
|
+
REPOSITORY_NAV_LABEL,
|
|
64
|
+
REPOSITORY_HEADING,
|
|
65
|
+
INTEGRATIONS_LABEL,
|
|
66
|
+
MCP_NAV_LABEL,
|
|
67
|
+
MCP_HEADING,
|
|
68
|
+
ACCOUNT_LABEL,
|
|
69
|
+
USERS_LABEL,
|
|
70
|
+
BACKUP_LABEL,
|
|
71
|
+
PROJECT_DESC,
|
|
72
|
+
RUNNERS_DESC,
|
|
73
|
+
REPOSITORY_DESC,
|
|
74
|
+
INTEGRATIONS_DESC,
|
|
75
|
+
MCP_DESC,
|
|
76
|
+
ACCOUNT_DESC,
|
|
77
|
+
USERS_DESC,
|
|
78
|
+
BACKUP_DESC,
|
|
79
|
+
RUNNER_FIELDS_REQUIRED_ERROR,
|
|
80
|
+
ADD_RUNNER_FAILED,
|
|
81
|
+
REMOVE_RUNNER_FAILED,
|
|
82
|
+
UPDATE_RUNNER_FAILED,
|
|
83
|
+
cannotReachRunnerError,
|
|
84
|
+
runnerAddedToast,
|
|
85
|
+
runnerRemovedToast,
|
|
86
|
+
runnerStoppedToast,
|
|
87
|
+
runnerStopFailedToast,
|
|
88
|
+
runnerStopFailedGenericToast,
|
|
89
|
+
runnerRestartingToast,
|
|
90
|
+
runnerRestartFailedToast,
|
|
91
|
+
runnerRestartFailedGenericToast,
|
|
92
|
+
runnerUpdatedToast,
|
|
93
|
+
PROJECT_NAME_LABEL,
|
|
94
|
+
PROJECT_NAME_PLACEHOLDER,
|
|
95
|
+
LOGO_URL_LABEL,
|
|
96
|
+
LOGO_URL_HINT,
|
|
97
|
+
LOGO_URL_PLACEHOLDER,
|
|
98
|
+
PREVIEW_LABEL,
|
|
99
|
+
LOGO_PREVIEW_ALT,
|
|
100
|
+
TIMEZONE_LABEL,
|
|
101
|
+
TIMEZONE_HINT,
|
|
102
|
+
RETRY_FAILED_TESTS_LABEL,
|
|
103
|
+
RETRY_FAILED_TESTS_HINT,
|
|
104
|
+
DARK_MODE_LABEL,
|
|
105
|
+
DARK_MODE_DESC,
|
|
106
|
+
PROJECT_SAVED_TOAST,
|
|
107
|
+
PROJECT_SAVE_FAILED,
|
|
108
|
+
saveProjectLabel,
|
|
109
|
+
BUILTIN_RUNNER_TOGGLE_LABEL,
|
|
110
|
+
BUILTIN_RUNNER_TOGGLE_DESC,
|
|
111
|
+
RUNNER_URL_LABEL,
|
|
112
|
+
RUNNER_URL_HINT_PREFIX,
|
|
113
|
+
RUNNER_URL_HINT_SUFFIX,
|
|
114
|
+
RUNNER_URL_PLACEHOLDER,
|
|
115
|
+
TOKEN_LABEL,
|
|
116
|
+
TOKEN_PLACEHOLDER,
|
|
117
|
+
KEEP_TOKEN_PLACEHOLDER,
|
|
118
|
+
BROWSER_LABEL,
|
|
119
|
+
RUNNER_NAME_PLACEHOLDER,
|
|
120
|
+
RUNNER_UNREACHABLE_LABEL,
|
|
121
|
+
RUNNER_PINGING_LABEL,
|
|
122
|
+
REMOVE_LABEL,
|
|
123
|
+
ADD_RUNNER_FORM_TITLE,
|
|
124
|
+
OPEN_ADD_RUNNER_LABEL,
|
|
125
|
+
editRunnerSubmitLabel,
|
|
126
|
+
addRunnerSubmitLabel,
|
|
127
|
+
restartRunnerLabel,
|
|
128
|
+
stopRunnerLabel,
|
|
129
|
+
CASE_PREFIX_LABEL,
|
|
130
|
+
CASE_PREFIX_PLACEHOLDER,
|
|
131
|
+
SUITE_PREFIX_LABEL,
|
|
132
|
+
SUITE_PREFIX_PLACEHOLDER,
|
|
133
|
+
EXAMPLES_LABEL,
|
|
134
|
+
PREFIXES_SAVED_TOAST,
|
|
135
|
+
PREFIXES_SAVE_FAILED,
|
|
136
|
+
MIGRATE_IDS_HEADING,
|
|
137
|
+
MIGRATE_DESC_PREFIX,
|
|
138
|
+
MIGRATE_DESC_STRONG,
|
|
139
|
+
MIGRATE_DESC_SUFFIX,
|
|
140
|
+
NEW_CASE_PREFIX_LABEL,
|
|
141
|
+
NEW_SUITE_PREFIX_LABEL,
|
|
142
|
+
MIGRATION_COMPLETE_TOAST,
|
|
143
|
+
MIGRATION_FAILED_TOAST,
|
|
144
|
+
savePrefixesLabel,
|
|
145
|
+
runMigrationLabel,
|
|
146
|
+
WEBHOOKS_CARD_TITLE,
|
|
147
|
+
DISCORD_WEBHOOK_LABEL,
|
|
148
|
+
DISCORD_WEBHOOK_HINT,
|
|
149
|
+
DISCORD_WEBHOOK_PLACEHOLDER,
|
|
150
|
+
SLACK_WEBHOOK_LABEL,
|
|
151
|
+
SLACK_WEBHOOK_HINT,
|
|
152
|
+
SLACK_WEBHOOK_PLACEHOLDER,
|
|
153
|
+
PUBLIC_URL_LABEL,
|
|
154
|
+
PUBLIC_URL_HINT,
|
|
155
|
+
PUBLIC_URL_PLACEHOLDER,
|
|
156
|
+
INTEGRATIONS_SAVED_TOAST,
|
|
157
|
+
INTEGRATIONS_SAVE_FAILED,
|
|
158
|
+
CI_TRIGGERS_CARD_TITLE,
|
|
159
|
+
CI_DESC_PART1,
|
|
160
|
+
CI_DESC_PART2,
|
|
161
|
+
CI_DESC_PART3,
|
|
162
|
+
MCP_TAB_LINK_LABEL,
|
|
163
|
+
CI_DESC_PART4,
|
|
164
|
+
EXTERNAL_BADGE_LABEL,
|
|
165
|
+
saveIntegrationsLabel,
|
|
166
|
+
copyCiSnippetLabel,
|
|
167
|
+
API_KEY_CARD_TITLE,
|
|
168
|
+
NO_KEY_GENERATED_MESSAGE,
|
|
169
|
+
HIDE_KEY_TITLE,
|
|
170
|
+
SHOW_KEY_TITLE,
|
|
171
|
+
COPY_KEY_TITLE,
|
|
172
|
+
MCP_REGEN_NOTE,
|
|
173
|
+
CONFIG_SNIPPET_CARD_TITLE,
|
|
174
|
+
CONFIG_SNIPPET_DESC_PREFIX,
|
|
175
|
+
CONFIG_SNIPPET_DESC_SUFFIX,
|
|
176
|
+
MCP_KEY_GENERATED_TOAST,
|
|
177
|
+
MCP_KEY_GENERATE_FAILED,
|
|
178
|
+
generateKeyLabel,
|
|
179
|
+
regenerateKeyLabel,
|
|
180
|
+
copyMcpSnippetLabel,
|
|
181
|
+
PROFILE_CARD_TITLE,
|
|
182
|
+
CHANGE_PASSWORD_CARD_TITLE,
|
|
183
|
+
CURRENT_PASSWORD_LABEL,
|
|
184
|
+
NEW_PASSWORD_LABEL,
|
|
185
|
+
CONFIRM_NEW_PASSWORD_LABEL,
|
|
186
|
+
SIGN_OUT_LABEL,
|
|
187
|
+
PROFILE_UPDATED_TOAST,
|
|
188
|
+
PASSWORDS_NO_MATCH_ERROR,
|
|
189
|
+
PASSWORD_TOO_SHORT_ERROR,
|
|
190
|
+
PASSWORD_CHANGED_TOAST,
|
|
191
|
+
saveProfileLabel,
|
|
192
|
+
changePasswordLabel,
|
|
193
|
+
REMOVE_USER_MODAL_TITLE,
|
|
194
|
+
REMOVE_USER_LABEL,
|
|
195
|
+
REMOVE_USER_BODY_PREFIX,
|
|
196
|
+
REMOVE_USER_BODY_SUFFIX,
|
|
197
|
+
ADD_USER_CARD_TITLE,
|
|
198
|
+
USER_NAME_PLACEHOLDER,
|
|
199
|
+
USER_EMAIL_PLACEHOLDER,
|
|
200
|
+
PASSWORD_LABEL,
|
|
201
|
+
ROLE_LABEL,
|
|
202
|
+
USER_ROLE_OPTION,
|
|
203
|
+
ADMIN_ROLE_OPTION,
|
|
204
|
+
REMOVE_USER_ICON_TITLE,
|
|
205
|
+
YOU_CHIP_LABEL,
|
|
206
|
+
USER_FORM_REQUIRED_ERROR,
|
|
207
|
+
addUserLabel,
|
|
208
|
+
userAddedToast,
|
|
209
|
+
userRemovedToast,
|
|
210
|
+
MANUAL_BACKUP_CARD_TITLE,
|
|
211
|
+
EXPORT_BLOCK_TITLE,
|
|
212
|
+
EXPORT_BLOCK_DESC_PREFIX,
|
|
213
|
+
EXPORT_BLOCK_DESC_SUFFIX,
|
|
214
|
+
IMPORT_BLOCK_TITLE,
|
|
215
|
+
IMPORT_BLOCK_DESC,
|
|
216
|
+
CHOOSE_FILE_LABEL,
|
|
217
|
+
BACKUP_DISCLAIMER_PREFIX,
|
|
218
|
+
BACKUP_DISCLAIMER_SUFFIX,
|
|
219
|
+
S3_STORAGE_CARD_TITLE,
|
|
220
|
+
S3_STORAGE_DESC_PREFIX,
|
|
221
|
+
ENDPOINT_URL_LABEL,
|
|
222
|
+
S3_STORAGE_DESC_SUFFIX,
|
|
223
|
+
ENDPOINT_URL_HINT,
|
|
224
|
+
ENDPOINT_URL_PLACEHOLDER,
|
|
225
|
+
REGION_LABEL,
|
|
226
|
+
REGION_HINT_PREFIX,
|
|
227
|
+
REGION_HINT_SUFFIX,
|
|
228
|
+
REGION_PLACEHOLDER,
|
|
229
|
+
BUCKET_LABEL,
|
|
230
|
+
BUCKET_PLACEHOLDER,
|
|
231
|
+
PATH_PREFIX_LABEL,
|
|
232
|
+
PATH_PREFIX_HINT,
|
|
233
|
+
PATH_PREFIX_PLACEHOLDER,
|
|
234
|
+
ACCESS_KEY_LABEL,
|
|
235
|
+
ACCESS_KEY_PLACEHOLDER,
|
|
236
|
+
SECRET_KEY_LABEL,
|
|
237
|
+
TEST_CONNECTION_LABEL,
|
|
238
|
+
SAVE_S3_CONFIG_LABEL,
|
|
239
|
+
S3_CONNECTION_SUCCESS,
|
|
240
|
+
S3_CONNECTION_FAILED,
|
|
241
|
+
BACKUP_CONFIG_SAVED_TOAST,
|
|
242
|
+
BACKUP_CONFIG_SAVE_FAILED,
|
|
243
|
+
SCHEDULED_BACKUP_CARD_TITLE,
|
|
244
|
+
CONFIGURE_S3_FIRST_MESSAGE,
|
|
245
|
+
ENABLE_SCHEDULED_BACKUP_LABEL,
|
|
246
|
+
CRON_EXPRESSION_LABEL,
|
|
247
|
+
CRON_HINT_PREFIX,
|
|
248
|
+
CRON_HINT_SUFFIX,
|
|
249
|
+
CRONTAB_LINK_LABEL,
|
|
250
|
+
CRON_PLACEHOLDER,
|
|
251
|
+
BACKUP_LAST_RUN_PREFIX,
|
|
252
|
+
BACKUP_DOWNLOADED_TOAST,
|
|
253
|
+
EXPORT_FAILED_TOAST,
|
|
254
|
+
IMPORT_SUCCESS_TOAST,
|
|
255
|
+
IMPORT_FAILED_FALLBACK,
|
|
256
|
+
BACKUP_UPLOAD_SUCCESS_TOAST,
|
|
257
|
+
BACKUP_UPLOAD_FAILED_FALLBACK,
|
|
258
|
+
backupFilename,
|
|
259
|
+
exportLabel,
|
|
260
|
+
importLabel,
|
|
261
|
+
secretKeyHint,
|
|
262
|
+
secretKeyPlaceholder,
|
|
263
|
+
testConnectionLabel,
|
|
264
|
+
saveS3ConfigLabel,
|
|
265
|
+
uploadedToLabel,
|
|
266
|
+
uploadS3NowLabel,
|
|
267
|
+
saveScheduleLabel
|
|
268
|
+
} from '$lib/copy/settings';
|
|
61
269
|
|
|
62
270
|
/** @type {'project' | 'runners' | 'repository' | 'integrations' | 'mcp' | 'account' | 'users' | 'backup'} */
|
|
63
271
|
let section =
|
|
@@ -224,7 +432,7 @@
|
|
|
224
432
|
} catch {
|
|
225
433
|
pingResults = {
|
|
226
434
|
...pingResults,
|
|
227
|
-
[r.id]: { ok: false, error:
|
|
435
|
+
[r.id]: { ok: false, error: NETWORK_ERROR, loading: false }
|
|
228
436
|
};
|
|
229
437
|
}
|
|
230
438
|
})
|
|
@@ -247,7 +455,7 @@
|
|
|
247
455
|
|
|
248
456
|
async function handleAddRunner() {
|
|
249
457
|
if (!runnerForm.name || !runnerForm.url || !runnerForm.token) {
|
|
250
|
-
runnerFormError =
|
|
458
|
+
runnerFormError = RUNNER_FIELDS_REQUIRED_ERROR;
|
|
251
459
|
return;
|
|
252
460
|
}
|
|
253
461
|
runnerFormError = '';
|
|
@@ -255,7 +463,7 @@
|
|
|
255
463
|
try {
|
|
256
464
|
const probe = await probeRunner(runnerForm.url, runnerForm.token);
|
|
257
465
|
if (!probe.ok) {
|
|
258
|
-
runnerFormError =
|
|
466
|
+
runnerFormError = cannotReachRunnerError(probe.error);
|
|
259
467
|
return;
|
|
260
468
|
}
|
|
261
469
|
const { runner } = await createRunner(runnerForm);
|
|
@@ -266,9 +474,9 @@
|
|
|
266
474
|
};
|
|
267
475
|
runnerForm = { name: '', url: '', token: '', browser: 'chromium' };
|
|
268
476
|
runnerFormOpen = false;
|
|
269
|
-
showToast('success',
|
|
477
|
+
showToast('success', runnerAddedToast(runner.name));
|
|
270
478
|
} catch {
|
|
271
|
-
runnerFormError =
|
|
479
|
+
runnerFormError = ADD_RUNNER_FAILED;
|
|
272
480
|
} finally {
|
|
273
481
|
runnerFormSaving = false;
|
|
274
482
|
}
|
|
@@ -278,9 +486,9 @@
|
|
|
278
486
|
try {
|
|
279
487
|
await deleteRunner(id);
|
|
280
488
|
runners = runners.filter((r) => r.id !== id);
|
|
281
|
-
showToast('success',
|
|
489
|
+
showToast('success', runnerRemovedToast(name));
|
|
282
490
|
} catch {
|
|
283
|
-
showToast('error',
|
|
491
|
+
showToast('error', REMOVE_RUNNER_FAILED);
|
|
284
492
|
}
|
|
285
493
|
}
|
|
286
494
|
|
|
@@ -290,7 +498,7 @@
|
|
|
290
498
|
const result = await pingRunner(id);
|
|
291
499
|
pingResults = { ...pingResults, [id]: { ...result, loading: false } };
|
|
292
500
|
} catch {
|
|
293
|
-
pingResults = { ...pingResults, [id]: { ok: false, error:
|
|
501
|
+
pingResults = { ...pingResults, [id]: { ok: false, error: NETWORK_ERROR, loading: false } };
|
|
294
502
|
}
|
|
295
503
|
}
|
|
296
504
|
|
|
@@ -299,12 +507,12 @@
|
|
|
299
507
|
try {
|
|
300
508
|
const result = await stopRunner(id);
|
|
301
509
|
if (result.ok) {
|
|
302
|
-
showToast('success',
|
|
510
|
+
showToast('success', runnerStoppedToast(name));
|
|
303
511
|
} else {
|
|
304
|
-
showToast('error',
|
|
512
|
+
showToast('error', runnerStopFailedToast(name, result.error));
|
|
305
513
|
}
|
|
306
514
|
} catch {
|
|
307
|
-
showToast('error',
|
|
515
|
+
showToast('error', runnerStopFailedGenericToast(name));
|
|
308
516
|
} finally {
|
|
309
517
|
stoppingId = null;
|
|
310
518
|
refreshPing(id);
|
|
@@ -316,12 +524,12 @@
|
|
|
316
524
|
try {
|
|
317
525
|
const result = await restartRunner(id);
|
|
318
526
|
if (result.ok) {
|
|
319
|
-
showToast('success',
|
|
527
|
+
showToast('success', runnerRestartingToast(name));
|
|
320
528
|
} else {
|
|
321
|
-
showToast('error',
|
|
529
|
+
showToast('error', runnerRestartFailedToast(name, result.error));
|
|
322
530
|
}
|
|
323
531
|
} catch {
|
|
324
|
-
showToast('error',
|
|
532
|
+
showToast('error', runnerRestartFailedGenericToast(name));
|
|
325
533
|
} finally {
|
|
326
534
|
restartingId = null;
|
|
327
535
|
// Give the replacement process a moment to bind before checking on it.
|
|
@@ -331,30 +539,40 @@
|
|
|
331
539
|
|
|
332
540
|
function startEdit(r) {
|
|
333
541
|
editingId = r.id;
|
|
334
|
-
|
|
542
|
+
// Token is never sent back by the server — leave blank; the update
|
|
543
|
+
// only replaces it if the admin types a new one (see handleUpdateRunner).
|
|
544
|
+
editForm = { name: r.name, url: r.url, token: '', browser: r.browser };
|
|
335
545
|
editFormError = '';
|
|
336
546
|
}
|
|
337
547
|
|
|
338
548
|
async function handleUpdateRunner(id) {
|
|
339
|
-
if (!editForm.name || !editForm.url
|
|
340
|
-
editFormError =
|
|
549
|
+
if (!editForm.name || !editForm.url) {
|
|
550
|
+
editFormError = RUNNER_FIELDS_REQUIRED_ERROR;
|
|
341
551
|
return;
|
|
342
552
|
}
|
|
343
553
|
editFormError = '';
|
|
344
554
|
editFormSaving = true;
|
|
345
555
|
try {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
556
|
+
// Only re-probe (and require a reachable token) when the admin actually
|
|
557
|
+
// typed a new one — an empty token here means "keep the existing one",
|
|
558
|
+
// which the still-running node already accepts.
|
|
559
|
+
if (editForm.token) {
|
|
560
|
+
const probe = await probeRunner(editForm.url, editForm.token);
|
|
561
|
+
if (!probe.ok) {
|
|
562
|
+
editFormError = cannotReachRunnerError(probe.error);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
pingResults = {
|
|
566
|
+
...pingResults,
|
|
567
|
+
[id]: { ok: true, latency: probe.latency, loading: false }
|
|
568
|
+
};
|
|
350
569
|
}
|
|
351
570
|
const { runner } = await updateRunner(id, editForm);
|
|
352
571
|
runners = runners.map((r) => (r.id === id ? runner : r));
|
|
353
|
-
pingResults = { ...pingResults, [id]: { ok: true, latency: probe.latency, loading: false } };
|
|
354
572
|
editingId = null;
|
|
355
|
-
showToast('success',
|
|
573
|
+
showToast('success', runnerUpdatedToast(runner.name));
|
|
356
574
|
} catch {
|
|
357
|
-
editFormError =
|
|
575
|
+
editFormError = UPDATE_RUNNER_FAILED;
|
|
358
576
|
} finally {
|
|
359
577
|
editFormSaving = false;
|
|
360
578
|
}
|
|
@@ -364,9 +582,9 @@
|
|
|
364
582
|
projectSaving = true;
|
|
365
583
|
try {
|
|
366
584
|
await saveProject(project);
|
|
367
|
-
showToast('success',
|
|
585
|
+
showToast('success', PROJECT_SAVED_TOAST);
|
|
368
586
|
} catch {
|
|
369
|
-
showToast('error',
|
|
587
|
+
showToast('error', PROJECT_SAVE_FAILED);
|
|
370
588
|
} finally {
|
|
371
589
|
projectSaving = false;
|
|
372
590
|
}
|
|
@@ -380,12 +598,12 @@
|
|
|
380
598
|
const url = URL.createObjectURL(blob);
|
|
381
599
|
const a = document.createElement('a');
|
|
382
600
|
a.href = url;
|
|
383
|
-
a.download =
|
|
601
|
+
a.download = backupFilename(new Date().toISOString().slice(0, 10));
|
|
384
602
|
a.click();
|
|
385
603
|
URL.revokeObjectURL(url);
|
|
386
|
-
showToast('success',
|
|
604
|
+
showToast('success', BACKUP_DOWNLOADED_TOAST);
|
|
387
605
|
} catch {
|
|
388
|
-
showToast('error',
|
|
606
|
+
showToast('error', EXPORT_FAILED_TOAST);
|
|
389
607
|
} finally {
|
|
390
608
|
exporting = false;
|
|
391
609
|
}
|
|
@@ -399,12 +617,12 @@
|
|
|
399
617
|
const data = JSON.parse(text);
|
|
400
618
|
const result = await importBackup(data);
|
|
401
619
|
if (result.error) throw new Error(result.error);
|
|
402
|
-
showToast('success',
|
|
620
|
+
showToast('success', IMPORT_SUCCESS_TOAST);
|
|
403
621
|
project = await fetchProject();
|
|
404
622
|
importFile = null;
|
|
405
623
|
if (fileInput) fileInput.value = '';
|
|
406
624
|
} catch (e) {
|
|
407
|
-
showToast('error', e.message ||
|
|
625
|
+
showToast('error', e.message || IMPORT_FAILED_FALLBACK);
|
|
408
626
|
} finally {
|
|
409
627
|
importing = false;
|
|
410
628
|
}
|
|
@@ -418,9 +636,9 @@
|
|
|
418
636
|
prefixesSaving = true;
|
|
419
637
|
try {
|
|
420
638
|
prefixes = await savePrefixes(prefixes);
|
|
421
|
-
showToast('success',
|
|
639
|
+
showToast('success', PREFIXES_SAVED_TOAST);
|
|
422
640
|
} catch {
|
|
423
|
-
showToast('error',
|
|
641
|
+
showToast('error', PREFIXES_SAVE_FAILED);
|
|
424
642
|
} finally {
|
|
425
643
|
prefixesSaving = false;
|
|
426
644
|
}
|
|
@@ -431,9 +649,9 @@
|
|
|
431
649
|
try {
|
|
432
650
|
await migratePrefixes(migrateForm);
|
|
433
651
|
prefixes = { ...prefixes, ...migrateForm };
|
|
434
|
-
showToast('success',
|
|
652
|
+
showToast('success', MIGRATION_COMPLETE_TOAST);
|
|
435
653
|
} catch {
|
|
436
|
-
showToast('error',
|
|
654
|
+
showToast('error', MIGRATION_FAILED_TOAST);
|
|
437
655
|
} finally {
|
|
438
656
|
migrating = false;
|
|
439
657
|
}
|
|
@@ -449,7 +667,7 @@
|
|
|
449
667
|
email: profileForm.email
|
|
450
668
|
});
|
|
451
669
|
auth.login($auth.token, { ...$auth.user, ...user });
|
|
452
|
-
showToast('success',
|
|
670
|
+
showToast('success', PROFILE_UPDATED_TOAST);
|
|
453
671
|
} catch (e) {
|
|
454
672
|
profileError = e.message;
|
|
455
673
|
} finally {
|
|
@@ -460,7 +678,7 @@
|
|
|
460
678
|
async function handleCreateUser() {
|
|
461
679
|
userFormError = '';
|
|
462
680
|
if (!userForm.name || !userForm.email || !userForm.password) {
|
|
463
|
-
userFormError =
|
|
681
|
+
userFormError = USER_FORM_REQUIRED_ERROR;
|
|
464
682
|
return;
|
|
465
683
|
}
|
|
466
684
|
userFormSaving = true;
|
|
@@ -468,7 +686,7 @@
|
|
|
468
686
|
const user = await createUserApi(userForm);
|
|
469
687
|
allUsers = [...allUsers, user];
|
|
470
688
|
userForm = { name: '', email: '', password: '', role: 'user' };
|
|
471
|
-
showToast('success',
|
|
689
|
+
showToast('success', userAddedToast(user.name));
|
|
472
690
|
} catch (e) {
|
|
473
691
|
userFormError = e.message;
|
|
474
692
|
} finally {
|
|
@@ -480,7 +698,7 @@
|
|
|
480
698
|
try {
|
|
481
699
|
await deleteUserApi(id);
|
|
482
700
|
allUsers = allUsers.filter((u) => u.id !== id);
|
|
483
|
-
showToast('success',
|
|
701
|
+
showToast('success', userRemovedToast(name));
|
|
484
702
|
} catch (e) {
|
|
485
703
|
showToast('error', e.message);
|
|
486
704
|
}
|
|
@@ -491,11 +709,11 @@
|
|
|
491
709
|
async function handleChangePassword() {
|
|
492
710
|
pwError = '';
|
|
493
711
|
if (pwForm.newPassword !== pwForm.confirmPassword) {
|
|
494
|
-
pwError =
|
|
712
|
+
pwError = PASSWORDS_NO_MATCH_ERROR;
|
|
495
713
|
return;
|
|
496
714
|
}
|
|
497
715
|
if (pwForm.newPassword.length < 8) {
|
|
498
|
-
pwError =
|
|
716
|
+
pwError = PASSWORD_TOO_SHORT_ERROR;
|
|
499
717
|
return;
|
|
500
718
|
}
|
|
501
719
|
pwSaving = true;
|
|
@@ -506,7 +724,7 @@
|
|
|
506
724
|
newPassword: pwForm.newPassword
|
|
507
725
|
});
|
|
508
726
|
pwForm = { currentPassword: '', newPassword: '', confirmPassword: '' };
|
|
509
|
-
showToast('success',
|
|
727
|
+
showToast('success', PASSWORD_CHANGED_TOAST);
|
|
510
728
|
} catch (e) {
|
|
511
729
|
pwError = e.message;
|
|
512
730
|
} finally {
|
|
@@ -526,9 +744,9 @@
|
|
|
526
744
|
mcpKey = result.mcpKey;
|
|
527
745
|
mcpKeySet = true;
|
|
528
746
|
mcpShowKey = true;
|
|
529
|
-
showToast('success',
|
|
747
|
+
showToast('success', MCP_KEY_GENERATED_TOAST);
|
|
530
748
|
} catch {
|
|
531
|
-
showToast('error',
|
|
749
|
+
showToast('error', MCP_KEY_GENERATE_FAILED);
|
|
532
750
|
} finally {
|
|
533
751
|
mcpGenerating = false;
|
|
534
752
|
}
|
|
@@ -537,21 +755,21 @@
|
|
|
537
755
|
function handleCopyMcpKey() {
|
|
538
756
|
navigator.clipboard.writeText(mcpKey).then(() => {
|
|
539
757
|
mcpKeyCopied = true;
|
|
540
|
-
setTimeout(() => (mcpKeyCopied = false),
|
|
758
|
+
setTimeout(() => (mcpKeyCopied = false), COPY_TIMEOUT_MS);
|
|
541
759
|
});
|
|
542
760
|
}
|
|
543
761
|
|
|
544
762
|
function handleCopyMcpSnippet() {
|
|
545
763
|
navigator.clipboard.writeText(mcpConfigSnippet).then(() => {
|
|
546
764
|
mcpSnippetCopied = true;
|
|
547
|
-
setTimeout(() => (mcpSnippetCopied = false),
|
|
765
|
+
setTimeout(() => (mcpSnippetCopied = false), COPY_TIMEOUT_MS);
|
|
548
766
|
});
|
|
549
767
|
}
|
|
550
768
|
|
|
551
769
|
function handleCopyCiSnippet() {
|
|
552
770
|
navigator.clipboard.writeText(ciWorkflowSnippet).then(() => {
|
|
553
771
|
ciSnippetCopied = true;
|
|
554
|
-
setTimeout(() => (ciSnippetCopied = false),
|
|
772
|
+
setTimeout(() => (ciSnippetCopied = false), COPY_TIMEOUT_MS);
|
|
555
773
|
});
|
|
556
774
|
}
|
|
557
775
|
|
|
@@ -559,9 +777,9 @@
|
|
|
559
777
|
integrationsSaving = true;
|
|
560
778
|
try {
|
|
561
779
|
integrations = await saveIntegrations(integrations);
|
|
562
|
-
showToast('success',
|
|
780
|
+
showToast('success', INTEGRATIONS_SAVED_TOAST);
|
|
563
781
|
} catch {
|
|
564
|
-
showToast('error',
|
|
782
|
+
showToast('error', INTEGRATIONS_SAVE_FAILED);
|
|
565
783
|
} finally {
|
|
566
784
|
integrationsSaving = false;
|
|
567
785
|
}
|
|
@@ -576,9 +794,9 @@
|
|
|
576
794
|
if (result.error) throw new Error(result.error);
|
|
577
795
|
if (backupConfig.backupS3SecretKey) backupS3SecretKeySet = true;
|
|
578
796
|
backupConfig = { ...backupConfig, backupS3SecretKey: '' };
|
|
579
|
-
showToast('success',
|
|
797
|
+
showToast('success', BACKUP_CONFIG_SAVED_TOAST);
|
|
580
798
|
} catch (e) {
|
|
581
|
-
showToast('error', e.message ||
|
|
799
|
+
showToast('error', e.message || BACKUP_CONFIG_SAVE_FAILED);
|
|
582
800
|
} finally {
|
|
583
801
|
backupConfigSaving = false;
|
|
584
802
|
}
|
|
@@ -592,10 +810,10 @@
|
|
|
592
810
|
const result = await testBackupS3(backupConfig);
|
|
593
811
|
if (result.error) throw new Error(result.error);
|
|
594
812
|
backupS3TestResult = 'success';
|
|
595
|
-
backupS3TestMessage =
|
|
813
|
+
backupS3TestMessage = S3_CONNECTION_SUCCESS;
|
|
596
814
|
} catch (e) {
|
|
597
815
|
backupS3TestResult = 'error';
|
|
598
|
-
backupS3TestMessage = e.message ||
|
|
816
|
+
backupS3TestMessage = e.message || S3_CONNECTION_FAILED;
|
|
599
817
|
} finally {
|
|
600
818
|
backupTestingS3 = false;
|
|
601
819
|
}
|
|
@@ -608,9 +826,9 @@
|
|
|
608
826
|
if (result.error) throw new Error(result.error);
|
|
609
827
|
backupLastRunAt = result.lastRunAt;
|
|
610
828
|
backupLastStatus = result.lastStatus ?? '';
|
|
611
|
-
showToast('success',
|
|
829
|
+
showToast('success', BACKUP_UPLOAD_SUCCESS_TOAST);
|
|
612
830
|
} catch (e) {
|
|
613
|
-
showToast('error', e.message ||
|
|
831
|
+
showToast('error', e.message || BACKUP_UPLOAD_FAILED_FALLBACK);
|
|
614
832
|
const bc = await fetchBackupConfig().catch(() => null);
|
|
615
833
|
if (bc) {
|
|
616
834
|
backupLastRunAt = bc.backupLastRunAt;
|
|
@@ -634,7 +852,7 @@
|
|
|
634
852
|
command: 'plum',
|
|
635
853
|
args: ['mcp'],
|
|
636
854
|
env: {
|
|
637
|
-
PLUM_API_URL:
|
|
855
|
+
PLUM_API_URL: API_BASE,
|
|
638
856
|
PLUM_API_KEY: mcpKey
|
|
639
857
|
}
|
|
640
858
|
}
|
|
@@ -670,24 +888,24 @@
|
|
|
670
888
|
$: navItems =
|
|
671
889
|
$auth.user?.role === 'admin'
|
|
672
890
|
? [
|
|
673
|
-
{ id: 'project', label:
|
|
674
|
-
{ id: 'runners', label:
|
|
675
|
-
{ id: 'repository', label:
|
|
676
|
-
{ id: 'integrations', label:
|
|
677
|
-
{ id: 'mcp', label:
|
|
678
|
-
{ id: 'account', label:
|
|
679
|
-
{ id: 'users', label:
|
|
680
|
-
{ id: 'backup', label:
|
|
891
|
+
{ id: 'project', label: PROJECT_LABEL },
|
|
892
|
+
{ id: 'runners', label: RUNNERS_LABEL },
|
|
893
|
+
{ id: 'repository', label: REPOSITORY_NAV_LABEL },
|
|
894
|
+
{ id: 'integrations', label: INTEGRATIONS_LABEL },
|
|
895
|
+
{ id: 'mcp', label: MCP_NAV_LABEL },
|
|
896
|
+
{ id: 'account', label: ACCOUNT_LABEL },
|
|
897
|
+
{ id: 'users', label: USERS_LABEL },
|
|
898
|
+
{ id: 'backup', label: BACKUP_LABEL }
|
|
681
899
|
]
|
|
682
|
-
: [{ id: 'account', label:
|
|
900
|
+
: [{ id: 'account', label: ACCOUNT_LABEL }];
|
|
683
901
|
</script>
|
|
684
902
|
|
|
685
|
-
<svelte:head><title>
|
|
903
|
+
<svelte:head><title>{PAGE_TITLE}</title></svelte:head>
|
|
686
904
|
|
|
687
905
|
<Toast {toast} />
|
|
688
906
|
|
|
689
907
|
<div class="page-header">
|
|
690
|
-
<h1>
|
|
908
|
+
<h1>{HEADING}</h1>
|
|
691
909
|
</div>
|
|
692
910
|
|
|
693
911
|
<div class="settings-layout">
|
|
@@ -712,42 +930,42 @@
|
|
|
712
930
|
{#if section === 'project'}
|
|
713
931
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
714
932
|
<div class="content-header">
|
|
715
|
-
<h2>
|
|
716
|
-
<p class="content-desc">
|
|
933
|
+
<h2>{PROJECT_LABEL}</h2>
|
|
934
|
+
<p class="content-desc">{PROJECT_DESC}</p>
|
|
717
935
|
</div>
|
|
718
936
|
|
|
719
937
|
<div class="card settings-card">
|
|
720
938
|
<div class="field">
|
|
721
|
-
<label class="field-label" for="project-name">
|
|
939
|
+
<label class="field-label" for="project-name">{PROJECT_NAME_LABEL}</label>
|
|
722
940
|
<input
|
|
723
941
|
id="project-name"
|
|
724
942
|
type="text"
|
|
725
943
|
class="field-input"
|
|
726
944
|
bind:value={project.name}
|
|
727
|
-
placeholder=
|
|
945
|
+
placeholder={PROJECT_NAME_PLACEHOLDER}
|
|
728
946
|
/>
|
|
729
947
|
</div>
|
|
730
948
|
|
|
731
949
|
<div class="field">
|
|
732
950
|
<label class="field-label" for="project-logo">
|
|
733
|
-
<span>
|
|
734
|
-
<span class="field-hint">
|
|
951
|
+
<span>{LOGO_URL_LABEL}</span>
|
|
952
|
+
<span class="field-hint">{LOGO_URL_HINT}</span>
|
|
735
953
|
</label>
|
|
736
954
|
<input
|
|
737
955
|
id="project-logo"
|
|
738
956
|
type="url"
|
|
739
957
|
class="field-input"
|
|
740
958
|
bind:value={project.logoUrl}
|
|
741
|
-
placeholder=
|
|
959
|
+
placeholder={LOGO_URL_PLACEHOLDER}
|
|
742
960
|
/>
|
|
743
961
|
</div>
|
|
744
962
|
|
|
745
963
|
{#if project.logoUrl}
|
|
746
964
|
<div class="logo-preview">
|
|
747
|
-
<span class="preview-label">
|
|
965
|
+
<span class="preview-label">{PREVIEW_LABEL}</span>
|
|
748
966
|
<img
|
|
749
967
|
src={project.logoUrl}
|
|
750
|
-
alt=
|
|
968
|
+
alt={LOGO_PREVIEW_ALT}
|
|
751
969
|
class="logo-img"
|
|
752
970
|
on:error={(e) => (e.target.style.display = 'none')}
|
|
753
971
|
/>
|
|
@@ -756,8 +974,8 @@
|
|
|
756
974
|
|
|
757
975
|
<div class="field">
|
|
758
976
|
<label class="field-label" for="project-timezone">
|
|
759
|
-
<span>
|
|
760
|
-
<span class="field-hint">
|
|
977
|
+
<span>{TIMEZONE_LABEL}</span>
|
|
978
|
+
<span class="field-hint">{TIMEZONE_HINT}</span>
|
|
761
979
|
</label>
|
|
762
980
|
<select id="project-timezone" class="field-input" bind:value={project.timezone}>
|
|
763
981
|
{#each TIMEZONES as tz}
|
|
@@ -768,10 +986,9 @@
|
|
|
768
986
|
|
|
769
987
|
<div class="field">
|
|
770
988
|
<label class="field-label" for="project-max-retries">
|
|
771
|
-
<span>
|
|
989
|
+
<span>{RETRY_FAILED_TESTS_LABEL}</span>
|
|
772
990
|
<span class="field-hint">
|
|
773
|
-
|
|
774
|
-
report. 0 disables retries.
|
|
991
|
+
{RETRY_FAILED_TESTS_HINT}
|
|
775
992
|
</span>
|
|
776
993
|
</label>
|
|
777
994
|
<input
|
|
@@ -787,8 +1004,8 @@
|
|
|
787
1004
|
<!-- Dark mode toggle -->
|
|
788
1005
|
<div class="toggle-row">
|
|
789
1006
|
<div class="toggle-info">
|
|
790
|
-
<span class="toggle-label">
|
|
791
|
-
<span class="toggle-desc">
|
|
1007
|
+
<span class="toggle-label">{DARK_MODE_LABEL}</span>
|
|
1008
|
+
<span class="toggle-desc">{DARK_MODE_DESC}</span>
|
|
792
1009
|
</div>
|
|
793
1010
|
<button
|
|
794
1011
|
class="toggle-switch"
|
|
@@ -803,7 +1020,7 @@
|
|
|
803
1020
|
|
|
804
1021
|
<div class="card-footer">
|
|
805
1022
|
<Button on:click={handleSaveProject} disabled={projectSaving}>
|
|
806
|
-
{projectSaving
|
|
1023
|
+
{saveProjectLabel(projectSaving)}
|
|
807
1024
|
</Button>
|
|
808
1025
|
</div>
|
|
809
1026
|
</div>
|
|
@@ -813,9 +1030,9 @@
|
|
|
813
1030
|
{:else if section === 'runners'}
|
|
814
1031
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
815
1032
|
<div class="content-header">
|
|
816
|
-
<h2>
|
|
1033
|
+
<h2>{RUNNERS_LABEL}</h2>
|
|
817
1034
|
<p class="content-desc">
|
|
818
|
-
|
|
1035
|
+
{RUNNERS_DESC}
|
|
819
1036
|
</p>
|
|
820
1037
|
</div>
|
|
821
1038
|
|
|
@@ -823,9 +1040,9 @@
|
|
|
823
1040
|
<!-- Built-in runner toggle -->
|
|
824
1041
|
<div class="toggle-row">
|
|
825
1042
|
<div class="toggle-info">
|
|
826
|
-
<span class="toggle-label">
|
|
1043
|
+
<span class="toggle-label">{BUILTIN_RUNNER_TOGGLE_LABEL}</span>
|
|
827
1044
|
<span class="toggle-desc">
|
|
828
|
-
|
|
1045
|
+
{BUILTIN_RUNNER_TOGGLE_DESC}
|
|
829
1046
|
</span>
|
|
830
1047
|
</div>
|
|
831
1048
|
<button
|
|
@@ -848,20 +1065,21 @@
|
|
|
848
1065
|
<div class="runner-card editing" transition:fly={{ y: -4, duration: 180 }}>
|
|
849
1066
|
<div class="runner-form-fields">
|
|
850
1067
|
<div class="field">
|
|
851
|
-
<label class="field-label" for="edit-name-{r.id}">
|
|
1068
|
+
<label class="field-label" for="edit-name-{r.id}">{NAME_LABEL}</label>
|
|
852
1069
|
<input
|
|
853
1070
|
id="edit-name-{r.id}"
|
|
854
1071
|
type="text"
|
|
855
1072
|
class="field-input"
|
|
856
1073
|
bind:value={editForm.name}
|
|
857
|
-
placeholder=
|
|
1074
|
+
placeholder={RUNNER_NAME_PLACEHOLDER}
|
|
858
1075
|
/>
|
|
859
1076
|
</div>
|
|
860
1077
|
<div class="field">
|
|
861
1078
|
<label class="field-label" for="edit-url-{r.id}">
|
|
862
|
-
|
|
1079
|
+
{RUNNER_URL_LABEL}
|
|
863
1080
|
<span class="field-hint"
|
|
864
|
-
>
|
|
1081
|
+
>{RUNNER_URL_HINT_PREFIX} <code>host.docker.internal</code>
|
|
1082
|
+
{RUNNER_URL_HINT_SUFFIX}</span
|
|
865
1083
|
>
|
|
866
1084
|
</label>
|
|
867
1085
|
<input
|
|
@@ -869,23 +1087,23 @@
|
|
|
869
1087
|
type="url"
|
|
870
1088
|
class="field-input"
|
|
871
1089
|
bind:value={editForm.url}
|
|
872
|
-
placeholder=
|
|
1090
|
+
placeholder={RUNNER_URL_PLACEHOLDER}
|
|
873
1091
|
/>
|
|
874
1092
|
</div>
|
|
875
1093
|
<div class="field">
|
|
876
|
-
<label class="field-label" for="edit-token-{r.id}">
|
|
1094
|
+
<label class="field-label" for="edit-token-{r.id}">{TOKEN_LABEL}</label>
|
|
877
1095
|
<input
|
|
878
1096
|
id="edit-token-{r.id}"
|
|
879
1097
|
type="text"
|
|
880
1098
|
class="field-input"
|
|
881
1099
|
bind:value={editForm.token}
|
|
882
|
-
placeholder=
|
|
1100
|
+
placeholder={KEEP_TOKEN_PLACEHOLDER}
|
|
883
1101
|
spellcheck="false"
|
|
884
1102
|
autocomplete="off"
|
|
885
1103
|
/>
|
|
886
1104
|
</div>
|
|
887
1105
|
<div class="field">
|
|
888
|
-
<label class="field-label" for="edit-browser-{r.id}">
|
|
1106
|
+
<label class="field-label" for="edit-browser-{r.id}">{BROWSER_LABEL}</label>
|
|
889
1107
|
<select
|
|
890
1108
|
id="edit-browser-{r.id}"
|
|
891
1109
|
class="field-input"
|
|
@@ -902,7 +1120,7 @@
|
|
|
902
1120
|
{/if}
|
|
903
1121
|
<div class="runner-form-actions">
|
|
904
1122
|
<Button on:click={() => handleUpdateRunner(r.id)} disabled={editFormSaving}>
|
|
905
|
-
{editFormSaving
|
|
1123
|
+
{editRunnerSubmitLabel(editFormSaving)}
|
|
906
1124
|
</Button>
|
|
907
1125
|
<Button
|
|
908
1126
|
variant="ghost"
|
|
@@ -910,7 +1128,7 @@
|
|
|
910
1128
|
editingId = null;
|
|
911
1129
|
editFormError = '';
|
|
912
1130
|
}}
|
|
913
|
-
disabled={editFormSaving}>
|
|
1131
|
+
disabled={editFormSaving}>{CANCEL_LABEL}</Button
|
|
914
1132
|
>
|
|
915
1133
|
</div>
|
|
916
1134
|
</div>
|
|
@@ -936,33 +1154,37 @@
|
|
|
936
1154
|
{#if ping.ok}
|
|
937
1155
|
<span class="ping-badge ok">{ping.latency}ms</span>
|
|
938
1156
|
{:else}
|
|
939
|
-
<span class="ping-badge fail" title={ping.error}
|
|
1157
|
+
<span class="ping-badge fail" title={ping.error}
|
|
1158
|
+
>{RUNNER_UNREACHABLE_LABEL}</span
|
|
1159
|
+
>
|
|
940
1160
|
{/if}
|
|
941
1161
|
{:else if ping?.loading}
|
|
942
|
-
<span class="ping-badge pinging">
|
|
1162
|
+
<span class="ping-badge pinging">{RUNNER_PINGING_LABEL}</span>
|
|
943
1163
|
{/if}
|
|
944
1164
|
</div>
|
|
945
1165
|
<p class="runner-card-url">{r.url}</p>
|
|
946
1166
|
<div class="runner-card-actions">
|
|
947
|
-
<Button variant="ghost" size="sm" on:click={() => startEdit(r)}
|
|
1167
|
+
<Button variant="ghost" size="sm" on:click={() => startEdit(r)}
|
|
1168
|
+
>{EDIT_LABEL}</Button
|
|
1169
|
+
>
|
|
948
1170
|
<Button
|
|
949
1171
|
variant="ghost"
|
|
950
1172
|
size="sm"
|
|
951
1173
|
disabled={restartingId === r.id}
|
|
952
1174
|
on:click={() => handleRestartRunner(r.id, r.name)}
|
|
953
|
-
>{restartingId === r.id
|
|
1175
|
+
>{restartRunnerLabel(restartingId === r.id)}</Button
|
|
954
1176
|
>
|
|
955
1177
|
<Button
|
|
956
1178
|
variant="ghost"
|
|
957
1179
|
size="sm"
|
|
958
1180
|
disabled={stoppingId === r.id}
|
|
959
1181
|
on:click={() => handleStopRunner(r.id, r.name)}
|
|
960
|
-
>{stoppingId === r.id
|
|
1182
|
+
>{stopRunnerLabel(stoppingId === r.id)}</Button
|
|
961
1183
|
>
|
|
962
1184
|
<Button
|
|
963
1185
|
variant="danger"
|
|
964
1186
|
size="sm"
|
|
965
|
-
on:click={() => handleDeleteRunner(r.id, r.name)}>
|
|
1187
|
+
on:click={() => handleDeleteRunner(r.id, r.name)}>{REMOVE_LABEL}</Button
|
|
966
1188
|
>
|
|
967
1189
|
</div>
|
|
968
1190
|
</div>
|
|
@@ -974,23 +1196,24 @@
|
|
|
974
1196
|
<!-- Add runner form / button -->
|
|
975
1197
|
{#if runnerFormOpen}
|
|
976
1198
|
<div class="runner-form" transition:fly={{ y: -6, duration: 200 }}>
|
|
977
|
-
<p class="runner-form-title">
|
|
1199
|
+
<p class="runner-form-title">{ADD_RUNNER_FORM_TITLE}</p>
|
|
978
1200
|
<div class="runner-form-fields">
|
|
979
1201
|
<div class="field">
|
|
980
|
-
<label class="field-label" for="rn-name">
|
|
1202
|
+
<label class="field-label" for="rn-name">{NAME_LABEL}</label>
|
|
981
1203
|
<input
|
|
982
1204
|
id="rn-name"
|
|
983
1205
|
type="text"
|
|
984
1206
|
class="field-input"
|
|
985
1207
|
bind:value={runnerForm.name}
|
|
986
|
-
placeholder=
|
|
1208
|
+
placeholder={RUNNER_NAME_PLACEHOLDER}
|
|
987
1209
|
/>
|
|
988
1210
|
</div>
|
|
989
1211
|
<div class="field">
|
|
990
1212
|
<label class="field-label" for="rn-url">
|
|
991
|
-
|
|
1213
|
+
{RUNNER_URL_LABEL}
|
|
992
1214
|
<span class="field-hint"
|
|
993
|
-
>
|
|
1215
|
+
>{RUNNER_URL_HINT_PREFIX} <code>host.docker.internal</code>
|
|
1216
|
+
{RUNNER_URL_HINT_SUFFIX}</span
|
|
994
1217
|
>
|
|
995
1218
|
</label>
|
|
996
1219
|
<input
|
|
@@ -998,23 +1221,23 @@
|
|
|
998
1221
|
type="url"
|
|
999
1222
|
class="field-input"
|
|
1000
1223
|
bind:value={runnerForm.url}
|
|
1001
|
-
placeholder=
|
|
1224
|
+
placeholder={RUNNER_URL_PLACEHOLDER}
|
|
1002
1225
|
/>
|
|
1003
1226
|
</div>
|
|
1004
1227
|
<div class="field">
|
|
1005
|
-
<label class="field-label" for="rn-token">
|
|
1228
|
+
<label class="field-label" for="rn-token">{TOKEN_LABEL}</label>
|
|
1006
1229
|
<input
|
|
1007
1230
|
id="rn-token"
|
|
1008
1231
|
type="text"
|
|
1009
1232
|
class="field-input"
|
|
1010
1233
|
bind:value={runnerForm.token}
|
|
1011
|
-
placeholder=
|
|
1234
|
+
placeholder={TOKEN_PLACEHOLDER}
|
|
1012
1235
|
spellcheck="false"
|
|
1013
1236
|
autocomplete="off"
|
|
1014
1237
|
/>
|
|
1015
1238
|
</div>
|
|
1016
1239
|
<div class="field">
|
|
1017
|
-
<label class="field-label" for="rn-browser">
|
|
1240
|
+
<label class="field-label" for="rn-browser">{BROWSER_LABEL}</label>
|
|
1018
1241
|
<select id="rn-browser" class="field-input" bind:value={runnerForm.browser}>
|
|
1019
1242
|
{#each BROWSERS as b}
|
|
1020
1243
|
<option value={b.id}>{b.label}</option>
|
|
@@ -1027,7 +1250,7 @@
|
|
|
1027
1250
|
{/if}
|
|
1028
1251
|
<div class="runner-form-actions">
|
|
1029
1252
|
<Button on:click={handleAddRunner} disabled={runnerFormSaving}>
|
|
1030
|
-
{runnerFormSaving
|
|
1253
|
+
{addRunnerSubmitLabel(runnerFormSaving)}
|
|
1031
1254
|
</Button>
|
|
1032
1255
|
<Button
|
|
1033
1256
|
variant="ghost"
|
|
@@ -1035,13 +1258,15 @@
|
|
|
1035
1258
|
runnerFormOpen = false;
|
|
1036
1259
|
runnerFormError = '';
|
|
1037
1260
|
}}
|
|
1038
|
-
disabled={runnerFormSaving}>
|
|
1261
|
+
disabled={runnerFormSaving}>{CANCEL_LABEL}</Button
|
|
1039
1262
|
>
|
|
1040
1263
|
</div>
|
|
1041
1264
|
</div>
|
|
1042
1265
|
{:else}
|
|
1043
1266
|
<div class="card-footer">
|
|
1044
|
-
<Button variant="ghost" on:click={() => (runnerFormOpen = true)}
|
|
1267
|
+
<Button variant="ghost" on:click={() => (runnerFormOpen = true)}
|
|
1268
|
+
>{OPEN_ADD_RUNNER_LABEL}</Button
|
|
1269
|
+
>
|
|
1045
1270
|
</div>
|
|
1046
1271
|
{/if}
|
|
1047
1272
|
</div>
|
|
@@ -1051,59 +1276,62 @@
|
|
|
1051
1276
|
{:else if section === 'repository'}
|
|
1052
1277
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1053
1278
|
<div class="content-header">
|
|
1054
|
-
<h2>
|
|
1055
|
-
<p class="content-desc">
|
|
1279
|
+
<h2>{REPOSITORY_HEADING}</h2>
|
|
1280
|
+
<p class="content-desc">{REPOSITORY_DESC}</p>
|
|
1056
1281
|
</div>
|
|
1057
1282
|
|
|
1058
1283
|
<div class="card settings-card">
|
|
1059
1284
|
<div class="field-row">
|
|
1060
1285
|
<div class="field">
|
|
1061
|
-
<label class="field-label" for="tc-prefix">
|
|
1286
|
+
<label class="field-label" for="tc-prefix">{CASE_PREFIX_LABEL}</label>
|
|
1062
1287
|
<input
|
|
1063
1288
|
id="tc-prefix"
|
|
1064
1289
|
type="text"
|
|
1065
1290
|
class="field-input mono"
|
|
1066
1291
|
bind:value={prefixes.testCasePrefix}
|
|
1067
|
-
placeholder=
|
|
1292
|
+
placeholder={CASE_PREFIX_PLACEHOLDER}
|
|
1068
1293
|
maxlength="10"
|
|
1069
1294
|
/>
|
|
1070
1295
|
</div>
|
|
1071
1296
|
<div class="field">
|
|
1072
|
-
<label class="field-label" for="ts-prefix">
|
|
1297
|
+
<label class="field-label" for="ts-prefix">{SUITE_PREFIX_LABEL}</label>
|
|
1073
1298
|
<input
|
|
1074
1299
|
id="ts-prefix"
|
|
1075
1300
|
type="text"
|
|
1076
1301
|
class="field-input mono"
|
|
1077
1302
|
bind:value={prefixes.testSuitePrefix}
|
|
1078
|
-
placeholder=
|
|
1303
|
+
placeholder={SUITE_PREFIX_PLACEHOLDER}
|
|
1079
1304
|
maxlength="10"
|
|
1080
1305
|
/>
|
|
1081
1306
|
</div>
|
|
1082
1307
|
</div>
|
|
1083
1308
|
<p class="content-desc">
|
|
1084
|
-
|
|
1085
|
-
<code class="code-sample">{prefixes.
|
|
1309
|
+
{EXAMPLES_LABEL}
|
|
1310
|
+
<code class="code-sample">{prefixes.testCasePrefix || CASE_PREFIX_PLACEHOLDER}-001</code
|
|
1311
|
+
>,
|
|
1312
|
+
<code class="code-sample"
|
|
1313
|
+
>{prefixes.testSuitePrefix || SUITE_PREFIX_PLACEHOLDER}-001</code
|
|
1314
|
+
>
|
|
1086
1315
|
</p>
|
|
1087
1316
|
<div class="card-footer">
|
|
1088
1317
|
<Button on:click={handleSavePrefixes} disabled={prefixesSaving}>
|
|
1089
|
-
{prefixesSaving
|
|
1318
|
+
{savePrefixesLabel(prefixesSaving)}
|
|
1090
1319
|
</Button>
|
|
1091
1320
|
</div>
|
|
1092
1321
|
</div>
|
|
1093
1322
|
|
|
1094
1323
|
<div class="content-header" style="margin-top: 1rem">
|
|
1095
|
-
<h2>
|
|
1324
|
+
<h2>{MIGRATE_IDS_HEADING}</h2>
|
|
1096
1325
|
<p class="content-desc">
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
> affected — you manage those separately.
|
|
1326
|
+
{MIGRATE_DESC_PREFIX} <strong>{MIGRATE_DESC_STRONG}</strong>
|
|
1327
|
+
{MIGRATE_DESC_SUFFIX}
|
|
1100
1328
|
</p>
|
|
1101
1329
|
</div>
|
|
1102
1330
|
|
|
1103
1331
|
<div class="card settings-card">
|
|
1104
1332
|
<div class="field-row">
|
|
1105
1333
|
<div class="field">
|
|
1106
|
-
<label class="field-label" for="mig-tc">
|
|
1334
|
+
<label class="field-label" for="mig-tc">{NEW_CASE_PREFIX_LABEL}</label>
|
|
1107
1335
|
<input
|
|
1108
1336
|
id="mig-tc"
|
|
1109
1337
|
type="text"
|
|
@@ -1114,7 +1342,7 @@
|
|
|
1114
1342
|
/>
|
|
1115
1343
|
</div>
|
|
1116
1344
|
<div class="field">
|
|
1117
|
-
<label class="field-label" for="mig-ts">
|
|
1345
|
+
<label class="field-label" for="mig-ts">{NEW_SUITE_PREFIX_LABEL}</label>
|
|
1118
1346
|
<input
|
|
1119
1347
|
id="mig-ts"
|
|
1120
1348
|
type="text"
|
|
@@ -1127,7 +1355,7 @@
|
|
|
1127
1355
|
</div>
|
|
1128
1356
|
<div class="card-footer">
|
|
1129
1357
|
<Button variant="ghost" on:click={handleMigratePrefixes} disabled={migrating}>
|
|
1130
|
-
{migrating
|
|
1358
|
+
{runMigrationLabel(migrating)}
|
|
1131
1359
|
</Button>
|
|
1132
1360
|
</div>
|
|
1133
1361
|
</div>
|
|
@@ -1137,82 +1365,78 @@
|
|
|
1137
1365
|
{:else if section === 'integrations'}
|
|
1138
1366
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1139
1367
|
<div class="content-header">
|
|
1140
|
-
<h2>
|
|
1368
|
+
<h2>{INTEGRATIONS_LABEL}</h2>
|
|
1141
1369
|
<p class="content-desc">
|
|
1142
|
-
|
|
1143
|
-
links.
|
|
1370
|
+
{INTEGRATIONS_DESC}
|
|
1144
1371
|
</p>
|
|
1145
1372
|
</div>
|
|
1146
1373
|
|
|
1147
1374
|
<div class="card settings-card">
|
|
1148
|
-
<p class="card-title">
|
|
1375
|
+
<p class="card-title">{WEBHOOKS_CARD_TITLE}</p>
|
|
1149
1376
|
|
|
1150
1377
|
<div class="field">
|
|
1151
1378
|
<label class="field-label" for="discord-url">
|
|
1152
|
-
<span>
|
|
1153
|
-
<span class="field-hint">
|
|
1379
|
+
<span>{DISCORD_WEBHOOK_LABEL}</span>
|
|
1380
|
+
<span class="field-hint">{DISCORD_WEBHOOK_HINT}</span>
|
|
1154
1381
|
</label>
|
|
1155
1382
|
<input
|
|
1156
1383
|
id="discord-url"
|
|
1157
1384
|
type="url"
|
|
1158
1385
|
class="field-input"
|
|
1159
1386
|
bind:value={integrations.discordWebhookUrl}
|
|
1160
|
-
placeholder=
|
|
1387
|
+
placeholder={DISCORD_WEBHOOK_PLACEHOLDER}
|
|
1161
1388
|
/>
|
|
1162
1389
|
</div>
|
|
1163
1390
|
|
|
1164
1391
|
<div class="field">
|
|
1165
1392
|
<label class="field-label" for="slack-url">
|
|
1166
|
-
<span>
|
|
1167
|
-
<span class="field-hint">
|
|
1393
|
+
<span>{SLACK_WEBHOOK_LABEL}</span>
|
|
1394
|
+
<span class="field-hint">{SLACK_WEBHOOK_HINT}</span>
|
|
1168
1395
|
</label>
|
|
1169
1396
|
<input
|
|
1170
1397
|
id="slack-url"
|
|
1171
1398
|
type="url"
|
|
1172
1399
|
class="field-input"
|
|
1173
1400
|
bind:value={integrations.slackWebhookUrl}
|
|
1174
|
-
placeholder=
|
|
1401
|
+
placeholder={SLACK_WEBHOOK_PLACEHOLDER}
|
|
1175
1402
|
/>
|
|
1176
1403
|
</div>
|
|
1177
1404
|
|
|
1178
1405
|
<div class="field">
|
|
1179
1406
|
<label class="field-label" for="public-url">
|
|
1180
|
-
<span>
|
|
1181
|
-
<span class="field-hint"
|
|
1182
|
-
>Base URL of this Plum instance, used to link reports in notifications</span
|
|
1183
|
-
>
|
|
1407
|
+
<span>{PUBLIC_URL_LABEL}</span>
|
|
1408
|
+
<span class="field-hint">{PUBLIC_URL_HINT}</span>
|
|
1184
1409
|
</label>
|
|
1185
1410
|
<input
|
|
1186
1411
|
id="public-url"
|
|
1187
1412
|
type="url"
|
|
1188
1413
|
class="field-input"
|
|
1189
1414
|
bind:value={integrations.notifyPublicUrl}
|
|
1190
|
-
placeholder=
|
|
1415
|
+
placeholder={PUBLIC_URL_PLACEHOLDER}
|
|
1191
1416
|
/>
|
|
1192
1417
|
</div>
|
|
1193
1418
|
|
|
1194
1419
|
<Button on:click={handleSaveIntegrations} disabled={integrationsSaving}>
|
|
1195
|
-
{integrationsSaving
|
|
1420
|
+
{saveIntegrationsLabel(integrationsSaving)}
|
|
1196
1421
|
</Button>
|
|
1197
1422
|
</div>
|
|
1198
1423
|
|
|
1199
1424
|
<div class="card settings-card">
|
|
1200
|
-
<p class="card-title">
|
|
1425
|
+
<p class="card-title">{CI_TRIGGERS_CARD_TITLE}</p>
|
|
1201
1426
|
<p class="content-desc">
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1427
|
+
{CI_DESC_PART1} <code class="code-sample">POST {API_BASE}/trigger</code>
|
|
1428
|
+
{CI_DESC_PART2}
|
|
1429
|
+
<code class="code-sample">Authorization: ApiKey …</code>
|
|
1430
|
+
{CI_DESC_PART3}
|
|
1431
|
+
<button class="link-btn" on:click={() => setSection('mcp')}>{MCP_TAB_LINK_LABEL}</button
|
|
1205
1432
|
>
|
|
1206
|
-
|
|
1207
|
-
<
|
|
1208
|
-
<button class="link-btn" on:click={() => setSection('mcp')}>MCP tab</button>
|
|
1209
|
-
and store it as a repo secret — never commit it directly. Runs triggered this way show up
|
|
1210
|
-
in Reports tagged <Badge variant="external">External</Badge>.
|
|
1433
|
+
{CI_DESC_PART4}
|
|
1434
|
+
<Badge variant="external">{EXTERNAL_BADGE_LABEL}</Badge>.
|
|
1211
1435
|
</p>
|
|
1212
1436
|
<pre class="mcp-snippet">{ciWorkflowSnippet}</pre>
|
|
1213
1437
|
<div class="card-footer">
|
|
1214
1438
|
<Button variant="ghost" on:click={handleCopyCiSnippet}>
|
|
1215
|
-
{ciSnippetCopied
|
|
1439
|
+
{copyCiSnippetLabel(ciSnippetCopied)}
|
|
1216
1440
|
</Button>
|
|
1217
1441
|
</div>
|
|
1218
1442
|
</div>
|
|
@@ -1222,21 +1446,20 @@
|
|
|
1222
1446
|
{:else if section === 'mcp'}
|
|
1223
1447
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1224
1448
|
<div class="content-header">
|
|
1225
|
-
<h2>
|
|
1449
|
+
<h2>{MCP_HEADING}</h2>
|
|
1226
1450
|
<p class="content-desc">
|
|
1227
|
-
|
|
1228
|
-
others.
|
|
1451
|
+
{MCP_DESC}
|
|
1229
1452
|
</p>
|
|
1230
1453
|
</div>
|
|
1231
1454
|
|
|
1232
1455
|
<div class="card settings-card">
|
|
1233
|
-
<p class="card-title">
|
|
1456
|
+
<p class="card-title">{API_KEY_CARD_TITLE}</p>
|
|
1234
1457
|
|
|
1235
1458
|
{#if !mcpKeySet}
|
|
1236
|
-
<p class="content-desc">
|
|
1459
|
+
<p class="content-desc">{NO_KEY_GENERATED_MESSAGE}</p>
|
|
1237
1460
|
<div class="card-footer">
|
|
1238
1461
|
<Button on:click={handleGenerateMcpKey} disabled={mcpGenerating}>
|
|
1239
|
-
{mcpGenerating
|
|
1462
|
+
{generateKeyLabel(mcpGenerating)}
|
|
1240
1463
|
</Button>
|
|
1241
1464
|
</div>
|
|
1242
1465
|
{:else}
|
|
@@ -1251,7 +1474,7 @@
|
|
|
1251
1474
|
/>
|
|
1252
1475
|
<button
|
|
1253
1476
|
class="icon-btn"
|
|
1254
|
-
title={mcpShowKey ?
|
|
1477
|
+
title={mcpShowKey ? HIDE_KEY_TITLE : SHOW_KEY_TITLE}
|
|
1255
1478
|
on:click={() => (mcpShowKey = !mcpShowKey)}
|
|
1256
1479
|
>
|
|
1257
1480
|
{#if mcpShowKey}
|
|
@@ -1290,7 +1513,7 @@
|
|
|
1290
1513
|
</svg>
|
|
1291
1514
|
{/if}
|
|
1292
1515
|
</button>
|
|
1293
|
-
<button class="icon-btn" title=
|
|
1516
|
+
<button class="icon-btn" title={COPY_KEY_TITLE} on:click={handleCopyMcpKey}>
|
|
1294
1517
|
{#if mcpKeyCopied}
|
|
1295
1518
|
<svg
|
|
1296
1519
|
width="14"
|
|
@@ -1322,10 +1545,10 @@
|
|
|
1322
1545
|
{/if}
|
|
1323
1546
|
</button>
|
|
1324
1547
|
</div>
|
|
1325
|
-
<p class="mcp-regen-note">
|
|
1548
|
+
<p class="mcp-regen-note">{MCP_REGEN_NOTE}</p>
|
|
1326
1549
|
<div class="card-footer">
|
|
1327
1550
|
<Button variant="ghost" on:click={handleGenerateMcpKey} disabled={mcpGenerating}>
|
|
1328
|
-
{mcpGenerating
|
|
1551
|
+
{regenerateKeyLabel(mcpGenerating)}
|
|
1329
1552
|
</Button>
|
|
1330
1553
|
</div>
|
|
1331
1554
|
{/if}
|
|
@@ -1333,16 +1556,16 @@
|
|
|
1333
1556
|
|
|
1334
1557
|
{#if mcpKeySet}
|
|
1335
1558
|
<div class="card settings-card">
|
|
1336
|
-
<p class="card-title">
|
|
1559
|
+
<p class="card-title">{CONFIG_SNIPPET_CARD_TITLE}</p>
|
|
1337
1560
|
<p class="content-desc">
|
|
1338
|
-
|
|
1339
|
-
<code class="code-sample">claude_desktop_config.json</code
|
|
1340
|
-
|
|
1561
|
+
{CONFIG_SNIPPET_DESC_PREFIX}
|
|
1562
|
+
<code class="code-sample">claude_desktop_config.json</code
|
|
1563
|
+
>{CONFIG_SNIPPET_DESC_SUFFIX}
|
|
1341
1564
|
</p>
|
|
1342
1565
|
<pre class="mcp-snippet">{mcpConfigSnippet}</pre>
|
|
1343
1566
|
<div class="card-footer">
|
|
1344
1567
|
<Button variant="ghost" on:click={handleCopyMcpSnippet}>
|
|
1345
|
-
{mcpSnippetCopied
|
|
1568
|
+
{copyMcpSnippetLabel(mcpSnippetCopied)}
|
|
1346
1569
|
</Button>
|
|
1347
1570
|
</div>
|
|
1348
1571
|
</div>
|
|
@@ -1353,14 +1576,14 @@
|
|
|
1353
1576
|
{:else if section === 'account'}
|
|
1354
1577
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1355
1578
|
<div class="content-header">
|
|
1356
|
-
<h2>
|
|
1357
|
-
<p class="content-desc">
|
|
1579
|
+
<h2>{ACCOUNT_LABEL}</h2>
|
|
1580
|
+
<p class="content-desc">{ACCOUNT_DESC}</p>
|
|
1358
1581
|
</div>
|
|
1359
1582
|
|
|
1360
1583
|
<div class="card settings-card">
|
|
1361
|
-
<p class="card-title">
|
|
1584
|
+
<p class="card-title">{PROFILE_CARD_TITLE}</p>
|
|
1362
1585
|
<div class="field">
|
|
1363
|
-
<label class="field-label" for="profile-name">
|
|
1586
|
+
<label class="field-label" for="profile-name">{NAME_LABEL}</label>
|
|
1364
1587
|
<input
|
|
1365
1588
|
id="profile-name"
|
|
1366
1589
|
type="text"
|
|
@@ -1369,7 +1592,7 @@
|
|
|
1369
1592
|
/>
|
|
1370
1593
|
</div>
|
|
1371
1594
|
<div class="field">
|
|
1372
|
-
<label class="field-label" for="profile-email">
|
|
1595
|
+
<label class="field-label" for="profile-email">{EMAIL_LABEL}</label>
|
|
1373
1596
|
<input
|
|
1374
1597
|
id="profile-email"
|
|
1375
1598
|
type="email"
|
|
@@ -1383,15 +1606,15 @@
|
|
|
1383
1606
|
on:click={handleUpdateProfile}
|
|
1384
1607
|
disabled={profileSaving || !profileForm.name || !profileForm.email}
|
|
1385
1608
|
>
|
|
1386
|
-
{profileSaving
|
|
1609
|
+
{saveProfileLabel(profileSaving)}
|
|
1387
1610
|
</Button>
|
|
1388
1611
|
</div>
|
|
1389
1612
|
</div>
|
|
1390
1613
|
|
|
1391
1614
|
<div class="card settings-card">
|
|
1392
|
-
<p class="card-title">
|
|
1615
|
+
<p class="card-title">{CHANGE_PASSWORD_CARD_TITLE}</p>
|
|
1393
1616
|
<div class="field">
|
|
1394
|
-
<label class="field-label" for="pw-current">
|
|
1617
|
+
<label class="field-label" for="pw-current">{CURRENT_PASSWORD_LABEL}</label>
|
|
1395
1618
|
<input
|
|
1396
1619
|
id="pw-current"
|
|
1397
1620
|
type="password"
|
|
@@ -1401,7 +1624,7 @@
|
|
|
1401
1624
|
/>
|
|
1402
1625
|
</div>
|
|
1403
1626
|
<div class="field">
|
|
1404
|
-
<label class="field-label" for="pw-new">
|
|
1627
|
+
<label class="field-label" for="pw-new">{NEW_PASSWORD_LABEL}</label>
|
|
1405
1628
|
<input
|
|
1406
1629
|
id="pw-new"
|
|
1407
1630
|
type="password"
|
|
@@ -1411,7 +1634,7 @@
|
|
|
1411
1634
|
/>
|
|
1412
1635
|
</div>
|
|
1413
1636
|
<div class="field">
|
|
1414
|
-
<label class="field-label" for="pw-confirm">
|
|
1637
|
+
<label class="field-label" for="pw-confirm">{CONFIRM_NEW_PASSWORD_LABEL}</label>
|
|
1415
1638
|
<input
|
|
1416
1639
|
id="pw-confirm"
|
|
1417
1640
|
type="password"
|
|
@@ -1426,14 +1649,14 @@
|
|
|
1426
1649
|
on:click={handleChangePassword}
|
|
1427
1650
|
disabled={pwSaving || !pwForm.currentPassword || !pwForm.newPassword}
|
|
1428
1651
|
>
|
|
1429
|
-
{pwSaving
|
|
1652
|
+
{changePasswordLabel(pwSaving)}
|
|
1430
1653
|
</Button>
|
|
1431
1654
|
</div>
|
|
1432
1655
|
</div>
|
|
1433
1656
|
|
|
1434
1657
|
<div class="card settings-card">
|
|
1435
1658
|
<div class="card-footer">
|
|
1436
|
-
<Button variant="danger" size="sm" on:click={handleLogout}>
|
|
1659
|
+
<Button variant="danger" size="sm" on:click={handleLogout}>{SIGN_OUT_LABEL}</Button>
|
|
1437
1660
|
</div>
|
|
1438
1661
|
</div>
|
|
1439
1662
|
</div>
|
|
@@ -1442,48 +1665,49 @@
|
|
|
1442
1665
|
{:else if section === 'users'}
|
|
1443
1666
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1444
1667
|
<div class="content-header">
|
|
1445
|
-
<h2>
|
|
1446
|
-
<p class="content-desc">
|
|
1668
|
+
<h2>{USERS_LABEL}</h2>
|
|
1669
|
+
<p class="content-desc">{USERS_DESC}</p>
|
|
1447
1670
|
</div>
|
|
1448
1671
|
|
|
1449
1672
|
<ConfirmModal
|
|
1450
1673
|
bind:open={confirmDeleteUserOpen}
|
|
1451
|
-
title=
|
|
1452
|
-
confirmLabel=
|
|
1674
|
+
title={REMOVE_USER_MODAL_TITLE}
|
|
1675
|
+
confirmLabel={REMOVE_USER_LABEL}
|
|
1453
1676
|
on:confirm={() => handleDeleteUser(confirmDeleteUser?.id, confirmDeleteUser?.name)}
|
|
1454
1677
|
>
|
|
1455
1678
|
{#if confirmDeleteUser}
|
|
1456
|
-
|
|
1679
|
+
{REMOVE_USER_BODY_PREFIX}
|
|
1680
|
+
<strong>{confirmDeleteUser.name}</strong>{REMOVE_USER_BODY_SUFFIX}
|
|
1457
1681
|
{/if}
|
|
1458
1682
|
</ConfirmModal>
|
|
1459
1683
|
|
|
1460
1684
|
<div class="card settings-card">
|
|
1461
|
-
<p class="card-title">
|
|
1685
|
+
<p class="card-title">{ADD_USER_CARD_TITLE}</p>
|
|
1462
1686
|
<div class="field-row">
|
|
1463
1687
|
<div class="field">
|
|
1464
|
-
<label class="field-label" for="u-name">
|
|
1688
|
+
<label class="field-label" for="u-name">{NAME_LABEL}</label>
|
|
1465
1689
|
<input
|
|
1466
1690
|
id="u-name"
|
|
1467
1691
|
type="text"
|
|
1468
1692
|
class="field-input"
|
|
1469
1693
|
bind:value={userForm.name}
|
|
1470
|
-
placeholder=
|
|
1694
|
+
placeholder={USER_NAME_PLACEHOLDER}
|
|
1471
1695
|
/>
|
|
1472
1696
|
</div>
|
|
1473
1697
|
<div class="field">
|
|
1474
|
-
<label class="field-label" for="u-email">
|
|
1698
|
+
<label class="field-label" for="u-email">{EMAIL_LABEL}</label>
|
|
1475
1699
|
<input
|
|
1476
1700
|
id="u-email"
|
|
1477
1701
|
type="email"
|
|
1478
1702
|
class="field-input"
|
|
1479
1703
|
bind:value={userForm.email}
|
|
1480
|
-
placeholder=
|
|
1704
|
+
placeholder={USER_EMAIL_PLACEHOLDER}
|
|
1481
1705
|
/>
|
|
1482
1706
|
</div>
|
|
1483
1707
|
</div>
|
|
1484
1708
|
<div class="field-row">
|
|
1485
1709
|
<div class="field">
|
|
1486
|
-
<label class="field-label" for="u-pw">
|
|
1710
|
+
<label class="field-label" for="u-pw">{PASSWORD_LABEL}</label>
|
|
1487
1711
|
<input
|
|
1488
1712
|
id="u-pw"
|
|
1489
1713
|
type="password"
|
|
@@ -1493,17 +1717,17 @@
|
|
|
1493
1717
|
/>
|
|
1494
1718
|
</div>
|
|
1495
1719
|
<div class="field">
|
|
1496
|
-
<label class="field-label" for="u-role">
|
|
1720
|
+
<label class="field-label" for="u-role">{ROLE_LABEL}</label>
|
|
1497
1721
|
<select id="u-role" class="field-input" bind:value={userForm.role}>
|
|
1498
|
-
<option value="user">
|
|
1499
|
-
<option value="admin">
|
|
1722
|
+
<option value="user">{USER_ROLE_OPTION}</option>
|
|
1723
|
+
<option value="admin">{ADMIN_ROLE_OPTION}</option>
|
|
1500
1724
|
</select>
|
|
1501
1725
|
</div>
|
|
1502
1726
|
</div>
|
|
1503
1727
|
{#if userFormError}<p class="form-error">{userFormError}</p>{/if}
|
|
1504
1728
|
<div class="card-footer">
|
|
1505
1729
|
<Button on:click={handleCreateUser} disabled={userFormSaving}>
|
|
1506
|
-
{userFormSaving
|
|
1730
|
+
{addUserLabel(userFormSaving)}
|
|
1507
1731
|
</Button>
|
|
1508
1732
|
</div>
|
|
1509
1733
|
</div>
|
|
@@ -1520,7 +1744,7 @@
|
|
|
1520
1744
|
{#if u.id !== $auth.user?.id}
|
|
1521
1745
|
<button
|
|
1522
1746
|
class="icon-btn danger"
|
|
1523
|
-
title=
|
|
1747
|
+
title={REMOVE_USER_ICON_TITLE}
|
|
1524
1748
|
on:click={() => {
|
|
1525
1749
|
confirmDeleteUser = { id: u.id, name: u.name };
|
|
1526
1750
|
confirmDeleteUserOpen = true;
|
|
@@ -1542,7 +1766,7 @@
|
|
|
1542
1766
|
</svg>
|
|
1543
1767
|
</button>
|
|
1544
1768
|
{:else}
|
|
1545
|
-
<span class="you-chip">
|
|
1769
|
+
<span class="you-chip">{YOU_CHIP_LABEL}</span>
|
|
1546
1770
|
{/if}
|
|
1547
1771
|
</div>
|
|
1548
1772
|
{/each}
|
|
@@ -1554,35 +1778,33 @@
|
|
|
1554
1778
|
{:else if section === 'backup'}
|
|
1555
1779
|
<div class="content-section" transition:fly={{ y: 6, duration: 180 }}>
|
|
1556
1780
|
<div class="content-header">
|
|
1557
|
-
<h2>
|
|
1781
|
+
<h2>{BACKUP_LABEL}</h2>
|
|
1558
1782
|
<p class="content-desc">
|
|
1559
|
-
|
|
1560
|
-
S3-compatible storage — Cloudflare R2, Backblaze B2, AWS S3, or MinIO.
|
|
1783
|
+
{BACKUP_DESC}
|
|
1561
1784
|
</p>
|
|
1562
1785
|
</div>
|
|
1563
1786
|
|
|
1564
1787
|
<!-- Manual export / import -->
|
|
1565
1788
|
<div class="card settings-card">
|
|
1566
|
-
<p class="card-title">
|
|
1789
|
+
<p class="card-title">{MANUAL_BACKUP_CARD_TITLE}</p>
|
|
1567
1790
|
<div class="backup-row">
|
|
1568
1791
|
<div class="backup-block">
|
|
1569
|
-
<p class="backup-block-title">
|
|
1792
|
+
<p class="backup-block-title">{EXPORT_BLOCK_TITLE}</p>
|
|
1570
1793
|
<p class="backup-block-desc">
|
|
1571
|
-
|
|
1572
|
-
|
|
1794
|
+
{EXPORT_BLOCK_DESC_PREFIX} <code>.json</code>
|
|
1795
|
+
{EXPORT_BLOCK_DESC_SUFFIX}
|
|
1573
1796
|
</p>
|
|
1574
1797
|
<Button on:click={handleExport} disabled={exporting}>
|
|
1575
|
-
{exporting
|
|
1798
|
+
{exportLabel(exporting)}
|
|
1576
1799
|
</Button>
|
|
1577
1800
|
</div>
|
|
1578
1801
|
|
|
1579
1802
|
<div class="backup-divider"></div>
|
|
1580
1803
|
|
|
1581
1804
|
<div class="backup-block">
|
|
1582
|
-
<p class="backup-block-title">
|
|
1805
|
+
<p class="backup-block-title">{IMPORT_BLOCK_TITLE}</p>
|
|
1583
1806
|
<p class="backup-block-desc">
|
|
1584
|
-
|
|
1585
|
-
overwritten. Cron jobs are re-scheduled after import.
|
|
1807
|
+
{IMPORT_BLOCK_DESC}
|
|
1586
1808
|
</p>
|
|
1587
1809
|
<div class="import-row">
|
|
1588
1810
|
<label class="file-label">
|
|
@@ -1593,53 +1815,56 @@
|
|
|
1593
1815
|
class="file-input-hidden"
|
|
1594
1816
|
on:change={handleFileChange}
|
|
1595
1817
|
/>
|
|
1596
|
-
<span class="file-btn">{importFile ? importFile.name :
|
|
1818
|
+
<span class="file-btn">{importFile ? importFile.name : CHOOSE_FILE_LABEL}</span>
|
|
1597
1819
|
</label>
|
|
1598
1820
|
<Button on:click={handleImport} disabled={!importFile || importing}>
|
|
1599
|
-
{importing
|
|
1821
|
+
{importLabel(importing)}
|
|
1600
1822
|
</Button>
|
|
1601
1823
|
</div>
|
|
1602
1824
|
</div>
|
|
1603
1825
|
</div>
|
|
1604
1826
|
<p class="backup-disclaimer">
|
|
1605
|
-
|
|
1606
|
-
<code>pg_dump</code>
|
|
1827
|
+
{BACKUP_DISCLAIMER_PREFIX}
|
|
1828
|
+
<code>pg_dump</code>
|
|
1829
|
+
{BACKUP_DISCLAIMER_SUFFIX}
|
|
1607
1830
|
</p>
|
|
1608
1831
|
</div>
|
|
1609
1832
|
|
|
1610
1833
|
<!-- S3 cloud backup -->
|
|
1611
1834
|
<div class="card settings-card">
|
|
1612
|
-
<p class="card-title">
|
|
1835
|
+
<p class="card-title">{S3_STORAGE_CARD_TITLE}</p>
|
|
1613
1836
|
<p class="backup-block-desc" style="margin-bottom: 1.25rem;">
|
|
1614
|
-
|
|
1615
|
-
|
|
1837
|
+
{S3_STORAGE_DESC_PREFIX} <strong>{ENDPOINT_URL_LABEL}</strong>
|
|
1838
|
+
{S3_STORAGE_DESC_SUFFIX}
|
|
1616
1839
|
</p>
|
|
1617
1840
|
|
|
1618
1841
|
<div class="field-row">
|
|
1619
1842
|
<div class="field">
|
|
1620
1843
|
<label class="field-label" for="s3-endpoint">
|
|
1621
|
-
<span>
|
|
1622
|
-
<span class="field-hint">
|
|
1844
|
+
<span>{ENDPOINT_URL_LABEL}</span>
|
|
1845
|
+
<span class="field-hint">{ENDPOINT_URL_HINT}</span>
|
|
1623
1846
|
</label>
|
|
1624
1847
|
<input
|
|
1625
1848
|
id="s3-endpoint"
|
|
1626
1849
|
type="url"
|
|
1627
1850
|
class="field-input"
|
|
1628
1851
|
bind:value={backupConfig.backupS3Endpoint}
|
|
1629
|
-
placeholder=
|
|
1852
|
+
placeholder={ENDPOINT_URL_PLACEHOLDER}
|
|
1630
1853
|
/>
|
|
1631
1854
|
</div>
|
|
1632
1855
|
<div class="field">
|
|
1633
1856
|
<label class="field-label" for="s3-region">
|
|
1634
|
-
<span>
|
|
1635
|
-
<span class="field-hint"
|
|
1857
|
+
<span>{REGION_LABEL}</span>
|
|
1858
|
+
<span class="field-hint"
|
|
1859
|
+
>{REGION_HINT_PREFIX} <code>auto</code> {REGION_HINT_SUFFIX}</span
|
|
1860
|
+
>
|
|
1636
1861
|
</label>
|
|
1637
1862
|
<input
|
|
1638
1863
|
id="s3-region"
|
|
1639
1864
|
type="text"
|
|
1640
1865
|
class="field-input"
|
|
1641
1866
|
bind:value={backupConfig.backupS3Region}
|
|
1642
|
-
placeholder=
|
|
1867
|
+
placeholder={REGION_PLACEHOLDER}
|
|
1643
1868
|
/>
|
|
1644
1869
|
</div>
|
|
1645
1870
|
</div>
|
|
@@ -1647,27 +1872,27 @@
|
|
|
1647
1872
|
<div class="field-row">
|
|
1648
1873
|
<div class="field">
|
|
1649
1874
|
<label class="field-label" for="s3-bucket">
|
|
1650
|
-
<span>
|
|
1875
|
+
<span>{BUCKET_LABEL}</span>
|
|
1651
1876
|
</label>
|
|
1652
1877
|
<input
|
|
1653
1878
|
id="s3-bucket"
|
|
1654
1879
|
type="text"
|
|
1655
1880
|
class="field-input"
|
|
1656
1881
|
bind:value={backupConfig.backupS3Bucket}
|
|
1657
|
-
placeholder=
|
|
1882
|
+
placeholder={BUCKET_PLACEHOLDER}
|
|
1658
1883
|
/>
|
|
1659
1884
|
</div>
|
|
1660
1885
|
<div class="field">
|
|
1661
1886
|
<label class="field-label" for="s3-prefix">
|
|
1662
|
-
<span>
|
|
1663
|
-
<span class="field-hint">
|
|
1887
|
+
<span>{PATH_PREFIX_LABEL}</span>
|
|
1888
|
+
<span class="field-hint">{PATH_PREFIX_HINT}</span>
|
|
1664
1889
|
</label>
|
|
1665
1890
|
<input
|
|
1666
1891
|
id="s3-prefix"
|
|
1667
1892
|
type="text"
|
|
1668
1893
|
class="field-input"
|
|
1669
1894
|
bind:value={backupConfig.backupS3Prefix}
|
|
1670
|
-
placeholder=
|
|
1895
|
+
placeholder={PATH_PREFIX_PLACEHOLDER}
|
|
1671
1896
|
/>
|
|
1672
1897
|
</div>
|
|
1673
1898
|
</div>
|
|
@@ -1675,32 +1900,28 @@
|
|
|
1675
1900
|
<div class="field-row">
|
|
1676
1901
|
<div class="field">
|
|
1677
1902
|
<label class="field-label" for="s3-access-key">
|
|
1678
|
-
<span>
|
|
1903
|
+
<span>{ACCESS_KEY_LABEL}</span>
|
|
1679
1904
|
</label>
|
|
1680
1905
|
<input
|
|
1681
1906
|
id="s3-access-key"
|
|
1682
1907
|
type="text"
|
|
1683
1908
|
class="field-input"
|
|
1684
1909
|
bind:value={backupConfig.backupS3AccessKey}
|
|
1685
|
-
placeholder=
|
|
1910
|
+
placeholder={ACCESS_KEY_PLACEHOLDER}
|
|
1686
1911
|
autocomplete="off"
|
|
1687
1912
|
/>
|
|
1688
1913
|
</div>
|
|
1689
1914
|
<div class="field">
|
|
1690
1915
|
<label class="field-label" for="s3-secret-key">
|
|
1691
|
-
<span>
|
|
1692
|
-
<span class="field-hint"
|
|
1693
|
-
>{backupS3SecretKeySet
|
|
1694
|
-
? 'A key is already saved — leave blank to keep it'
|
|
1695
|
-
: 'Required'}</span
|
|
1696
|
-
>
|
|
1916
|
+
<span>{SECRET_KEY_LABEL}</span>
|
|
1917
|
+
<span class="field-hint">{secretKeyHint(backupS3SecretKeySet)}</span>
|
|
1697
1918
|
</label>
|
|
1698
1919
|
<input
|
|
1699
1920
|
id="s3-secret-key"
|
|
1700
1921
|
type="password"
|
|
1701
1922
|
class="field-input"
|
|
1702
1923
|
bind:value={backupConfig.backupS3SecretKey}
|
|
1703
|
-
placeholder={backupS3SecretKeySet
|
|
1924
|
+
placeholder={secretKeyPlaceholder(backupS3SecretKeySet)}
|
|
1704
1925
|
autocomplete="new-password"
|
|
1705
1926
|
/>
|
|
1706
1927
|
</div>
|
|
@@ -1708,10 +1929,10 @@
|
|
|
1708
1929
|
|
|
1709
1930
|
<div class="backup-actions">
|
|
1710
1931
|
<Button variant="ghost" on:click={handleTestS3} disabled={backupTestingS3}>
|
|
1711
|
-
{backupTestingS3
|
|
1932
|
+
{testConnectionLabel(backupTestingS3)}
|
|
1712
1933
|
</Button>
|
|
1713
1934
|
<Button on:click={handleSaveBackupConfig} disabled={backupConfigSaving}>
|
|
1714
|
-
{backupConfigSaving
|
|
1935
|
+
{saveS3ConfigLabel(backupConfigSaving)}
|
|
1715
1936
|
</Button>
|
|
1716
1937
|
</div>
|
|
1717
1938
|
|
|
@@ -1729,14 +1950,14 @@
|
|
|
1729
1950
|
|
|
1730
1951
|
<!-- Scheduled backup -->
|
|
1731
1952
|
<div class="card settings-card" class:card-disabled={!s3Configured}>
|
|
1732
|
-
<p class="card-title">
|
|
1953
|
+
<p class="card-title">{SCHEDULED_BACKUP_CARD_TITLE}</p>
|
|
1733
1954
|
|
|
1734
1955
|
{#if !s3Configured}
|
|
1735
|
-
<p class="backup-block-desc">
|
|
1956
|
+
<p class="backup-block-desc">{CONFIGURE_S3_FIRST_MESSAGE}</p>
|
|
1736
1957
|
{:else}
|
|
1737
1958
|
<div class="field">
|
|
1738
1959
|
<label class="field-label backup-toggle-label" for="backup-enabled">
|
|
1739
|
-
<span>
|
|
1960
|
+
<span>{ENABLE_SCHEDULED_BACKUP_LABEL}</span>
|
|
1740
1961
|
<button
|
|
1741
1962
|
id="backup-enabled"
|
|
1742
1963
|
class="toggle-btn"
|
|
@@ -1752,11 +1973,12 @@
|
|
|
1752
1973
|
|
|
1753
1974
|
<div class="field">
|
|
1754
1975
|
<label class="field-label" for="backup-cron">
|
|
1755
|
-
<span>
|
|
1976
|
+
<span>{CRON_EXPRESSION_LABEL}</span>
|
|
1756
1977
|
<span class="field-hint">
|
|
1757
|
-
|
|
1978
|
+
{CRON_HINT_PREFIX} <code>0 2 * * *</code>
|
|
1979
|
+
{CRON_HINT_SUFFIX}
|
|
1758
1980
|
<a href="https://crontab.guru" target="_blank" rel="noopener noreferrer"
|
|
1759
|
-
>
|
|
1981
|
+
>{CRONTAB_LINK_LABEL}</a
|
|
1760
1982
|
>
|
|
1761
1983
|
</span>
|
|
1762
1984
|
</label>
|
|
@@ -1765,16 +1987,17 @@
|
|
|
1765
1987
|
type="text"
|
|
1766
1988
|
class="field-input field-input-mono"
|
|
1767
1989
|
bind:value={backupConfig.backupCron}
|
|
1768
|
-
placeholder=
|
|
1990
|
+
placeholder={CRON_PLACEHOLDER}
|
|
1769
1991
|
/>
|
|
1770
1992
|
</div>
|
|
1771
1993
|
|
|
1772
1994
|
{#if backupLastRunAt}
|
|
1773
1995
|
<p class="backup-last-run">
|
|
1774
|
-
|
|
1996
|
+
{BACKUP_LAST_RUN_PREFIX}
|
|
1997
|
+
{new Date(backupLastRunAt).toLocaleString()} —
|
|
1775
1998
|
{#if backupLastStatus?.startsWith('success:')}
|
|
1776
1999
|
<span class="status-success"
|
|
1777
|
-
>
|
|
2000
|
+
>{uploadedToLabel(backupLastStatus.replace('success:', ''))}</span
|
|
1778
2001
|
>
|
|
1779
2002
|
{:else if backupLastStatus?.startsWith('error:')}
|
|
1780
2003
|
<span class="status-error">{backupLastStatus.replace('error:', '')}</span>
|
|
@@ -1786,10 +2009,10 @@
|
|
|
1786
2009
|
|
|
1787
2010
|
<div class="backup-actions">
|
|
1788
2011
|
<Button variant="ghost" on:click={handleRunBackupNow} disabled={backupRunningNow}>
|
|
1789
|
-
{backupRunningNow
|
|
2012
|
+
{uploadS3NowLabel(backupRunningNow)}
|
|
1790
2013
|
</Button>
|
|
1791
2014
|
<Button on:click={handleSaveBackupConfig} disabled={backupConfigSaving}>
|
|
1792
|
-
{backupConfigSaving
|
|
2015
|
+
{saveScheduleLabel(backupConfigSaving)}
|
|
1793
2016
|
</Button>
|
|
1794
2017
|
</div>
|
|
1795
2018
|
{/if}
|