Merge pull request #2 from Berack96/Abbellimento

Abbellimento
This commit was merged in pull request #2.
This commit is contained in:
Giulia Vago 20015091
2019-02-01 22:27:09 +01:00
committed by GitHub
37 changed files with 1410 additions and 476 deletions

2
.gitignore vendored
View File

@@ -263,3 +263,5 @@ __pycache__/
SeniorAssistant/SeniorAssistant/wwwroot/* SeniorAssistant/SeniorAssistant/wwwroot/*
/SeniorAssistant/Controllers/TestController.cs /SeniorAssistant/Controllers/TestController.cs
/SeniorAssistant/Views/Test/* /SeniorAssistant/Views/Test/*
/SeniorAssistant/Views/Home/Calendar.cshtml
/SeniorAssistant/Views/Home/Calendar.cshtml.cs

View File

@@ -6,81 +6,150 @@ using LinqToDB;
using System.Linq; using System.Linq;
using System; using System;
using SeniorAssistant.Models.Users; using SeniorAssistant.Models.Users;
using SeniorAssistant.Data;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.IO;
using System.Collections.Generic;
using System.Net.Http.Headers;
namespace IdentityDemo.Controllers namespace IdentityDemo.Controllers
{ {
[ApiExplorerSettings(IgnoreApi = true)]
[Route("[controller]/[action]")] [Route("[controller]/[action]")]
public class AccountController : BaseController public class AccountController : BaseController
{ {
private static readonly string NoteModified = "Il tuo dottore ha modificato la nota per te"; private static readonly string NoteModified = "Il tuo dottore ha modificato la nota per te";
private static readonly string InvalidLogIn = "Username o Password sbagliati"; private static readonly string InvalidLogIn = "Username o Password sbagliati";
private static readonly string AlreadyLogIn = "L'utente e' gia' loggato";
private static readonly string UsernameDupl = "Lo username selezionato e' gia' in uso";
private static readonly string ModNotExists = "L'oggetto da modificare non esiste"; private static readonly string ModNotExists = "L'oggetto da modificare non esiste";
private static readonly string AlreadyPatie = "Sei gia' un paziente"; private static readonly string AlreadyPatie = "Sei gia' un paziente";
private static readonly string DocNotExists = "Il dottore selezionato non esiste"; private static readonly string DocNotExists = "Il dottore selezionato non esiste";
private static readonly string InsertAsDoct = "Ti ha inserito come il suo dottore: "; private static readonly string InsertAsDoct = "Ti ha inserito come il suo dottore: ";
private static readonly string DefaultImage = "/uploads/default.jpg";
private static readonly string UploadsDirec = "/uploads/";
[HttpPost] [HttpPost]
public async Task<ActionResult> _login(string username, string password) public async Task<IActionResult> _login(string username, string password)
{ {
var result = await (from u in Db.Users try
where u.Username.Equals(username)
&& u.Password.Equals(password)
select u).ToListAsync();
if (result.Count == 1)
{ {
User user = result.First(); var user = await (from u in Db.Users
HttpContext.Session.SetString(Username, username); where u.Username.Equals(username)
HttpContext.Session.SetString("email", user.Email); && u.Password.Equals(password)
HttpContext.Session.SetString("name", user.Name); select u).FirstOrDefaultAsync();
HttpContext.Session.SetString("lastname", user.LastName);
var isDoc = (from d in Db.Doctors
where d.Username.Equals(username)
select d).ToArray().FirstOrDefault() != null;
HttpContext.Session.SetString("role", isDoc? "doctor":"patient");
return Json(OkJson); if (user != null)
{
HttpContext.Session.SetString(Username, username);
HttpContext.Session.SetString("email", user.Email);
HttpContext.Session.SetString("name", user.Name);
HttpContext.Session.SetString("lastname", user.LastName);
HttpContext.Session.SetString("avatar", user.Avatar ?? DefaultImage);
var isDoc = (from d in Db.Doctors
where d.Username.Equals(username)
select d).ToArray().FirstOrDefault() != null;
HttpContext.Session.SetString("role", isDoc ? "doctor" : "patient");
return Json(OkJson);
}
return Json(new JsonResponse()
{
Success = false,
Message = InvalidLogIn
});
} }
return Json(new JsonResponse() catch (Exception e)
{ {
Success = false, return Json(new JsonResponse()
Message = InvalidLogIn {
}); Success = false,
Message = e.Message + " " +e.Source + "</br>"+ e.StackTrace
});
}
} }
[HttpPost] [HttpPost]
public ActionResult _logout() public IActionResult _logout()
{ {
HttpContext.Session.Clear(); HttpContext.Session.Clear();
return Json(OkJson); return Json(OkJson);
} }
[HttpPost] [HttpPost]
public async Task<ActionResult> _register(User user) public async Task<IActionResult> _register(User user, Forgot forgot, string code = "")
{ {
try try
{ {
user.Avatar = DefaultImage;
forgot.Username = user.Username;
Db.Insert(user); Db.Insert(user);
Db.Insert(forgot);
if (code != null && code.Equals("444442220"))
{
Db.Insert(new Doctor
{
Username = user.Username
});
};
return await _login(user.Username, user.Password); return await _login(user.Username, user.Password);
} }
catch catch (Exception e)
{ {
return Json(new JsonResponse() return Json(new JsonResponse()
{ {
Success = false, Success = false,
Message = UsernameDupl Message = e.Message
}); });
} }
} }
[HttpPost] [HttpPost]
public async Task<ActionResult> _notification(string username, string message, string redirectUrl = "#") public async Task<IActionResult> _modify(User user, Doctor doctor)
{
return await LoggedAccessDataOf(user.Username, false, () => {
var usr = Db.Users.Where(u => u.Username.Equals(user.Username)).FirstOrDefault();
if (user.Password == null)
user.Password = usr.Password;
if (user.Avatar == null)
user.Avatar = usr.Avatar;
if (user.Email == null)
user.Email = usr.Email;
if (user.LastName == null)
user.LastName = usr.LastName;
if (user.Name == null)
user.Name = usr.Name;
Db.UpdateAsync(user);
var doc = Db.Doctors.Where(d => d.Username.Equals(user.Username)).FirstOrDefault();
if(doc!=null)
{
if (doctor.PhoneNumber != null)
doc.PhoneNumber = doctor.PhoneNumber;
if (doctor.Schedule != null)
doc.Schedule = doctor.Schedule;
if (doctor.Location != null)
doc.Location = doctor.Location;
Db.UpdateAsync(doc);
}
return Json(OkJson);
});
}
[HttpPost]
public async Task<IActionResult> _checkQuestion(string username, string answer)
{
var forgot = Db.Forgot.Where(f => f.Username.Equals(username) && f.Answer.Equals(answer)).FirstOrDefault();
if(forgot != null)
{
var user = (from u in Db.Users where u.Username.Equals(forgot.Username) select u).FirstOrDefault();
return await _login(user.Username, user.Password);
}
return Json(new JsonResponse(false, "Risposta sbagliata"));
}
[HttpPost]
public async Task<IActionResult> _notification(string username, string message, string redirectUrl = "#")
{ {
return await LoggedAction(() => return await LoggedAction(() =>
{ {
@@ -97,7 +166,7 @@ namespace IdentityDemo.Controllers
} }
[HttpPut] [HttpPut]
public async Task<ActionResult> _notification(int id) public async Task<IActionResult> _notification(int id)
{ {
return await LoggedAction(() => return await LoggedAction(() =>
{ {
@@ -119,7 +188,7 @@ namespace IdentityDemo.Controllers
} }
[HttpPost] [HttpPost]
public async Task<ActionResult> _addDoc(string doctor) public async Task<IActionResult> _addDoc(string doctor)
{ {
return await LoggedAction(() => return await LoggedAction(() =>
{ {
@@ -146,13 +215,13 @@ namespace IdentityDemo.Controllers
Username = username Username = username
}); });
var a = _notification(doctor, InsertAsDoct + username); var a = _notification(doctor, InsertAsDoct + username, "/user/" + username);
return Json(OkJson); return Json(OkJson);
}); });
} }
[HttpPost] [HttpPost]
public async Task<ActionResult> _sendMessage(string receiver, string body) public async Task<IActionResult> _sendMessage(string receiver, string body)
{ {
return await LoggedAction(() => { return await LoggedAction(() => {
string username = HttpContext.Session.GetString(Username); string username = HttpContext.Session.GetString(Username);
@@ -171,7 +240,7 @@ namespace IdentityDemo.Controllers
} }
[HttpPut] [HttpPut]
public async Task<ActionResult> _addNote(string patient, string text) public async Task<IActionResult> _addNote(string patient, string text)
{ {
return await LoggedAccessDataOf(patient, true, () => return await LoggedAccessDataOf(patient, true, () =>
{ {
@@ -185,7 +254,7 @@ namespace IdentityDemo.Controllers
} }
[HttpPut] [HttpPut]
public async Task<ActionResult> _minHeartToPatient(string patient, int value) public async Task<IActionResult> _minHeartToPatient(string patient, int value)
{ {
return await LoggedAccessDataOf(patient, true, () => return await LoggedAccessDataOf(patient, true, () =>
{ {
@@ -198,7 +267,7 @@ namespace IdentityDemo.Controllers
} }
[HttpPut] [HttpPut]
public async Task<ActionResult> _maxHeartToPatient(string patient, int value) public async Task<IActionResult> _maxHeartToPatient(string patient, int value)
{ {
return await LoggedAccessDataOf(patient, true, () => return await LoggedAccessDataOf(patient, true, () =>
{ {
@@ -209,5 +278,83 @@ namespace IdentityDemo.Controllers
return Json(OkJson); return Json(OkJson);
}); });
} }
[HttpPost]
public async Task<IActionResult> _save(IEnumerable<IFormFile> files)
{
return await LoggedAction(() =>
{
if (files != null)
{
var loggedUser = HttpContext.Session.GetString(Username);
foreach (var file in files)
{
var fileContent = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
// We are only interested in the file name.
var fileName = loggedUser + Path.GetExtension(fileContent.FileName.ToString().Trim('"'));
var physicalPath = "wwwroot" + UploadsDirec;
Directory.CreateDirectory(physicalPath);
physicalPath = Path.Combine(physicalPath, fileName);
var externalPath = Path.Combine(UploadsDirec, fileName);
using (var fileStream = new FileStream(physicalPath, FileMode.Create))
{
file.CopyTo(fileStream);
}
var user = (from u in Db.Users
where u.Username.Equals(loggedUser)
select u).FirstOrDefault();
user.Avatar = externalPath;
HttpContext.Session.SetString("avatar", externalPath);
Db.Update(user);
}
}
return Json(OkJson);
/*
if (file.Length > 0)
{
var fileContent = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
var name = loggedUser + ".jpg";
var path = Path.Combine(("/uploads/"), name);
var stream = new FileStream(path, FileMode.Create);
file.CopyTo(stream);
var user = (from u in Db.Users
where u.Username.Equals(loggedUser)
select u).FirstOrDefault();
user.Avatar = path;
Db.Update(User);
}
return Json(OkJson);
});
/*
var loggedUser = HttpContext.Session.GetString(Username);
long size = file.Length;
// full path to file in temp location
var filePathPart = Path.GetDirectoryName("~/AdminLTE-2.4.3/dist/img/");
var fileName = Path.GetFileName(loggedUser + ".jpg");
var filePath = Path.Combine(filePathPart,fileName);
if (size > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
return Json(new JsonResponse());
*/
});
}
} }
} }

