using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Script.Services; using Ext_Gantt_CRUD_Demo.models; using System.Web.Script.Serialization; using System.Data.Linq; namespace Ext_Gantt_CRUD_Demo { /// /// Summary description for Tasks /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [ScriptService] public class Tasks : System.Web.Services.WebService { public class NestedTaskModel : Task { public List children = null; public bool leaf = true; public string PhantomParentId; public string PhantomId; public NestedTaskModel() : base() { } public NestedTaskModel(Task t) { this.Id = t.Id; this.parentId = t.parentId; this.StartDate = t.StartDate; this.EndDate = t.EndDate; this.Duration = t.Duration; this.DurationUnit = t.DurationUnit; this.PercentDone = t.PercentDone; this.Priority = t.Priority; this.Name = t.Name; this.index = t.index; } } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] public object Get() { DataClasses1DataContext _db = new DataClasses1DataContext(); var rootTasks = _db.Tasks.Where(b => !b.parentId.HasValue); List roots = new List(); foreach (Task cd in rootTasks) { NestedTaskModel n = new NestedTaskModel(cd); roots.Add(n); this.SetNodeChildren(n); } return roots; } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Object Create(NestedTaskModel[] jsonData) { DataClasses1DataContext _db = new DataClasses1DataContext(); foreach (NestedTaskModel t in jsonData) { Task task = new Task(); task.parentId = t.parentId; task.StartDate = t.StartDate; task.EndDate = t.EndDate; task.Duration = t.Duration; task.DurationUnit = t.DurationUnit; task.PercentDone = t.PercentDone; task.Priority = t.Priority; task.Name = t.Name; task.index = t.index; _db.Tasks.InsertOnSubmit(task); _db.SubmitChanges(ConflictMode.ContinueOnConflict); int? id = task.Id; Task[] children = (from _t in jsonData where _t.PhantomParentId != "" && _t.PhantomParentId == t.PhantomId select _t).ToArray(); foreach (Task child in children) { child.parentId = id; } this.Update(children); } return jsonData; } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Object Update(IEnumerable jsonData) { DataClasses1DataContext _db = new DataClasses1DataContext(); foreach (Task vals in jsonData) { Task t = _db.Tasks.SingleOrDefault(b => b.Id == vals.Id); if (t != null) { t.Name = vals.Name; t.parentId = vals.parentId; t.Duration = vals.Duration; t.DurationUnit = vals.DurationUnit; t.PercentDone = vals.PercentDone; t.StartDate = vals.StartDate; t.EndDate = vals.EndDate; t.Priority = vals.Priority; t.index = vals.index; } } _db.SubmitChanges(ConflictMode.ContinueOnConflict); return jsonData; } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Object Delete(IEnumerable jsonData) { DataClasses1DataContext _db = new DataClasses1DataContext(); foreach (Task t in jsonData) { Task task = _db.Tasks.SingleOrDefault(b => b.Id == t.Id); if (task != null) { var deps = _db.Dependencies.Where(b => (b.To == t.Id || b.From == t.Id)); _db.Dependencies.DeleteAllOnSubmit(deps); _db.Tasks.DeleteOnSubmit(task); } // Also clear any children of this task recursively IEnumerable children = _db.Tasks.Where(b => (b.parentId == t.Id)); this.Delete(children); } _db.SubmitChanges(); return new { success = true }; } public void SetNodeChildren(NestedTaskModel node) { DataClasses1DataContext _db = new DataClasses1DataContext(); var children = _db.Tasks.Where(b => b.parentId == node.Id); if (children.Count() > 0) { node.children = new List(); foreach (Task t in children) { NestedTaskModel n = new NestedTaskModel(t); node.children.Add(n); this.SetNodeChildren(n); } // Last step, sort children on the 'index' field node.children = node.children.OrderBy(a => a.index).ToList(); } node.leaf = (node.children == null); } } }