diff --git a/.github/workflows/check-format.yml b/.github/workflows/check-format.yml index d3d4c0d6b..76cb300f1 100644 --- a/.github/workflows/check-format.yml +++ b/.github/workflows/check-format.yml @@ -59,4 +59,4 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh pr close "$PR_NUMBER" --delete-branch --comment "❌ Formatting check failed — PR auto-closed. - Please run \`npm run format\` and push again." + Please run \`npm run format\` in both `client` and `server` directories and push again." diff --git a/.github/workflows/deploy-images-on-release.yml b/.github/workflows/deploy-images-on-release.yml index f1d0dd7ce..cf06f7840 100644 --- a/.github/workflows/deploy-images-on-release.yml +++ b/.github/workflows/deploy-images-on-release.yml @@ -11,6 +11,9 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Extract version from tag id: extract_tag run: echo "version=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" @@ -93,6 +96,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -119,12 +124,16 @@ jobs: platforms: linux/amd64,linux/arm64 labels: | org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate + build-args: | + VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }} docker-build-and-push-server-mono: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Extract version id: extract_tag @@ -143,6 +152,7 @@ jobs: -t ghcr.io/bluewave-labs/checkmate-backend-mono:${{ steps.extract_tag.outputs.version }} \ -f ./docker/dist-mono/server.Dockerfile \ --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \ + --build-arg VITE_APP_VERSION=${{ steps.extract_tag.outputs.version }} \ . - name: Push Server Docker image diff --git a/.github/workflows/deploy-images.yml b/.github/workflows/deploy-images.yml index d3d70b90b..fa39fed85 100644 --- a/.github/workflows/deploy-images.yml +++ b/.github/workflows/deploy-images.yml @@ -10,6 +10,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -18,12 +20,16 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get version + id: vars + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - name: Build Client Docker image run: | docker build \ -t ghcr.io/bluewave-labs/checkmate-client:latest \ -f ./docker/dist/client.Dockerfile \ --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \ + --build-arg VITE_APP_VERSION=${{ env.VERSION }} \ . - name: Push Client Docker image @@ -85,6 +91,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -96,6 +104,10 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get version + id: vars + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + - name: Build and push multi-arch Docker image uses: docker/build-push-action@v5 with: @@ -107,12 +119,16 @@ jobs: platforms: linux/amd64,linux/arm64 labels: | org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate + build-args: | + VITE_APP_VERSION=${{ env.VERSION }} docker-build-and-push-server-mono: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -121,12 +137,17 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get version + id: vars + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + - name: Build Server Docker image run: | docker build \ -t ghcr.io/bluewave-labs/checkmate-backend-mono:latest \ -f ./docker/dist-mono/server.Dockerfile \ --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \ + --build-arg VITE_APP_VERSION=${{ env.VERSION }} \ . - name: Push Server Docker image diff --git a/.github/workflows/production-deploy.yml b/.github/workflows/production-deploy.yml index 6956f5caa..7764c488b 100644 --- a/.github/workflows/production-deploy.yml +++ b/.github/workflows/production-deploy.yml @@ -10,6 +10,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -18,12 +20,16 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get version + id: vars + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - name: Build Client Docker image run: | docker build \ -t ghcr.io/bluewave-labs/checkmate:frontend-demo \ -f ./docker/prod/client.Dockerfile \ --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \ + --build-arg VITE_APP_VERSION=${{ env.VERSION }} \ . - name: Push Client Docker image diff --git a/.github/workflows/staging-deploy.yml b/.github/workflows/staging-deploy.yml index 34fa243c6..ea5477815 100644 --- a/.github/workflows/staging-deploy.yml +++ b/.github/workflows/staging-deploy.yml @@ -10,6 +10,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 @@ -18,12 +20,16 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - name: Get version + id: vars + run: echo "VERSION=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - name: Build Client Docker image run: | docker build \ -t ghcr.io/bluewave-labs/checkmate:frontend-staging \ -f ./docker/staging/client.Dockerfile \ --label org.opencontainers.image.source=https://github.com/bluewave-labs/checkmate \ + --build-arg VITE_APP_VERSION=${{ env.VERSION }} \ . - name: Push Client Docker image diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs index 7d6029d4b..86d523a6f 100644 --- a/client/.eslintrc.cjs +++ b/client/.eslintrc.cjs @@ -16,4 +16,8 @@ module.exports = { "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], "react/no-unescaped-entities": "off", }, + globals: { + __APP_VERSION__: "readonly", + process: "readonly", + }, }; diff --git a/client/src/Components/MonitorDetailsControlHeader/index.jsx b/client/src/Components/MonitorDetailsControlHeader/index.jsx index 5ad665069..1d253e3d5 100644 --- a/client/src/Components/MonitorDetailsControlHeader/index.jsx +++ b/client/src/Components/MonitorDetailsControlHeader/index.jsx @@ -83,23 +83,24 @@ const MonitorDetailsControlHeader = ({ > {t("menu.incidents")} - - + {isAdmin && ( + + )} {isAdmin && ( diff --git a/client/src/Pages/StatusPage/Create/Components/Tabs/Settings.jsx b/client/src/Pages/StatusPage/Create/Components/Tabs/Settings.jsx index 4242f931c..a1ba117b0 100644 --- a/client/src/Pages/StatusPage/Create/Components/Tabs/Settings.jsx +++ b/client/src/Pages/StatusPage/Create/Components/Tabs/Settings.jsx @@ -117,7 +117,7 @@ const TabSettings = ({ component="h2" variant="h2" > - {t("settingsAppearance")} + {t("statusPageCreateAppearanceTitle")} {t("statusPageCreateAppearanceDescription")} diff --git a/client/src/Pages/StatusPage/Create/index.jsx b/client/src/Pages/StatusPage/Create/index.jsx index aa0b27ac0..94eaa4f81 100644 --- a/client/src/Pages/StatusPage/Create/index.jsx +++ b/client/src/Pages/StatusPage/Create/index.jsx @@ -62,6 +62,7 @@ const CreateStatusPage = () => { useStatusPageFetch(isCreate, url); const [deleteStatusPage, isDeleting] = useStatusPageDelete(fetchStatusPage, url); + console.log(JSON.stringify(form, null, 2)); // Handlers const handleFormChange = (e) => { let { type, name, value, checked } = e.target; @@ -190,7 +191,7 @@ const CreateStatusPage = () => { } let newLogo = undefined; - if (statusPage.logo) { + if (statusPage.logo && Object.keys(statusPage.logo).length > 0) { newLogo = { src: `data:${statusPage.logo.contentType};base64,${statusPage.logo.data}`, name: "logo", @@ -293,7 +294,7 @@ const CreateStatusPage = () => { color="accent" onClick={handleSubmit} > - {t("settingsSave")} + {t("statusPageCreate.buttonSave")} diff --git a/client/src/Pages/StatusPage/Status/index.jsx b/client/src/Pages/StatusPage/Status/index.jsx index af5eedeab..7903b097b 100644 --- a/client/src/Pages/StatusPage/Status/index.jsx +++ b/client/src/Pages/StatusPage/Status/index.jsx @@ -53,7 +53,7 @@ const PublicStatus = () => { return ; } - if (monitors.length === 0) { + if (monitors?.length === 0) { return ( { } + element={ + + + + } /> diff --git a/client/src/Utils/NetworkService.js b/client/src/Utils/NetworkService.js index 714268b0b..414c45a22 100644 --- a/client/src/Utils/NetworkService.js +++ b/client/src/Utils/NetworkService.js @@ -549,6 +549,7 @@ class NetworkService { * @param {number} config.limit - The maximum number of checks to retrieve. * @param {string} config.dateRange - The range of dates for which to retrieve checks. * @param {string} config.filter - The filter to apply to the checks. + * @param {boolean} config.ack - The acknowledgment status to apply to the checks. * @param {number} config.page - The page number to retrieve in a paginated list. * @param {number} config.rowsPerPage - The number of rows per page in a paginated list. * @returns {Promise} The response from the axios GET request. @@ -562,6 +563,7 @@ class NetworkService { if (config.limit) params.append("limit", config.limit); if (config.dateRange) params.append("dateRange", config.dateRange); if (config.filter) params.append("filter", config.filter); + if (config.ack !== undefined) params.append("ack", config.ack); if (config.page) params.append("page", config.page); if (config.rowsPerPage) params.append("rowsPerPage", config.rowsPerPage); if (config.status !== undefined) params.append("status", config.status); @@ -581,6 +583,7 @@ class NetworkService { * @param {number} config.limit - The maximum number of checks to retrieve. * @param {string} config.dateRange - The range of dates for which to retrieve checks. * @param {string} config.filter - The filter to apply to the checks. + * @param {boolean} config.ack - The acknowledgment status to apply to the checks. * @param {number} config.page - The page number to retrieve in a paginated list. * @param {number} config.rowsPerPage - The number of rows per page in a paginated list. * @returns {Promise} The response from the axios GET request. @@ -592,12 +595,30 @@ class NetworkService { if (config.limit) params.append("limit", config.limit); if (config.dateRange) params.append("dateRange", config.dateRange); if (config.filter) params.append("filter", config.filter); + if (config.ack !== undefined) params.append("ack", config.ack); if (config.page) params.append("page", config.page); if (config.rowsPerPage) params.append("rowsPerPage", config.rowsPerPage); - if (config.status !== undefined) params.append("status", config.status); return this.axiosInstance.get(`/checks/team?${params.toString()}`); }; + /** + * ************************************ + * Update the status of a check + * ************************************ + * + * @async + * @param {Object} config - The configuration object. + * @param {string} config.checkId - The ID of the check to update. + * @param {boolean} config.ack - The acknowledgment to update the check to. + * @returns {Promise} The response from the axios PUT request. + * + */ + async updateCheckStatus(config) { + return this.axiosInstance.put(`/checks/check/${config.checkId}`, { + ack: config.ack, + }); + } + /** * ************************************ * Get all checks for a given user diff --git a/client/src/Utils/Theme/globalTheme.js b/client/src/Utils/Theme/globalTheme.js index ae014432d..eb827a907 100644 --- a/client/src/Utils/Theme/globalTheme.js +++ b/client/src/Utils/Theme/globalTheme.js @@ -36,6 +36,11 @@ const baseTheme = (palette) => ({ color: palette.primary.contrastTextTertiary, fontWeight: 400, }, + label: { + fontSize: "var(--env-var-font-size-medium)", + color: palette.primary.contrastTextSecondary, + fontWeight: 500, + }, }, /* TODO change to 4 */ spacing: 2, diff --git a/client/src/locales/ar.json b/client/src/locales/ar.json index 81a2bb05f..a7b64dd80 100644 --- a/client/src/locales/ar.json +++ b/client/src/locales/ar.json @@ -3,38 +3,11 @@ "title": "", "distributedStatusHeaderText": "", "distributedStatusSubHeaderText": "", - "settingsGeneralSettings": "", - "settingsDisplayTimezone": "", - "settingsDisplayTimezoneDescription": "", - "settingsAppearance": "", - "settingsAppearanceDescription": "", - "settingsThemeMode": "", - "settingsLanguage": "", - "settingsEnabled": "", "settingsDisabled": "", - "settingsHistoryAndMonitoring": "", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "", - "settingsClearAllStats": "", - "settingsClearAllStatsButton": "", - "settingsClearAllStatsDialogTitle": "", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "", - "settingsSave": "", "settingsSuccessSaved": "", "settingsFailedToSave": "", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "", "DeleteAccountButton": "", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "", - "settingsThemeModeDark": "", - "settingsClearAllStatsDialogCancel": "", "commonSaving": "", "navControls": "", "incidentsPageTitle": "", @@ -461,26 +419,18 @@ "passwordRequirements": "", "saving": "" }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/cs.json b/client/src/locales/cs.json index 4e1170ee7..a5249ebbd 100644 --- a/client/src/locales/cs.json +++ b/client/src/locales/cs.json @@ -3,38 +3,11 @@ "title": "", "distributedStatusHeaderText": "", "distributedStatusSubHeaderText": "", - "settingsGeneralSettings": "Obecná nastavení", - "settingsDisplayTimezone": "", - "settingsDisplayTimezoneDescription": "", - "settingsAppearance": "Vzhled", - "settingsAppearanceDescription": "", - "settingsThemeMode": "", - "settingsLanguage": "Jazyk", - "settingsEnabled": "Zapnuto", "settingsDisabled": "Vypnuto", - "settingsHistoryAndMonitoring": "Historie a monitorování", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "", - "settingsClearAllStats": "", - "settingsClearAllStatsButton": "", - "settingsClearAllStatsDialogTitle": "", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "Vyvinuto společností Bluewave Labs.", - "settingsSave": "Uložit", "settingsSuccessSaved": "Nastavení bylo úspěšně uloženo", "settingsFailedToSave": "Nepodařilo se uložit nastavení", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "", "DeleteAccountButton": "", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "", - "settingsThemeModeDark": "", - "settingsClearAllStatsDialogCancel": "", "commonSaving": "", "navControls": "", "incidentsPageTitle": "", @@ -461,26 +419,18 @@ "passwordRequirements": "", "saving": "" }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/de.json b/client/src/locales/de.json index e33adab68..948c384d8 100644 --- a/client/src/locales/de.json +++ b/client/src/locales/de.json @@ -3,57 +3,30 @@ "title": "Titel", "distributedStatusHeaderText": "", "distributedStatusSubHeaderText": "", - "settingsGeneralSettings": "Einstellungen", - "settingsDisplayTimezone": "Zeitzone anzeigen", - "settingsDisplayTimezoneDescription": "", - "settingsAppearance": "", - "settingsAppearanceDescription": "", - "settingsThemeMode": "Theme modus", - "settingsLanguage": "Sprache", - "settingsEnabled": "Aktiv", - "settingsDisabled": "", - "settingsHistoryAndMonitoring": "", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "", - "settingsClearAllStats": "", - "settingsClearAllStatsButton": "", - "settingsClearAllStatsDialogTitle": "", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "", - "settingsSave": "", - "settingsSuccessSaved": "", - "settingsFailedToSave": "", - "settingsStatsCleared": "", - "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", + "settingsDisabled": "Inaktiv", + "settingsSuccessSaved": "Einstellungen erfolgreich gespeichert", + "settingsFailedToSave": "Fehler beim Speichern der Einstellungen", + "settingsStatsCleared": "Statistiken gelöscht", + "settingsFailedToClearStats": "Fehler beim löschen der Statistiken", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", "starPromptTitle": "", "starPromptDescription": "", - "https": "", - "http": "", + "https": "HTTPS", + "http": "HTTP", "monitor": "", - "aboutus": "", - "now": "", - "delete": "", - "configure": "", - "responseTime": "", - "ms": "", + "aboutus": "Über uns", + "now": "Jetzt", + "delete": "Löschen", + "configure": "Einstellungen", + "responseTime": "Antwortzeit", + "ms": "ms", "bar": "", "area": "", - "country": "", - "city": "", - "response": "", + "country": "Land", + "city": "Stadt", + "response": "Antwort", "monitorStatusUp": "", "monitorStatusDown": "", "webhookSendSuccess": "", @@ -67,7 +40,7 @@ "distributedUptimeCreateChecksDescription": "", "distributedUptimeCreateIncidentNotification": "", "distributedUptimeCreateIncidentDescription": "", - "distributedUptimeCreateAdvancedSettings": "", + "distributedUptimeCreateAdvancedSettings": "Erweiterte Einstellungen", "distributedUptimeDetailsNoMonitorHistory": "", "distributedUptimeDetailsStatusHeaderUptime": "", "distributedUptimeDetailsStatusHeaderLastUpdate": "", @@ -76,33 +49,33 @@ "testNotification": "", "addOrEditNotifications": "", "slack": { - "label": "", + "label": "Slack", "description": "", - "webhookLabel": "", + "webhookLabel": "Webhook URL", "webhookPlaceholder": "", "webhookRequired": "" }, "discord": { - "label": "", + "label": "Discord", "description": "", - "webhookLabel": "", + "webhookLabel": "Discord Webhook URL", "webhookPlaceholder": "", "webhookRequired": "" }, "telegram": { - "label": "", + "label": "Telegram", "description": "", "tokenLabel": "", - "tokenPlaceholder": "", + "tokenPlaceholder": "123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11", "chatIdLabel": "", - "chatIdPlaceholder": "", + "chatIdPlaceholder": "-1001234567890", "fieldsRequired": "" }, "webhook": { - "label": "", + "label": "Webhooks", "description": "", - "urlLabel": "", - "urlPlaceholder": "", + "urlLabel": "Webhook URL", + "urlPlaceholder": "https://your-server.com/webhook", "urlRequired": "" }, "testNotificationDevelop": "", @@ -151,14 +124,14 @@ "distributedUptimeStatusLogoUploadButton": "", "distributedUptimeStatusStandardMonitorsHeader": "", "distributedUptimeStatusStandardMonitorsDescription": "", - "distributedUptimeStatusCreateYour": "", - "distributedUptimeStatusEditYour": "", + "distributedUptimeStatusCreateYour": "Erstelle Dein", + "distributedUptimeStatusEditYour": "Ändere Dein", "distributedUptimeStatusPublishedLabel": "", - "distributedUptimeStatusCompanyNameLabel": "", + "distributedUptimeStatusCompanyNameLabel": "Firmenname", "distributedUptimeStatusPageAddressLabel": "", - "distributedUptimeStatus30Days": "", - "distributedUptimeStatus60Days": "", - "distributedUptimeStatus90Days": "", + "distributedUptimeStatus30Days": "30 Tage", + "distributedUptimeStatus60Days": "60 Tage", + "distributedUptimeStatus90Days": "90 Tage", "distributedUptimeStatusPageNotSetUp": "", "distributedUptimeStatusContactAdmin": "", "distributedUptimeStatusPageNotPublic": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "", "DeleteAccountButton": "", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "", - "settingsThemeModeDark": "", - "settingsClearAllStatsDialogCancel": "", "commonSaving": "", "navControls": "", "incidentsPageTitle": "", @@ -461,26 +419,18 @@ "passwordRequirements": "", "saving": "" }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 5c81a6e14..aad4c1359 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -387,6 +387,7 @@ "incidentsOptionsHeaderFilterBy": "Filter by:", "incidentsOptionsHeaderFilterCannotResolve": "Cannot resolve", "incidentsOptionsHeaderFilterDown": "Down", + "incidentsOptionsHeaderFilterResolved": "Resolved", "incidentsOptionsHeaderLastDay": "Last day", "incidentsOptionsHeaderLastHour": "Last hour", "incidentsOptionsHeaderLastWeek": "Last week", @@ -587,10 +588,6 @@ "now": "Now", "os": "OS", "pageSpeedAddApiKey": "to add your API key.", - "pageSpeedApiKeyFieldDescription": "Enter your Google PageSpeed API key to enable pagespeed monitoring. Click Reset to update the key.", - "pageSpeedApiKeyFieldLabel": "PageSpeed API key", - "pageSpeedApiKeyFieldResetLabel": "API key is set. Click Reset to change it.", - "pageSpeedApiKeyFieldTitle": "Google PageSpeed API key", "pageSpeedConfigureSettingsDescription": "Here you can select the URL of the host, together with the type of monitor.", "pageSpeedDetailsPerformanceReport": "Values are estimated and may vary.", "pageSpeedDetailsPerformanceReportCalculator": "See calculator", @@ -664,74 +661,98 @@ "selectAll": "Select all", "sendTestNotifications": "Send test notifications", "seperateEmails": "You can separate multiple emails with a comma", - "settingURLDisabled": "Disabled", - "settingsAbout": "About", - "settingsAddDemoMonitorsButton": "Add demo monitors", - "settingsAppearance": "Appearance", - "settingsAppearanceDescription": "Switch between light and dark mode, or change user interface language", - "settingsClearAllStats": "Clear all stats. This is irreversible.", - "settingsClearAllStatsButton": "Clear all stats", - "settingsClearAllStatsDialogCancel": "Cancel", - "settingsClearAllStatsDialogConfirm": "Yes, clear all stats", - "settingsClearAllStatsDialogDescription": "Once removed, the monitoring history and stats cannot be retrieved.", - "settingsClearAllStatsDialogTitle": "Do you want to clear all stats?", - "settingsDemoMonitors": "Demo monitors", - "settingsDemoMonitorsAdded": "Successfully added demo monitors", - "settingsDemoMonitorsDescription": "Add sample monitors for demonstration purposes.", - "settingsDevelopedBy": "Developed by Bluewave Labs.", "settingsDisabled": "Disabled", - "settingsDisplayTimezone": "Display timezone", - "settingsDisplayTimezoneDescription": "Select the timezone used to display dates and times throughout the application.", - "settingsEmail": "Email", - "settingsEmailAddress": "Email address - Used for authentication", - "settingsEmailConnectionHost": "Email connection host - Hostname to use in the HELO/EHLO greeting", - "settingsEmailDescription": "Configure the email settings for your system. This is used to send notifications and alerts.", - "settingsEmailFieldResetLabel": "Password is set. Click Reset to change it.", - "settingsEmailHost": "Email host - Hostname or IP address to connect to", - "settingsEmailIgnoreTLS": "Ignore TLS - Disable STARTTLS", - "settingsEmailPassword": "Email password - Password for authentication", - "settingsEmailPool": "Pool - Enable connection pooling", - "settingsEmailPort": "Email port - Port to connect to", - "settingsEmailRejectUnauthorized": "Reject Unauthorized", - "settingsEmailRequireTLS": "Require TLS - Force STARTTLS", - "settingsEmailRequiredFields": "Email address, host, port and password are required", - "settingsEmailSecure": "Secure - Use SSL", - "settingsEmailTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP", - "settingsEmailTransportLinkDescription": "This builds an SMTP transport for NodeMailer", - "settingsEmailTransportLinkText": "See specifications here", "settingsEmailUser": "Email user - Username for authentication, overrides email address if specified", - "settingsEnabled": "Enabled", "settingsFailedToAddDemoMonitors": "Failed to add demo monitors", "settingsFailedToClearStats": "Failed to clear stats", "settingsFailedToDeleteMonitors": "Failed to delete all monitors", "settingsFailedToSave": "Failed to save settings", - "settingsGeneralSettings": "General settings", - "settingsHistoryAndMonitoring": "History of monitoring", - "settingsHistoryAndMonitoringDescription": "Define how long you want to retain historical data. You can also clear all existing data.", - "settingsLanguage": "Language", "settingsMonitorsDeleted": "Successfully deleted all monitors", - "settingsRemoveAllMonitorsButton": "Remove all monitors", - "settingsRemoveAllMonitorsDialogConfirm": "Yes, remove all monitors", - "settingsRemoveAllMonitorsDialogTitle": "Do you want to remove all monitors?", + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "Developed by Bluewave Labs", + "labelVersion": "Version", + "title": "About" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "Add demo monitors", + "description": "Add sample monitors for demonstration purposes.", + "title": "Demo monitors" + }, + "emailSettings": { + "buttonSendTestEmail": "Send test e-mail", + "description": "Configure the email settings for your system. This is used to send notifications and alerts.", + "descriptionTransport": "This builds an SMTP transport for NodeMailer", + "labelAddress": "Email address - Used for authentication", + "labelConnectionHost": "Email connection host - Hostname to use in the HELO/EHLO greeting", + "labelHost": "Email host - Hostname or IP address to connect to", + "labelIgnoreTLS": "Disable STARTTLS: Don't use TLS even if the server supports it", + "labelPassword": "Email password - Password for authentication", + "labelPasswordSet": "Password is set. Click Reset to change it.", + "labelPool": "Enable connection pooling: Reuse existing connections to improve performance", + "labelPort": "Email port - Port to connect to", + "labelRejectUnauthorized": "Reject invalid certificates: Reject connections with self-signed or untrusted certificates", + "labelRequireTLS": "Force STARTTLS: Require TLS upgrade, fail if not supported", + "labelSecure": "Use SSL (recommended): Encrypt the connection using SSL/TLS", + "labelTLSServername": "TLS Servername - Optional Hostname for TLS Validation when host is an IP", + "labelUser": "Email user - Username for authentication, overrides email address if specified", + "linkTransport": "See specifications here", + "placeholderUser": "Leave empty if not required", + "title": "Email" + }, + "pageSpeedSettings": { + "description": "Enter your Google PageSpeed API key to enable Google PageSpeed monitoring. Click Reset to update the key.", + "labelApiKey": "PageSpeed API key", + "labelApiKeySet": "API key is set. Click Reset to change it.", + "title": "Google PageSpeed API key" + }, + "saveButtonLabel": "Save", + "statsSettings": { + "clearAllStatsButton": "Clear all stats", + "clearAllStatsDescription": "Clear all stats. This is irreversible.", + "clearAllStatsDialogConfirm": "Yes, clear all stats", + "clearAllStatsDialogDescription": "Once removed, the monitoring history and stats cannot be retrieved.", + "clearAllStatsDialogTitle": "Do you want to clear all stats?", + "description": "Define how long you want to retain historical data. You can also clear all existing data.", + "labelTTL": "The days you want to keep monitoring history.", + "labelTTLOptional": "0 for infinite", + "title": "Monitor history" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "Remove all monitors", + "description": "Remove all monitors from your system.", + "dialogConfirm": "Yes, remove all monitors", + "dialogDescription": "Once removed, the monitors cannot be retrieved.", + "dialogTitle": "Do you want to remove all monitors?", + "title": "System reset" + }, + "timezoneSettings": { + "description": "Select the timezone used to display dates and times throughout the application.", + "label": "Display timezone", + "title": "Display timezone" + }, + "title": "Settings", + "uiSettings": { + "description": "Switch between light and dark mode, or change user interface language.", + "labelLanguage": "Language", + "labelTheme": "Theme mode", + "title": "Appearance" + }, + "urlSettings": { + "description": "Display the IP address or URL of monitor on the public Status page. If it's disabled, only the monitor name will be shown to protect sensitive information.", + "label": "Display IP/URL on status page", + "selectDisabled": "Disabled", + "selectEnabled": "Enabled", + "title": "Monitor IP/URL on Status Page" + } + }, "settingsSave": "Save", "settingsStatsCleared": "Stats cleared successfully", "settingsSuccessSaved": "Settings saved successfully", - "settingsSystemReset": "System reset", - "settingsSystemResetDescription": "Remove all monitors from your system.", - "settingsTTLLabel": "The days you want to keep monitoring history.", - "settingsTTLOptionalLabel": "0 for infinite", - "settingsTestEmail": "Send test e-mail", "settingsTestEmailFailed": "Failed to send test email", "settingsTestEmailFailedWithReason": "Failed to send test email: {{reason}}", "settingsTestEmailSuccess": "Test email sent successfully", "settingsTestEmailUnknownError": "Unknown error", - "settingsThemeMode": "Theme Mode", - "settingsThemeModeDark": "Dark", - "settingsThemeModeLight": "Light", - "settingsURLDescription": "Display the IP address or URL of monitor on the public Status page. If it's disabled, only the monitor name will be shown to protect sensitive information.", - "settingsURLEnabled": "Enabled", - "settingsURLSelectTitle": "Display IP/URL on status page", - "settingsURLTitle": "Monitor IP/URL on Status Page", "showAdminLoginLink": "Show \"Administrator? Login Here\" link on the status page", "showCharts": "Show charts", "showUptimePercentage": "Show uptime percentage", @@ -750,7 +771,11 @@ "pending": "Pending...", "up": "Your site is up." }, + "statusPageCreate": { + "buttonSave": "Save" + }, "statusPageCreateAppearanceDescription": "Define the default look and feel of your public status page.", + "statusPageCreateAppearanceTitle": "Appearance", "statusPageCreateBasicInfoDescription": "Define company name and the subdomain that your status page points to.", "statusPageCreateBasicInfoStatusPageAddress": "Your status page address", "statusPageCreateSelectTimeZoneDescription": "Select the timezone that your status page will be displayed in.", diff --git a/client/src/locales/es.json b/client/src/locales/es.json index 3579117ae..4cbd91336 100644 --- a/client/src/locales/es.json +++ b/client/src/locales/es.json @@ -3,38 +3,11 @@ "title": "Titulo", "distributedStatusHeaderText": "", "distributedStatusSubHeaderText": "", - "settingsGeneralSettings": "", - "settingsDisplayTimezone": "", - "settingsDisplayTimezoneDescription": "", - "settingsAppearance": "", - "settingsAppearanceDescription": "", - "settingsThemeMode": "", - "settingsLanguage": "", - "settingsEnabled": "", "settingsDisabled": "", - "settingsHistoryAndMonitoring": "", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "", - "settingsClearAllStats": "", - "settingsClearAllStatsButton": "", - "settingsClearAllStatsDialogTitle": "", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "", - "settingsSave": "", "settingsSuccessSaved": "", "settingsFailedToSave": "", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "", "DeleteAccountButton": "", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "", - "settingsThemeModeDark": "", - "settingsClearAllStatsDialogCancel": "", "commonSaving": "", "navControls": "", "incidentsPageTitle": "", @@ -461,26 +419,18 @@ "passwordRequirements": "", "saving": "" }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/fi.json b/client/src/locales/fi.json index d92fcf8db..1783f8a07 100644 --- a/client/src/locales/fi.json +++ b/client/src/locales/fi.json @@ -3,38 +3,11 @@ "title": "Otsikko", "distributedStatusHeaderText": "Reaaliaikainen kattavuus oikeilla laitteilla", "distributedStatusSubHeaderText": "Miljoonien laitteiden voimin ympäri maailman näet järjestelmän suorituskyvyn maailman alueittain, maittain tai kaupungeittain", - "settingsGeneralSettings": "Yleiset asetukset", - "settingsDisplayTimezone": "Näytä aikavyöhyke", - "settingsDisplayTimezoneDescription": "Valitse sovelluksessa käytettävä aikavyöhyke päivämäärien ja aikojen näyttämiseen.", - "settingsAppearance": "Ulkonäkö", - "settingsAppearanceDescription": "Vaihda teema vaaleaksi tai tummaksi tai vaihda käyttöliittymän kieli", - "settingsThemeMode": "Teematila", - "settingsLanguage": "Kieli", - "settingsEnabled": "Käytössä", "settingsDisabled": "Poistettu käytöstä", - "settingsHistoryAndMonitoring": "Valvonnan historia", - "settingsHistoryAndMonitoringDescription": "Määritä, kuinka pitkään haluat säilyttää historiallisia tietoja. Voit myös tyhjentää kaikki olemassa olevat tiedot.", - "settingsTTLLabel": "Kuinka monta päivää haluat säilyttää valvontahistorian.", - "settingsTTLOptionalLabel": "0 on ääretön", - "settingsClearAllStats": "Tyhjennä kaikki tilastot. Tämä on peruuttamaton.", - "settingsClearAllStatsButton": "Tyhjennä kaikki tilastot", - "settingsClearAllStatsDialogTitle": "Haluatko tyhjentää kaikki tilastot?", - "settingsClearAllStatsDialogDescription": "Kun valvontahistoria ja tilastot on poistettu, niitä ei voi palauttaa.", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "Tietoja", - "settingsDevelopedBy": "Kehittänyt Bluewave Labs.", - "settingsSave": "Tallenna", "settingsSuccessSaved": "", "settingsFailedToSave": "", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "Ei valittua tiedostoa", "fallbackPage": "" }, - "settingsSystemReset": "Järjestelmän palautus", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "Poista tili", "DeleteAccountButton": "Poista tili", "publicLink": "Julkinen linkki", "maskedPageSpeedKeyPlaceholder": "*************************************", - "pageSpeedApiKeyFieldTitle": "Google PageSpeed API-avain", - "pageSpeedApiKeyFieldLabel": "PageSpeed API-avain", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "Palauta", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "Salasana", "team": "Tiimi", "logOut": "Kirjaudu ulos", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "Sähköpostiasetukset", - "settingsEmailDescription": "Määritä sähköpostiasetukset", - "settingsEmailHost": "", - "settingsEmailPort": "Sähköpostin portti - Portti johon yhdistetään", - "settingsEmailAddress": "Sähköpostiosoite - Käytetään tunnistautumiseen", - "settingsEmailPassword": "Sähköpostin salasana - Salasana tunnistautumiseen", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "Salasana on asetettu. Paina Palauta vaihtaaksesi sen.", "state": "Tila", "statusBreadCrumbsStatusPages": "Tilasivut", "statusBreadCrumbsDetails": "Tiedot", - "settingsThemeModeLight": "Vaalea", - "settingsThemeModeDark": "Tumma", - "settingsClearAllStatsDialogCancel": "Peruuta", "commonSaving": "Tallennetaan...", "navControls": "Ohjaimet", "incidentsPageTitle": "Häiriöt", @@ -461,26 +419,18 @@ "passwordRequirements": "Uuden salasanan on oltava vähintään 8 merkkiä pitkä ja sen on sisältävä vähintään yksi iso kirjain, yksi pieni kirjain, yksi numero sekä yksi erikoismerkki.", "saving": "Tallennetaan..." }, - "settingsEmailConnectionHost": "", "emailSent": "Sähköpostin lähetys onnistui", "failedToSendEmail": "Sähköpostin lähetys epäonnistui", - "settingsTestEmail": "Lähetä testi sähköposti", "settingsTestEmailSuccess": "Testisähköpostin lähetys onnistui", "settingsTestEmailFailed": "Testisähköpostin lähetys epäonnistui", "settingsTestEmailFailedWithReason": "Testisähköpostin lähetys epäonnistui: {{reason}}", "settingsTestEmailUnknownError": "Tuntematon virhe", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "Valvonta on keskeytetty.", "up": "Sivusi on ylhäällä.", "down": "Sivusi on alhaalla.", "pending": "Odottaa..." }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/fr.json b/client/src/locales/fr.json index 729296216..5aabeb6e3 100644 --- a/client/src/locales/fr.json +++ b/client/src/locales/fr.json @@ -3,38 +3,11 @@ "title": "Titre", "distributedStatusHeaderText": "", "distributedStatusSubHeaderText": "", - "settingsGeneralSettings": "Paramètres généraux", - "settingsDisplayTimezone": "Fuseau horaire d'affichage", - "settingsDisplayTimezoneDescription": "Le fuseau horaire du tableau de bord que vous affichez publiquement.", - "settingsAppearance": "Apparence", - "settingsAppearanceDescription": "", - "settingsThemeMode": "", - "settingsLanguage": "Langue", - "settingsEnabled": "Activé", "settingsDisabled": "Désactivé", - "settingsHistoryAndMonitoring": "", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "0 pour infini", - "settingsClearAllStats": "Effacer les stats. C'est irréversible.", - "settingsClearAllStatsButton": "Effacer les stats", - "settingsClearAllStatsDialogTitle": "Voulez-vous effacer toutes les stats ?", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "Oui, effacer les stats", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "", - "settingsSave": "", "settingsSuccessSaved": "", "settingsFailedToSave": "", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "Supprimer le compte", "DeleteAccountButton": "Supprimer le compte", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "Déconnexion", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "Email", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "Clair", - "settingsThemeModeDark": "Sombre", - "settingsClearAllStatsDialogCancel": "Annuler", "commonSaving": "Sauvegarde...", "navControls": "", "incidentsPageTitle": "Incidents", @@ -461,26 +419,18 @@ "passwordRequirements": "Le nouveau mot de passe doit contenir au moins 8 caractères et au moins une lettre majuscule, une lettre minuscule, un chiffre et un caractère spécial.", "saving": "Sauvegarde..." }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "Erreur inconnue", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/pt-BR.json b/client/src/locales/pt-BR.json index fa6197bb3..37604b53b 100644 --- a/client/src/locales/pt-BR.json +++ b/client/src/locales/pt-BR.json @@ -3,38 +3,11 @@ "title": "Título", "distributedStatusHeaderText": "Cobertura em tempo real e em dispositivos reais", "distributedStatusSubHeaderText": "Impulsionado por milhões de dispositivos em todo o mundo, visualize o desempenho do sistema por região global, país ou cidade", - "settingsGeneralSettings": "Configurações gerais", - "settingsDisplayTimezone": "Fuso horário", - "settingsDisplayTimezoneDescription": "Selecione o fuso horário usado para exibir datas e horas em todo o aplicativo.", - "settingsAppearance": "Aparência", - "settingsAppearanceDescription": "Alterne entre o modo claro e escuro ou altere o idioma da interface do usuário", - "settingsThemeMode": "Tema", - "settingsLanguage": "Linguagem", - "settingsEnabled": "Habilitado", "settingsDisabled": "Desabilitado", - "settingsHistoryAndMonitoring": "Histórico de monitoramento", - "settingsHistoryAndMonitoringDescription": "Defina por quanto tempo você deseja manter os dados de histórico. Você também pode limpar todos os dados existentes.", - "settingsTTLLabel": "Os dias em que você deseja manter os dados de histórico.", - "settingsTTLOptionalLabel": "0 para infinito", - "settingsClearAllStats": "Limpe todas as estatísticas. Isso é irreversível.", - "settingsClearAllStatsButton": "Limpar todas as estatísticas", - "settingsClearAllStatsDialogTitle": "Você quer limpar todas as estatísticas?", - "settingsClearAllStatsDialogDescription": "Uma vez limpo, o histórico de monitoramento e as estatísticas não podem ser recuperados.", - "settingsClearAllStatsDialogConfirm": "Sim, limpar todas as estatísticas", - "settingsDemoMonitors": "Monitores de demonstração", - "settingsDemoMonitorsDescription": "Adicione monitores de genéricos para fins de demonstração.", - "settingsAddDemoMonitorsButton": "Adicionar monitores de demonstração", - "settingsRemoveAllMonitorsButton": "Remover todos os monitores", - "settingsRemoveAllMonitorsDialogTitle": "Você deseja remover todos os monitores?", - "settingsRemoveAllMonitorsDialogConfirm": "Sim, remova todos os monitores", - "settingsAbout": "Sobre", - "settingsDevelopedBy": "Desenvolvido pela Bluewave Labs.", - "settingsSave": "Salvar", "settingsSuccessSaved": "Configurações salvas com sucesso", "settingsFailedToSave": "Falha ao salvar as configurações", "settingsStatsCleared": "Estatísticas limpas com sucesso", "settingsFailedToClearStats": "Falha ao limpar estatísticas", - "settingsDemoMonitorsAdded": "Monitores de demonstração adicionados com sucesso", "settingsFailedToAddDemoMonitors": "Falha ao adicionar monitores de demonstração", "settingsMonitorsDeleted": "Todos os monitores foram excluídos com sucesso", "settingsFailedToDeleteMonitors": "Falha ao excluir todos os monitores", @@ -310,7 +283,6 @@ "statusPageCreateTabsContentFeaturesDescription": "Mostrar mais detalhes na página de status", "showCharts": "Mostrar gráficos", "showUptimePercentage": "Mostrar porcentagem de Uptime", - "showAdminLoginLink": "Mostrar o link \"Administrador? Efetue login aqui\" na página de status", "removeLogo": "Remover logo", "statusPageStatus": "Uma página de status pública não está configurada.", "statusPageStatusContactAdmin": "Entre em contato com seu administrador", @@ -361,16 +333,10 @@ "noFileSelected": "Nenhum arquivo selecionado", "fallbackPage": "Importe um arquivo para enviar uma lista de servidores em massa" }, - "settingsSystemReset": "Resetar sistema", - "settingsSystemResetDescription": "Remova todos os monitores do seu sistema.", "DeleteAccountTitle": "Remover conta", "DeleteAccountButton": "Remover conta", "publicLink": "Link publico", "maskedPageSpeedKeyPlaceholder": "*************************************", - "pageSpeedApiKeyFieldTitle": "Google PageSpeed API key", - "pageSpeedApiKeyFieldLabel": "PageSpeed API key", - "pageSpeedApiKeyFieldDescription": "Insira sua chave da API do Google PageSpeed ​​para ativar o monitoramento de velocidade de página. Clique em Resetar para atualizar a chave.", - "pageSpeedApiKeyFieldResetLabel": "A chave de API está definida. Clique em Resetar para alterá-la.", "reset": "Resetar", "ignoreTLSError": "Ignorar erro TLS/SSL", "tlsErrorIgnored": "Erros TLS/SSL ignorados", @@ -432,22 +398,13 @@ "password": "Senha", "team": "Equipe", "logOut": "Sair", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "E-mail", - "settingsEmailDescription": "Configurações de e-mail do seu sistema. Elas são usadas para enviar notificações e alertas.", - "settingsEmailHost": "Host de e-mail - Nome do host ou endereço IP do servidor SMTP", - "settingsEmailPort": "Porta de e-mail - Porta para conectar", - "settingsEmailAddress": "Endereço de e-mail - Usado para autenticação", - "settingsEmailPassword": "Senha de e-mail - Senha para autenticação", "settingsEmailUser": "Usuário de e-mail - Nome de usuário para autenticação, substitui o endereço de e-mail, se especificado", - "settingsEmailFieldResetLabel": "A senha foi definida. Clique em Redefinir para alterá-la.", "state": "Estado", "statusBreadCrumbsStatusPages": "Pagina de status", "statusBreadCrumbsDetails": "Detalhes", - "settingsThemeModeLight": "Claro", - "settingsThemeModeDark": "Escuro", - "settingsClearAllStatsDialogCancel": "Cancelar", "commonSaving": "Salvando...", "navControls": "Controles", "incidentsPageTitle": "Incidentes", @@ -462,26 +419,18 @@ "passwordRequirements": "A nova senha deve conter pelo menos 8 caracteres e deve ter pelo menos uma letra maiúscula, uma letra minúscula, um número e um caractere especial.", "saving": "Salvando..." }, - "settingsEmailConnectionHost": "Host de conexão de e-mail - Nome do host a ser usado na saudação HELO/EHLO", "emailSent": "E-mail enviado com sucesso", "failedToSendEmail": "Falha ao enviar e-mail", - "settingsTestEmail": "Enviar e-mail de teste", "settingsTestEmailSuccess": "E-mail de teste enviado com sucesso", "settingsTestEmailFailed": "Falha ao enviar e-mail de teste", "settingsTestEmailFailedWithReason": "Falha ao enviar e-mail de teste: {{reason}}", "settingsTestEmailUnknownError": "Erro desconhecido", - "settingsEmailRequiredFields": "O host e a porta do e-mail são obrigatórios", "statusMsg": { "paused": "O monitoramento está pausado.", "up": "Seu site está no ar.", "down": "Seu site está fora do ar.", "pending": "Pendente..." }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -740,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/ru.json b/client/src/locales/ru.json index 908bc73e7..a4ec3290f 100644 --- a/client/src/locales/ru.json +++ b/client/src/locales/ru.json @@ -3,38 +3,11 @@ "title": "Название", "distributedStatusHeaderText": "Охват реального времени и реального устройства", "distributedStatusSubHeaderText": "Работает на миллионах устройств по всему миру, просматривайте производительность системы по глобальному региону, стране или городу", - "settingsGeneralSettings": "Общие настройки", - "settingsDisplayTimezone": "Отображать часовой пояс", - "settingsDisplayTimezoneDescription": "Часовой пояс панели мониторинга, которую вы публично отображаете.", - "settingsAppearance": "Внешний вид", - "settingsAppearanceDescription": "Переключение между светлым и темным режимом или изменение языка пользовательского интерфейса", - "settingsThemeMode": "Тема", - "settingsLanguage": "Язык", - "settingsEnabled": "Включено", "settingsDisabled": "Выключено", - "settingsHistoryAndMonitoring": "История и мониторинг", - "settingsHistoryAndMonitoringDescription": "Определите здесь, как долго вы хотите хранить данные. Вы также можете удалить все прошлые данные.", - "settingsTTLLabel": "Дни, за которыми вы хотите следить.", - "settingsTTLOptionalLabel": "0 для бесконечности", - "settingsClearAllStats": "Очистить всю статистику. Это необратимо.", - "settingsClearAllStatsButton": "Очистить всю статистику", - "settingsClearAllStatsDialogTitle": "Хотите очистить всю статистику?", - "settingsClearAllStatsDialogDescription": "После удаления ваши мониторы не могут быть восстановлены.", - "settingsClearAllStatsDialogConfirm": "Да, очистить всю статистику", - "settingsDemoMonitors": "Демо мониторы", - "settingsDemoMonitorsDescription": "Здесь вы можете добавлять и удалять демонстрационные мониторы.", - "settingsAddDemoMonitorsButton": "Добавьте демонстрационные мониторы", - "settingsRemoveAllMonitorsButton": "Удалить все демонстрационные мониторы", - "settingsRemoveAllMonitorsDialogTitle": "Хотите удалить все мониторы?", - "settingsRemoveAllMonitorsDialogConfirm": "Да, очистить все мониторы", - "settingsAbout": "О", - "settingsDevelopedBy": "Developed by Bluewave Labs.", - "settingsSave": "Сохранить", "settingsSuccessSaved": "Настройки успешно сохранены", "settingsFailedToSave": "Не удалось сохранить настройки", "settingsStatsCleared": "Статистика успешно очищена", "settingsFailedToClearStats": "Не удалось очистить статистику", - "settingsDemoMonitorsAdded": "Успешно добавлены демонстрационные мониторы", "settingsFailedToAddDemoMonitors": "Не удалось добавить демонстрационные мониторы", "settingsMonitorsDeleted": "Успешно удалены все мониторы", "settingsFailedToDeleteMonitors": "Не удалось удалить все мониторы", @@ -360,16 +333,10 @@ "noFileSelected": "Файл не выбран", "fallbackPage": "Импортируйте файл для массовой загрузки списка серверов" }, - "settingsSystemReset": "Сброс системы", - "settingsSystemResetDescription": "Удалите все мониторы из вашей системы.", "DeleteAccountTitle": "Удалить аккаунт", "DeleteAccountButton": "Удалить аккаунт", "publicLink": "Публичная ссылка", "maskedPageSpeedKeyPlaceholder": "*************************************", - "pageSpeedApiKeyFieldTitle": "Ключ API Google PageSpeed", - "pageSpeedApiKeyFieldLabel": "Ключ API PageSpeed", - "pageSpeedApiKeyFieldDescription": "Введите свой API-ключ Google PageSpeed, чтобы включить мониторинг скорости страницы. Нажмите \"Сброс\", чтобы обновить ключ.", - "pageSpeedApiKeyFieldResetLabel": "Установлен ключ API. Нажмите \"Сброс\", чтобы изменить его.", "reset": "Сброс", "ignoreTLSError": "Игнорировать ошибку TLS/SSL", "tlsErrorIgnored": "Ошибки TLS/SSL игнорируются", @@ -431,22 +398,13 @@ "password": "Пароль", "team": "Команда", "logOut": "Выйти", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "Настройки Email", - "settingsEmailDescription": "Настройка параметров email", - "settingsEmailHost": "Email host", - "settingsEmailPort": "Email port", - "settingsEmailAddress": "Email address", - "settingsEmailPassword": "Email пароль", "settingsEmailUser": "Email пользователь", - "settingsEmailFieldResetLabel": "Пароль установлен. Нажмите \"Сброс\", чтобы изменить его.", "state": "Состояние", "statusBreadCrumbsStatusPages": "Страницы статуса", "statusBreadCrumbsDetails": "Подробности", - "settingsThemeModeLight": "Светлая", - "settingsThemeModeDark": "Тёмная", - "settingsClearAllStatsDialogCancel": "Отменить", "commonSaving": "Сохранение...", "navControls": "Управления", "incidentsPageTitle": "Инциденты", @@ -461,26 +419,18 @@ "passwordRequirements": "Новый пароль должен содержать не менее 8 символов и содержать как минимум одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.", "saving": "Сохранение..." }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/tr.json b/client/src/locales/tr.json index c9e224d63..e9b8f0850 100644 --- a/client/src/locales/tr.json +++ b/client/src/locales/tr.json @@ -3,38 +3,11 @@ "title": "Başlık", "distributedStatusHeaderText": "Gerçek zamanlı, Gerçek cihazlar kapsamı", "distributedStatusSubHeaderText": "Dünya çapında milyonlarca cihaz tarafından desteklenen sistem performansını küresel bölgeye, ülkeye veya şehre göre görüntüleyin", - "settingsGeneralSettings": "Genel ayarlar", - "settingsDisplayTimezone": "Görüntüleme saat dilimi", - "settingsDisplayTimezoneDescription": "Herkese açık olarak görüntülediğiniz kontrol panelinin saat dilimi.", - "settingsAppearance": "Görünüm", - "settingsAppearanceDescription": "Açık ve koyu mod arasında geçiş yapın veya kullanıcı arayüzü dilini değiştirin", - "settingsThemeMode": "Tema", - "settingsLanguage": "Dil", - "settingsEnabled": "Etkin", "settingsDisabled": "Devre dışı", - "settingsHistoryAndMonitoring": "Geçmiş ve izleme", - "settingsHistoryAndMonitoringDescription": "Verileri ne kadar süreyle saklamak istediğinizi burada tanımlayın. Ayrıca tüm geçmiş verileri kaldırabilirsiniz.", - "settingsTTLLabel": "İzleme geçmişini saklamak istediğiniz gün sayısı.", - "settingsTTLOptionalLabel": "Sınırsız için 0", - "settingsClearAllStats": "Tüm istatistikleri temizle. Bu geri alınamaz.", - "settingsClearAllStatsButton": "Tüm istatistikleri temizle", - "settingsClearAllStatsDialogTitle": "Tüm istatistikleri temizlemek istiyor musunuz?", - "settingsClearAllStatsDialogDescription": "Silindikten sonra, monitörleriniz geri alınamaz.", - "settingsClearAllStatsDialogConfirm": "Evet, tüm istatistikleri temizle", - "settingsDemoMonitors": "Demo monitörler", - "settingsDemoMonitorsDescription": "Burada demo monitörler ekleyebilir ve kaldırabilirsiniz.", - "settingsAddDemoMonitorsButton": "Demo monitörler ekle", - "settingsRemoveAllMonitorsButton": "Tüm monitörleri kaldır", - "settingsRemoveAllMonitorsDialogTitle": "Tüm monitörleri kaldırmak istiyor musunuz?", - "settingsRemoveAllMonitorsDialogConfirm": "Evet, tüm monitörleri temizle", - "settingsAbout": "Hakkında", - "settingsDevelopedBy": "Bluewave Labs tarafından geliştirilmiştir.", - "settingsSave": "Kaydet", "settingsSuccessSaved": "Ayarlar başarıyla kaydedildi", "settingsFailedToSave": "Ayarlar kaydedilemedi", "settingsStatsCleared": "İstatistikler başarıyla temizlendi", "settingsFailedToClearStats": "İstatistikler temizlenemedi", - "settingsDemoMonitorsAdded": "Demo monitörler başarıyla eklendi", "settingsFailedToAddDemoMonitors": "Demo monitörler eklenemedi", "settingsMonitorsDeleted": "Tüm monitörler başarıyla silindi", "settingsFailedToDeleteMonitors": "Monitörler silinemedi", @@ -360,16 +333,10 @@ "noFileSelected": "Hiçbir dosya seçilmedi", "fallbackPage": "Toplu olarak sunucu listesini yüklemek için bir dosyayı içe aktarın" }, - "settingsSystemReset": "Sistem sıfırla", - "settingsSystemResetDescription": "Sistemdeki tüm monitörleri silin", "DeleteAccountTitle": "Hesabı sil", "DeleteAccountButton": "Hesabı sil", "publicLink": "Herkese açık bağlantı", "maskedPageSpeedKeyPlaceholder": "*************************************", - "pageSpeedApiKeyFieldTitle": "Google PageSpeed API anahtarı", - "pageSpeedApiKeyFieldLabel": "PageSpeed API anahtarı", - "pageSpeedApiKeyFieldDescription": "Sayfa hızı izlemeyi etkinleştirmek için Google PageSpeed API anahtarınızı girin. Anahtarı güncellemek için Sıfırla'ya tıklayın.", - "pageSpeedApiKeyFieldResetLabel": "API anahtarı ayarlandı. Değiştirmek için Sıfırla'ya tıklayın.", "reset": "Sıfırla", "ignoreTLSError": "TLS/SSL hatalarını gözardı et", "tlsErrorIgnored": "TLS/SSL hataları gözardı ediliyor", @@ -431,22 +398,13 @@ "password": "Parola", "team": "Ekip", "logOut": "Çıkış yap", - "notifications": "Bildirimler" + "notifications": "Bildirimler", + "logs": "" }, - "settingsEmail": "Eposta", - "settingsEmailDescription": "Sistem için eposta ayarlarını düzenleyin. Bu işlem eposta üzerinden bildirim ve alarm almak için gereklidir.", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "E-posta şifresi - Kimlik doğrulama şifresi.", "settingsEmailUser": "E-posta kullanıcısı – Kimlik doğrulama için kullanıcı adı; belirtilirse e-posta adresinin yerine geçer.", - "settingsEmailFieldResetLabel": "Şifre ayarlandı. Değiştirmek için \"Sıfırla\"ya tıklayın.", "state": "Durum", "statusBreadCrumbsStatusPages": "Durum sayfası", "statusBreadCrumbsDetails": "Detaylar", - "settingsThemeModeLight": "Aydınlat", - "settingsThemeModeDark": "Karart", - "settingsClearAllStatsDialogCancel": "İptal", "commonSaving": "Kaydediliyor.", "navControls": "Kontroller", "incidentsPageTitle": "Olaylar", @@ -461,26 +419,18 @@ "passwordRequirements": "Yeni şifreniz en az 8 karakterden oluşmalı ve en az bir büyük harf, bir küçük harf, bir rakam ve bir özel karakter içermelidir.", "saving": "Kaydediliyor..." }, - "settingsEmailConnectionHost": "E-posta bağlantı ana bilgisayarı - HELO/EHLO selamlamasında kullanılacak ana bilgisayar adı", "emailSent": "E-posta başarı ile gönderildi.", "failedToSendEmail": "E-posta gönderimi başarısız.", - "settingsTestEmail": "Test E-postası gönder.", "settingsTestEmailSuccess": "Test E-postası başarı ile gönderildi.", "settingsTestEmailFailed": "Test E-postası gönderimi başarısız.", "settingsTestEmailFailedWithReason": "Test E-postası gönderimi başarısız: {{reason}}", "settingsTestEmailUnknownError": "Bilinmeyen hata.", - "settingsEmailRequiredFields": "E-posta sunucusu ve portu gereklidir.", "statusMsg": { "paused": "İzleme duraklatıldı.", "up": "Siteniz yayında.", "down": "Siteniz kapalı.", "pending": "Sırada.." }, - "settingsURLTitle": "Durum Sayfasında IP/URL'yi İzle", - "settingsURLDescription": "Genel Durum sayfasında monitörün IP adresini veya URL'sini görüntüleyin. Devre dışı bırakılırsa, hassas bilgileri korumak için yalnızca monitör adı gösterilecektir.", - "settingsURLSelectTitle": "Durum sayfasında IP/URL'yi görüntüle", - "settingsURLEnabled": "Etkinleştirilmiş", - "settingURLDisabled": "Devre dışı bırakılmış", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "beklemede" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "Güvenli - SSL kullan", - "settingsEmailPool": "", "sendTestNotifications": "Bildirimleri dene", - "selectAll": "Tümünü seç" + "selectAll": "Tümünü seç", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/src/locales/zh-TW.json b/client/src/locales/zh-TW.json index 9dfd6effb..21f53a7bf 100644 --- a/client/src/locales/zh-TW.json +++ b/client/src/locales/zh-TW.json @@ -3,38 +3,11 @@ "title": "名稱", "distributedStatusHeaderText": "實時、真實設備覆蓋", "distributedStatusSubHeaderText": "由全球數百萬個設備提供支持,您可以按全球區域、國家或城市查看系統效能", - "settingsGeneralSettings": "一般設定", - "settingsDisplayTimezone": "顯示時區", - "settingsDisplayTimezoneDescription": "您公開顯示的儀表板的時區。", - "settingsAppearance": "外觀", - "settingsAppearanceDescription": "", - "settingsThemeMode": "主題", - "settingsLanguage": "語言", - "settingsEnabled": "啟動", "settingsDisabled": "", - "settingsHistoryAndMonitoring": "", - "settingsHistoryAndMonitoringDescription": "", - "settingsTTLLabel": "", - "settingsTTLOptionalLabel": "", - "settingsClearAllStats": "", - "settingsClearAllStatsButton": "", - "settingsClearAllStatsDialogTitle": "", - "settingsClearAllStatsDialogDescription": "", - "settingsClearAllStatsDialogConfirm": "", - "settingsDemoMonitors": "", - "settingsDemoMonitorsDescription": "", - "settingsAddDemoMonitorsButton": "", - "settingsRemoveAllMonitorsButton": "", - "settingsRemoveAllMonitorsDialogTitle": "", - "settingsRemoveAllMonitorsDialogConfirm": "", - "settingsAbout": "", - "settingsDevelopedBy": "", - "settingsSave": "", "settingsSuccessSaved": "", "settingsFailedToSave": "", "settingsStatsCleared": "", "settingsFailedToClearStats": "", - "settingsDemoMonitorsAdded": "", "settingsFailedToAddDemoMonitors": "", "settingsMonitorsDeleted": "", "settingsFailedToDeleteMonitors": "", @@ -360,16 +333,10 @@ "noFileSelected": "", "fallbackPage": "" }, - "settingsSystemReset": "", - "settingsSystemResetDescription": "", "DeleteAccountTitle": "", "DeleteAccountButton": "", "publicLink": "", "maskedPageSpeedKeyPlaceholder": "", - "pageSpeedApiKeyFieldTitle": "", - "pageSpeedApiKeyFieldLabel": "", - "pageSpeedApiKeyFieldDescription": "", - "pageSpeedApiKeyFieldResetLabel": "", "reset": "", "ignoreTLSError": "", "tlsErrorIgnored": "", @@ -431,22 +398,13 @@ "password": "", "team": "", "logOut": "", - "notifications": "" + "notifications": "", + "logs": "" }, - "settingsEmail": "", - "settingsEmailDescription": "", - "settingsEmailHost": "", - "settingsEmailPort": "", - "settingsEmailAddress": "", - "settingsEmailPassword": "", "settingsEmailUser": "", - "settingsEmailFieldResetLabel": "", "state": "", "statusBreadCrumbsStatusPages": "", "statusBreadCrumbsDetails": "", - "settingsThemeModeLight": "", - "settingsThemeModeDark": "", - "settingsClearAllStatsDialogCancel": "", "commonSaving": "", "navControls": "", "incidentsPageTitle": "", @@ -461,26 +419,18 @@ "passwordRequirements": "", "saving": "" }, - "settingsEmailConnectionHost": "", "emailSent": "", "failedToSendEmail": "", - "settingsTestEmail": "", "settingsTestEmailSuccess": "", "settingsTestEmailFailed": "", "settingsTestEmailFailedWithReason": "", "settingsTestEmailUnknownError": "", - "settingsEmailRequiredFields": "", "statusMsg": { "paused": "", "up": "", "down": "", "pending": "" }, - "settingsURLTitle": "", - "settingsURLDescription": "", - "settingsURLSelectTitle": "", - "settingsURLEnabled": "", - "settingURLDisabled": "", "uptimeGeneralInstructions": { "http": "", "ping": "", @@ -739,12 +689,147 @@ "paused": "" }, "advancedMatching": "", - "settingsEmailTLSServername": "", - "settingsEmailIgnoreTLS": "", - "settingsEmailRequireTLS": "", - "settingsEmailRejectUnauthorized": "", - "settingsEmailSecure": "", - "settingsEmailPool": "", "sendTestNotifications": "", - "selectAll": "" + "selectAll": "", + "showAdminLoginLink": "", + "logsPage": { + "title": "", + "description": "", + "tabs": { + "queue": "", + "logs": "" + }, + "toast": { + "fetchLogsSuccess": "" + }, + "logLevelSelect": { + "title": "", + "values": { + "all": "", + "info": "", + "warn": "", + "error": "", + "debug": "" + } + } + }, + "queuePage": { + "title": "", + "refreshButton": "", + "flushButton": "", + "jobTable": { + "title": "", + "idHeader": "", + "urlHeader": "", + "typeHeader": "", + "activeHeader": "", + "lockedAtHeader": "", + "runCountHeader": "", + "failCountHeader": "", + "lastRunHeader": "", + "lastFinishedAtHeader": "", + "lastRunTookHeader": "" + }, + "metricsTable": { + "title": "", + "metricHeader": "", + "valueHeader": "" + }, + "failedJobTable": { + "title": "", + "monitorIdHeader": "", + "monitorUrlHeader": "", + "failCountHeader": "", + "failedAtHeader": "", + "failReasonHeader": "" + } + }, + "export": { + "title": "", + "success": "", + "failed": "" + }, + "monitorActions": { + "title": "", + "import": "", + "export": "" + }, + "settingsPage": { + "aboutSettings": { + "labelDevelopedBy": "", + "labelVersion": "", + "title": "" + }, + "demoMonitorsSettings": { + "buttonAddMonitors": "", + "description": "", + "title": "" + }, + "emailSettings": { + "buttonSendTestEmail": "", + "description": "", + "descriptionTransport": "", + "labelAddress": "", + "labelConnectionHost": "", + "labelHost": "", + "labelIgnoreTLS": "", + "labelPassword": "", + "labelPasswordSet": "", + "labelPool": "", + "labelPort": "", + "labelRejectUnauthorized": "", + "labelRequireTLS": "", + "labelSecure": "", + "labelTLSServername": "", + "labelUser": "", + "linkTransport": "", + "placeholderUser": "", + "title": "" + }, + "pageSpeedSettings": { + "description": "", + "labelApiKeySet": "", + "labelApiKey": "", + "title": "" + }, + "saveButtonLabel": "", + "statsSettings": { + "clearAllStatsButton": "", + "clearAllStatsDescription": "", + "clearAllStatsDialogConfirm": "", + "clearAllStatsDialogDescription": "", + "clearAllStatsDialogTitle": "", + "description": "", + "labelTTL": "", + "labelTTLOptional": "", + "title": "" + }, + "systemResetSettings": { + "buttonRemoveAllMonitors": "", + "description": "", + "dialogConfirm": "", + "dialogDescription": "", + "dialogTitle": "", + "title": "" + }, + "timezoneSettings": { + "description": "", + "label": "", + "title": "" + }, + "title": "", + "uiSettings": { + "description": "", + "labelLanguage": "", + "labelTheme": "", + "title": "" + }, + "urlSettings": { + "description": "", + "label": "", + "selectDisabled": "", + "selectEnabled": "", + "title": "" + } + } } diff --git a/client/vite.config.js b/client/vite.config.js index dc84ce055..838cc5142 100644 --- a/client/vite.config.js +++ b/client/vite.config.js @@ -1,12 +1,20 @@ -import { defineConfig } from "vite"; +import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react"; import svgr from "vite-plugin-svgr"; +import { execSync } from "child_process"; -// https://vitejs.dev/config/ -export default defineConfig({ - base: "/", - plugins: [svgr(), react()], - optimizeDeps: { - include: ["@mui/material/Tooltip", "@emotion/styled"], - }, +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ""); + let version = 2.2; + + return { + base: "/", + plugins: [svgr(), react()], + optimizeDeps: { + include: ["@mui/material/Tooltip", "@emotion/styled"], + }, + define: { + __APP_VERSION__: JSON.stringify(version), + }, + }; }); diff --git a/server/controllers/authController.js b/server/controllers/authController.js index d517c50d9..1d8c2af0e 100755 --- a/server/controllers/authController.js +++ b/server/controllers/authController.js @@ -423,13 +423,6 @@ class AuthController { await this.jobQueue.deleteJob(monitor); }) )); - - // 3. Delete team - await this.db.deleteTeam(user.teamId); - // 4. Delete all other team members - await this.db.deleteAllOtherUsers(); - // 5. Delete each monitor - await this.db.deleteMonitorsByUserId(user._id); } // 6. Delete the user by id await this.db.deleteUser(user._id); diff --git a/server/controllers/checkController.js b/server/controllers/checkController.js index 387839beb..8f9d0fbb5 100755 --- a/server/controllers/checkController.js +++ b/server/controllers/checkController.js @@ -8,6 +8,9 @@ import { deleteChecksParamValidation, deleteChecksByTeamIdParamValidation, updateChecksTTLBodyValidation, + ackCheckBodyValidation, + ackAllChecksParamValidation, + ackAllChecksBodyValidation, } from "../validation/joi.js"; import jwt from "jsonwebtoken"; import { getTokenFromHeaders } from "../utils/utils.js"; @@ -55,13 +58,15 @@ class CheckController { try { const { monitorId } = req.params; - let { type, sortOrder, dateRange, filter, page, rowsPerPage, status } = req.query; + let { type, sortOrder, dateRange, filter, ack, page, rowsPerPage, status } = + req.query; const result = await this.db.getChecksByMonitor({ monitorId, type, sortOrder, dateRange, filter, + ack, page, rowsPerPage, status, @@ -85,13 +90,14 @@ class CheckController { return; } try { - let { sortOrder, dateRange, filter, page, rowsPerPage } = req.query; + let { sortOrder, dateRange, filter, ack, page, rowsPerPage } = req.query; const { teamId } = req.user; const checkData = await this.db.getChecksByTeam({ sortOrder, dateRange, filter, + ack, page, rowsPerPage, teamId, @@ -105,6 +111,55 @@ class CheckController { } }; + ackCheck = async (req, res, next) => { + try { + await ackCheckBodyValidation.validateAsync(req.body); + } catch (error) { + next(handleValidationError(error, SERVICE_NAME)); + return; + } + + try { + const { checkId } = req.params; + const { ack } = req.body; + const { teamId } = req.user; + + const updatedCheck = await this.db.ackCheck(checkId, teamId, ack); + + return res.success({ + msg: this.stringService.checkUpdateStatus, + data: updatedCheck, + }); + } catch (error) { + next(handleError(error, SERVICE_NAME, "ackCheck")); + } + }; + + ackAllChecks = async (req, res, next) => { + try { + await ackAllChecksParamValidation.validateAsync(req.params); + await ackAllChecksBodyValidation.validateAsync(req.body); + } catch (error) { + next(handleValidationError(error, SERVICE_NAME)); + return; + } + + try { + const { monitorId, path } = req.params; + const { ack } = req.body; + const { teamId } = req.user; + + const updatedChecks = await this.db.ackAllChecks(monitorId, teamId, ack, path); + + return res.success({ + msg: this.stringService.checkUpdateStatus, + data: updatedChecks, + }); + } catch (error) { + next(handleError(error, SERVICE_NAME, "ackAllChecks")); + } + }; + deleteChecks = async (req, res, next) => { try { await deleteChecksParamValidation.validateAsync(req.params); diff --git a/server/controllers/inviteController.js b/server/controllers/inviteController.js index 3b2212769..3799c58b9 100755 --- a/server/controllers/inviteController.js +++ b/server/controllers/inviteController.js @@ -77,11 +77,16 @@ class InviteController { name: firstname, link: `${clientHost}/register/${inviteToken.token}`, }); - await this.emailService.sendEmail( + const result = await this.emailService.sendEmail( req.body.email, "Welcome to Uptime Monitor", html ); + if (!result) { + return res.error({ + msg: "Failed to send invite e-mail... Please verify your settings.", + }); + } } catch (error) { logger.warn({ message: error.message, diff --git a/server/db/models/Check.js b/server/db/models/Check.js index 39c5281d2..8bb6cd028 100755 --- a/server/db/models/Check.js +++ b/server/db/models/Check.js @@ -64,6 +64,23 @@ const BaseCheckSchema = mongoose.Schema({ default: Date.now, expires: 60 * 60 * 24 * 30, // 30 days }, + /** + * Acknowledgment of the check. + * + * @type {Boolean} + */ + ack: { + type: Boolean, + default: false, + }, + /** + * Resolution date of the check (when the check was resolved). + * + * @type {Date} + */ + ackAt: { + type: Date, + }, }); /** diff --git a/server/db/models/Monitor.js b/server/db/models/Monitor.js index 38aeff0c3..c71ea5f18 100755 --- a/server/db/models/Monitor.js +++ b/server/db/models/Monitor.js @@ -147,6 +147,7 @@ MonitorSchema.pre("findOneAndDelete", async function (next) { MonitorSchema.pre("deleteMany", async function (next) { const filter = this.getFilter(); const monitors = await this.model.find(filter).select(["_id", "type"]).lean(); + for (const monitor of monitors) { if (monitor.type === "pagespeed") { await PageSpeedCheck.deleteMany({ monitorId: monitor._id }); @@ -155,6 +156,10 @@ MonitorSchema.pre("deleteMany", async function (next) { } else { await Check.deleteMany({ monitorId: monitor._id }); } + await StatusPage.updateMany( + { monitors: monitor._id }, + { $pull: { monitors: monitor._id } } + ); await MonitorStats.deleteMany({ monitorId: monitor._id.toString() }); } next(); diff --git a/server/db/models/User.js b/server/db/models/User.js index 74ee1166e..f180cfb86 100755 --- a/server/db/models/User.js +++ b/server/db/models/User.js @@ -1,6 +1,9 @@ import mongoose from "mongoose"; import bcrypt from "bcryptjs"; import logger from "../../utils/logger.js"; +import Monitor from "./Monitor.js"; +import Team from "./Team.js"; +import Notification from "./Notification.js"; const UserSchema = mongoose.Schema( { @@ -74,6 +77,25 @@ UserSchema.pre("findOneAndUpdate", function (next) { next(); }); +UserSchema.pre("findOneAndDelete", async function (next) { + try { + const userToDelete = await this.model.findOne(this.getFilter()); + if (!userToDelete) return next(); + if (userToDelete.role.includes("superadmin")) { + await Team.deleteOne({ _id: userToDelete.teamId }); + await Monitor.deleteMany({ userId: userToDelete._id }); + await this.model.deleteMany({ + teamId: userToDelete.teamId, + _id: { $ne: userToDelete._id }, + }); + await Notification.deleteMany({ teamId: userToDelete.teamId }); + } + next(); + } catch (error) { + next(error); + } +}); + UserSchema.methods.comparePassword = async function (submittedPassword) { const res = await bcrypt.compare(submittedPassword, this.password); return res; diff --git a/server/db/mongo/modules/checkModule.js b/server/db/mongo/modules/checkModule.js index f409fd3d2..b7d9f4fb2 100755 --- a/server/db/mongo/modules/checkModule.js +++ b/server/db/mongo/modules/checkModule.js @@ -63,18 +63,26 @@ const getChecksByMonitor = async ({ sortOrder, dateRange, filter, + ack, page, rowsPerPage, status, }) => { try { - status = typeof status !== "undefined" ? false : undefined; + status = status === "true" ? true : status === "false" ? false : undefined; page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); + + const ackStage = + ack === "true" + ? { ack: true } + : { $or: [{ ack: false }, { ack: { $exists: false } }] }; + // Match const matchStage = { - monitorId: ObjectId.createFromHexString(monitorId), + monitorId: new ObjectId(monitorId), ...(typeof status !== "undefined" && { status }), + ...(typeof ack !== "undefined" && ackStage), ...(dateRangeLookup[dateRange] && { createdAt: { $gte: dateRangeLookup[dateRange], @@ -153,6 +161,7 @@ const getChecksByTeam = async ({ sortOrder, dateRange, filter, + ack, page, rowsPerPage, teamId, @@ -160,9 +169,16 @@ const getChecksByTeam = async ({ try { page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); + + const ackStage = + ack === "true" + ? { ack: true } + : { $or: [{ ack: false }, { ack: { $exists: false } }] }; + const matchStage = { - teamId: ObjectId.createFromHexString(teamId), + teamId: new ObjectId(teamId), status: false, + ...(typeof ack !== "undefined" && ackStage), ...(dateRangeLookup[dateRange] && { createdAt: { $gte: dateRangeLookup[dateRange], @@ -236,6 +252,58 @@ const getChecksByTeam = async ({ } }; +/** + * Update the acknowledgment status of a check + * @async + * @param {string} checkId - The ID of the check to update + * @param {string} teamId - The ID of the team + * @param {boolean} ack - The acknowledgment status to set + * @returns {Promise} + * @throws {Error} + */ +const ackCheck = async (checkId, teamId, ack) => { + try { + const updatedCheck = await Check.findOneAndUpdate( + { _id: checkId, teamId: teamId }, + { $set: { ack, ackAt: new Date() } }, + { new: true } + ); + + if (!updatedCheck) { + throw new Error("Check not found"); + } + + return updatedCheck; + } catch (error) { + error.service = SERVICE_NAME; + error.method = "ackCheck"; + throw error; + } +}; + +/** + * Update the acknowledgment status of all checks for a monitor or team + * @async + * @param {string} id - The monitor ID or team ID + * @param {boolean} ack - The acknowledgment status to set + * @param {string} path - The path type ('monitor' or 'team') + * @returns {Promise} + * @throws {Error} + */ +const ackAllChecks = async (monitorId, teamId, ack, path) => { + try { + const updatedChecks = await Check.updateMany( + path === "monitor" ? { monitorId } : { teamId }, + { $set: { ack, ackAt: new Date() } } + ); + return updatedChecks.modifiedCount; + } catch (error) { + error.service = SERVICE_NAME; + error.method = "ackAllChecks"; + throw error; + } +}; + /** * Delete all checks for a monitor * @async @@ -317,6 +385,8 @@ export { createChecks, getChecksByMonitor, getChecksByTeam, + ackCheck, + ackAllChecks, deleteChecks, deleteChecksByTeamId, updateChecksTTL, diff --git a/server/db/mongo/modules/diagnosticModule.js b/server/db/mongo/modules/diagnosticModule.js index 7a51ad193..e59830518 100755 --- a/server/db/mongo/modules/diagnosticModule.js +++ b/server/db/mongo/modules/diagnosticModule.js @@ -19,7 +19,7 @@ const getMonitorsByTeamIdExecutionStats = async (req) => { order = "asc"; } // Build match stage - const matchStage = { teamId: ObjectId.createFromHexString(req.params.teamId) }; + const matchStage = { teamId: new ObjectId(req.params.teamId) }; if (type !== undefined) { matchStage.type = Array.isArray(type) ? { $in: type } : type; } diff --git a/server/db/mongo/modules/monitorModule.js b/server/db/mongo/modules/monitorModule.js index 32ed8b146..bc31915c2 100755 --- a/server/db/mongo/modules/monitorModule.js +++ b/server/db/mongo/modules/monitorModule.js @@ -523,7 +523,7 @@ const getMonitorsByTeamId = async ({ order = "asc"; } // Build match stage - const matchStage = { teamId: ObjectId.createFromHexString(teamId) }; + const matchStage = { teamId: new ObjectId(teamId) }; if (type !== undefined) { matchStage.type = Array.isArray(type) ? { $in: type } : type; } @@ -563,8 +563,7 @@ const getMonitorsByTeamId = async ({ const getMonitorsAndSummaryByTeamId = async ({ type, explain, teamId }) => { try { - const parsedTeamId = ObjectId.createFromHexString(teamId); - const matchStage = { teamId: parsedTeamId }; + const matchStage = { teamId: new ObjectId(teamId) }; if (type !== undefined) { matchStage.type = Array.isArray(type) ? { $in: type } : type; } @@ -606,9 +605,8 @@ const getMonitorsWithChecksByTeamId = async ({ field = "name"; order = "asc"; } - const parsedTeamId = ObjectId.createFromHexString(teamId); // Build match stage - const matchStage = { teamId: parsedTeamId }; + const matchStage = { teamId: new ObjectId(teamId) }; if (type !== undefined) { matchStage.type = Array.isArray(type) ? { $in: type } : type; } diff --git a/server/db/mongo/modules/monitorModuleQueries.js b/server/db/mongo/modules/monitorModuleQueries.js index 35ddb8478..ab45eebb6 100755 --- a/server/db/mongo/modules/monitorModuleQueries.js +++ b/server/db/mongo/modules/monitorModuleQueries.js @@ -4,7 +4,7 @@ const buildUptimeDetailsPipeline = (monitorId, dates, dateString) => { return [ { $match: { - monitorId: ObjectId.createFromHexString(monitorId), + monitorId: new ObjectId(monitorId), createdAt: { $gte: dates.start, $lte: dates.end }, }, }, @@ -407,6 +407,16 @@ const buildHardwareDetailsPipeline = (monitor, dates, dateString) => { ], }, }, + { $unwind: "$checks" }, + { $sort: { "checks._id": 1 } }, + { + $group: { + _id: "$_id", + checks: { $push: "$checks" }, + aggregateData: { $first: "$aggregateData" }, + upChecks: { $first: "$upChecks" }, + }, + }, { $project: { aggregateData: { @@ -415,12 +425,7 @@ const buildHardwareDetailsPipeline = (monitor, dates, dateString) => { upChecks: { $arrayElemAt: ["$upChecks", 0], }, - checks: { - $sortArray: { - input: "$checks", - sortBy: { _id: 1 }, - }, - }, + checks: 1, }, }, ]; @@ -734,7 +739,7 @@ const buildGetMonitorsByTeamIdPipeline = (req) => { order = "asc"; } // Build the match stage - const matchStage = { teamId: ObjectId.createFromHexString(req.params.teamId) }; + const matchStage = { teamId: new ObjectId(req.params.teamId) }; if (type !== undefined) { matchStage.type = Array.isArray(type) ? { $in: type } : type; } diff --git a/server/db/mongo/modules/statusPageModule.js b/server/db/mongo/modules/statusPageModule.js index e94ffbd55..8a682d567 100755 --- a/server/db/mongo/modules/statusPageModule.js +++ b/server/db/mongo/modules/statusPageModule.js @@ -90,6 +90,45 @@ const getStatusPage = async (url) => { const stringService = ServiceRegistry.get(StringService.SERVICE_NAME); try { + const preliminaryStatusPage = await StatusPage.findOne({ url }); + if (!preliminaryStatusPage) { + const error = new Error(stringService.statusPageNotFound); + error.status = 404; + throw error; + } + + if (!preliminaryStatusPage.monitors || preliminaryStatusPage.monitors.length === 0) { + const { + _id, + color, + companyName, + isPublished, + logo, + originalMonitors, + showCharts, + showUptimePercentage, + timezone, + showAdminLoginLink, + url, + } = preliminaryStatusPage; + return { + statusPage: { + _id, + color, + companyName, + isPublished, + logo, + originalMonitors, + showCharts, + showUptimePercentage, + timezone, + showAdminLoginLink, + url, + }, + monitors: [], + }; + } + const statusPageQuery = await StatusPage.aggregate([ { $match: { url: url } }, { @@ -134,6 +173,9 @@ const getStatusPage = async (url) => { }, }, }, + { $match: { "monitors.orderIndex": { $ne: -1 } } }, + { $sort: { "monitors.orderIndex": 1 } }, + { $group: { _id: "$_id", @@ -156,20 +198,7 @@ const getStatusPage = async (url) => { showAdminLoginLink: 1, url: 1, }, - monitors: { - $filter: { - input: { - $sortArray: { - input: "$monitors", - sortBy: { orderIndex: 1 }, - }, - }, - as: "monitor", - cond: { - $ne: ["$$monitor.orderIndex", -1], - }, - }, - }, + monitors: 1, }, }, ]); diff --git a/server/routes/checkRoute.js b/server/routes/checkRoute.js index aedca991a..7f91dbe31 100755 --- a/server/routes/checkRoute.js +++ b/server/routes/checkRoute.js @@ -1,7 +1,9 @@ import { Router } from "express"; import { verifyOwnership } from "../middleware/verifyOwnership.js"; +import { verifyTeamAccess } from "../middleware/verifyTeamAccess.js"; import { isAllowed } from "../middleware/isAllowed.js"; import Monitor from "../db/models/Monitor.js"; +import Check from "../db/models/Check.js"; class CheckRoutes { constructor(checkController) { @@ -20,6 +22,14 @@ class CheckRoutes { this.router.get("/:monitorId", this.checkController.getChecksByMonitor); + this.router.put( + "/check/:checkId", + verifyTeamAccess(Check, "checkId"), + this.checkController.ackCheck + ); + + this.router.put("/:path/:monitorId?", this.checkController.ackAllChecks); + this.router.post( "/:monitorId", verifyOwnership(Monitor, "monitorId"), diff --git a/server/service/emailService.js b/server/service/emailService.js index 89bd4d50f..433fd0871 100755 --- a/server/service/emailService.js +++ b/server/service/emailService.js @@ -137,6 +137,17 @@ class EmailService { }; this.transporter = this.nodemailer.createTransport(emailConfig); + try { + await this.transporter.verify(); + } catch (error) { + this.logger.warn({ + message: "Email transporter verification failed", + service: SERVICE_NAME, + method: "verifyTransporter", + }); + return false; + } + try { const info = await this.transporter.sendMail({ to: to, diff --git a/server/service/stringService.js b/server/service/stringService.js index 5ee17a5ef..6f9ad8cd8 100755 --- a/server/service/stringService.js +++ b/server/service/stringService.js @@ -444,6 +444,10 @@ class StringService { get verifyOwnerUnauthorized() { return this.translationService.getTranslation("verifyOwnerUnauthorized"); } + + get dbUserNotFound() { + return this.translationService.getTranslation("dbUserNotFound"); + } } export default StringService; diff --git a/server/utils/logger.js b/server/utils/logger.js index 0864176c5..49b875d96 100755 --- a/server/utils/logger.js +++ b/server/utils/logger.js @@ -76,7 +76,7 @@ class Logger { info(config) { const logEntry = this.buildLogEntry("info", config); this.cacheLog(logEntry); - this.logger.info(config.message, logEntry); + this.logger.info(logEntry); } /** @@ -90,7 +90,7 @@ class Logger { warn(config) { const logEntry = this.buildLogEntry("warn", config); this.cacheLog(logEntry); - this.logger.warn(config.message, logEntry); + this.logger.warn(logEntry); } /** @@ -104,7 +104,7 @@ class Logger { error(config) { const logEntry = this.buildLogEntry("error", config); this.cacheLog(logEntry); - this.logger.error(config.message, logEntry); + this.logger.error(logEntry); } /** * Logs a debug message. @@ -117,7 +117,7 @@ class Logger { debug(config) { const logEntry = this.buildLogEntry("debug", config); this.cacheLog(logEntry); - this.logger.debug(config.message, logEntry); + this.logger.debug(logEntry); } cacheLog(entry) { diff --git a/server/validation/joi.js b/server/validation/joi.js index e5c1d6e43..d44bb14eb 100755 --- a/server/validation/joi.js +++ b/server/validation/joi.js @@ -289,6 +289,19 @@ const createCheckBodyValidation = joi.object({ message: joi.string().required(), }); +const ackCheckBodyValidation = joi.object({ + ack: joi.boolean(), +}); + +const ackAllChecksParamValidation = joi.object({ + monitorId: joi.string().optional(), + path: joi.string().valid("monitor", "team").required(), +}); + +const ackAllChecksBodyValidation = joi.object({ + ack: joi.boolean(), +}); + const getChecksParamValidation = joi.object({ monitorId: joi.string().required(), }); @@ -299,6 +312,7 @@ const getChecksQueryValidation = joi.object({ limit: joi.number(), dateRange: joi.string().valid("recent", "hour", "day", "week", "month", "all"), filter: joi.string().valid("all", "down", "resolve"), + ack: joi.boolean(), page: joi.number(), rowsPerPage: joi.number(), status: joi.boolean(), @@ -311,9 +325,9 @@ const getTeamChecksQueryValidation = joi.object({ limit: joi.number(), dateRange: joi.string().valid("hour", "day", "week", "month", "all"), filter: joi.string().valid("all", "down", "resolve"), + ack: joi.boolean(), page: joi.number(), rowsPerPage: joi.number(), - status: joi.boolean(), }); const deleteChecksParamValidation = joi.object({ @@ -654,6 +668,9 @@ export { getChecksQueryValidation, getTeamChecksParamValidation, getTeamChecksQueryValidation, + ackCheckBodyValidation, + ackAllChecksParamValidation, + ackAllChecksBodyValidation, deleteChecksParamValidation, deleteChecksByTeamIdParamValidation, updateChecksTTLBodyValidation,