View File

@@ -6,16 +6,15 @@ using System.Linq;
namespace SeniorAssistant.Controllers namespace SeniorAssistant.Controllers
{ {
[ApiExplorerSettings(IgnoreApi = true)]
public class HomeController : BaseController public class HomeController : BaseController
{ {
[Route("")] [Route("")]
[Route("Home")] [Route("Home")]
[Route("Index")] [Route("Index")]
public IActionResult Index() [Route("Login")]
public IActionResult Login()
{ {
string username = HttpContext.Session.GetString(Username); return CheckUnAuthorized("Login");
return View("Index", GetUser(username));
} }
[Route("Heartbeat")] [Route("Heartbeat")]
@@ -45,6 +44,23 @@ namespace SeniorAssistant.Controllers
[Route("User/{User}")] [Route("User/{User}")]
public IActionResult SingleUser(string user) public IActionResult SingleUser(string user)
{ {
try
{
string rm = HttpContext.Request.Query["removePatient"];
string usr = HttpContext.Session.GetString(Username);
var pt = Db.Patients
.Where(p => p.Username.Equals(rm) && p.Doctor.Equals(usr))
.FirstOrDefault();
var mp = Db.MenuPatients
.Where(m => m.PatientUsername.Equals(rm) && m.Username.Equals(usr))
.FirstOrDefault();
Db.Delete(pt);
Db.Delete(mp);
}
catch { }
return CheckAuthorized("User", GetUser(user)); return CheckAuthorized("User", GetUser(user));
} }
@@ -54,6 +70,52 @@ namespace SeniorAssistant.Controllers
return CheckAuthorized("Message", GetUser(user)); return CheckAuthorized("Message", GetUser(user));
} }
[Route("Profile")]
public IActionResult Profile()
{
string username = HttpContext.Session.GetString(Username);
return CheckAuthorized("Profile", GetUser(username));
}
[Route("Register")]
public IActionResult Register()
{
return CheckUnAuthorized("Register");
}
[Route("Forgot")]
public IActionResult Forgot(string username = "")
{
if (IsLogged())
{
return RedirectToAction("Profile", "Home");
}
var forgot = Db.Forgot.Where(f => f.Username.Equals(username)).FirstOrDefault();
if (forgot == null)
return View("Login", "Utente non esiste");
return View("Forgot", forgot);
}
protected IActionResult CheckAuthorized(string view, object model = null)
{
if (!IsLogged())
{
model = "/" + view;
view = "Login";
}
return View(view, model);
}
protected IActionResult CheckUnAuthorized(string view, object model = null)
{
if (IsLogged())
{
return RedirectToAction("Profile", "Home");
}
return View(view, model);
}
private User GetUser(string username) private User GetUser(string username)
{ {
return Db.Users return Db.Users
@@ -62,12 +124,5 @@ namespace SeniorAssistant.Controllers
.Where(u => u.Username.Equals(username)) .Where(u => u.Username.Equals(username))
.FirstOrDefault(); .FirstOrDefault();
} }
private IActionResult CheckAuthorized(string view, object model = null)
{
if (!IsLogged())
return View("Index", "/" + view);
return View(view, model);
}
} }
} }

View File

