2022-05-24 08:14:10 +00:00
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<link rel="stylesheet" href="../../css/spectre.min.css">
|
2022-05-24 14:01:23 +00:00
|
|
|
<link rel="stylesheet" href="../../css/spectre-icons.min.css">
|
2022-05-24 08:14:10 +00:00
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="table"></div>
|
2022-05-24 21:13:03 +00:00
|
|
|
<div id="view"></div>
|
2022-05-24 08:14:10 +00:00
|
|
|
<script src="../../core/lib/interface.js"></script>
|
|
|
|
<script>
|
|
|
|
var domTable = document.getElementById("table");
|
2022-05-24 21:13:03 +00:00
|
|
|
var domView = document.getElementById("view");
|
2022-05-24 08:14:10 +00:00
|
|
|
|
2022-05-24 21:13:03 +00:00
|
|
|
function viewLog(logData, filename) {
|
|
|
|
domView.innerHTML = "";
|
2022-05-24 14:01:23 +00:00
|
|
|
var html = `
|
2022-05-24 21:13:03 +00:00
|
|
|
<div class="container">
|
|
|
|
<h4><b>Viewing data of:</b> ` + filename + `</h4>
|
|
|
|
</div>
|
|
|
|
<table class="table table-striped table-hover">
|
2022-05-24 14:01:23 +00:00
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th>Date</th>
|
2022-05-24 21:13:03 +00:00
|
|
|
<th>Time</th>
|
|
|
|
<th>Duration</th>
|
2022-05-24 14:01:23 +00:00
|
|
|
<th>Status</th>
|
2022-05-24 21:13:03 +00:00
|
|
|
<th>Sleep</th>
|
2022-05-24 14:01:23 +00:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>`;
|
2022-05-24 21:13:03 +00:00
|
|
|
logData.forEach((entry, index, log) => {
|
|
|
|
var duration = ((log[index + 1] || [Math.floor(Date.now() / 6E5)])[0] - entry[0]) * 10;
|
|
|
|
html += `
|
|
|
|
<tr style="text-align: center">
|
|
|
|
<td style="text-align: right">` +
|
|
|
|
new Date(entry[0] * 6E5).toLocaleDateString(undefined) + `
|
2022-05-24 14:01:23 +00:00
|
|
|
</td>
|
|
|
|
<td>` +
|
2022-05-24 21:13:03 +00:00
|
|
|
new Date(entry[0] * 6E5).toLocaleTimeString([], {hour: '2-digit', minute: '2-digit'}) + `
|
2022-05-24 14:01:23 +00:00
|
|
|
</td>
|
2023-04-05 14:47:09 +00:00
|
|
|
<td style="text-align: right"><div class="container"` +
|
2022-05-24 21:13:03 +00:00
|
|
|
(duration >= 60 ? ` style="background-color: hsl(192, 50%, ` +
|
|
|
|
(duration > 480 ? 50 : 100 - Math.floor(duration / 60) * 50 / 8) +
|
|
|
|
`%)">` : `>`) +
|
|
|
|
duration + ` min
|
|
|
|
</td>
|
|
|
|
<td><div class="container" style="background-color: ` +
|
|
|
|
["orange", "lightcoral", "lightgreen", "lightcyan", "lightskyblue"][entry[1]] + `">` +
|
|
|
|
["unknown", "not worn", "awake", "light sleep", "deep sleep"][entry[1]] + `
|
|
|
|
</div></td>
|
|
|
|
<td><div class="container" style="background-color: ` +
|
|
|
|
["orange", "lightgreen", "lightskyblue"][entry[2]] + `">` +
|
|
|
|
["unknown", "non consecutive", "consecutive"][entry[2]] + `
|
|
|
|
</div></td>
|
|
|
|
</tr>`
|
|
|
|
});
|
|
|
|
html += `
|
|
|
|
</tbody>
|
|
|
|
</table>`;
|
|
|
|
domView.innerHTML = html;
|
2022-05-24 14:01:23 +00:00
|
|
|
}
|
|
|
|
|
2022-05-24 21:13:03 +00:00
|
|
|
function saveCSV(logData, date0, date1) {
|
|
|
|
var csvTime = document.getElementById("csvTime").selectedIndex;
|
|
|
|
var filename = "sleeplog_" +
|
|
|
|
new Date(date0).toISOString().substr(0, 10) + "_" +
|
|
|
|
new Date(date1).toISOString().substr(5, 5);
|
2022-05-24 14:01:23 +00:00
|
|
|
logData = logData.map(entry => {
|
|
|
|
entry[0] *= 6E5;
|
2022-05-24 21:13:03 +00:00
|
|
|
if (csvTime === 1) entry[0] /= 1E3;
|
|
|
|
if (csvTime === 2) entry[0] = entry[0] / 864E5 + 25569;
|
2022-05-24 14:01:23 +00:00
|
|
|
return entry.join(",");
|
|
|
|
}).join("\n");
|
2022-05-24 21:13:03 +00:00
|
|
|
Util.saveCSV(filename, "time,sleep,consecutive\n" + logData);
|
2022-05-24 08:14:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function readLog(date, callback) {
|
|
|
|
Util.showModal("Downloading logged data...");
|
2022-05-24 11:57:14 +00:00
|
|
|
Puck.eval(`require("sleeplog").readLog(` + date + `, ` + date + ` + 12096E5)`, logData => {
|
2022-05-24 08:14:10 +00:00
|
|
|
Util.hideModal();
|
|
|
|
callback(logData);
|
|
|
|
});
|
|
|
|
}
|
2022-05-24 14:01:23 +00:00
|
|
|
|
2022-05-24 21:13:03 +00:00
|
|
|
function deleteFile(filename, callback) {
|
|
|
|
if (window.confirm("Do you really want to remove " + filename)) {
|
2023-04-05 14:47:09 +00:00
|
|
|
Util.showModal("Deleting " + filename + " ...");
|
2022-05-24 21:13:03 +00:00
|
|
|
if (filename.endsWith(" (StorageFile)")) {
|
|
|
|
Util.eraseStorageFile(filename, () => {
|
|
|
|
Util.hideModal();
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
Util.eraseStorage(filename, () => {
|
|
|
|
Util.hideModal();
|
|
|
|
callback();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-04-05 16:02:34 +00:00
|
|
|
function deleteBefore(dateString, callback) {
|
2023-04-05 14:47:09 +00:00
|
|
|
date = new Date(dateString);
|
2023-04-05 15:52:59 +00:00
|
|
|
if (window.confirm("Do you really want to remove all data before " + date.toLocaleDateString(undefined))) {
|
2023-04-05 14:47:09 +00:00
|
|
|
Util.showModal("Deleting all data before" + date.toLocaleDateString(undefined) + " ...");
|
2023-04-05 15:52:59 +00:00
|
|
|
Puck.eval(`require("Storage").list(/^sleeplog_\\d+.log$/).forEach(file => {
|
|
|
|
date = (parseInt(file.match(/\\d+/)[0]) + 0.25) * 12096E5
|
|
|
|
print(date < ` + date + `)
|
|
|
|
if (date < ` + date + `) {
|
|
|
|
require("Storage").erase(file)
|
|
|
|
}
|
|
|
|
})`, () => {
|
|
|
|
Util.hideModal();
|
|
|
|
callback();
|
|
|
|
})
|
2023-04-05 14:47:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-05-24 21:13:03 +00:00
|
|
|
function viewFiles() {
|
2022-05-24 08:14:10 +00:00
|
|
|
Util.showModal("Loading...");
|
|
|
|
domTable.innerHTML = "";
|
2023-04-05 14:47:09 +00:00
|
|
|
Puck.eval(`require("Storage").list(/^sleeplog_\\d+.log$/)`, files => {
|
2022-05-24 21:13:03 +00:00
|
|
|
// add active log
|
2022-05-24 08:14:10 +00:00
|
|
|
files.push("" + Math.floor(Date.now() / 12096E5 - 0.25));
|
2022-05-24 21:13:03 +00:00
|
|
|
files = files.map(file => { return {
|
|
|
|
filename: file.length === 4 ? "sleeplog.log (StorageFile)" : file,
|
2023-04-05 14:47:09 +00:00
|
|
|
date: (parseInt(file.match(/\d+/)[0]) + 0.25) * 12096E5
|
2022-05-24 21:13:03 +00:00
|
|
|
}});
|
|
|
|
files = files.sort((a, b) => a.date - b.date);
|
2022-05-24 08:34:46 +00:00
|
|
|
var html = `
|
2022-05-24 10:28:17 +00:00
|
|
|
<table class="table table-striped table-hover">
|
|
|
|
<thead>
|
|
|
|
<tr>
|
2022-05-24 10:52:08 +00:00
|
|
|
<th>File</th>
|
2022-05-24 14:01:23 +00:00
|
|
|
<th>from</th>
|
2022-05-24 10:52:08 +00:00
|
|
|
<th>to</th>
|
|
|
|
<th>Actions</th>
|
2022-05-24 10:28:17 +00:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>`;
|
2022-05-24 21:13:03 +00:00
|
|
|
files.forEach(file => { html += `
|
2022-05-24 10:28:17 +00:00
|
|
|
<tr>
|
2022-05-24 21:13:03 +00:00
|
|
|
<td>${file.filename}</td>
|
|
|
|
<td>${new Date(file.date).toLocaleDateString(undefined)}</td>
|
|
|
|
<td>${new Date(file.date + 12096E5).toLocaleDateString(undefined)}</td>
|
2022-05-24 10:28:17 +00:00
|
|
|
<td>
|
2022-05-24 21:13:03 +00:00
|
|
|
<button class="btn btn-sm tooltip" data-tooltip="view data" task="view" filename="${file.filename}" date="${file.date}">
|
|
|
|
<i class="icon icon-caret"></i>
|
|
|
|
</button>
|
|
|
|
<button class="btn btn-sm tooltip btn-primary" data-tooltip="save csv-file" task="csv" filename="${file.filename}" date="${file.date}">
|
|
|
|
<i class="icon icon-download"></i>
|
|
|
|
</button>
|
|
|
|
<button class="btn btn-sm tooltip btn-error" data-tooltip="delete file" task="del" filename="${file.filename}" date="${file.date}">
|
|
|
|
<i class="icon icon-delete"></i>
|
|
|
|
</button>`;
|
2022-05-24 08:14:10 +00:00
|
|
|
html += `
|
2022-05-24 10:28:17 +00:00
|
|
|
</td>
|
|
|
|
</tr>`;
|
2022-05-24 08:14:10 +00:00
|
|
|
});
|
|
|
|
html += `
|
2022-05-24 10:28:17 +00:00
|
|
|
</tbody>
|
|
|
|
</table>
|
2022-05-24 21:13:03 +00:00
|
|
|
<div class="container">
|
|
|
|
<form class="form-horizontal">
|
|
|
|
<div class="form-group">
|
2023-04-05 14:47:09 +00:00
|
|
|
<div class="col-sm-12">
|
2022-05-24 21:13:03 +00:00
|
|
|
<label class="form-label"><b>csv time format</b></label>
|
|
|
|
</div>
|
2023-04-05 14:47:09 +00:00
|
|
|
<div class="col-sm-12">
|
2022-05-24 21:13:03 +00:00
|
|
|
<select class="form-select" id="csvTime">
|
|
|
|
<option>JavaScript (milliseconds since 1970)</option>
|
|
|
|
<option>UNIX (seconds since 1970)</option>
|
|
|
|
<option>Office (days since 1900)</option>
|
|
|
|
</select>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
2023-04-05 14:47:09 +00:00
|
|
|
</div>
|
|
|
|
<div class="container">
|
|
|
|
<form class="form-horizontal">
|
|
|
|
<div class="form-group">
|
|
|
|
<div class="col-sm-12">
|
|
|
|
<label class="form-label"><b>Delete all logfiles before</b></label>
|
|
|
|
</div>
|
|
|
|
<div class="col-sm-10">
|
|
|
|
<input class="form-input" id="delBeforeDate" type="date" value="2022-01-01">
|
|
|
|
</div>
|
|
|
|
<div class="col-mx-auto">
|
2023-04-05 15:52:59 +00:00
|
|
|
<button class="btn tooltip btn-error" data-tooltip="delete old files" task="delBefore" filename="_" date="_">
|
2023-04-05 14:47:09 +00:00
|
|
|
<i class="icon icon-delete"></i>
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</form>
|
2022-05-24 21:13:03 +00:00
|
|
|
</div>`;
|
2022-05-24 08:14:10 +00:00
|
|
|
domTable.innerHTML = html;
|
|
|
|
Util.hideModal();
|
|
|
|
var buttons = domTable.querySelectorAll("button");
|
2022-05-24 08:34:46 +00:00
|
|
|
for (var i = 0; i < buttons.length; i++) {
|
|
|
|
buttons[i].addEventListener("click", event => {
|
2022-05-24 08:14:10 +00:00
|
|
|
var button = event.currentTarget;
|
|
|
|
var task = button.getAttribute("task");
|
2022-05-24 21:13:03 +00:00
|
|
|
var filename = button.getAttribute("filename");
|
|
|
|
var date = button.getAttribute("date") - 0;
|
|
|
|
if (!task || !filename || !date) return;
|
|
|
|
if (task === "view") readLog(date, logData => viewLog(logData, filename));
|
|
|
|
else if (task === "csv") readLog(date, logData => saveCSV(logData, date, date + 12096E5));
|
|
|
|
else if (task === "del") deleteFile(filename, () => viewFiles());
|
2023-04-05 16:02:34 +00:00
|
|
|
else if (task === "delBefore") deleteBefore(document.getElementById("delBeforeDate").value, () => viewFiles());
|
2022-05-24 08:14:10 +00:00
|
|
|
});
|
|
|
|
}
|
2022-05-24 08:34:46 +00:00
|
|
|
});
|
2022-05-24 08:14:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function onInit() {
|
2022-05-24 21:13:03 +00:00
|
|
|
viewFiles();
|
2022-05-24 08:14:10 +00:00
|
|
|
}
|
|
|
|
</script>
|
|
|
|
</body>
|
2022-05-24 21:13:03 +00:00
|
|
|
</html>
|