public PartialViewResult AddTarget(AdminWidgetsModel model, string error)
    {
      var m = new AdminWidgetSelectModel();
      m.SelectionTitle = "Select New Page or Widget";

      // get list of pages from container            
      var container = (IContainer)HttpContext.Application["container"];
      //SupportedScopes scope = SupportedScopes.EntireSite; //TODO: get correct scope

      m.WidgetSelections = container.GetAllInstances<IPage>()//.Where(w => (w.SupportedScopes & scope) == scope)
          .Select(p => new WidgetSelect()
          {
            Name = p.Name,
            Description = string.Format("{0} with {1} area{2}",
              p.Parent == null ? "<em>Master</em> page" : "Page", p.Areas.Count(), p.Areas.Count() == 1 ? string.Empty : "s"),
            ScopeFlags = (int)p.SupportedScopes,
            Icon = "page",
            PostHref = Url.Action("AddTarget", new
            {
              workspace = Scope.Workspace,
              collection = Scope.Collection,
              targetType = "page",
              targetName = p.Name
            })
          }).Concat(container.GetAllInstances<IWidget>().Where(w => w.Areas.Count() > 0) //.Where(w => (w.SupportedScopes & scope) == scope)
          .Select(w => new WidgetSelect()
          {
            Name = w.Name,
            Description = w.Description,
            ScopeFlags = (int)w.SupportedScopes,
            Icon = "widget",
            PostHref = Url.Action("AddTarget", new
            {
              workspace = Scope.Workspace,
              collection = Scope.Collection,
              targetType = "widget",
              targetName = w.Name
            })
          }));

      m.Error = error;
      m.CancelHref = Url.Action("AdminTargets", new
      {
        workspace = Scope.Workspace,
        collection = Scope.Collection,
        targetType = model.TargetType,
        targetName = model.TargetName,
        pageName = model.PageName
      });
      return PartialView("AdminWidgetSelect", m);
    }
 public ActionResult AddTarget(AdminWidgetsModel model)
 {
   try
   {
     var appSvc = AdminService.AddTarget(Scope, model.TargetName, model.TargetType == "page");
     LoadWidgetsData(model, appSvc);
   }
   catch (Exception ex)
   {
     // return select model with error message
     LogService.Error(ex);
     return AddTarget(model, ex.Message);
   }
   // return updated target listings
   return View("AdminWidgets", "Admin", model);
 }
 public ActionResult RemoveTarget(AdminWidgetsModel model)
 {
   try
   {
     var appSvc = AdminService.RemoveTarget(Scope, model.TargetName, model.TargetType == "page");
     LoadWidgetsData(model, appSvc);
   }
   catch (Exception ex)
   {
     LogService.Error(ex);
     model.Errors.Add(ex.Message);
   }
   return View("AdminWidgets", "Admin", model);
 }
 private void LoadWidgetsData(AdminWidgetsModel m)
 {
   LoadWidgetsData(m, AppService);
 }
    private WidgetInclude GetInclude(bool inherited, string targetName, bool isPage, string areaName, int index, Include include, IList<IWidget> widgets, AdminWidgetsModel m)
    {
      var i = new WidgetInclude()
      {
        IncludePath = AppService.GetIncludePath(include),
        Name = include.Name,
        Inherited = inherited,
        RemoveHref = inherited ? null : Url.Action("RemoveInclude", new
        {
          workspace = Scope.Workspace,
          collection = Scope.Collection,
          targetType = isPage ? "page" : "widget",
          targetName = targetName,
          areaName = areaName,
          includeIdx = index
        }),
        MoveHref = inherited ? null : Url.Action("MoveInclude", new
        {
          workspace = Scope.Workspace,
          collection = Scope.Collection,
          targetType = isPage ? "page" : "widget",
          targetName = targetName,
          areaName = areaName,
          includeIdx = index
        }),
      };

      var widget = widgets.Where(w => w.Name == i.Name).FirstOrDefault();
      if (widget != null)
      {
        i.Desc = widget.Description;
        i.ScopeFlags = (int)widget.SupportedScopes;
        i.ConfigInclude = inherited ? null : widget.GetConfigInclude(i.IncludePath);
        i.Valid = widget.IsValid(include);
      }
      if (string.IsNullOrEmpty(i.Desc)) i.Desc = "Widget has no description.";
      return i;
    }
    private Target GetTarget(TargetBase t, bool inherited, IList<IPage> pages, IList<IWidget> widgets, AdminWidgetsModel m)
    {
      Target target = new Target()
      {
        Name = t.Name,
        IsPage = t is ServicePage,
        Inherited = inherited,
        SelectHref = Url.Action("Widgets", new
        {
          workspace = Scope.Workspace,
          collection = Scope.Collection,
          targetType = t is ServicePage ? "page" : "widget",
          targetName = t.Name
        }),
        RemoveHref = inherited ? null : Url.Action("RemoveTarget", new
        {
          workspace = Scope.Workspace,
          collection = Scope.Collection,
          targetType = t is ServicePage ? "page" : "widget",
          targetName = t.Name
        }),
        Areas = t.Areas.Select(a => new Area()
        {
          Name = a.Name,
          Inherited = inherited,
          SelectHref = Url.Action("Widgets", new
          {
            workspace = Scope.Workspace,
            collection = Scope.Collection,
            targetType = t is ServicePage ? "page" : "widget",
            targetName = t.Name,
            areaName = a.Name
          }),
          RemoveHref = inherited ? null : Url.Action("RemoveArea", new
          {
            workspace = Scope.Workspace,
            collection = Scope.Collection,
            targetType = t is ServicePage ? "page" : "widget",
            targetName = t.Name,
            areaName = a.Name
          }),
          Includes = a.Includes.Select(i => GetInclude(inherited, t.Name, t is ServicePage, a.Name, a.Includes.ToList().IndexOf(i), i, widgets, m)).ToList()
        }).ToList()
      };

      if (target.IsPage)
      {
        IPage page = pages.Where(p => p.Name == target.Name).FirstOrDefault();
        if (page != null)
        {
          int cnt = page.Areas.Count();
          target.ScopeFlags = (int)page.SupportedScopes;
          target.Parent = page.Parent;
          IPage parent = pages.Where(p => p.Name == page.Parent).FirstOrDefault();
          if (parent != null) cnt += parent.Areas.Count();
          target.TotalAreaCount = cnt;
          //target.Desc = page.Description;
        }
      }
      else
      {
        IWidget widget = widgets.Where(w => w.Name == target.Name).FirstOrDefault();
        if (widget != null)
        {
          target.ScopeFlags = (int)widget.SupportedScopes;
          target.TotalAreaCount = widget.Areas.Count();
          //target.Desc = widget.Description;
        }
      }

      target.Desc = string.Format("{0} with {1} include{2} in {3} of {4} area{5}",
        target.IsMasterPage ? "<em>Master</em>" : target.IsPage ? "Page" : "Customizable widget",
        target.IncludeCount, target.IncludeCount == 1 ? string.Empty : "s",
        target.AreaCount, target.TotalAreaCount, target.TotalAreaCount == 1 ? string.Empty : "s");
      return target;
    }
    private void LoadWidgetsData(AdminWidgetsModel m, AppService appSvc)
    {
      //TODO: move into service
      var targets = new List<Target>();

      var container = (IContainer)HttpContext.Application["container"];
      var instances = container.Model.AllInstances.Where(i => i.PluginType.Equals(typeof(IWidget)));
      var widgets = instances.Select(i => i.Get<IWidget>()).ToList();
      //var widgets = container.GetAllInstances<IWidget>();
      var pages = container.GetAllInstances<IPage>();

      //load data based on scope
      if (Scope.IsWorkspace || Scope.IsCollection)
      {
        var w = appSvc.GetWorkspace(Scope.Workspace);
        if (Scope.IsCollection)
        {
          var c = w.GetCollection(Scope.Collection);
          var cTargets = c.Pages.Cast<TargetBase>().Concat(c.Widgets.Cast<TargetBase>());
          targets.AddRange(cTargets.Select(p => GetTarget(p, !Scope.IsCollection, pages, widgets, m)));
        }
        var wTargets = w.Pages.Cast<TargetBase>().Concat(w.Widgets.Cast<TargetBase>())
          .Select(p => GetTarget(p, !Scope.IsWorkspace, pages, widgets, m));
        MergeTargets(wTargets, targets);
      }
      var sTargets = appSvc.Pages.Cast<TargetBase>().Concat(appSvc.Widgets.Cast<TargetBase>())
        .Select(p => GetTarget(p, !Scope.IsEntireSite, pages, widgets, m));
      MergeTargets(sTargets, targets);

      // select first target
      if (string.IsNullOrEmpty(m.TargetName) && targets.Count > 0)
      {
        m.TargetName = targets[0].Name;
        m.TargetType = targets[0].IsPage ? "page" : "widget";
      }
      m.Targets = targets.OrderBy(t => t.Inherited);

      // get areas for target
      var target = m.Targets.Where(t => t.Name == m.TargetName && t.IsPage == (m.TargetType == "page")).FirstOrDefault();
      m.Areas = (target != null) ? target.Areas.OrderBy(a => a.Inherited).ToArray() : new Area[] { };

      // select first area
      if (m.AreaName == null && m.Areas.Count() > 0) m.AreaName = m.Areas.First().Name;

      var area = m.Areas.Where(a => a.Name == m.AreaName).FirstOrDefault();
      m.Includes = (area != null) ? area.Includes.OrderBy(a => a.Inherited).ToArray() : new WidgetInclude[] { };
    }
 [System.Web.Mvc.AcceptVerbs(HttpVerbs.Post)] //TODO: fix some bug in jquery won't post will only get
 public ActionResult MoveInclude(AdminWidgetsModel model, int includeIdx, bool down)
 {
   try
   {
     var appSvc = AdminService.MoveInclude(Scope, model.TargetName, model.TargetType == "page", model.AreaName, includeIdx, down);
     LoadWidgetsData(model, appSvc);
     return PartialView("AdminIncludes", model);
   }
   catch (Exception ex)
   {
     LogService.Error(ex);
     return Json(new { error = ex.Message });
   }
 }
 public PartialViewResult AdminIncludes(AdminWidgetsModel model)
 {
   // return updated target listings
   LoadWidgetsData(model);
   return PartialView("AdminIncludes", model);
 }
    public ActionResult AddInclude(AdminWidgetsModel model)
    {
      try
      {
        var appSvc = AdminService.AddInclude(Scope, model.TargetName, model.TargetType == "page", model.AreaName, model.IncludeName);
        LoadWidgetsData(model, appSvc);
      }
      catch (Exception ex)
      {
        // return select model with error message
        LogService.Error(ex);
        return AddInclude(model, ex.Message);
      }

      return View("AdminWidgets", "Admin", model);
    }
    public PartialViewResult AddInclude(AdminWidgetsModel model, string error)
    {
      AdminWidgetSelectModel m = new AdminWidgetSelectModel();
      m.SelectionTitle = "Select a Widget Include";

      var container = (IContainer)HttpContext.Application["container"];
      //SupportedScopes scope = SupportedScopes.EntireSite; //TODO: get correct scope

      m.WidgetSelections = container.GetAllInstances<IWidget>()//.Where(w => (w.SupportedScopes & scope) == scope)
          .Select(w => new WidgetSelect()
          {
            Name = w.Name,
            Description = w.Description ?? "This widget has no description.",
            ScopeFlags = (int)w.SupportedScopes,
            Icon = "widget",
            IsHint = w.AreaHints.Contains(model.AreaName),
            ScopeMatch = IsScopeMatch(container, w.SupportedScopes, model.TargetType, model.TargetName),
            PostHref = Url.Action("AddInclude", new
            {
              workspace = Scope.Workspace,
              collection = Scope.Collection,
              targetType = model.TargetType,
              targetName = model.TargetName,
              areaName = model.AreaName,
              includeName = w.Name
            })
          }).OrderByDescending(w => w.IsHint).ThenByDescending(w => w.ScopeMatch);
      m.Error = error;
      m.CancelHref = Url.Action("AdminIncludes", new
      {
        workspace = Scope.Workspace,
        collection = Scope.Collection,
        targetType = model.TargetType,
        targetName = model.TargetName,
        pageName = model.PageName
      });
      return PartialView("AdminWidgetSelect", m);
    }
 public ActionResult RemoveArea(AdminWidgetsModel model)
 {
   TargetBase target = model.TargetType == "page" ? (TargetBase)new ServicePage() { Name = model.TargetName } :
             (TargetBase)new ServiceWidget() { Name = model.TargetName };
   try
   {
     var appSvc = AdminService.RemoveArea(Scope, model.TargetName, model.TargetType == "page", model.AreaName);
     LoadWidgetsData(model, appSvc);
   }
   catch (Exception ex)
   {
     LogService.Error(ex);
     model.Errors.Add(ex.Message);
   }
   return View("AdminWidgets", "Admin", model);
 }
 public ActionResult AddArea(AdminWidgetsModel model)
 {
   TargetBase target = model.TargetType == "page" ? (TargetBase)new ServicePage() { Name = model.TargetName } :
             (TargetBase)new ServiceWidget() { Name = model.TargetName };
   try
   {
     var appSvc = AdminService.AddArea(Scope, model.TargetName, model.TargetType == "page", model.AreaName);
     LoadWidgetsData(model, appSvc);
   }
   catch (Exception ex)
   {
     // return select model with error message
     LogService.Error(ex);
     return AddArea(model, ex.Message);
   }
   // return updated area listings
   return View("AdminWidgets", "Admin", model);
 }
 public ViewResult Widgets(AdminWidgetsModel m)
 {
   LoadWidgetsData(m);
   return View("AdminWidgets", "Admin", m);
 }
    public PartialViewResult AddArea(AdminWidgetsModel model, string error)
    {
      var m = new AdminWidgetSelectModel();
      m.SelectionTitle = "Select an Area";

      IEnumerable<string> areas = null;
      var container = (IContainer)HttpContext.Application["container"];
      if (model.TargetType == "page")
      {
        var pages = container.GetAllInstances<IPage>();
        IPage page = pages.Where(p => p.Name == model.TargetName).Single();
        IPage parent = pages.Where(p => p.Name == page.Parent).SingleOrDefault();
        if (parent != null) areas = page.Areas.Concat(parent.Areas);
        else areas = page.Areas;
      }
      else
      {
        var widgets = container.GetAllInstances<IWidget>();
        IWidget widget = widgets.Where(w => w.Name == model.TargetName).Single();
        areas = widget.Areas;
      }

      m.WidgetSelections = areas.Select(a => new WidgetSelect()
      {
        Name = a,
        //Icon = a,
        PostHref = Url.Action("AddArea", new
        {
          workspace = Scope.Workspace,
          collection = Scope.Collection,
          targetType = model.TargetType,
          targetName = model.TargetName,
          areaName = a
        })
      });

      m.Error = error;
      m.CancelHref = Url.Action("AdminAreas", new
      {
        workspace = Scope.Workspace,
        collection = Scope.Collection,
        targetType = model.TargetType,
        targetName = model.TargetName,
        pageName = model.PageName
      });
      return PartialView("AdminWidgetSelect", m);
    }