@@ -5,6 +5,7 @@ using SeniorAssistant.Models.Users;
using System.Linq; using System.Linq;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using SeniorAssistant.Models;
namespace SeniorAssistant.Controllers namespace SeniorAssistant.Controllers
{ {
@@ -37,8 +38,8 @@ namespace SeniorAssistant.Controllers
{ {
return HttpContext.Session.GetString(Username) != null; return HttpContext.Session.GetString(Username) != null;
} }
protected async Task<ActionResult> LoggedAction(Func<ActionResult> success) protected async Task<IActionResult> LoggedAction(Func<IActionResult> success)
{ {
try try
{ {
@@ -56,16 +57,12 @@ namespace SeniorAssistant.Controllers
return Json(new JsonResponse() return Json(new JsonResponse()
{ {
Success = false, Success = false,
Message = ExceptionSer + Environment.NewLine + Message = e.Message
e.Message + Environment.NewLine +
e.StackTrace + Environment.NewLine +
e.TargetSite + Environment.NewLine +
e.InnerException
}); });
} }
} }
protected async Task<ActionResult> LoggedAccessDataOf(string username, bool patients, Func<ActionResult> success) protected async Task<IActionResult> LoggedAccessDataOf(string username, bool patients, Func<IActionResult> success)
{ {
return await LoggedAction(() => return await LoggedAction(() =>
{ {

View File

@@ -1,5 +1,4 @@
using System; using System.Linq;
using System.Linq;
using LinqToDB; using LinqToDB;
using LinqToDB.Data; using LinqToDB.Data;
using LinqToDB.DataProvider; using LinqToDB.DataProvider;
@@ -23,6 +22,8 @@ namespace SeniorAssistant.Data
public ITable<Patient> Patients => GetTable<Patient>(); public ITable<Patient> Patients => GetTable<Patient>();
public ITable<Notification> Notifications => GetTable<Notification>(); public ITable<Notification> Notifications => GetTable<Notification>();
public ITable<Message> Messages => GetTable<Message>(); public ITable<Message> Messages => GetTable<Message>();
public ITable<Forgot> Forgot => GetTable<Forgot>();
public ITable<MenuPatient> MenuPatients => GetTable<MenuPatient>();
public T[] GetLastMessages<T>(ITable<T> table, string receiver, ref int numNotSeen, int max = 10) public T[] GetLastMessages<T>(ITable<T> table, string receiver, ref int numNotSeen, int max = 10)
where T : IHasMessage where T : IHasMessage

View File

@@ -0,0 +1,16 @@
using LinqToDB.Mapping;
namespace SeniorAssistant.Models
{
public class Forgot : IHasUsername
{
[Column(IsPrimaryKey = true, CanBeNull = false)]
public string Username { get; set; }
[Column(CanBeNull = false)]
public string Question { get; set; }
[Column(CanBeNull = false)]
public string Answer { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using LinqToDB.Mapping;
using Newtonsoft.Json;
namespace SeniorAssistant.Models.Users
{
public class MenuPatient : IHasUsername
{
[Column(IsPrimaryKey = true, CanBeNull = false)]
public string Username { get; set; }
[Column(IsPrimaryKey = true, CanBeNull = false)]
public string PatientUsername { get; set; }
[JsonIgnore]
[Association(ThisKey = nameof(PatientUsername), OtherKey = nameof(User.Username), CanBeNull = false)]
public User Usr { get; set; }
}
}

View File

@@ -20,6 +20,8 @@ namespace SeniorAssistant.Models
public string LastName { get; set; } public string LastName { get; set; }
public string Avatar { get; set; }
[JsonIgnore] [JsonIgnore]
[Association(ThisKey = nameof(Username), OtherKey = nameof(Doctor.Username), CanBeNull = true)] [Association(ThisKey = nameof(Username), OtherKey = nameof(Doctor.Username), CanBeNull = true)]
public Doctor Doc { get; set; } public Doctor Doc { get; set; }

View File

@@ -7,10 +7,6 @@
<LangVersion>7.1</LangVersion> <LangVersion>7.1</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="linq2db" Version="2.5.4" /> <PackageReference Include="linq2db" Version="2.5.4" />
<PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.App" />

View File

@@ -133,6 +133,8 @@ namespace SeniorAssistant
db.CreateTableIfNotExists<Patient>(); db.CreateTableIfNotExists<Patient>();
db.CreateTableIfNotExists<Notification>(); db.CreateTableIfNotExists<Notification>();
db.CreateTableIfNotExists<Message>(); db.CreateTableIfNotExists<Message>();
db.CreateTableIfNotExists<Forgot>();
db.CreateTableIfNotExists<MenuPatient>();
} }
} }
@@ -147,11 +149,11 @@ namespace SeniorAssistant
List<Doctor> docs = db.Doctors.ToListAsync().Result; List<Doctor> docs = db.Doctors.ToListAsync().Result;
if (docs.Count == 0) if (docs.Count == 0)
{ {
users.Add(new User { Name = "Alfredo", LastName = "Parise", Email = "alfred.pary@libero.it", Username = "alfredigno", Password = "alfy" }); users.Add(new User { Name = "Alfredo", LastName = "Parise", Email = "alfred.pary@libero.it", Username = "alfredigno", Password = "alfy", Avatar = "/uploads/default.jpg" });
users.Add(new User { Name = "Edoardo", LastName = "Marzio", Email = "edo.marzio@libero.it", Username = "marzietto", Password = "edo64" }); users.Add(new User { Name = "Edoardo", LastName = "Marzio", Email = "edo.marzio@libero.it", Username = "marzietto", Password = "edo64", Avatar = "/uploads/default.jpg" });
docs.Add(new Doctor { Username = "alfredigno", Location = "Brasile" }); docs.Add(new Doctor { Username = "alfredigno", Location = "Brasile", PhoneNumber = "+0 123456789", Schedule = "Solo feriali 9:00-13:00/15:00-19:00" });
docs.Add(new Doctor { Username = "marzietto", Location = "Uganda" }); docs.Add(new Doctor { Username = "marzietto", Location = "Uganda", PhoneNumber = "+9 87654321", Schedule = "Feriali e festivi 9:00-13:00" });
foreach (var doc in docs) foreach (var doc in docs)
db.InsertOrReplace(doc); db.InsertOrReplace(doc);
@@ -167,7 +169,7 @@ namespace SeniorAssistant
for (count=0; count<names.Length; count++) for (count=0; count<names.Length; count++)
{ {
var username = baseUsername + count; var username = baseUsername + count;
users.Add(new User { Name = names[count], LastName = lastnames[count], Username = username, Password = username, Email = username + "@email.st" }); users.Add(new User { Name = names[count], LastName = lastnames[count], Username = username, Password = username, Email = username + "@email.st", Avatar = "/uploads/default.jpg" });
patients.Add(new Patient { Username = username, Doctor = docs[rnd.Next(docs.Count)].Username }); patients.Add(new Patient { Username = username, Doctor = docs[rnd.Next(docs.Count)].Username });
} }
@@ -175,8 +177,17 @@ namespace SeniorAssistant
db.InsertOrReplace(patient); db.InsertOrReplace(patient);
} }
var forgot = new Forgot()
{
Question = "Quale animale ti piace di piu'?",
Answer = "Rayquaza"
};
foreach (var user in users) foreach (var user in users)
{
forgot.Username = user.Username;
db.InsertOrReplace(forgot);
db.InsertOrReplace(user); db.InsertOrReplace(user);
}
DateTime now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); DateTime now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
now = now.AddHours(DateTime.Now.Hour).AddMinutes(30); now = now.AddHours(DateTime.Now.Hour).AddMinutes(30);

View File

@@ -0,0 +1,48 @@
@model Forgot
<div class="col-md-4"></div>
<div class="col-md-4">
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Accesso tramite domanda di sicurezza</h3>
</div>
<div class="form-horizontal">
<div class="box-body">
<p>Se indovini la risposta allora verrai loggato. Li poi potrai modificare la password.</p>
<div>
<p class="">Domanda di sicurezza: <strong>@Model.Question</strong> </p>
<label>Risposta: </label>
<input id="answer" type="text" placeholder="Risposta" />
<input type="button" class="btn btn-default" id="send-answ" value="Invia" />
</div>
<p id="error" class="login-box-msg text-red"></p>
</div>
<div class="box-footer">
<a href="/Login" type="button" class="btn btn-info">Torna al Login</a>
</div>
</div>
</div>
</div>
<div class="col-md-4"></div>
<script>
$("#send-answ").on("click", function () {
var answer = $("#answer").val();
$.ajax({
url: "/Account/_checkQuestion",
dataType: "json",
type: "POST",
data: {
Username: "@Model.Username",
Answer: answer
},
success: function (data) {
if (data.success)
window.location.reload();
else
$("#error").html(data.message);
}
});
});
</script>

View File

@@ -1,36 +0,0 @@
<!--
pg di registering
se gia loggato reindirizza al profilo(ancora da fare)
logo sito
disattivare l-aside e le opzioni
se non loggato deve tornare qua
-->
@model object
@inject IHttpContextAccessor HttpContextAccessor
@{
ViewBag.Title = "Hello Razor";
string session = HttpContextAccessor.HttpContext.Session.GetString("username");
}
<div class="content">
@if (session == null)
{
@if (Model is string)
{
<p class="text-red box-title">Per poter accedere alla pagina [@Model] e' necessario essere loggati</p>
}
<div class="login-box">
@{ await Html.RenderPartialAsync("Login"); }
</div>
<div class="login-box">
@{ await Html.RenderPartialAsync("Register"); }
</div>
}
else
{
await Html.RenderPartialAsync("Profile", Model); // magari sostituire qui
}
</div>

View File

@@ -0,0 +1,95 @@
@model string
@if (Model != null)
{
var m = Model;
if (Model.StartsWith("/"))
{
m = "Per poter accedere alla pagina[" + Model + "] e' necessario essere loggati";
}
<div class="col-md-4"></div>
<p class="text-red box-title">@m</p>
}
<div class="col-md-4"></div>
<div class="col-md-4">
<!-- Login Form -->
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Login</h3>
</div>
<!-- /.box-header -->
<!-- form start -->
<div class="form-horizontal">
<div class="box-body">
<div class="form-group">
<label class="col-sm-2 control-label">Username</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="username" placeholder="Username" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">Password</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="password" placeholder="Password" />
</div>
</div>
</div>
<!-- /.box-body -->
<div class="box-footer">
<input type="submit" class="btn btn-info pull-right" id="login-btn" value="Login" />
<p id="msg" class="login-box-msg"></p>
</div>
<!-- /.box-footer -->
</div>
<div class="box-footer">
<button type="button" id="forgot" class="btn btn-default">Passsword dimenticata</button>
<a href="/Register" type="button" class="btn btn-info pull-right">Registrati</a>
<br />
<form id="div-forgot" style="display:none" action="/Forgot" method="get">
<div class="box-body">
<div class="form-group">
<label class="col-sm-2 control-label">Username</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="username"><br />
<input class="btn btn-default" type="submit" id="ok-forgot" value="Recupera password" />
</div>
</div>
</div>
</form>
</div>
</div>
<!-- /.box -->
</div>
<div class="col-md-4"></div>
<script>
$("#forgot").on("click", function () {
$("#div-forgot").toggle();
});
$("#login-btn").on("click", function () {
var username = $("#username").val();
var password = $("#password").val();
$.ajax({
url: "/Account/_login",
data: { Username: username, Password: password },
dataType: "json",
type: "POST",
success: function (data) {
var msg = $("#msg");
if (data.success) {
window.location.reload();
} else {
msg.html(data.message).show();
$("#user-menu").addClass("open");
}
return false;
}
})
});
</script>

View File

@@ -4,56 +4,102 @@
@using LinqToDB; @using LinqToDB;
@{ @{
ViewBag.Title = "Hello Razor"; ViewBag.Title = "Chat";
string username = HttpContextAccessor.HttpContext.Session.GetString("username"); var session = HttpContextAccessor.HttpContext.Session;
var username = session.GetString("username");
var db = dbFactory.Create(); var db = dbFactory.Create();
var MaxMessages = 20;
var messages = (from m in db.Messages var messages = (from m in db.Messages
where (m.Username.Equals(Model.Username) && m.Receiver.Equals(username)) where (m.Username.Equals(Model.Username) && m.Receiver.Equals(username))
||(m.Receiver.Equals(Model.Username) && m.Username.Equals(username)) ||(m.Receiver.Equals(Model.Username) && m.Username.Equals(username))
orderby m.Time ascending orderby m.Time ascending
select m).ToArray(); select m).Take(MaxMessages).ToArray();
} }
<div class="content"> <div class="content">
@if (messages.Count() == 0) <div class="row">
{ <div class="col-md-12">
<p class="text-red">Non hai messaggi</p> <div class="box box-primary direct-chat direct-chat-primary">
} <div class="box-header with-border">
else <h3 class="box-title">Messaggi con @Model.Name @Model.LastName</h3>
{ </div>
<h3 class="text-bold">Messaggi con @Model.Name @Model.LastName</h3> <div class="box-body">
<!-- Conversations are loaded here -->
foreach (var message in messages) <div class="direct-chat-messages" style="overflow-x:hidden">
{ @if (messages.Count() == 0)
if (message.Seen == default && message.Receiver.Equals(username)) {
{ <p class="text-red">Non hai messaggi</p>
message.Seen = DateTime.Now; }
db.Update(message); else
} {
<div> foreach (var message in messages)
@if (message.Receiver.Equals(username)) {
{ if (message.Seen == default && message.Receiver.Equals(username))
<div class="pull-left"></div> {
<div class="pull-right-container bg-light-blue"> message.Seen = DateTime.Now;
<span style="white-space: pre-line" class="">@message.Body</span> db.Update(message);
<p class="text-aqua">@message.Seen</p> }
<div>
@if (message.Receiver.Equals(username))
{
<!-- Message. Default to the left -->
<div class="row">
<div class="pull-left direct-chat-msg col-md-6">
<div class="direct-chat-info clearfix">
<span class="direct-chat-name pull-left">@Model.LastName</span>
<span class="direct-chat-timestamp pull-right">@message.Time</span>
</div>
<!-- /.direct-chat-info -->
<img class="direct-chat-img" src="@Model.Avatar" alt="User image">
<div class="direct-chat-text">
@message.Body
</div>
<!-- /.direct-chat-text -->
</div>
</div>
}
else
{
<!-- Message to the right -->
<div class="row">
<div class="pull-right direct-chat-msg right col-md-6">
<div class="direct-chat-info clearfix">
<span class="direct-chat-name pull-right">Tu</span>
<span class="direct-chat-timestamp pull-left">@message.Time</span>
</div>
<!-- /.direct-chat-info and text -->
<img class="direct-chat-img" src="@session.GetString("avatar")" alt="User image">
<div class="direct-chat-text">
@message.Body
</div>
</div>
</div>
}
</div>
}
}
</div> </div>
} </div>
else <!-- /.box-body -->
{ <div class="box-footer">
<div class="pull-right-container bg-green-gradient"> <div>
<div style="white-space: pre-line" class="">@message.Body</div> <div class="input-group">
<p class="text-aqua">@message.Seen</p> <input type="text"id="res-message" name="message" placeholder="Scrivi un messaggio..." class="form-control">
<span class="input-group-btn">
<button type="submit" id="btn-send-message" class="btn btn-primary btn-flat">Spedisci</button>
</span>
</div>
<p id="message-error" class="text-red"></p>
</div> </div>
<div class="pull-right"></div> </div>
} <!-- /.box-footer-->
</div> </div>
} <!--/.direct-chat -->
} </div>
<div class="pull-right"> </div>
<textarea id="res-message" class="progress-text" placeholder="Scrivi qui per scrivere un messaggio"></textarea>
<button id="btn-send-message">Invia</button> <div class="pull-right col-md-4">
<p id="message-error" class="text-red"></p>
</div> </div>
<script> <script>
$("#btn-send-message").on("click", function () { $("#btn-send-message").on("click", function () {

View File

@@ -0,0 +1,314 @@
@inject IHttpContextAccessor HttpContextAccessor
@inject IDataContextFactory<SeniorDataContext> dbFactory
@model User
<section class="content">
<div class="row">
<div class="col-md-1"></div>
<div class="col-md-4">
<div class="box box-info bg-gray-light" style="border-top-color: darkgray">
<div class="box-header with-border">
<h2 class="box-title">Dati utente</h2>
<p></p><label>Per modificare i dati: </label>
<a href="#" type="button" class="text btn btn-default" id="btn-mod"> Premi qui</a>
</div>
<section class="form-horizontal">
<div class="box-body">
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="text" value="@Model.Name" id="mod-name" />
<input class="form-control old-data form-control" disabled type="text" value="@Model.Name" /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="text" value="@Model.LastName" id="mod-last" />
<input class="form-control old-data" disabled type="text" value="@Model.LastName" /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="email" value="@Model.Email" id="mod-email" />
<input class="form-control old-data" disabled type="email" value="@Model.Email" /><br />
</div>
</div>
@if (Model.IsDoctor())
{
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="number" value="@Model.Doc.PhoneNumber" id="mod-phone" placeholder="Numero telefono" />
<input class="form-control old-data" disabled type="number" value="@Model.Doc.PhoneNumber" /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="text" value="@Model.Doc.Location" id="mod-location" placeholder="Luogo" />
<input class="form-control old-data" disabled type="text" value="@Model.Doc.Location" /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="text" value="@Model.Doc.Schedule" id="mod-schedule" placeholder="Orari" />
<input class="form-control old-data" disabled type="text" value="@Model.Doc.Schedule" /><br />
</div>
</div>
}
<div class="form-group">
<div class="col-sm-10">
<input class="form-control" type="text" value="@Model.Username" disabled /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="password" id="mod-pass1" placeholder="Nuova password" /><br />
</div>
</div>
<div class="form-group">
<div class="col-sm-10">
<input class="form-control mod-data hide" type="password" id="mod-pass2" placeholder="Conferma password" /><br />
</div>
</div>
<div class="form-group" id="image-uploader" style="display:none">
<div class="col-sm-10">
<div>
<form method="post" enctype="multipart/form-data">
<span>Cambia immagine profilo</span>
<input type="file" name="files" id="files" />
</form>
</div>
</div>
</div>
</div>
</section>
<div class="box-footer">
<p id="msg"></p>
<input class="btn btn-info pull-right mod-data hide" type="button" id="update-user" value="Aggiorna"/>
</div>
</div>
</div>
<div class="col-md-6">
@if (Model.IsPatient()) // is patient and has doc, must show doc data
{
var db = dbFactory.Create();
var doctor = (from u in db.Users
join d in db.Doctors on u.Username equals d.Username
where d.Username.Equals(Model.Pat.Doctor)
select new { u.Username, u.Name, u.LastName, d.Location, d.PhoneNumber, d.Schedule }).ToArray().First();
<div class="box box-warning">
<div class="box-header with-border">
<h3 class="box-title">Contatti con il dottore: <strong>@doctor.Name @doctor.LastName</strong></h3>
</div>
<div class="box-body">
<div role="form">
<div class="form-group">
<h5 class="box-comment">Indirizzo dello studio: <strong>@doctor.Location</strong></h5>
</div>
<div class="form-group">
<h5>Recapito telefonico: <strong>@doctor.PhoneNumber</strong></h5>
</div>
<div class="form-group">
<div class="input-group-btn input-group-sm">
<h5 class="form-control box-comment">Orario visite: <strong>@doctor.Schedule</strong></h5>
</div>
</div>
<div class="form-group">
<label>Note da parte del dottore:</label>
<textarea class="form-control" placeholder="Nessuna nota" readonly rows="10" style="resize:none">@Model.Pat.Notes</textarea>
<br />
<div class="input-group-btn input-group-sm">
<a href="/Message/@doctor.Username" class="btn btn-flat btn-info">Scrivi un messaggio</a>
</div>
</div>
</div>
</div>
</div>
}
else
{
var db = dbFactory.Create();
dynamic[] data;
Type type = null;
string title = null;
var docData = db.Doctors.Where(d => d.Username.Equals(Model.Username)).ToArray().FirstOrDefault();
if (docData != null) // is DOC
{
// see all the patient of the doc
<div class="box-header with-border">
<h2 class="box-title">Lista dei pazienti</h2>
</div>
var patients = (from u in db.Users
join p in db.Patients on u.Username equals p.Username
where p.Doctor.Equals(docData.Username)
select new { u.Username, u.Name, u.LastName, p.Notes, Profile = "<a href=\\\"/user/" + u.Username + "\\\">Visita profilo</a>" }).ToArray();
data = patients;
type = patients.FirstOrDefault()?.GetType();
}
else // is a patient and need to choose a doctor
{
// choose which doc you want
title = "Scegli un Doc";
var docs = (from u in db.Users
join d in db.Doctors on u.Username equals d.Username
select new { u.Username, u.Name, u.LastName, d.Location, Choose = "<a id=\\\"choose-" + u.Username + "\\\" href=#>Scegli</a>" }).ToArray();
data = docs;
type = docs.FirstOrDefault().GetType();
}
if (type != null)
{
var fields = new List<string>();
foreach (var field in type.GetProperties())
{
fields.Add(field.Name);
}
<p>@title</p>
<div id="var-table"></div>
<script>
var datas = [
@foreach (var el in data)
{
@:{
@foreach (var field in fields)
{
@field@:: "@Html.Raw(type.GetProperty(field).GetValue(el, null))",
}
@:},
}
];
$(document).ready(function () {
$("#var-table").kendoGrid({
dataSource: {
data: datas,
schema: {
model: {
fields: {
@foreach (var field in fields)
{
@field@: : { type: "@field.GetType().Name" },
}
}
}
}
},
scrollable: true,
sortable: true,
filterable: true,
columns: [
@foreach (var field in fields)
{
@:{ field: "@field", title: "@field", template: "#=@field#" },
}
]
});
@if (docData == null) // choose a doc
{
<text>
$('[id^="choose-"]').on("click", function () {
var id = this.id.replace("choose-", '');
$.ajax({
type: "POST",
url: "/Account/_addDoc",
data: { doctor: id },
success: function (data) {
if (data.success) {
window.location.reload();
}
}
})
})
</text>
}
});
</script>
}
}
</div>
</div>
</section>
<script>
$(document).ready(function () {
$(".opening-hours li").eq(new Date().getDay()).addClass("today");
});
$("#files").kendoUpload({
async: {
saveUrl: "/Account/_save",
autoUpload: true
},
success: function (data) {
if (data.response.success)
window.location.reload();
else
console.log(data.response.message);
}
});
$("#btn-mod").on("click", function () {
$(".mod-data").toggleClass("hide");
$(".old-data").toggleClass("hide");
$("#image-uploader").toggle();
});
$("#update-user").on("click", function () {
var name = $("#mod-name").val();
var lastname = $("#mod-last").val();
var password = $("#mod-pass1").val();
var password2 = $("#mod-pass2").val();
var email = $("#mod-email").val();
var schedule = $("#mod-schedule").val();
var phone = $("#mod-phone").val();
var location = $("#mod-location").val();
if (password != password2) {
$("#msg-reg").html("[Le password non coincidono]").show();
return false;
}
$.ajax({
url: "/Account/_modify",
data: {
User: {
Username: "@Model.Username",
Name: name,
Lastname: lastname,
Password: password,
Email: email
},
Doctor: {
Schedule: schedule,
PhoneNumber: phone,
Location: location
}
},
dataType: "json",
type: "POST",
success: function (data) {
var msg = $("#msg");
if (data.success) {
window.location.reload();
} else {
msg.html(data.message).show();
}
}
})
});
</script>

View File

@@ -0,0 +1,137 @@
<div class="col-md-4"></div>
<div class="col-md-4">
<!-- Register Form -->
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Registrazione</h3>
</div>
<!-- form start -->
<div class="form-horizontal">
<div class="box-body">
<div class="form-group">
<label class="col-sm-3 control-label">Username</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="regUsername" placeholder="Username" required />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Name</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="regName" placeholder="Name" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Last name</label>
<div class="col-sm-8">
<input class="form-control" type="text" id="regLastname" placeholder="Lastname" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Password</label>
<div class="col-sm-8">
<input class="form-control" type="password" id="regPassword" placeholder="Password" required />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Conferma password</label>
<div class="col-sm-8">
<input class="form-control" type="password" id="regPassword2" placeholder="Password" required />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">E-mail</label>
<div class="col-sm-8">
<input class="form-control" type="email" id="regEmail" placeholder="Email" required />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Sei un dottore?</label>
<div class="col-sm-8">
<input type="checkbox" id="check" />
<input class="form-control hide" type="text" id="regDoctor" placeholder="(543210)" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Domanda di sicurezza</label>
<div class="col-sm-8">
<input class="form-control" type="text" id="passwQues" placeholder="Domanda di sicurezza" required />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Risposta di sicurezza</label>
<div class="col-sm-8">
<input class="form-control" type="text" id="passwAnsw" placeholder="Risposta di sicurezza" required />
</div>
</div>
</div>
<div class="box-footer">
<button class="btn btn-info pull-right" id="register-btn">Register</button>
<a href="/Login" type="button" class="btn btn-info">Torna al login</a>
<p id="msg-reg" class="login-box-msg text-red"></p>
</div>
</div>
</div>
</div>
<div class="col-md-4"></div>
<script>
$("#check").on("click", function () {
$("#regDoctor").addClass("hide");
$("#check").removeClass("hide");
});
$("#register-btn").on("click", function () {
var username = $("#regUsername").val();
var name = $("#regName").val();
var lastname = $("#regLastname").val();
var password = $("#regPassword").val();
var password2 = $("#regPassword2").val();
var email = $("#regEmail").val();
var code = $("#regDoctor").val();
var quest = $("#passwQues").val();
var answ = $("#passwAnsw").val();
if (password != password2) {
$("#msg-reg").html("[Le password non coincidono]").show();
return false;
}
$.ajax({
url: "/Account/_register",
data: {
Code: code,
User: {
Username: username,
Name: name,
Lastname: lastname,
Password: password,
Email: email
},
Forgot: {
Question: quest,
Answer: answ
}
},
dataType: "json",
type: "POST",
success: function (data) {
var msg = $("#msg-reg");
if (data.success) {
window.location.reload();
} else {
msg.html(data.message).show();
}
}
})
});
</script>

View File

@@ -3,9 +3,10 @@
@model User @model User
@{ @{
ViewBag.Title = "Hello Razor"; ViewBag.Title = "Dati paziente";
var session = HttpContextAccessor.HttpContext.Session; var session = HttpContextAccessor.HttpContext.Session;
var username = session.GetString("username"); var username = session.GetString("username");
bool filter = HttpContextAccessor.HttpContext.Request.Query["from"] != (String)null;
bool auth = username.Equals(Model.Username); bool auth = username.Equals(Model.Username);
bool isDoc = Model.IsPatient() && username.Equals(Model.Pat.Doctor); bool isDoc = Model.IsPatient() && username.Equals(Model.Pat.Doctor);
@@ -18,72 +19,154 @@
} }
else else
{ {
<div> <div class="row">
<input id="hours-data" type="text" placeholder="hours" value="24" /> <div class="col-md-4">
<button id="refresh-hours" class="fc-button">Cambia ora</button> <table>
<div id="chart-data"></div> <tr>
<div class="form-group">
<div class="input-group col-md-10">
<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>
</div>
</tr>
<tr>
<div class="form-group">
<div class="input-group col-md-4">
<div class="input-group-addon">
<i class="fa fa-calendar"></i>
</div>
<input id="date-from" class="form-control" type="date" value="@HttpContextAccessor.HttpContext.Request.Query["from"]" />
<input id="date-to" class="form-control" type="date" value="@HttpContextAccessor.HttpContext.Request.Query["to"]" />
<div class="input-group-addon">
<input type="button" id="refresh-date" class="no-border btn" value="Cambia data" />
</div>
</div>
</div>
</tr>
</table>
</div>
<div class="col-md-4">
@if (isDoc)
{
<div class="form-group col-md-10">
<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>
<div class="col-md-4">
@if (isDoc)
{
<div class="form-group">
<label>Scrivi una nota per il paziente</label>
<textarea id="note-area" placeholder="Scrivi una nota.." class="form-control" rows="3" style="resize:none">@Model.Pat.Notes</textarea>
<button id="send-note" class="btn">Salva</button>
<p id="note-error"></p>
</div>
}
</div>
</div> </div>
@if (isDoc)
{ <div class="row">
<div> @if (isDoc)
<textarea id="note-area" placeholder="Scrivi una nota..">@Model.Pat.Notes</textarea> {
<button id="send-note" class="btn">Salva</button> <div class="form-group col-md-4">
<p id="note-error"></p> <form action="" method="get" onsubmit="return confirm('Sicuro di voler rimuovere il paziente?');">
<button type="submit" name="removePatient" class="btn btn-danger" value="@Model.Username">Rimuovi paziente</button>
</form>
</div>
<div class="form-group col-md-4">
<div class="input-group-btn input-group-sm col-md-10">
<a href="/Message/@Model.Pat.Username" class="btn btn-flat btn-info">Scrivi a @Model.Name </a>
</div>
</div>
}
<div class="form-group col-md-4">
<input type="checkbox" id="show-table">
<label>
Mostra dati sotto forma di tabella
</label>
</div> </div>
<a class="" href="/Message/@Model.Pat.Username">Invia un messaggio al tuo paziente</a> </div>
<div> <div id="chart-data"></div>
<p>Inserisci un minimo o massimo valore per il battito cardiaco</p>
<p>Se il valore del battito del paziente supera i valori che hai inserito verrai notificato</p>
<label>Max:</label>
<input id="maxHeart" placeholder="max" value="@Model.Pat.MaxHeart" />
<label>Min:</label>
<input id="minHeart" placeholder="min" value="@Model.Pat.MinHeart" />
</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>
}
<script> <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
}
});
});
function onlyNum(object, numChar = 3) { function onlyNum(object, numChar = 3) {
object.val(object.val().replace(/[^0-9]/g, '').substring(0, numChar)); object.val(object.val().replace(/[^0-9]/g, '').substring(0, numChar));
} }
$("#show-table").on("click", function () {
$(toRefresh).click();
});
$("#hours-data").on("change keyup paste click", function () { $("#hours-data").on("change keyup paste click", function () {
onlyNum($(this), 2); onlyNum($(this), 2);
}); });
$("#refresh-hours").on("click", function () { $("#refresh-hours").on("click", function () {
var hours = $("#hours-data").val(); var hours = $("#hours-data").val();
var base_url = "@Url.Content("~/api/")";
var end_url = "/@Model.Username/last/" + hours; var end_url = "/@Model.Username/last/" + hours;
toRefresh = "#refresh-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;
toRefresh = "#refresh-date";
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 + "heartbeat" + end_url, function (heartbeat) {
$.getJSON(base_url + "step" + end_url, function (steps) { $.getJSON(base_url + "step" + end_url, function (steps) {
$.getJSON(base_url + "sleep" + end_url, function (sleep) { $.getJSON(base_url + "sleep" + end_url, function (sleep) {
@@ -101,8 +184,124 @@ else
if (Object.keys(heartbeat).length == 0 if (Object.keys(heartbeat).length == 0
&& Object.keys(steps).length == 0 && Object.keys(steps).length == 0
&& Object.keys(sleep).length == 0) && Object.keys(sleep).length == 0)
$("#chart-data").html("Nessun dato"); $("#chart-data").html("<h3 class='text-center text-red'>Nessun Dato</h3>");
else 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) {
var dati = "Dati di @Model.Name @Model.LastName"
$("#chart-data").kendoGrid({
toolbar: ["excel"],
excel: {
fileName: dati,
filterable: false,
columns: [{ autowidth: true}]
},
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"
}
],
excelExport: function (e) {
var sheet = e.workbook.sheets[0];
for (var i = 1; i < sheet.columns.length; i++) {
sheet.columns[i].width = 10;
}
}
});
}
else
$("#chart-data").kendoChart({ $("#chart-data").kendoChart({
title: { text: "Visualizzazione attivita' di @Model.Name @Model.LastName" }, title: { text: "Visualizzazione attivita' di @Model.Name @Model.LastName" },
legend: { position: "bottom" }, legend: { position: "bottom" },
@@ -167,10 +366,10 @@ else
min: 0 min: 0
}] }]
}); /* Kendo */ }); /* Kendo */
} /* else */
}); /* sleep */ }); /* sleep */
}); /* steps */ }); /* steps */
}); /* heart */ }); /* heart */
}); /* click */ }
$("#refresh-hours").click();
</script> </script>
} }

