예제 #1
0
 public Tree(int sortOrder, string applicationAlias, string group, string alias, string title, TreeUse use, Type treeControllerType, bool isSingleNodeTree)
 {
     SortOrder          = sortOrder;
     SectionAlias       = applicationAlias ?? throw new ArgumentNullException(nameof(applicationAlias));
     TreeGroup          = group;
     TreeAlias          = alias ?? throw new ArgumentNullException(nameof(alias));
     TreeTitle          = title;
     TreeUse            = use;
     TreeControllerType = treeControllerType ?? throw new ArgumentNullException(nameof(treeControllerType));
     IsSingleNodeTree   = isSingleNodeTree;
 }
예제 #2
0
        public override Tree Build()
        {
            var     sortOrder    = _sortOrder ?? 1;
            var     alias        = _alias ?? "testTree";
            var     sectionAlias = _sectionAlias ?? Constants.Applications.Content;
            var     group        = _group ?? string.Empty;
            var     title        = _title ?? string.Empty;
            TreeUse treeUse      = _treeUse ?? TreeUse.Main;
            var     isSingleNode = _isSingleNode ?? false;

            return(new Tree(sortOrder, sectionAlias, group, alias, title, treeUse, typeof(SampleTreeController), isSingleNode));
        }
예제 #3
0
 public void HasFlagAnyTest(TreeUse value, TreeUse test, bool expected)
 {
     // The HasFlagAny() extension method determines whether
     // at least one bit from <test> is set.
     if (expected)
     {
         Assert.IsTrue(value.HasFlagAny(test));
     }
     else
     {
         Assert.IsFalse(value.HasFlagAny(test));
     }
 }
예제 #4
0
 public void HasFlagAllTest(TreeUse value, TreeUse test, bool expected)
 {
     // The HasFlagAll() extension method determines whether
     // all bits from <test> are set (other bits can be set too).
     if (expected)
     {
         Assert.IsTrue(value.HasFlagAll(test));
     }
     else
     {
         Assert.IsFalse(value.HasFlagAll(test));
     }
 }
예제 #5
0
 public void HasFlagTest(TreeUse value, TreeUse test, bool expected)
 {
     // The built-in Enum.HasFlag() method determines whether
     // all bits from <test> are set (other bits can be set too).
     if (expected)
     {
         Assert.IsTrue(value.HasFlag(test));
     }
     else
     {
         Assert.IsFalse(value.HasFlag(test));
     }
 }
