summaryrefslogtreecommitdiff
path: root/htroot/js/IndexReIndexMonitor.js
diff options
context:
space:
mode:
authorluccioman <luccioman@users.noreply.github.com>2018-01-19 11:58:52 +0100
committerluccioman <luccioman@users.noreply.github.com>2018-01-19 11:58:52 +0100
commit5e2812c0608288e0d4700909a46adddeb4c26d05 (patch)
treead22d8f55415312b6511dfde263f13b8d9228917 /htroot/js/IndexReIndexMonitor.js
parent19903a984fa64e2314d589b847c33532d81983a7 (diff)
Automatically refresh running recrawl report when JavaScript is enabled.
For users who would prefer to keep JavaScript disabled, a manual Refresh button is still available.
Diffstat (limited to 'htroot/js/IndexReIndexMonitor.js')
-rw-r--r--htroot/js/IndexReIndexMonitor.js202
1 files changed, 202 insertions, 0 deletions
diff --git a/htroot/js/IndexReIndexMonitor.js b/htroot/js/IndexReIndexMonitor.js
new file mode 100644
index 000000000..787a45d9d
--- /dev/null
+++ b/htroot/js/IndexReIndexMonitor.js
@@ -0,0 +1,202 @@
+/*
+ * @licstart The following is the entire license notice for the
+ * JavaScript code in this file.
+ *
+ * Copyright (C) 2018 by luccioman; https://github.com/luccioman
+ *
+ *
+ * This file is part of YaCy.
+ *
+ * YaCy is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * YaCy is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with YaCy. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @licend The above is the entire license notice
+ * for the JavaScript code in this file.
+ */
+
+/* This is JavaScript for the IndexReIndexMonitor_p.html page */
+
+var REFRESH_DELAY = 5000;
+var TERMINATED_STATUS = 2;
+var xhr = null;
+if (window.XMLHttpRequest) {
+ if(window.JSON && window.JSON.parse) {
+ xhr = new XMLHttpRequest();
+ } else {
+ console.warn("JSON parsing is not supported by the browser.");
+ }
+} else {
+ console.warn("XMLHttpRequest is not supported by the browser.");
+}
+
+/**
+ * Once DOM is fully loaded, handle eventual reindex and recrawl jobs reports
+ * refreshing
+ */
+function domLoaded() {
+ /* Get the DOM elements to be refreshed */
+ var earlyRecrawlTerminationElem = document.getElementById("earlyRecrawlTermination");
+ var recrawlStatusElem = document.getElementById("recrawlStatus");
+ var recrawlQueryTextElem = document.getElementById("recrawlQueryText");
+ var recrawlStartTimeElem = document.getElementById("recrawlStartTime");
+ var recrawlEndTimeElem = document.getElementById("recrawlEndTime");
+ var urlsToRecrawlCountElem = document.getElementById("urlsToRecrawlCount");
+ var recrawledUrlsCountElem = document.getElementById("recrawledUrlsCount");
+ var rejectedUrlsCountElem = document.getElementById("rejectedUrlsCount");
+ var malformedUrlsCountElem = document.getElementById("malformedUrlsCount");
+ var refreshingIcon = document.getElementById("refreshingIcon");
+ var refreshFailureIcon = document.getElementById("refreshFailureIcon");
+ var refreshBtn = document.getElementById("recrawlRefreshBtn");
+
+ if (recrawlStatusElem != null && recrawlStatusElem.dataset != null) {
+ /* Initialize status labels that may be translated in the html template */
+ var recrawlStatusLabels = {};
+ if(recrawlStatusElem.dataset.status0 != null) {
+ recrawlStatusLabels["0"] = recrawlStatusElem.dataset.status0;
+ }
+ if(recrawlStatusElem.dataset.status1 != null) {
+ recrawlStatusLabels["1"] = recrawlStatusElem.dataset.status1;
+ }
+ if(recrawlStatusElem.dataset.status2 != null) {
+ recrawlStatusLabels["2"] = recrawlStatusElem.dataset.status2;
+ }
+
+ if (recrawlStatusElem.dataset.status != TERMINATED_STATUS) {
+ /* Update a DOM element when it exists */
+ var updateElemText = function(elem, newValue) {
+ if (newValue != null && elem != null) {
+ elem.innerText = newValue;
+ }
+ }
+
+ /* Handle failure to fetch fresh report information */
+ var handleFetchReportError = function() {
+ /* Hide the icon marking automated refresh, but keep the manual refresh button */
+ if(refreshingIcon != null) {
+ refreshingIcon.className = "hidden";
+ }
+ /* Display the icon informing user about failure on automated report refresh */
+ if(refreshFailureIcon != null && refreshFailureIcon.className != null) {
+ refreshFailureIcon.className = refreshFailureIcon.className.replace("hidden", "");
+ }
+ }
+
+ /* Update report DOM elements with the fetched report information */
+ var updateReportElements = function(report) {
+ recrawlStatusElem.dataset.status = report.status;
+
+ if (recrawlStatusLabels[report.status] != null) {
+ /* Use the eventually translated status label when available */
+ updateElemText(recrawlStatusElem, recrawlStatusLabels[report.status]);
+ } else if(report.statusLabel != null) {
+ /* Otherwise use the default one provided in the json response */
+ updateElemText(recrawlStatusElem, report.statusLabel);
+ }
+ if(report.earlyTerminated) {
+ if(earlyRecrawlTerminationElem != null && earlyRecrawlTerminationElem.className != null) {
+ earlyRecrawlTerminationElem.className = earlyRecrawlTerminationElem.className.replace("hidden", "");
+ }
+ }
+ updateElemText(recrawlQueryTextElem, report.query);
+ updateElemText(recrawlStartTimeElem,
+ report.startTime);
+ updateElemText(recrawlEndTimeElem, report.endTime);
+ if (report.urlCounts != null) {
+ updateElemText(urlsToRecrawlCountElem,
+ report.urlCounts.toRecrawl);
+ updateElemText(recrawledUrlsCountElem,
+ report.urlCounts.recrawled);
+ updateElemText(rejectedUrlsCountElem,
+ report.urlCounts.rejected);
+ updateElemText(malformedUrlsCountElem,
+ report.urlCounts.malformed);
+ if (report.urlCounts.malformedDeleted != null
+ && malformedUrlsCountElem != null) {
+ malformedUrlsCountElem.title = malformedUrlsCountElem.title
+ .replace(/\d+/,
+ report.urlCounts.malformedDeleted);
+ }
+ }
+ }
+
+ /* Processing the response from IndexReIndexMonitor_p.json */
+ var handleResponse = function() {
+ if (xhr.readyState == 4 /* XMLHttpRequest.DONE */) {
+ if (xhr.status != 200 || xhr.response == null) {
+ handleFetchReportError();
+ return;
+ }
+ var report = null;
+ try {
+ var jsonResponse = window.JSON.parse(xhr.response);
+ if (jsonResponse != null) {
+ report = jsonResponse.recrawlJob;
+ }
+ } catch(error) {
+ console.error("JSON parsing error ", error);
+ }
+ if (report == null || report.status == null) {
+ handleFetchReportError();
+ return;
+ }
+
+ updateReportElements(report);
+
+ if(report.status == TERMINATED_STATUS) {
+ /* First hide the icon marking automated refresh and the manual refresh button */
+ if(refreshingIcon != null) {
+ refreshingIcon.className = "hidden";
+ }
+ if(refreshBtn != null) {
+ refreshBtn.className = "hidden";
+ }
+ /*
+ * Then if the update fieldset is displayed, completely refresh the page to display again the
+ * new recrawl job fieldset
+ */
+ if(document.getElementById("updateJobFieldset") != null) {
+ window.location.href = "IndexReIndexMonitor_p.html";
+ }
+ } else {
+ /*
+ * Continue refreshing while the job is not
+ * terminated
+ */
+ window.setTimeout(function() {
+ xhr.onreadystatechange = handleResponse;
+ xhr.open("get", "IndexReIndexMonitor_p.json");
+ xhr.send();
+ }, REFRESH_DELAY);
+ }
+ }
+ };
+
+ /*
+ * We are here so JavaScript is enabled and required API are supported :
+ * we can show the refreshing icon if the element is present
+ */
+ if(refreshingIcon != null && refreshingIcon.className != null) {
+ refreshingIcon.className = refreshingIcon.className.replace("hidden", "");
+ }
+
+ window.setTimeout(function() {
+ xhr.onreadystatechange = handleResponse;
+ xhr.open("get", "IndexReIndexMonitor_p.json");
+ xhr.send();
+ }, REFRESH_DELAY);
+ }
+ }
+}
+if (xhr != null) {
+ window.onload = domLoaded;
+} \ No newline at end of file