View File

@@ -1,6 +1,6 @@
@model IEnumerable<User> @model IEnumerable<User>
@{ @{
ViewBag.Title = "Hello Razor"; ViewBag.Title = "Tutti gli utenti";
} }
<div id="grid"></div> <div id="grid"></div>

View File

@@ -1,17 +1,17 @@
@{ @{
var controller = ViewContext.RouteData.Values["Controller"]; var controller = ViewContext.RouteData.Values["Controller"].ToString();
var action = ViewContext.RouteData.Values["Action"]; var action = ViewContext.RouteData.Values["Action"].ToString();
} }
<div class="breadcrumb"> <div class="breadcrumb">
@Html.ActionLink("Home", "Index", "Home") @Html.ActionLink("Home", "Profile", "Home")
@if (controller.ToString() != "Home") @if (controller != "Home")
{ {
@:> @Html.ActionLink(controller.ToString(), "Index", controller.ToString()) @:> @Html.ActionLink(controller, "Index", controller)
} }
@if (action.ToString() != "Index") @if (action != "Index")
{ {
@:> @Html.ActionLink(action.ToString(), action.ToString(), controller.ToString()) @:> @Html.ActionLink(action, action, controller)
} }
</div> </div>

View File

@@ -1,36 +0,0 @@
<ul style="list-style-type:none">
<li class="user-header">
<input type="text" id="username" placeholder="username" />
<input type="password" id="password" placeholder="password" />
<div>
<button class="btn-default btn btn-flat" id="login-btn">Login</button>
</div>
<p id="msg" class="login-box-msg"></p>
</li>
</ul>
<script>
$("#login-btn").on("click", function () {
var userName = $("#username").val();
var password = $("#password").val();
$.ajax({
url: "/Account/_login",
data: { UserName: userName, Password: password, RememberMe: false },
dataType: "json",
type: "POST",
success: function (data) {
var msg = $("#msg");
if (data.success) {
window.location.reload();
} else {
msg.html(data.message).show();
$("#user-menu").addClass("open");
}
return false;
},
error: function (xhr, status, error) {
alert(xhr.status+" "+xhr.responseText)
}
})
});
</script>