예제 #6
0
        /// <summary>
        /// Returns the tree nodes for an application
        /// </summary>
        /// <param name="application">The application to load tree for</param>
        /// <param name="tree">An optional single tree alias, if specified will only load the single tree for the request app</param>
        /// <param name="queryStrings">The query strings</param>
        /// <param name="use">Tree use.</param>
        public async Task <ActionResult <TreeRootNode> > GetApplicationTrees(string application, string tree, [ModelBinder(typeof(HttpQueryStringModelBinder))] FormCollection queryStrings, TreeUse use = TreeUse.Main)
        {
            application = application.CleanForXss();

            if (string.IsNullOrEmpty(application))
            {
                return(NotFound());
            }

            var section = _sectionService.GetByAlias(application);

            if (section == null)
            {
                return(NotFound());
            }

            // find all tree definitions that have the current application alias
            var groupedTrees = _treeService.GetBySectionGrouped(application, use);
            var allTrees     = groupedTrees.Values.SelectMany(x => x).ToList();

            if (allTrees.Count == 0)
            {
                // if there are no trees defined for this section but the section is defined then we can have a simple
                // full screen section without trees
                var name = _localizedTextService.Localize("sections", application);
                return(TreeRootNode.CreateSingleTreeRoot(Constants.System.RootString, null, null, name, TreeNodeCollection.Empty, true));
            }

            // handle request for a specific tree / or when there is only one tree
            if (!tree.IsNullOrWhiteSpace() || allTrees.Count == 1)
            {
                var t = tree.IsNullOrWhiteSpace()
                    ? allTrees[0]
                    : allTrees.FirstOrDefault(x => x.TreeAlias == tree);

                if (t == null)
                {
                    return(NotFound());
                }

                var treeRootNode = await GetTreeRootNode(t, Constants.System.Root, queryStrings);

                if (treeRootNode != null)
                {
                    return(treeRootNode);
                }

                return(NotFound());
            }

            // handle requests for all trees
            // for only 1 group
            if (groupedTrees.Count == 1)
            {
                var nodes = new TreeNodeCollection();
                foreach (var t in allTrees)
                {
                    var nodeResult = await TryGetRootNode(t, queryStrings);

                    if (!(nodeResult.Result is null))
                    {
                        return(nodeResult.Result);
                    }

                    var node = nodeResult.Value;
                    if (node != null)
                    {
                        nodes.Add(node);
                    }
                }

                var name = _localizedTextService.Localize("sections", application);

                if (nodes.Count > 0)
                {
                    var treeRootNode = TreeRootNode.CreateMultiTreeRoot(nodes);
                    treeRootNode.Name = name;
                    return(treeRootNode);
                }

                // otherwise it's a section with all empty trees, aka a fullscreen section
                // todo is this true? what if we just failed to TryGetRootNode on all of them? SD: Yes it's true but we should check the result of TryGetRootNode and throw?
                return(TreeRootNode.CreateSingleTreeRoot(Constants.System.RootString, null, null, name, TreeNodeCollection.Empty, true));
            }

            // for many groups
            var treeRootNodes = new List <TreeRootNode>();

            foreach (var(groupName, trees) in groupedTrees)
            {
                var nodes = new TreeNodeCollection();
                foreach (var t in trees)
                {
                    var nodeResult = await TryGetRootNode(t, queryStrings);

                    if (nodeResult != null && nodeResult.Result is not null)
                    {
                        return(nodeResult.Result);
                    }
                    var node = nodeResult?.Value;

                    if (node != null)
                    {
                        nodes.Add(node);
                    }
                }

                if (nodes.Count == 0)
                {
                    continue;
                }

                // no name => third party
                // use localization key treeHeaders/thirdPartyGroup
                // todo this is an odd convention
                var name = groupName.IsNullOrWhiteSpace() ? "thirdPartyGroup" : groupName;

                var groupRootNode = TreeRootNode.CreateGroupNode(nodes, application);
                groupRootNode.Name = _localizedTextService.Localize("treeHeaders", name);
                treeRootNodes.Add(groupRootNode);
            }

            return(TreeRootNode.CreateGroupedMultiTreeRoot(new TreeNodeCollection(treeRootNodes.OrderBy(x => x.Name))));
        }
 public void SetFlagTests(TreeUse value, TreeUse flag, TreeUse expected)
 {
     Assert.AreEqual(expected, value.SetFlag(flag));
 }
예제 #8
0
 public TreeBuilder WithTreeUse(TreeUse treeUse)
 {
     _treeUse = treeUse;
     return(this);
 }
예제 #9
0
 /// <inheritdoc />
 public IDictionary <string, IEnumerable <Tree> > GetBySectionGrouped(string sectionAlias, TreeUse use = TreeUse.Main)
 {
     return(GetBySection(sectionAlias, use).GroupBy(x => x.TreeGroup).ToDictionary(
                x => x.Key ?? "",
                x => (IEnumerable <Tree>)x.ToArray()));
 }
예제 #10
0
 /// <inheritdoc />
 public IEnumerable <Tree> GetBySection(string sectionAlias, TreeUse use = TreeUse.Main)
 // use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
 => _treeCollection.Where(x => x.SectionAlias.InvariantEquals(sectionAlias) && x.TreeUse.HasFlagAny(use)).OrderBy(x => x.SortOrder).ToList();
예제 #11
0
 /// <inheritdoc />
 public IEnumerable <Tree> GetAll(TreeUse use = TreeUse.Main)
 // use HasFlagAny: if use is Main|Dialog, we want to return Main *and* Dialog trees
 => _treeCollection.Where(x => x.TreeUse.HasFlagAny(use));