const app = new Vue({ el: '#app', data: { info: null, summaries: null, selectedSummary: null, filterGreen: true, filterDomain: null, filterOrg: null, //filterDate: (new Date()).toISOString().substring(0, 7), filterDate: null, reverse: true, anonymous: true, }, created: async function () { let that = this; if ('anonymous' in localStorage) { this.anonymous = JSON.parse(localStorage.anonymous); } this.fetchAll(); }, methods: { fetchAll: async function() { try { this.info = await this.getInfo(); this.summaries = this.info.summaries; } catch (error) { this.info = null; this.summaries = null; } }, toggleAnonymous: function() { this.anonymous = !this.anonymous; localStorage.anonymous = this.anonymous; this.fetchAll(); }, filtered: function () { let that = this; let filtered = this.summaries.filter(function (summary) { return (!that.filterGreen || that.getColor(summary) !== "lime") && (!that.filterDomain || summary.domain === that.filterDomain) && (!that.filterOrg || summary.org === that.filterOrg) && (!that.filterDate || that.inDates(summary)); }); if (this.reverse) { return filtered.reverse(); } else { return filtered; } }, toggle: async function(summary) { if (this.selectedSummary && this.selectedSummary.serial === summary.serial) { this.selectedSummary = null; } else { if (!summary.details) { summary.details = await this.getDetails(summary.serial); } this.selectedSummary = summary; } }, inDates: function(summary) { if (!this.filterDate) { return true; } let mindate = (new Date(summary.mindate)).toISOString().substring(0, 7); let maxdate = (new Date(summary.maxdate)).toISOString().substring(0, 7); return mindate === this.filterDate || maxdate === this.filterDate; }, printDate: function (date) { return (new Date(date)).toISOString().replace("T", " ").replace(/\..*Z$/, " UTC"); }, getColor: function (element) { if (element.dkimresult === "fail" && element.spfresult === "fail") { return "red"; } else if (element.dkimresult === "fail" || element.spfresult === "fail") { return "orange"; } else if (element.dkimresult === "pass" && element.spfresult === "pass") { return "lime"; } else { return "yellow"; } }, getInfo: function (event) { let anonymous = this.anonymous ? "anonymous=1" : ""; return fetch(`api.php?${anonymous}`).then(function (response) { if (response.status != 200) { return; } return response.text().then(function (body) { return JSON.parse(body); }); }); }, getDetails: function (serial) { let anonymous = this.anonymous ? "&anonymous=1" : ""; return fetch(`api.php?serial=${serial}${anonymous}`).then(function (response) { if (response.status != 200) { return; } return response.text().then(function (body) { return JSON.parse(body); }); }); } } });