365 lines
16 KiB
Plaintext
365 lines
16 KiB
Plaintext
@inject IHttpContextAccessor HttpContextAccessor
|
|
@inject IDataContextFactory<SeniorDataContext> dbFactory
|
|
@model User
|
|
|
|
@{
|
|
ViewBag.Title = "Hello Razor";
|
|
var session = HttpContextAccessor.HttpContext.Session;
|
|
var username = session.GetString("username");
|
|
bool filter = HttpContextAccessor.HttpContext.Request.Query["from"] != (String)null;
|
|
|
|
bool auth = username.Equals(Model.Username);
|
|
bool isDoc = Model.IsPatient() && username.Equals(Model.Pat.Doctor);
|
|
auth = auth || isDoc;
|
|
}
|
|
|
|
@if (!auth)
|
|
{
|
|
<p class="box-title text-red">Non sei autorizzato a vedere i dati di @Model.Name @Model.LastName</p>
|
|
}
|
|
else
|
|
{
|
|
<div>
|
|
<div class="col-md-3">
|
|
<div class="form-group">
|
|
<div class="input-group">
|
|
<input id="hours-data" type="text" placeholder="hours" value="24" class="form-control timepicker" />
|
|
|
|
<div class="input-group-addon">
|
|
<input type="button" value="Cambia ora" class="no-border" id="refresh-hours">
|
|
</div>
|
|
</div>
|
|
<!-- /.input group -->
|
|
|
|
|
|
</div>
|
|
<!-- /.form group -->
|
|
</div>
|
|
|
|
<div class="col-md-1"></div>
|
|
|
|
<div class="col-md-6">
|
|
<!-- Date range -->
|
|
<div class="form-group">
|
|
<div class="input-group">
|
|
<div class="input-group-addon">
|
|
<i class="fa fa-calendar"></i>
|
|
</div>
|
|
<input id="date-from" type="date" value="@HttpContextAccessor.HttpContext.Request.Query["from"]" />
|
|
<input id="date-to" type="date" value="@HttpContextAccessor.HttpContext.Request.Query["to"]" />
|
|
<input type="button" id="refresh-date" class="fc-button no-border" value="Cambia data" />
|
|
</div>
|
|
<!-- /.input group -->
|
|
</div>
|
|
<!-- /.form group -->
|
|
</div>
|
|
|
|
@if (isDoc)
|
|
{
|
|
<div class="form-group">
|
|
<form action="" method="get" onsubmit="return confirm('Sicuro di voler rimuovere il paziente?');">
|
|
<button type="submit" name="removePatient" class="btn btn-default" value="@Model.Username">Rimuovi paziente</button>
|
|
</form>
|
|
</div>
|
|
}
|
|
</div>
|
|
<div class="row"></div>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
@if (isDoc)
|
|
{
|
|
<div class="form-group col-md-3">
|
|
<label>Scrivi una nota per il paziente</label>
|
|
<textarea id="note-area" placeholder="Scrivi una nota.." class="form-control" rows="2">@Model.Pat.Notes</textarea>
|
|
<button id="send-note" class="btn">Salva</button>
|
|
<p id="note-error"></p>
|
|
</div>
|
|
<div class="col-md-1"></div>
|
|
|
|
<div class="form-group col-md-5">
|
|
<label>Inserisci un minimo o massimo valore per il battito cardiaco</label>
|
|
<p>Se il valore del battito del paziente supera i valori che hai inserito verrai notificato</p>
|
|
<div class="form-group col-md-5">
|
|
<label>Max:</label>
|
|
<input id="maxHeart" placeholder="max" value="@Model.Pat.MaxHeart" class="form-control" />
|
|
</div>
|
|
<div class="form-group col-md-5">
|
|
<label>Min:</label>
|
|
<input id="minHeart" placeholder="min" value="@Model.Pat.MinHeart" class="form-control" />
|
|
</div>
|
|
</div>
|
|
<div class="col-md-1"></div>
|
|
|
|
<div class="form-group">
|
|
<div class="input-group-btn input-group-sm">
|
|
<a href="/Message/@Model.Pat.Username" class="btn btn-flat btn-info">Scrivi a @Model.Name </a>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
$("#send-note").on("click", function () {
|
|
var text = $("#note-area").val().trim();
|
|
$.ajax({
|
|
url: "/Account/_addNote",
|
|
type: "PUT",
|
|
data: {
|
|
Patient: "@Model.Username", Text: text
|
|
},
|
|
success: function (data) {
|
|
$("#note-error").html(data.success ? "Nota salvata" : data.message);
|
|
}
|
|
});
|
|
});
|
|
$("#maxHeart, #minHeart").on("change keyup paste click", function () {
|
|
onlyNum($(this));
|
|
});
|
|
$("#maxHeart, #minHeart").on("blur", function () {
|
|
var value = parseInt($(this).val());
|
|
var id = $(this).attr("id");
|
|
$.ajax({
|
|
url: "/Account/_" + id + "ToPatient",
|
|
type: "PUT",
|
|
data: {
|
|
Patient: "@Model.Username",
|
|
Value: value
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
}
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>
|
|
<input type="checkbox" id="show-table">
|
|
Mostra dati sottoforma tabella
|
|
</label>
|
|
</div>
|
|
<div id="chart-data"></div>
|
|
<script>
|
|
$(function () {
|
|
$('#reservation').daterangepicker();
|
|
$('#datepicker').datepicker({
|
|
autoclose: true
|
|
});
|
|
});
|
|
|
|
function onlyNum(object, numChar = 3) {
|
|
object.val(object.val().replace(/[^0-9]/g, '').substring(0, numChar));
|
|
}
|
|
|
|
$("#show-table").on("click", function () {
|
|
$("#refresh-hours").click();
|
|
});
|
|
|
|
$("#hours-data").on("change keyup paste click", function () {
|
|
onlyNum($(this), 2);
|
|
});
|
|
$("#refresh-hours").on("click", function () {
|
|
var hours = $("#hours-data").val();
|
|
var end_url = "/@Model.Username/last/" + hours;
|
|
kendoUpdate(end_url);
|
|
});
|
|
$("#refresh-date").on("click", function () {
|
|
var from = $("#date-from").val();
|
|
var to = $("#date-to").val();
|
|
var end_url = "/@Model.Username/"+from+"/"+to;
|
|
kendoUpdate(end_url);
|
|
});
|
|
|
|
var toRefresh = "@if (filter) { @Html.Raw("#refresh-date") } else { @Html.Raw("#refresh-hours") }";
|
|
$(toRefresh).click();
|
|
|
|
function kendoUpdate(end_url, base_url = "@Url.Content("~/api/")") {
|
|
$.getJSON(base_url + "heartbeat" + end_url, function (heartbeat) {
|
|
$.getJSON(base_url + "step" + end_url, function (steps) {
|
|
$.getJSON(base_url + "sleep" + end_url, function (sleep) {
|
|
var sleepArr = [];
|
|
|
|
sleep.forEach(function (el) {
|
|
sleepArr.push({ "time": el.time, "value": 1 });
|
|
var base_time = new Date(el.time).getTime();
|
|
|
|
for (var i = 60000; i <= el.value; i += 60000) {
|
|
sleepArr.push({ "time": new Date(base_time + i), "value": 1 });
|
|
}
|
|
});
|
|
|
|
if (Object.keys(heartbeat).length == 0
|
|
&& Object.keys(steps).length == 0
|
|
&& Object.keys(sleep).length == 0)
|
|
$("#chart-data").html("Nessun dato");
|
|
else {
|
|
$("#chart-data").html("");
|
|
if (sleepArr.length == 0)
|
|
sleepArr.push({ "time": heartbeat[0].time, "value": false });
|
|
|
|
var minDate = Math.min(
|
|
new Date(heartbeat[0].time).getTime(),
|
|
new Date(steps[0].time).getTime(),
|
|
new Date(sleepArr[0].time).getTime()
|
|
);
|
|
|
|
var maxDate = Math.max(
|
|
new Date(heartbeat[heartbeat.length-1].time).getTime(),
|
|
new Date(steps[steps.length - 1].time).getTime(),
|
|
new Date(sleepArr[sleepArr.length -1].time).getTime()
|
|
);
|
|
|
|
|
|
var allData = [];
|
|
for (var delta = 60 * 60 * 1000; minDate < maxDate; minDate += delta) {
|
|
var heartVal = NaN;
|
|
for (var i = 0; i < heartbeat.length; i++) {
|
|
var time = new Date(heartbeat[i].time).getTime();
|
|
if (time >= minDate && time <= minDate + delta) {
|
|
heartVal = heartbeat[i].value;
|
|
i = heartbeat.length;
|
|
}
|
|
if (time > minDate + delta)
|
|
i = heartbeat.length;
|
|
}
|
|
|
|
var stepVal = NaN;
|
|
for (var i = 0; i < steps.length; i++) {
|
|
var time = new Date(steps[i].time).getTime();
|
|
if (time >= minDate && time <= minDate + delta) {
|
|
stepVal = steps[i].value;
|
|
i = steps.length;
|
|
}
|
|
if (time > minDate + delta)
|
|
i = steps.length;
|
|
}
|
|
|
|
var sleepVal = false;
|
|
for (var i = 0; i < sleepArr.length; i++) {
|
|
var time = new Date(sleepArr[i].time).getTime();
|
|
if (time >= minDate && time <= minDate + delta) {
|
|
sleepVal = true;
|
|
i = sleepArr.length;
|
|
}
|
|
if (time > minDate + delta)
|
|
i = sleepArr.length;
|
|
}
|
|
|
|
allData.push({
|
|
"Time": new Date(minDate),
|
|
"Heartbeat": heartVal,
|
|
"Steps": stepVal,
|
|
"Sleep": sleepVal
|
|
});
|
|
}
|
|
if (document.getElementById("show-table").checked) {
|
|
$("#chart-data").kendoGrid({
|
|
dataSource: {
|
|
data: allData,
|
|
serverPaging: false,
|
|
serverSorting: false,
|
|
batch: false,
|
|
schema: {
|
|
model: {
|
|
fields: {
|
|
time: { type: "date" },
|
|
Heartbeat: { type: "number" },
|
|
Steps: {type: "number"},
|
|
Sleep: {type: "bool"}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
scrollable: true,
|
|
sortable: true,
|
|
filterable: true,
|
|
editable: false,
|
|
columns: [
|
|
{
|
|
field: "Time",
|
|
title: "Date/Time",
|
|
format: "{0:dd/MM/yyyy HH:mm}"
|
|
},
|
|
{
|
|
field: "Heartbeat",
|
|
title: "Battiti"
|
|
},
|
|
{
|
|
field: "Steps",
|
|
title: "Passi"
|
|
},
|
|
{
|
|
field: "Sleep",
|
|
title: "Sonno"
|
|
}
|
|
]
|
|
});
|
|
}
|
|
else
|
|
$("#chart-data").kendoChart({
|
|
title: { text: "Visualizzazione attivita' di @Model.Name @Model.LastName" },
|
|
legend: { position: "bottom" },
|
|
seriesDefaults: {
|
|
type: "line",
|
|
style: "smooth"
|
|
},
|
|
series: [{
|
|
name: "Battito",
|
|
field: "value",
|
|
color: "red",
|
|
axis: "Heartbeat",
|
|
categoryField: "time",
|
|
data: heartbeat,
|
|
tooltip: {
|
|
visible: true,
|
|
format: "{0}%",
|
|
template: "Media di: #= value # bpm"
|
|
}
|
|
}, {
|
|
name: "Passi",
|
|
field: "value",
|
|
color: "blue",
|
|
axis: "Steps",
|
|
categoryField: "time",
|
|
data: steps,
|
|
tooltip: {
|
|
visible: true,
|
|
format: "{0}%",
|
|
template: "#= series.name #: #= value #"
|
|
}
|
|
}, {
|
|
type: "area",
|
|
name: "Sonno",
|
|
field: "value",
|
|
color: "black",
|
|
axis: "Sleep",
|
|
categoryField: "time",
|
|
data: sleepArr
|
|
}],
|
|
categoryAxis: {
|
|
labels: {
|
|
rotation: +45,
|
|
dateFormats: {
|
|
hours: "HH:mm"
|
|
}
|
|
},
|
|
type: "Date",
|
|
baseUnit: "hours"
|
|
},
|
|
valueAxes: [{
|
|
name: "Heartbeat",
|
|
color: "red"
|
|
}, {
|
|
name: "Steps",
|
|
color: "blue"
|
|
}, {
|
|
name: "Sleep",
|
|
color: "gray",
|
|
visible: false,
|
|
max: 1,
|
|
min: 0
|
|
}]
|
|
}); /* Kendo */
|
|
} /* else */
|
|
}); /* sleep */
|
|
}); /* steps */
|
|
}); /* heart */
|
|
}
|
|
</script>
|
|
} |