Example #1
0
        public List <TreeNode> FindNodes(string typeName, [Required, FromBody] FindNodesRequest request)
        {
            Type type = TypeLogic.GetType(typeName);

            var list = giFindNodesGeneric.GetInvoker(type)(request);

            return(ToTreeNodes(list));
        }
Example #2
0
        static List <TreeInfo> FindNodesGeneric <T>(FindNodesRequest request)
            where T : TreeEntity
        {
            var qd            = QueryLogic.Queries.QueryDescription(typeof(T));
            var userFilters   = request.userFilters.Select(f => f.ToFilter(qd, false)).ToList();
            var frozenFilters = request.frozenFilters.Select(f => f.ToFilter(qd, false)).ToList();


            var frozenQuery = QueryLogic.Queries.GetEntities(new QueryEntitiesRequest {
                QueryName = typeof(T), Filters = frozenFilters, Orders = new List <Order>()
            })
                              .Select(a => (T)a.Entity);

            var filteredQuery = QueryLogic.Queries.GetEntities(new QueryEntitiesRequest {
                QueryName = typeof(T), Filters = userFilters.Concat(frozenFilters).ToList(), Orders = new List <Order>()
            })
                                .Select(a => (T)a.Entity);

            var disabledMixin = MixinDeclarations.IsDeclared(typeof(T), typeof(DisabledMixin));
            var list          = filteredQuery
                                .SelectMany(t => t.Ascendants())
                                .Select(t => new TreeInfo
            {
                route         = t.Route,
                name          = t.Name,
                lite          = t.ToLite(),
                level         = t.Level(),
                disabled      = disabledMixin && t.Mixin <DisabledMixin>().IsDisabled,
                childrenCount = frozenQuery.Count(a => (bool)(a.Route.GetAncestor(1) == t.Route)),
            }).ToList();

            var expandedChildren = request.expandedNodes.IsNullOrEmpty() ? new List <TreeInfo>() :
                                   frozenQuery
                                   .Where(t => request.expandedNodes.Contains(t.Parent().ToLite()))
                                   .SelectMany(t => t.Ascendants())
                                   .Select(t => new TreeInfo
            {
                route         = t.Route,
                name          = t.Name,
                lite          = t.ToLite(),
                level         = t.Level(),
                disabled      = disabledMixin && t.Mixin <DisabledMixin>().IsDisabled,
                childrenCount = frozenQuery.Count(a => (bool)(a.Route.GetAncestor(1) == t.Route)),
            }).ToList();

            return(list.Concat(expandedChildren).ToList());
        }