View File

@@ -7,14 +7,14 @@
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<!-- The user image in the navbar--> <!-- The user image in the navbar-->
<img src="~/AdminLTE-2.4.3/dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> <img src="@session.GetString("avatar")" class="user-image" alt="User Image">
<!-- hidden-xs hides the username on small devices so only the image appears. --> <!-- hidden-xs hides the username on small devices so only the image appears. -->
<span id="user-name" class="hidden-xs">@Model</span> <span id="user-name" class="hidden-xs">@Model</span>
</a> </a>
<ul class="dropdown-menu" style="box-shadow: black 0px 0px 2px"> <ul class="dropdown-menu" style="box-shadow: black 0px 0px 2px">
<!-- The user image in the menu --> <!-- The user image in the menu -->
<li class="user-header"> <li class="user-header">
<img src="~/AdminLTE-2.4.3/dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> <img src="@session.GetString("avatar")" class="img-circle" alt="User Image" id="avatar">
<p> <p>
@session.GetString("name") @session.GetString("lastname") - @session.GetString("role") @session.GetString("name") @session.GetString("lastname") - @session.GetString("role")
<small>@session.GetString("email")</small> <small>@session.GetString("email")</small>

View File

@@ -35,7 +35,7 @@
<li> <li>
<!-- start notification --> <!-- start notification -->
<a id="message-@message.Id" @if(message.Seen != default) {<text>class= "bg-gray"</text>} href="/Message/@message.Username"> <a id="message-@message.Id" @if(message.Seen != default) {<text>class= "bg-gray"</text>} href="/Message/@message.Username">
<i class="fa text-lime">@message.Time</i><br /> <i class="fa text-light-blue">@message.Time</i><br />
@message.Body @message.Body
</a> </a>
</li> </li>

