Abbellimento #2
2
.gitignore
vendored
2
.gitignore
vendored
@@ -263,3 +263,5 @@ __pycache__/
|
||||
SeniorAssistant/SeniorAssistant/wwwroot/*
|
||||
/SeniorAssistant/Controllers/TestController.cs
|
||||
/SeniorAssistant/Views/Test/*
|
||||
/SeniorAssistant/Views/Home/Calendar.cshtml
|
||||
/SeniorAssistant/Views/Home/Calendar.cshtml.cs
|
||||
|
||||
@@ -6,81 +6,150 @@ using LinqToDB;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using SeniorAssistant.Models.Users;
|
||||
using SeniorAssistant.Data;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
namespace IdentityDemo.Controllers
|
||||
{
|
||||
[ApiExplorerSettings(IgnoreApi = true)]
|
||||
[Route("[controller]/[action]")]
|
||||
public class AccountController : BaseController
|
||||
{
|
||||
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 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 AlreadyPatie = "Sei gia' un paziente";
|
||||
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 DefaultImage = "/uploads/default.jpg";
|
||||
private static readonly string UploadsDirec = "/uploads/";
|
||||
|
||||
[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
|
||||
where u.Username.Equals(username)
|
||||
&& u.Password.Equals(password)
|
||||
select u).ToListAsync();
|
||||
|
||||
if (result.Count == 1)
|
||||
try
|
||||
{
|
||||
User user = result.First();
|
||||
HttpContext.Session.SetString(Username, username);
|
||||
HttpContext.Session.SetString("email", user.Email);
|
||||
HttpContext.Session.SetString("name", user.Name);
|
||||
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");
|
||||
var user = await (from u in Db.Users
|
||||
where u.Username.Equals(username)
|
||||
&& u.Password.Equals(password)
|
||||
select u).FirstOrDefaultAsync();
|
||||
|
||||
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,
|
||||
Message = InvalidLogIn
|
||||
});
|
||||
return Json(new JsonResponse()
|
||||
{
|
||||
Success = false,
|
||||
Message = e.Message + " " +e.Source + "</br>"+ e.StackTrace
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult _logout()
|
||||
public IActionResult _logout()
|
||||
{
|
||||
HttpContext.Session.Clear();
|
||||
return Json(OkJson);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult> _register(User user)
|
||||
public async Task<IActionResult> _register(User user, Forgot forgot, string code = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
user.Avatar = DefaultImage;
|
||||
forgot.Username = user.Username;
|
||||
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);
|
||||
}
|
||||
catch
|
||||
catch (Exception e)
|
||||
{
|
||||
return Json(new JsonResponse()
|
||||
{
|
||||
Success = false,
|
||||
Message = UsernameDupl
|
||||
Message = e.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[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(() =>
|
||||
{
|
||||
@@ -97,7 +166,7 @@ namespace IdentityDemo.Controllers
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public async Task<ActionResult> _notification(int id)
|
||||
public async Task<IActionResult> _notification(int id)
|
||||
{
|
||||
return await LoggedAction(() =>
|
||||
{
|
||||
@@ -119,7 +188,7 @@ namespace IdentityDemo.Controllers
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult> _addDoc(string doctor)
|
||||
public async Task<IActionResult> _addDoc(string doctor)
|
||||
{
|
||||
return await LoggedAction(() =>
|
||||
{
|
||||
@@ -146,13 +215,13 @@ namespace IdentityDemo.Controllers
|
||||
Username = username
|
||||
});
|
||||
|
||||
var a = _notification(doctor, InsertAsDoct + username);
|
||||
var a = _notification(doctor, InsertAsDoct + username, "/user/" + username);
|
||||
return Json(OkJson);
|
||||
});
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public async Task<ActionResult> _sendMessage(string receiver, string body)
|
||||
public async Task<IActionResult> _sendMessage(string receiver, string body)
|
||||
{
|
||||
return await LoggedAction(() => {
|
||||
string username = HttpContext.Session.GetString(Username);
|
||||
@@ -171,7 +240,7 @@ namespace IdentityDemo.Controllers
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public async Task<ActionResult> _addNote(string patient, string text)
|
||||
public async Task<IActionResult> _addNote(string patient, string text)
|
||||
{
|
||||
return await LoggedAccessDataOf(patient, true, () =>
|
||||
{
|
||||
@@ -185,7 +254,7 @@ namespace IdentityDemo.Controllers
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public async Task<ActionResult> _minHeartToPatient(string patient, int value)
|
||||
public async Task<IActionResult> _minHeartToPatient(string patient, int value)
|
||||
{
|
||||
return await LoggedAccessDataOf(patient, true, () =>
|
||||
{
|
||||
@@ -198,7 +267,7 @@ namespace IdentityDemo.Controllers
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public async Task<ActionResult> _maxHeartToPatient(string patient, int value)
|
||||
public async Task<IActionResult> _maxHeartToPatient(string patient, int value)
|
||||
{
|
||||
return await LoggedAccessDataOf(patient, true, () =>
|
||||
{
|
||||
@@ -209,5 +278,83 @@ namespace IdentityDemo.Controllers
|
||||
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());
|
||||
*/
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,16 +6,15 @@ using System.Linq;
|
||||
|
||||
namespace SeniorAssistant.Controllers
|
||||
{
|
||||
[ApiExplorerSettings(IgnoreApi = true)]
|
||||
public class HomeController : BaseController
|
||||
{
|
||||
[Route("")]
|
||||
[Route("Home")]
|
||||
[Route("Index")]
|
||||
public IActionResult Index()
|
||||
[Route("Login")]
|
||||
public IActionResult Login()
|
||||
{
|
||||
string username = HttpContext.Session.GetString(Username);
|
||||
return View("Index", GetUser(username));
|
||||
return CheckUnAuthorized("Login");
|
||||
}
|
||||
|
||||
[Route("Heartbeat")]
|
||||
@@ -45,6 +44,23 @@ namespace SeniorAssistant.Controllers
|
||||
[Route("User/{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));
|
||||
}
|
||||
|
||||
@@ -54,6 +70,52 @@ namespace SeniorAssistant.Controllers
|
||||
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)
|
||||
{
|
||||
return Db.Users
|
||||
@@ -62,12 +124,5 @@ namespace SeniorAssistant.Controllers
|
||||
.Where(u => u.Username.Equals(username))
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
private IActionResult CheckAuthorized(string view, object model = null)
|
||||
{
|
||||
if (!IsLogged())
|
||||
return View("Index", "/" + view);
|
||||
return View(view, model);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ using SeniorAssistant.Models.Users;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using SeniorAssistant.Models;
|
||||
|
||||
namespace SeniorAssistant.Controllers
|
||||
{
|
||||
@@ -37,8 +38,8 @@ namespace SeniorAssistant.Controllers
|
||||
{
|
||||
return HttpContext.Session.GetString(Username) != null;
|
||||
}
|
||||
|
||||
protected async Task<ActionResult> LoggedAction(Func<ActionResult> success)
|
||||
|
||||
protected async Task<IActionResult> LoggedAction(Func<IActionResult> success)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -56,16 +57,12 @@ namespace SeniorAssistant.Controllers
|
||||
return Json(new JsonResponse()
|
||||
{
|
||||
Success = false,
|
||||
Message = ExceptionSer + Environment.NewLine +
|
||||
e.Message + Environment.NewLine +
|
||||
e.StackTrace + Environment.NewLine +
|
||||
e.TargetSite + Environment.NewLine +
|
||||
e.InnerException
|
||||
Message = e.Message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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(() =>
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq;
|
||||
using LinqToDB;
|
||||
using LinqToDB.Data;
|
||||
using LinqToDB.DataProvider;
|
||||
@@ -23,6 +22,8 @@ namespace SeniorAssistant.Data
|
||||
public ITable<Patient> Patients => GetTable<Patient>();
|
||||
public ITable<Notification> Notifications => GetTable<Notification>();
|
||||
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)
|
||||
where T : IHasMessage
|
||||
|
||||
16
SeniorAssistant/Models/Forgot.cs
Normal file
16
SeniorAssistant/Models/Forgot.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
18
SeniorAssistant/Models/MenuPatient.cs
Normal file
18
SeniorAssistant/Models/MenuPatient.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,8 @@ namespace SeniorAssistant.Models
|
||||
|
||||
public string LastName { get; set; }
|
||||
|
||||
public string Avatar { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
[Association(ThisKey = nameof(Username), OtherKey = nameof(Doctor.Username), CanBeNull = true)]
|
||||
public Doctor Doc { get; set; }
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
<LangVersion>7.1</LangVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="wwwroot\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="linq2db" Version="2.5.4" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.App" />
|
||||
|
||||
@@ -133,6 +133,8 @@ namespace SeniorAssistant
|
||||
db.CreateTableIfNotExists<Patient>();
|
||||
db.CreateTableIfNotExists<Notification>();
|
||||
db.CreateTableIfNotExists<Message>();
|
||||
db.CreateTableIfNotExists<Forgot>();
|
||||
db.CreateTableIfNotExists<MenuPatient>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -147,11 +149,11 @@ namespace SeniorAssistant
|
||||
List<Doctor> docs = db.Doctors.ToListAsync().Result;
|
||||
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 = "Edoardo", LastName = "Marzio", Email = "edo.marzio@libero.it", Username = "marzietto", Password = "edo64" });
|
||||
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", Avatar = "/uploads/default.jpg" });
|
||||
|
||||
docs.Add(new Doctor { Username = "alfredigno", Location = "Brasile" });
|
||||
docs.Add(new Doctor { Username = "marzietto", Location = "Uganda" });
|
||||
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", PhoneNumber = "+9 87654321", Schedule = "Feriali e festivi 9:00-13:00" });
|
||||
|
||||
foreach (var doc in docs)
|
||||
db.InsertOrReplace(doc);
|
||||
@@ -167,7 +169,7 @@ namespace SeniorAssistant
|
||||
for (count=0; count<names.Length; 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 });
|
||||
}
|
||||
|
||||
@@ -175,8 +177,17 @@ namespace SeniorAssistant
|
||||
db.InsertOrReplace(patient);
|
||||
}
|
||||
|
||||
var forgot = new Forgot()
|
||||
{
|
||||
Question = "Quale animale ti piace di piu'?",
|
||||
Answer = "Rayquaza"
|
||||
};
|
||||
foreach (var user in users)
|
||||
{
|
||||
forgot.Username = user.Username;
|
||||
db.InsertOrReplace(forgot);
|
||||
db.InsertOrReplace(user);
|
||||
}
|
||||
|
||||
DateTime now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
|
||||
now = now.AddHours(DateTime.Now.Hour).AddMinutes(30);
|
||||
|
||||
48
SeniorAssistant/Views/Home/Forgot.cshtml
Normal file
48
SeniorAssistant/Views/Home/Forgot.cshtml
Normal 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>
|
||||
@@ -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>
|
||||
95
SeniorAssistant/Views/Home/Login.cshtml
Normal file
95
SeniorAssistant/Views/Home/Login.cshtml
Normal 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>
|
||||
@@ -4,56 +4,102 @@
|
||||
@using LinqToDB;
|
||||
|
||||
@{
|
||||
ViewBag.Title = "Hello Razor";
|
||||
string username = HttpContextAccessor.HttpContext.Session.GetString("username");
|
||||
ViewBag.Title = "Chat";
|
||||
var session = HttpContextAccessor.HttpContext.Session;
|
||||
var username = session.GetString("username");
|
||||
var db = dbFactory.Create();
|
||||
var MaxMessages = 20;
|
||||
var messages = (from m in db.Messages
|
||||
where (m.Username.Equals(Model.Username) && m.Receiver.Equals(username))
|
||||
||(m.Receiver.Equals(Model.Username) && m.Username.Equals(username))
|
||||
orderby m.Time ascending
|
||||
select m).ToArray();
|
||||
select m).Take(MaxMessages).ToArray();
|
||||
}
|
||||
|
||||
<div class="content">
|
||||
@if (messages.Count() == 0)
|
||||
{
|
||||
<p class="text-red">Non hai messaggi</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
<h3 class="text-bold">Messaggi con @Model.Name @Model.LastName</h3>
|
||||
|
||||
foreach (var message in messages)
|
||||
{
|
||||
if (message.Seen == default && message.Receiver.Equals(username))
|
||||
{
|
||||
message.Seen = DateTime.Now;
|
||||
db.Update(message);
|
||||
}
|
||||
<div>
|
||||
@if (message.Receiver.Equals(username))
|
||||
{
|
||||
<div class="pull-left"></div>
|
||||
<div class="pull-right-container bg-light-blue">
|
||||
<span style="white-space: pre-line" class="">@message.Body</span>
|
||||
<p class="text-aqua">@message.Seen</p>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="box box-primary direct-chat direct-chat-primary">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">Messaggi con @Model.Name @Model.LastName</h3>
|
||||
</div>
|
||||
<div class="box-body">
|
||||
<!-- Conversations are loaded here -->
|
||||
<div class="direct-chat-messages" style="overflow-x:hidden">
|
||||
@if (messages.Count() == 0)
|
||||
{
|
||||
<p class="text-red">Non hai messaggi</p>
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var message in messages)
|
||||
{
|
||||
if (message.Seen == default && message.Receiver.Equals(username))
|
||||
{
|
||||
message.Seen = DateTime.Now;
|
||||
db.Update(message);
|
||||
}
|
||||
<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>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="pull-right-container bg-green-gradient">
|
||||
<div style="white-space: pre-line" class="">@message.Body</div>
|
||||
<p class="text-aqua">@message.Seen</p>
|
||||
</div>
|
||||
<!-- /.box-body -->
|
||||
<div class="box-footer">
|
||||
<div>
|
||||
<div class="input-group">
|
||||
<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 class="pull-right"></div>
|
||||
}
|
||||
</div>
|
||||
<!-- /.box-footer-->
|
||||
</div>
|
||||
}
|
||||
}
|
||||
<div class="pull-right">
|
||||
<textarea id="res-message" class="progress-text" placeholder="Scrivi qui per scrivere un messaggio"></textarea>
|
||||
<button id="btn-send-message">Invia</button>
|
||||
<p id="message-error" class="text-red"></p>
|
||||
<!--/.direct-chat -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pull-right col-md-4">
|
||||
|
||||
</div>
|
||||
<script>
|
||||
$("#btn-send-message").on("click", function () {
|
||||
|
||||
314
SeniorAssistant/Views/Home/Profile.cshtml
Normal file
314
SeniorAssistant/Views/Home/Profile.cshtml
Normal 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>
|
||||
137
SeniorAssistant/Views/Home/Register.cshtml
Normal file
137
SeniorAssistant/Views/Home/Register.cshtml
Normal 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>
|
||||
@@ -3,9 +3,10 @@
|
||||
@model User
|
||||
|
||||
@{
|
||||
ViewBag.Title = "Hello Razor";
|
||||
ViewBag.Title = "Dati paziente";
|
||||
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);
|
||||
@@ -18,72 +19,154 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>
|
||||
<input id="hours-data" type="text" placeholder="hours" value="24" />
|
||||
<button id="refresh-hours" class="fc-button">Cambia ora</button>
|
||||
<div id="chart-data"></div>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<table>
|
||||
<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>
|
||||
@if (isDoc)
|
||||
{
|
||||
<div>
|
||||
<textarea id="note-area" placeholder="Scrivi una nota..">@Model.Pat.Notes</textarea>
|
||||
<button id="send-note" class="btn">Salva</button>
|
||||
<p id="note-error"></p>
|
||||
|
||||
<div class="row">
|
||||
@if (isDoc)
|
||||
{
|
||||
<div class="form-group col-md-4">
|
||||
<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>
|
||||
<a class="" href="/Message/@Model.Pat.Username">Invia un messaggio al tuo paziente</a>
|
||||
<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>
|
||||
}
|
||||
</div>
|
||||
<div id="chart-data"></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
|
||||
}
|
||||
});
|
||||
});
|
||||
function onlyNum(object, numChar = 3) {
|
||||
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 () {
|
||||
onlyNum($(this), 2);
|
||||
});
|
||||
$("#refresh-hours").on("click", function () {
|
||||
var hours = $("#hours-data").val();
|
||||
var base_url = "@Url.Content("~/api/")";
|
||||
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 + "step" + end_url, function (steps) {
|
||||
$.getJSON(base_url + "sleep" + end_url, function (sleep) {
|
||||
@@ -101,8 +184,124 @@ else
|
||||
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("<h3 class='text-center text-red'>Nessun Dato</h3>");
|
||||
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({
|
||||
title: { text: "Visualizzazione attivita' di @Model.Name @Model.LastName" },
|
||||
legend: { position: "bottom" },
|
||||
@@ -167,10 +366,10 @@ else
|
||||
min: 0
|
||||
}]
|
||||
}); /* Kendo */
|
||||
} /* else */
|
||||
}); /* sleep */
|
||||
}); /* steps */
|
||||
}); /* heart */
|
||||
}); /* click */
|
||||
$("#refresh-hours").click();
|
||||
}
|
||||
</script>
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
@model IEnumerable<User>
|
||||
@{
|
||||
ViewBag.Title = "Hello Razor";
|
||||
ViewBag.Title = "Tutti gli utenti";
|
||||
}
|
||||
|
||||
<div id="grid"></div>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
@{
|
||||
var controller = ViewContext.RouteData.Values["Controller"];
|
||||
var action = ViewContext.RouteData.Values["Action"];
|
||||
var controller = ViewContext.RouteData.Values["Controller"].ToString();
|
||||
var action = ViewContext.RouteData.Values["Action"].ToString();
|
||||
}
|
||||
|
||||
<div class="breadcrumb">
|
||||
@Html.ActionLink("Home", "Index", "Home")
|
||||
@if (controller.ToString() != "Home")
|
||||
@Html.ActionLink("Home", "Profile", "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>
|
||||
@@ -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>
|
||||
@@ -7,14 +7,14 @@
|
||||
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||||
<!-- 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. -->
|
||||
<span id="user-name" class="hidden-xs">@Model</span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" style="box-shadow: black 0px 0px 2px">
|
||||
<!-- The user image in the menu -->
|
||||
<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>
|
||||
@session.GetString("name") @session.GetString("lastname") - @session.GetString("role")
|
||||
<small>@session.GetString("email")</small>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<li>
|
||||
<!-- start notification -->
|
||||
<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
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -3,50 +3,78 @@
|
||||
|
||||
@{
|
||||
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");
|
||||
var db = dbFactory.Create();
|
||||
|
||||
|
||||
if (username != null)
|
||||
{
|
||||
var isDoc = session.GetString("role").Equals("doctor");
|
||||
var isPatient = session.GetString("role").Equals("patient");
|
||||
var Menu = new List<IMenuItem>();
|
||||
Menu.Add(new MenuItem("Profilo", "/"));
|
||||
Menu.Add(new MenuItem("Dati personali", "/user/" + username));
|
||||
if (isDoc)
|
||||
|
||||
if(isPatient)
|
||||
{
|
||||
var db = dbFactory.Create();
|
||||
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));
|
||||
Menu.Add(new MenuItem("Dati personali", "/user/" + username));
|
||||
}
|
||||
|
||||
<aside class="main-sidebar">
|
||||
<!-- sidebar: style can be found in sidebar.less -->
|
||||
<section class="sidebar">
|
||||
@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) -->
|
||||
<!-- search form (Optional) -->
|
||||
<form action="#" method="get" class="sidebar-form">
|
||||
<form action="" method="get" class="sidebar-form">
|
||||
<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">
|
||||
<button type="submit" name="search" id="search-btn" class="btn btn-flat">
|
||||
<i class="fa fa-search"></i>
|
||||
<button type="submit" class="btn btn-flat">
|
||||
<i class="fa fa-plus"></i>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
@@ -54,6 +82,16 @@
|
||||
<!-- /.search form -->
|
||||
<!-- 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>
|
||||
<ul class="sidebar-menu" data-widget="tree">
|
||||
@foreach (var menuItem in Menu)
|
||||
@@ -66,28 +104,25 @@
|
||||
</li>
|
||||
break;
|
||||
case SubMenu multi:
|
||||
<li class="treeview @if(search != null) {<text>menu-open</text>}">
|
||||
<li class="treeview menu-open">
|
||||
<a href="#">
|
||||
<i class="fa fa-link"></i><span>@multi.Text</span>
|
||||
<span class="pull-right-container">
|
||||
<i class="fa fa-angle-left pull-right"></i>
|
||||
</span>
|
||||
</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)
|
||||
{
|
||||
<li>
|
||||
@{
|
||||
var text = item.Text;
|
||||
var bg = "";
|
||||
if (search != null && item.Text.StartsWith(search))
|
||||
{
|
||||
bg = "bg-aqua";
|
||||
text = item.Text.Replace(search, "<em>" + search + "</em>");
|
||||
}
|
||||
}
|
||||
<a href="@item.HRef" class="@bg">
|
||||
@Html.Raw(text)
|
||||
<a href="@item.HRef">
|
||||
<span>@Html.Raw(item.Text)</span>
|
||||
<form class="pull-right-container" action="" method="get">
|
||||
<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">
|
||||
<i class="fa fa-minus pull-right"></i>
|
||||
</button>
|
||||
</form>
|
||||
</a>
|
||||
</li>
|
||||
}
|
||||
@@ -102,11 +137,5 @@
|
||||
</section>
|
||||
<!-- /.sidebar -->
|
||||
</aside>
|
||||
@if (search != null)
|
||||
{
|
||||
<script>
|
||||
$("body").removeClass("sidebar-collapse");
|
||||
</script>
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,12 +22,24 @@ scratch. This page gets rid of all links and provides the needed markup only.
|
||||
<title>SeniorAssistant @ViewBag.Title</title>
|
||||
<!-- 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">
|
||||
|
||||
|
||||
<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 -->
|
||||
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/font-awesome/css/font-awesome.min.css">
|
||||
<!-- Ionicons -->
|
||||
<link rel="stylesheet" href="~/AdminLTE-2.4.3/bower_components/Ionicons/css/ionicons.min.css">
|
||||
<!-- 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">
|
||||
<!-- AdminLTE Skins. We have chosen the skin-blue for this starter
|
||||
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/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>
|
||||
|
||||
<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 -->
|
||||
<span class="logo-mini">@ViewBag.LogoMini</span>
|
||||
<!-- 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>
|
||||
<!-- Header Navbar -->
|
||||
<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)
|
||||
{
|
||||
<text>
|
||||
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
</a>
|
||||
<a href="#" class="sidebar-toggle" data-toggle="push-menu" role="button">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
</a>
|
||||
</text>
|
||||
}
|
||||
<!-- Navbar Right Menu -->
|
||||
@@ -106,6 +131,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
|
||||
<!-- REQUIRED JS SCRIPTS -->
|
||||
<!-- jQuery 3 -->
|
||||
@*<script src="~/AdminLTE-2.4.3/bower_components/jquery/dist/jquery.min.js"></script>*@
|
||||
|
||||
<!-- Bootstrap 3.3.7 -->
|
||||
<script src="~/AdminLTE-2.4.3/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
|
||||
<!-- 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
|
||||
user experience. -->
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -4,4 +4,5 @@
|
||||
@using SeniorAssistant.Data;
|
||||
@using Microsoft.AspNetCore.Mvc;
|
||||
@using Microsoft.AspNetCore.Http;
|
||||
@using System.Linq;
|
||||
@using System.Linq;
|
||||
@using LinqToDB;
|
||||
5
SeniorAssistant/libman.json
Normal file
5
SeniorAssistant/libman.json
Normal 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
39
SeniorAssistant/wwwroot/AdminLTE-2.4.3/plugins/business.css
Normal file
39
SeniorAssistant/wwwroot/AdminLTE-2.4.3/plugins/business.css
Normal 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;
|
||||
}
|
||||
BIN
SeniorAssistant/wwwroot/logo-lg.png
Normal file
BIN
SeniorAssistant/wwwroot/logo-lg.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 72 KiB |
BIN
SeniorAssistant/wwwroot/uploads/alfredigno.jpg
Normal file
BIN
SeniorAssistant/wwwroot/uploads/alfredigno.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 55 KiB |
BIN
SeniorAssistant/wwwroot/uploads/default.jpg
Normal file
BIN
SeniorAssistant/wwwroot/uploads/default.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
BIN
SeniorAssistant/wwwroot/uploads/vecchio0.jpg
Normal file
BIN
SeniorAssistant/wwwroot/uploads/vecchio0.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 53 KiB |
Reference in New Issue
Block a user