using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.Extensions.Localization; namespace Yavsc.Controllers { using Microsoft.EntityFrameworkCore; using Models; using Models.Workflow; using Yavsc.Helpers; using Yavsc.Server.Helpers; [Authorize("AdministratorOnly")] public class ActivityController : Controller { private readonly ApplicationDbContext _context; readonly IStringLocalizer SR; readonly ILogger logger; public ActivityController(ApplicationDbContext context, IStringLocalizer SR, ILoggerFactory loggerFactory) { _context = context; this.SR = SR; logger=loggerFactory.CreateLogger(); } // GET: Activity public IActionResult Index() { SetSettingClasseInfo(); return View(_context.Activities.Include(a=>a.Parent).ToList()); } private void SetSettingClasseInfo(string currentCode = null) { var items = Config.ProfileTypes.Select( pt => new SelectListItem { Text = SR[pt.FullName], Value = pt.FullName, Selected = currentCode == pt.FullName }).ToList(); items.Add(new SelectListItem { Text = SR[Constants.NoneCode], Value = Constants.NoneCode, Selected = currentCode == null}); ViewBag.SettingsClassName = items; } private List GetEligibleParent(string code) { // eligibles are those // who are not in descendence var acts = _context.Activities.Where( a => a.Code != code ).Select(a => new SelectListItem { Text = a.Name, Value = a.Code }).ToList(); var nullItem = new SelectListItem { Text = SR[Constants.NoneCode], Value = Constants.NoneCode }; acts.Add(nullItem); if (code == null) return acts; var existing = _context.Activities.Include(a => a.Children).FirstOrDefault(a => a.Code == code); if (existing == null) return acts; var pi = acts.FirstOrDefault(i => i.Value == existing.ParentCode); if (pi!=null) pi.Selected = true; else nullItem.Selected = true; RecursivelyFilterChild(acts, existing); return acts; } /// /// Filters a activity selection list /// in order to exclude any descendant /// from the eligible list at the Parent property. /// WARN! results in a infinite loop when /// data is corrupted and there is a circularity /// in the activity hierarchy graph (Parent/Children) /// /// /// private static void RecursivelyFilterChild(List list, Activity activity) { if (activity == null) return; if (activity.Children == null) return; if (list.Count == 0) return; foreach (var child in activity.Children) { RecursivelyFilterChild(list, child); var rem = list.FirstOrDefault(i => i.Value == child.Code); if (rem != null) list.Remove(rem); } } // GET: Activity/Details/5 public IActionResult Details(string id) { if (id == null) { return NotFound(); } Activity activity = _context.Activities.Single(m => m.Code == id); if (activity == null) { return NotFound(); } return View(activity); } // GET: Activity/Create public IActionResult Create() { SetSettingClasseInfo(); ViewBag.ParentCode = GetEligibleParent(null); return View(); } // POST: Activity/Create [HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(Activity activity) { if (activity.ParentCode==Constants.NoneCode) activity.ParentCode=null; if (activity.SettingsClassName==Constants.NoneCode) activity.SettingsClassName=null; if (ModelState.IsValid) { _context.Activities.Add(activity); _context.SaveChanges(User.GetUserId()); return RedirectToAction("Index"); } SetSettingClasseInfo(); return View(activity); } // GET: Activity/Edit/5 public IActionResult Edit(string id) { if (id == null) { return NotFound(); } Activity activity = _context.Activities.Single(m => m.Code == id); if (activity == null) { return NotFound(); } ViewBag.ParentCode = GetEligibleParent(id); SetSettingClasseInfo(); return View(activity); } // POST: Activity/Edit/5 [HttpPost] [ValidateAntiForgeryToken] public IActionResult Edit(Activity activity) { if (activity.ParentCode==Constants.NoneCode) activity.ParentCode=null; if (activity.SettingsClassName==Constants.NoneCode) activity.SettingsClassName=null; if (ModelState.IsValid) { _context.Update(activity); _context.SaveChanges(User.GetUserId()); return RedirectToAction("Index"); } return View(activity); } // GET: Activity/Delete/5 [ActionName("Delete")] public IActionResult Delete(string id) { if (id == null) { return NotFound(); } Activity activity = _context.Activities.Single(m => m.Code == id); if (activity == null) { return NotFound(); } return View(activity); } // POST: Activity/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public IActionResult DeleteConfirmed(string id) { Activity activity = _context.Activities.Single(m => m.Code == id); _context.Activities.Remove(activity); _context.SaveChanges(User.GetUserId()); return RedirectToAction("Index"); } } }