View File

@@ -1,128 +0,0 @@
@inject IHttpContextAccessor HttpContextAccessor
@inject IDataContextFactory<SeniorDataContext> dbFactory
@model User
<div class="content">
<div class="pull-left" , style="width: 50%">
<h2 class="alert-success" style="text-align:center">
Welcome @Model.Name @Model.LastName
</h2>
name: @Model.Name<br />
lastname: @Model.LastName<br />
email: @Model.Email<br />
</div>
<div class="box pull-right" , style="width: 45%">
@if (Model.IsPatient()) // is patient and has doc, must show doc data
{
var db = dbFactory.Create();
var doctor = (from u in db.Users
join d in db.Doctors on u.Username equals d.Username
where d.Username.Equals(Model.Pat.Doctor)
select new { u.Username, u.Name, u.LastName, d.Location }).ToArray().First();
<p class="text-bold">Dottore: @doctor.Name @doctor.LastName</p>
<p class="text-fuchsia">Dove mi puoi trovare? @doctor.Location</p>
<textarea class="progress-text" placeholder="Nessuna nuova nota" readonly>@Model.Pat.Notes</textarea>
<a class="" href="/Message/@doctor.Username">Invia un messaggio al tuo dottore</a>
}
else
{
var db = dbFactory.Create();
dynamic[] data;
Type type = null;
string title = null;
var docData = db.Doctors.Where(d => d.Username.Equals(Model.Username)).ToArray().FirstOrDefault();
if (docData != null) // is DOC
{
// see all the patient of the doc
title = "Lista dei pazienti";
var patients = (from u in db.Users
join p in db.Patients on u.Username equals p.Username
where p.Doctor.Equals(docData.Username)
select new { u.Username, u.Name, u.LastName, p.Notes, Profile = "<a href=\\\"/user/" + u.Username + "\\\">Profile</a>" }).ToArray();
data = patients;
type = patients.FirstOrDefault().GetType();
}
else // is a patient and need to choose a doctor
{
// choose which doc you want
title = "Scegli un Doc";
var docs = (from u in db.Users
join d in db.Doctors on u.Username equals d.Username
select new { u.Username, u.Name, u.LastName, d.Location, Choose = "<a id=\\\"choose-" + u.Username + "\\\" href=#>Scegli</a>" }).ToArray();
data = docs;
type = docs.FirstOrDefault().GetType();
}
var fields = new List<string>();
foreach (var field in type.GetProperties())
{
fields.Add(field.Name);
}
<p>@title</p>
<div id="var-table"></div>
<script>
var datas = [
@foreach (var el in data)
{
@:{
@foreach (var field in fields)
{
@field@:: "@Html.Raw(type.GetProperty(field).GetValue(el, null))",
}
@:},
}
];
$(document).ready(function () {
$("#var-table").kendoGrid({
dataSource: {
data: datas,
schema: {
model: {
fields: {
@foreach (var field in fields)
{
@field@: : { type: "@field.GetType().Name" },
}
}
}
}
},
scrollable: true,
sortable: true,
filterable: true,
columns: [
@foreach (var field in fields)
{
@:{ field: "@field", title: "@field", template: "#=@field#" },
}
]
});
@if(docData == null) // choose a doc
{
<text>
$('[id^="choose-"]').on("click", function () {
var id = this.id.replace("choose-", '');
$.ajax({
type: "POST",
url: "/Account/_addDoc",
data: { doctor: id },
success: function (data) {
if (data.success) {
window.location.reload();
}
}
})
})
</text>
}
});
</script>
}
</div>
</div>

View File

@@ -1,50 +0,0 @@
<ul style="list-style: none">
<li class="user-header">
<input type="text" id="regUsername" placeholder="Username" required />
<input type="text" id="regName" placeholder="Name" />
<input type="text" id="regLastname" placeholder="Lastname" />
<input type="password" id="regPassword" placeholder="Password" required />
<input type="email" id="regEmail" placeholder="Email" required />
<label>Doc?</label><input type="checkbox" id="regDoctor" />
<div>
<button class="btn-default btn btn-flat" id="register-btn">Register</button>
</div>
<p id="msg-reg" class="login-box-msg"></p>
</li>
</ul>
<script>
$("#register-btn").on("click", function () {
var username = $("#regUsername").val();
var name = $("#regName").val();
var lastname = $("#regLastname").val();
var password = $("#regPassword").val();
var email = $("#regEmail").val();
var role = $("#regDoctor").is(":checked")? "Doctor":"User";
$.ajax({
url: "/Account/_register",
data: {
Username: username,
Name: name,
Lastname: lastname,
Password: password,
Email: email,
Role: role
},
dataType: "json",
type: "POST",
success: function (data) {
var msg = $("#msg-reg");
if (data.success) {
window.location.reload();
} else {
msg.html(data.message).show();
}
},
error: function (xhr, status, error) {
alert(xhr.responseText)
}
})
});
</script>

View File

@@ -3,50 +3,78 @@
@{ @{
var session = HttpContextAccessor.HttpContext.Session; var session = HttpContextAccessor.HttpContext.Session;
string search = HttpContextAccessor.HttpContext.Request.Query["q"]; string add = HttpContextAccessor.HttpContext.Request.Query["add"];
string remove = HttpContextAccessor.HttpContext.Request.Query["remove"];
string username = session.GetString("username"); string username = session.GetString("username");
var db = dbFactory.Create();
if (username != null) if (username != null)
{ {
var isDoc = session.GetString("role").Equals("doctor"); var isDoc = session.GetString("role").Equals("doctor");
var isPatient = session.GetString("role").Equals("patient");
var Menu = new List<IMenuItem>(); var Menu = new List<IMenuItem>();
Menu.Add(new MenuItem("Profilo", "/")); Menu.Add(new MenuItem("Profilo", "/"));
Menu.Add(new MenuItem("Dati personali", "/user/" + username));
if (isDoc) if(isPatient)
{ {
var db = dbFactory.Create(); Menu.Add(new MenuItem("Dati personali", "/user/" + username));
var patients = (from p in db.Patients
where p.Doctor.Equals(username)
join u in db.Users on p.Username equals u.Username
select new { Username = p.Username, Name = u.Name + " " + u.LastName }).ToArray();
var sub = new SubMenu() { Text = "Pazienti", Items = new List<MenuItem>() };
foreach (var p in patients)
{
sub.Items.Add(new MenuItem(p.Name, "/user/" + p.Username));
}
Menu.Add(sub);
}
else
{
var db = dbFactory.Create();
var patient = (from p in db.Patients
where p.Username.Equals(username)
select p).FirstOrDefault();
Menu.Add(new MenuItem("Invia un messaggio al dottore", "/Message/" + patient.Doctor));
} }
<aside class="main-sidebar"> <aside class="main-sidebar">
<!-- sidebar: style can be found in sidebar.less --> <!-- sidebar: style can be found in sidebar.less -->
<section class="sidebar"> <section class="sidebar">
@if (isDoc) @if (isDoc)
{ {
if (add != null)
{
var user = db.Patients
.Where(p => p.Username.Equals(add) && p.Doctor.Equals(username))
.FirstOrDefault();
try
{
db.Insert(new MenuPatient()
{
Username = username,
PatientUsername = user.Username
});
}
catch { }
}
if(remove != null)
{
var menu = db.MenuPatients
.Where(p => p.Username.Equals(username) && p.PatientUsername.Equals(remove))
.FirstOrDefault();
if(menu != null)
{
db.Delete(menu);
}
}
var patients = db.MenuPatients
.LoadWith(m => m.Usr)
.Where(m => m.Username.Equals(username))
.Select(m => m.Usr)
.ToArray();
var num = patients.Count();
var sub = new SubMenu() { Text = num + " pazienti link rapido", Items = new List<MenuItem>() };
foreach (var p in patients)
{
sub.Items.Add(new MenuItem(p.Name + " " + p.LastName, "/user/" + p.Username));
}
Menu.Add(sub);
<!-- Sidebar user panel (optional) --> <!-- Sidebar user panel (optional) -->
<!-- search form (Optional) --> <!-- search form (Optional) -->
<form action="#" method="get" class="sidebar-form"> <form action="" method="get" class="sidebar-form">
<div class="input-group"> <div class="input-group">
<input type="text" name="q" class="form-control" placeholder="Search..." , value="@search"> <input type="text" name="add" class="form-control" placeholder="Aggiungi utente ai link" , value="">
<span class="input-group-btn"> <span class="input-group-btn">
<button type="submit" name="search" id="search-btn" class="btn btn-flat"> <button type="submit" class="btn btn-flat">
<i class="fa fa-search"></i> <i class="fa fa-plus"></i>
</button> </button>
</span> </span>
</div> </div>
@@ -54,6 +82,16 @@
<!-- /.search form --> <!-- /.search form -->
<!-- Sidebar Menu --> <!-- Sidebar Menu -->
} }
else
{
var patient = (from p in db.Patients
where p.Username.Equals(username)
select p).FirstOrDefault();
if (patient != null)
{
Menu.Add(new MenuItem("Invia un messaggio al dottore", "/Message/" + patient.Doctor));
}
}
<div> <div>
<ul class="sidebar-menu" data-widget="tree"> <ul class="sidebar-menu" data-widget="tree">
@foreach (var menuItem in Menu) @foreach (var menuItem in Menu)
@@ -66,28 +104,25 @@
</li> </li>
break; break;
case SubMenu multi: case SubMenu multi:
<li class="treeview @if(search != null) {<text>menu-open</text>}"> <li class="treeview menu-open">
<a href="#"> <a href="#">
<i class="fa fa-link"></i><span>@multi.Text</span> <i class="fa fa-link"></i><span>@multi.Text</span>
<span class="pull-right-container"> <span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i> <i class="fa fa-angle-left pull-right"></i>
</span> </span>
</a> </a>
<ul class="treeview-menu" @if (search != null) { <text> style="display: block;" </text> }> <ul class="treeview-menu" style="display:block">
@foreach (MenuItem item in multi.Items) @foreach (MenuItem item in multi.Items)
{ {
<li> <li>
@{ <a href="@item.HRef">
var text = item.Text; <span>@Html.Raw(item.Text)</span>
var bg = ""; <form class="pull-right-container" action="" method="get">
if (search != null && item.Text.StartsWith(search)) <input type="text" name="remove" class="hide" value="@System.IO.Path.GetFileName(item.HRef)">
{ <button class="no-border btn-flat" style="background-color:#2c3b41" type="submit" role="form">
bg = "bg-aqua"; <i class="fa fa-minus pull-right"></i>
text = item.Text.Replace(search, "<em>" + search + "</em>"); </button>
} </form>
}
<a href="@item.HRef" class="@bg">
@Html.Raw(text)
</a> </a>
</li> </li>
} }
@@ -102,11 +137,5 @@
</section> </section>
<!-- /.sidebar --> <!-- /.sidebar -->
</aside> </aside>
@if (search != null)
{
<script>
$("body").removeClass("sidebar-collapse");
</script>
}
} }
} }

View File

@@ -22,12 +22,24 @@ scratch. This page gets rid of all links and provides the needed markup only.
<title>SeniorAssistant @ViewBag.Title</title> <title>SeniorAssistant @ViewBag.Title</title>
<!-- Tell the browser to be responsive to screen width --> <!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/bootstrap/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/fullcalendar/dist/fullcalendar.min.css">
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/fullcalendar/dist/fullcalendar.print.min.css" media="print">
<!-- daterange picker -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/bootstrap-daterangepicker/daterangepicker.css">
<!-- bootstrap datepicker -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/bootstrap-datepicker/dist/css/bootstrap-datepicker.min.css">
<!-- iCheck for checkboxes and radio inputs -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/plugins/iCheck/all.css">
<link rel="stylesheet" href="~/AdminLTE-2.4.3/plugins/timepicker/bootstrap-timepicker.min.css">
<!-- Font Awesome --> <!-- Font Awesome -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/font-awesome/css/font-awesome.min.css">
<!-- Ionicons --> <!-- Ionicons -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/Ionicons/css/ionicons.min.css"> <link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/Ionicons/css/ionicons.min.css">
<!-- Theme style --> <!-- Theme style -->
<link rel="stylesheet" href="~/AdminLTE-2.4.3/plugins/business.css" />
<link rel="stylesheet" href="~/AdminLTE-2.4.3/dist/css/AdminLTE.min.css"> <link rel="stylesheet" href="~/AdminLTE-2.4.3/dist/css/AdminLTE.min.css">
<!-- AdminLTE Skins. We have chosen the skin-blue for this starter <!-- AdminLTE Skins. We have chosen the skin-blue for this starter
page. However, you can choose any other skin. Make sure you page. However, you can choose any other skin. Make sure you
@@ -47,6 +59,17 @@ scratch. This page gets rid of all links and provides the needed markup only.
<script src="~/kendo/@(kendo.Version)/js/jquery.min.js"></script> <script src="~/kendo/@(kendo.Version)/js/jquery.min.js"></script>
<script src="~/kendo/@(kendo.Version)/js/kendo.all.min.js"></script> <script src="~/kendo/@(kendo.Version)/js/kendo.all.min.js"></script>
<script src="~/kendo/@(kendo.Version)/js/jszip.min.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/moment/moment.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/fullcalendar/dist/fullcalendar.min.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/bootstrap-daterangepicker/daterangepicker.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/fastclick/lib/fastclick.js"></script>
<script src="~/AdminLTE-2.4.3/bower_components/jquery-slimscroll/jquery.slimscroll.min.js"></script>
<script src="~/AdminLTE-2.4.3/plugins/timepicker/bootstrap-timepicker.min.js"></script>
<script src="~/AdminLTE-2.4.3/plugins/jQueryUI/jquery-ui.js"></script>
<script src="~/AdminLTE-2.4.3/plugins/jQueryUI/jquery-ui.min.js"></script>
<script src="~/AdminLTE-2.4.3/plugins/iCheck/icheck.min.js"></script>
</head> </head>
<body class="hold-transition @(theme.Skin.GetDescription()) @(!logged?theme.Layout.GetDescription():"")"> <body class="hold-transition @(theme.Skin.GetDescription()) @(!logged?theme.Layout.GetDescription():"")">
@@ -58,7 +81,9 @@ scratch. This page gets rid of all links and provides the needed markup only.
<!-- mini logo for sidebar mini 50x50 pixels --> <!-- mini logo for sidebar mini 50x50 pixels -->
<span class="logo-mini">@ViewBag.LogoMini</span> <span class="logo-mini">@ViewBag.LogoMini</span>
<!-- logo for regular state and mobile devices --> <!-- logo for regular state and mobile devices -->
<span class="logo-lg">@ViewBag.Logo</span> <span class="logo-lg">
<img src="~/logo-lg.png" width="50" height="50" /> <b>S</b>enior<b>A</b>ssistant
</span>
</a> </a>
<!-- Header Navbar --> <!-- Header Navbar -->
<nav class="navbar navbar-static-top" role="navigation"> <nav class="navbar navbar-static-top" role="navigation">
@@ -66,9 +91,9 @@ scratch. This page gets rid of all links and provides the needed markup only.
@if (logged) @if (logged)
{ {
<text> <text>
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button"> <a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
<span class="sr-only">Toggle navigation</span> <span class="sr-only">Toggle navigation</span>
</a> </a>
</text> </text>
} }
<!-- Navbar Right Menu --> <!-- Navbar Right Menu -->
@@ -106,6 +131,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
<!-- REQUIRED JS SCRIPTS --> <!-- REQUIRED JS SCRIPTS -->
<!-- jQuery 3 --> <!-- jQuery 3 -->
@*<script src="~/AdminLTE-2.4.3/bower_components/jquery/dist/jquery.min.js"></script>*@ @*<script src="~/AdminLTE-2.4.3/bower_components/jquery/dist/jquery.min.js"></script>*@
<!-- Bootstrap 3.3.7 --> <!-- Bootstrap 3.3.7 -->
<script src="~/AdminLTE-2.4.3/bower_components/bootstrap/dist/js/bootstrap.min.js"></script> <script src="~/AdminLTE-2.4.3/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- AdminLTE App --> <!-- AdminLTE App -->
@@ -114,4 +140,4 @@ scratch. This page gets rid of all links and provides the needed markup only.
Both of these plugins are recommended to enhance the Both of these plugins are recommended to enhance the
user experience. --> user experience. -->
</body> </body>
</html> </html>

View File

@@ -4,4 +4,5 @@
@using SeniorAssistant.Data; @using SeniorAssistant.Data;
@using Microsoft.AspNetCore.Mvc; @using Microsoft.AspNetCore.Mvc;
@using Microsoft.AspNetCore.Http; @using Microsoft.AspNetCore.Http;
@using System.Linq; @using System.Linq;
@using LinqToDB;

View File

@@ -0,0 +1,5 @@
{
"version": "1.0",
"defaultProvider": "cdnjs",
"libraries": []
}

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,39 @@
.business-hours {
padding: 40px 14px;
margin-top: -15px;
position: relative;
}
.business-hours:before {
content: '';
width: 23px;
height: 23px;
background: #111;
position: absolute;
top: 5px;
left: -12px;
transform: rotate(-45deg);
z-index: -1;
}
.business-hours .title {
font-size: 20px;
color: #BBB;
text-transform: uppercase;
padding-left: 5px;
border-left: 4px solid #ffac0c;
}
.business-hours li {
color: #888;
line-height: 30px;
border-bottom: 1px solid #333;
}
.business-hours li:last-child {
border-bottom: none;
}
.business-hours .opening-hours li.today {
color: #ffac0c;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB