protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
 {
     actionAdder(new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.GenericDeleteDataWorkflow"), this.PermissionTypes)))
     {
         VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
     });
 }
예제 #2
0
        protected override IEnumerable<Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            var entityToken = new TreeSimpleElementEntityToken(
                this.Id, 
                this.Tree.TreeId, 
                EntityTokenSerializer.Serialize(parentEntityToken));                

            Element element = new Element(new ElementHandle(
                dynamicContext.ElementProviderName,
                entityToken,
                dynamicContext.Piggybag.PreparePiggybag(this.ParentNode, parentEntityToken)
                ));


            if (parentEntityToken is TreePerspectiveEntityToken)
            {
                element.ElementHandle.Piggyback[StringConstants.PiggybagTreeId] = Tree.TreeId;
            }

            var replaceContext = new DynamicValuesHelperReplaceContext(parentEntityToken, dynamicContext.Piggybag);

            element.VisualData = new ElementVisualizedData
            {
                Label = this.LabelDynamicValuesHelper.ReplaceValues(replaceContext),
                ToolTip = this.ToolTipDynamicValuesHelper.ReplaceValues(replaceContext),
                HasChildren = ChildNodes.Any(),
                Icon = this.Icon,
                OpenedIcon = this.OpenIcon
            };

            yield return element;
        }
예제 #3
0
        /// <summary>
        /// Depending on dynamicContext's Direction creates either filter expression for finding child elements or
        /// a filter expression to find current element based on children elements
        /// </summary>
        /// <param name="parameterExpression">The parameter expression.</param>
        /// <param name="dynamicContext">The dynamic context.</param>
        /// <param name="filtersToSkip">The filters to skip.</param>
        /// <returns></returns>
        internal virtual Expression CreateFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext, IList<int> filtersToSkip = null)
        {
            Expression expression = null;

            var filterNodes = dynamicContext.Direction == TreeNodeDynamicContextDirection.Down
                                  ? this.FilterNodes
                                  : dynamicContext.CurrentTreeNode.FilterNodes;

            foreach (FilterNode filterNode in filterNodes)
            {
                if (filtersToSkip != null && filtersToSkip.Contains(filterNode.Id)) continue;

                Expression filterExpression;
                if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
                {
                    filterExpression = filterNode.CreateDownwardsFilterExpression(parameterExpression, dynamicContext);
                }
                else
                {
                    filterExpression = filterNode.CreateUpwardsFilterExpression(parameterExpression, dynamicContext);
                }

                if (filterExpression == null) continue;

                expression = expression.NestedAnd(filterExpression);
            }

            return expression;
        }
예제 #4
0
        /// <summary>
        /// Creates the accumulated filter expression from current tree definition node, and all the nearest ancestor DataFolderElement-s that
        /// are related to the same data type.
        /// </summary>
        /// <param name="parameterExpression">The parameter expression.</param>
        /// <param name="affectedInterfaceType">Type of the affected interface.</param>
        /// <param name="dynamicContext">The dynamic context.</param>
        /// <param name="filtersToSkip">The filters to skip.</param>
        /// <returns></returns>
        internal Expression CreateAccumulatedFilterExpression(ParameterExpression parameterExpression, Type affectedInterfaceType, TreeNodeDynamicContext dynamicContext, IList<int> filtersToSkip = null)
        {
            TreeNode treeNode = this;            

            Expression currentExpression = null;            

            while (treeNode != null)
            {
                DataFilteringTreeNode dataFilteringTreeNode = treeNode as DataFilteringTreeNode;

                if (dataFilteringTreeNode != null 
                    && (dataFilteringTreeNode == this || dataFilteringTreeNode is DataFolderElementsTreeNode) 
                    && (dataFilteringTreeNode.CurrentDataInterfaceType == affectedInterfaceType))
                {
                    Expression filterExpression = dataFilteringTreeNode.CreateFilterExpression(parameterExpression, dynamicContext, filtersToSkip);

                    if (filterExpression != null)
                    {
                        currentExpression = currentExpression.NestedAnd(filterExpression);
                    }
                }
                else
                {
                    break;
                }

                treeNode = treeNode.ParentNode;
            }

            //currentExpression.DebugLogExpression("DataFileringTreeNode", "Accumulated Filter Expression");

            return currentExpression;
        }
예제 #5
0
        private AncestorMatch GetAncestorFromParentFilter(TreeNodeDynamicContext dynamicContext)
        {
            var treeNode = dynamicContext.CurrentTreeNode;

            if (treeNode is DataElementsTreeNode)
            {
                var parentIdFilter = treeNode.FilterNodes.OfType <ParentIdFilterNode>().FirstOrDefault();
                if (parentIdFilter == null)
                {
                    return(null);
                }

                Type   ancestorType = parentIdFilter.ParentFilterType;
                object key          = parentIdFilter.FindParentKeyValue(dynamicContext);

                return(key == null ? null : new AncestorMatch {
                    InterfaceType = ancestorType, KeyValue = key
                });
            }

            if (treeNode is DataFolderElementsTreeNode &&
                dynamicContext.CurrentEntityToken is TreeDataFieldGroupingElementEntityToken groupEntityToken &&
                groupEntityToken.ChildGeneratingDataElementsReferenceValue != null)
            {
                return(new AncestorMatch
                {
                    InterfaceType = groupEntityToken.ChildGeneratingDataElementsReferenceType,
                    KeyValue = groupEntityToken.ChildGeneratingDataElementsReferenceValue
                });
            }

            return(null);
        }
예제 #6
0
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            string url = this.UrlDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext);

            this.External = url.Contains("://");

            if(!External)
            {
                url = UrlUtils.ResolvePublicUrl(url);
            }

            CustomUrlActionNodeActionToken actionToken = new CustomUrlActionNodeActionToken(
                url,
                this.External,
                (this.External ? "externalview" : "documentview"),
                this.ViewLabelDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                this.ViewToolTipDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                this.Serialize(),
                this.PermissionTypes);

            ElementAction elementAction = new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            };

            actionAdder(elementAction);
        }
예제 #7
0
        public string CustomFormMarkupPath { get; internal set; }   // Optional


        /// <exclude />
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            var payload = new StringBuilder();
            this.Serialize(payload);

            StringConversionServices.SerializeKeyValuePair(payload, "_IconResourceName_", Icon.ResourceName);

            if (!String.IsNullOrEmpty(CustomFormMarkupPath))
            {
                StringConversionServices.SerializeKeyValuePair(payload, "_CustomFormMarkupPath_", CustomFormMarkupPath);

                actionAdder(new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.GenericEditDataWorkflow"), this.PermissionTypes)
                            {
                                Payload = payload.ToString()
                            }))
                    {
                        VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
                    });
            }
            else
            {
                actionAdder(new ElementAction(new ActionHandle(new ProxyDataActionToken(ActionIdentifier.Edit, this.PermissionTypes)))
                {
                    VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
                });
            }
        }
예제 #8
0
        private static Expression CreateInnerExpression(TreeNodeDynamicContext dynamicContext, ParentIdFilterNode parentIdFilterNode, DataElementsTreeNode dataElementsTreeNode, bool includeJoin = true)
        {
            Type interfaceType = dataElementsTreeNode.CurrentDataInterfaceType;

            ParameterExpression parameterExpression = Expression.Parameter(interfaceType, "innerData");

            List <int> filtersToSkip = new List <int>()
            {
                parentIdFilterNode.Id
            };

            foreach (ParentIdFilterNode childParentIdFilterNode in dataElementsTreeNode.FilterNodes.OfType <ParentIdFilterNode>().Where(f => f.Id != parentIdFilterNode.Id))
            {
                if (childParentIdFilterNode.ParentFilterTypeTreeNode.IsAncestor(parentIdFilterNode.ParentFilterTypeTreeNode))
                {
                    filtersToSkip.Add(childParentIdFilterNode.Id);
                }
            }

            Expression filterExpression = dataElementsTreeNode.CreateAccumulatedFilterExpression(parameterExpression, interfaceType, dynamicContext, filtersToSkip);

            Expression whereExpression = ExpressionHelper.CreateWhereExpression(DataFacade.GetData(interfaceType).Expression, parameterExpression, filterExpression);


            if ((includeJoin) && (dataElementsTreeNode.JoinDataElementsTreeNode != null))
            {
                //MRJ: Multiple Parent Filter: Recursive call, so we would have to make multiple recursive calls
                Expression innerInnerExpression = CreateInnerExpression(dynamicContext, dataElementsTreeNode.JoinParentIdFilterNode, dataElementsTreeNode.JoinDataElementsTreeNode);

                // Create join lambda expressions
                PropertyInfo     outerKeyPropertyInfo       = dataElementsTreeNode.KeyPropertyInfo;
                LambdaExpression outerKeySelectorExpression = Expression.Lambda(Expression.Property(parameterExpression, outerKeyPropertyInfo), parameterExpression);

                Type innerKeyType = TypeHelpers.FindElementType(innerInnerExpression);
                ParameterExpression innerKeySelectorParameterExpression = Expression.Parameter(innerKeyType, "innerKeyParam");
                LambdaExpression    innerKeySelectorExpression          = Expression.Lambda(innerKeySelectorParameterExpression, innerKeySelectorParameterExpression);

                ParameterExpression parameterExpression1 = Expression.Parameter(dataElementsTreeNode.CurrentDataInterfaceType, "param1");
                ParameterExpression parameterExpression2 = Expression.Parameter(outerKeyPropertyInfo.PropertyType, "param2");
                LambdaExpression    resultSelector       = Expression.Lambda(parameterExpression1, parameterExpression1, parameterExpression2);

                Expression joinExpression = ExpressionHelper.CreateJoinExpression(
                    whereExpression,
                    innerInnerExpression,
                    outerKeySelectorExpression,
                    innerKeySelectorExpression,
                    resultSelector);

                whereExpression = joinExpression;
            }


            Expression selectExpression = ExpressionHelper.CreateSelectExpression(whereExpression, ExpressionHelper.CreatePropertyExpression(parentIdFilterNode.ReferenceFieldName, parameterExpression), parameterExpression);

            Expression distinctExpression = ExpressionHelper.CreateDistinctExpression(selectExpression);

            return(distinctExpression);
        }
예제 #9
0
        private Expression GetObjectsExpression(TreeNodeDynamicContext dynamicContext, bool includeAllGroupingFields = false)
        {
            ParameterExpression parameterExpression = Expression.Parameter(this.InterfaceType, "data");

            Expression filterExpression = CreateAccumulatedFilterExpression(parameterExpression, this.InterfaceType, dynamicContext);

            Expression whereExpression = ExpressionHelper.CreateWhereExpression(DataFacade.GetData(this.InterfaceType).Expression, parameterExpression, filterExpression);

            Expression fieldExpression = ExpressionHelper.CreatePropertyExpression(this.InterfaceType, this.PropertyInfo.DeclaringType, this.FieldName, parameterExpression);

            var        keySelector       = Expression.Lambda(fieldExpression, parameterExpression);
            Expression orderByExpression = this.SortDirection == SortDirection.Ascending
                ? ExpressionHelper.CreateOrderByExpression(whereExpression, keySelector)
                : ExpressionHelper.CreateOrderByDescendingExpression(whereExpression, keySelector);

            Expression selectBodyExpression;

            List <LambdaExpression> orderByExpressions = null;

            if (!includeAllGroupingFields)
            {
                selectBodyExpression = CreateSelectBodyExpression(parameterExpression, fieldExpression, out orderByExpressions);
            }
            else
            {
                List <Expression> bodyExpressions = new List <Expression>();
                foreach (DataFolderElementsTreeNode dataFolderElementsTreeNode in this.AllGroupingNodes)
                {
                    List <LambdaExpression> innerOrderByExpressions;

                    Expression groupFieldExpression = ExpressionHelper.CreatePropertyExpression(dataFolderElementsTreeNode.InterfaceType, dataFolderElementsTreeNode.PropertyInfo.DeclaringType, dataFolderElementsTreeNode.FieldName, parameterExpression);
                    Expression bodyExpression       = dataFolderElementsTreeNode.CreateSelectBodyExpression(parameterExpression, groupFieldExpression, out innerOrderByExpressions);

                    bodyExpressions.Add(bodyExpression);
                }

                selectBodyExpression = Expression.New(this.AllGroupingsTupleConstructor, bodyExpressions);

                // TODO: proper processing of innerOrderByExpressions
            }

            Expression selectExpression = ExpressionHelper.CreateSelectExpression(
                orderByExpression,
                selectBodyExpression,
                parameterExpression);

            Expression distinctExpression = ExpressionHelper.CreateDistinctExpression(selectExpression);


            // Sorting after calling "DISTINCT" to fix LINQ2SQL issue. No need to sort while resolving security
            if (orderByExpressions != null && dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
            {
                distinctExpression = ApplyOrder(distinctExpression, orderByExpressions);
            }

            return(distinctExpression);
        }
        /// <exclude />
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            Icon = new ResourceHandle(BuildInIconProviderName.ProviderName, "copy");

            actionAdder(new ElementAction(new ActionHandle(new ProxyDataActionToken(ActionIdentifier.Duplicate,this.PermissionTypes)))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #11
0
        /// <exclude />
        public override AncestorResult GetParentEntityToken(EntityToken ownEntityToken, Type parentInterfaceOfInterest, TreeNodeDynamicContext dynamicContext)
        {
            if (this.ParentFilteringHelpers == null)
            {
                throw new InvalidOperationException(string.Format("Failed to find parent, are you missing a parent filter for the type '{0}'", this.InterfaceType));
            }

            ParentFilterHelper helper;
            if (this.ParentFilteringHelpers.TryGetValue(parentInterfaceOfInterest, out helper) == false)
            {
                // We cant find the interface of interest directly, so we will give 'some' parent entity token
                // by using 'one' of our own parent id filters

                helper = this.ParentFilteringHelpers.First().Value;
            }

            DataEntityToken dataEntityToken = (DataEntityToken)ownEntityToken;
            IData data = dataEntityToken.Data;

            Verify.ArgumentCondition(data != null, "ownEntityToken", "Failed to get data");

            object parentFieldValue = helper.ParentReferencedPropertyInfo.GetValue(data, null);

            ParameterExpression parameterExpression = Expression.Parameter(helper.ParentIdFilterNode.ParentFilterType, "data");

            Expression expression = Expression.Equal(
                ExpressionHelper.CreatePropertyExpression(helper.ParentRefereePropertyName, parameterExpression),
                Expression.Constant(parentFieldValue, helper.ParentReferencedPropertyInfo.PropertyType)
            );

            Expression whereExpression = ExpressionHelper.CreateWhereExpression(
                DataFacade.GetData(helper.ParentIdFilterNode.ParentFilterType).Expression,
                parameterExpression, expression
            );

            IData parentDataItem = ExpressionHelper.GetCastedObjects<IData>(helper.ParentIdFilterNode.ParentFilterType, whereExpression)
                                   .FirstOrDefault();

            Verify.IsNotNull(parentDataItem, "Failed to get parent data item. Check if there's a broken parent reference.");
            
            DataEntityToken parentEntityToken = parentDataItem.GetDataEntityToken();

            TreeNode parentTreeNode = this.ParentNode;
            var dataElementsTreeNode = parentTreeNode as DataElementsTreeNode;

            while (dataElementsTreeNode == null ||
                   dataElementsTreeNode.InterfaceType != parentEntityToken.InterfaceType)
            {
                parentTreeNode = parentTreeNode.ParentNode;
            }

            return new AncestorResult(parentTreeNode, parentEntityToken);
        }
예제 #12
0
        private AncestorMatch GetAncestorFromParentFilter(TreeNodeDynamicContext dynamicContext)
        {
            var dataNode = dynamicContext.CurrentTreeNode as DataElementsTreeNode;
            if(dataNode == null) return null;
            
            var parentIdFilter = dynamicContext.CurrentTreeNode.FilterNodes.OfType<ParentIdFilterNode>().FirstOrDefault();
            if (parentIdFilter == null) return null;

            Type ancestorType = parentIdFilter.ParentFilterType;
            object key = parentIdFilter.FindParentKeyValue(dynamicContext);

            return key == null ? null : new AncestorMatch { InterfaceType = ancestorType, KeyValue = key};
        }
예제 #13
0
        private IEnumerable <T> GetCurrentAndLocalizableObjects <T>(TreeNodeDynamicContext dynamicContext, bool includeAllGroupingFields = false)
        {
            IEnumerable <T> objects = GetObjects <T>(dynamicContext, includeAllGroupingFields);

            if (!this.LocalizationEnabled)
            {
                return(objects);
            }

            using (new DataScope(UserSettings.ForeignLocaleCultureInfo))
            {
                var foreignObjects = GetObjects <T>(dynamicContext, includeAllGroupingFields);
                return(objects.Concat(foreignObjects).Distinct());
            }
        }
예제 #14
0
        /// <exclude />
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            var payload = new StringBuilder();
            this.Serialize(payload);

            if (this.ParentIdEntries.Count > 0)
            {
                List<EntityToken> entityTokens = dynamicContext.Piggybag.GetParentEntityTokens().ToList();
                entityTokens.Reverse(); 

                entityTokens.Add(dynamicContext.CurrentEntityToken);
                entityTokens.Add(entityToken);

                entityTokens.Reverse();

                foreach (ParentIdEntry parentIdEntry in this.ParentIdEntries)
                {
                    DataEntityToken dataEntityToken = entityTokens.FindDataEntityToken(parentIdEntry.TargetInterface);
                    if (dataEntityToken == null) continue;

                    IData data = dataEntityToken.Data;

                    object keyValue = parentIdEntry.TargetPropertyInfo.GetValue(data, null);

                    StringConversionServices.SerializeKeyValuePair(payload, parentIdEntry.SourcePropertyName, keyValue);
                }
            }

            StringConversionServices.SerializeKeyValuePair(payload, "_InterfaceType_", InterfaceType);
            StringConversionServices.SerializeKeyValuePair(payload, "_IconResourceName_", Icon.ResourceName);

            if (!String.IsNullOrEmpty(CustomFormMarkupPath))
            {
                StringConversionServices.SerializeKeyValuePair(payload, "_CustomFormMarkupPath_", CustomFormMarkupPath);
            }

            actionAdder(new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.GenericAddDataWorkflow"), this.PermissionTypes)
            {
                Payload = payload.ToString(),
                DoIgnoreEntityTokenLocking = true,
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken))
            }))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #15
0
        private NodeDataSet GetDataset(TreeNodeDynamicContext dynamicContext, bool returnJoinedTableKeys = true)
        {
            List <object> innerKeys = null;

            Expression expression;

            if (this.Display == LeafDisplayMode.Compact && this.JoinDataElementsTreeNode != null)
            {
                expression = CreateJoinExpression(dynamicContext);
            }
            else if (this.Display == LeafDisplayMode.Auto && this.JoinDataElementsTreeNode != null)
            {
                expression = CreateSimpleExpression(dynamicContext);

                if (returnJoinedTableKeys)
                {
                    //MRJ: Multiple Parent Filter: Not a real problem here as we just make a request for every filter
                    Expression innerExpression = CreateInnerExpression(dynamicContext, this.JoinParentIdFilterNode, this.JoinDataElementsTreeNode, false);

                    if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
                    {
                        innerExpression.DebugLogExpression("DataElementTreeNode", label: "Parent ids with children expression:");
                    }

                    innerKeys = DataFacade.GetData(this.JoinDataElementsTreeNode.CurrentDataInterfaceType).Provider
                                .CreateQuery(innerExpression)
                                .ToEnumerableOfObjects()
                                .ToList();
                }
            }
            else
            {
                expression = CreateSimpleExpression(dynamicContext);
            }

            if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
            {
                expression.DebugLogExpression("DataElementTreeNode");
            }

            return(new NodeDataSet
            {
                DataItems = ExpressionHelper.GetCastedObjects <IData>(this.InterfaceType, expression),
                JoinedKeys = innerKeys
            });
        }
        public override IEnumerable<EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            IEntityTokenContainingParentEntityToken containingParentEnitytToken = childEntityToken as IEntityTokenContainingParentEntityToken;
            if (containingParentEnitytToken != null)
            {
                childEntityToken = containingParentEnitytToken.GetParentEntityToken();
            }


            foreach (EntityToken entityToken in this.ParentNode.GetEntityTokens(childEntityToken, dynamicContext))
            {                
                foreach (var kvp in GetFunctionResult())
                {
                    yield return new TreeFunctionElementGeneratorEntityToken(this.Id, this.Tree.TreeId, EntityTokenSerializer.Serialize(entityToken), kvp.Key);
                }
            }
        }
예제 #17
0
        public Type WorkflowType { get; internal set; }     // Requried


        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            WorkflowActionToken actionToken = new WorkflowActionToken(
                WorkflowFacade.GetWorkflowType(TypeManager.SerializeType(this.WorkflowType)),
                this.PermissionTypes)
            {
                Payload = this.Serialize(),
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken)),
                DoIgnoreEntityTokenLocking = true
            };


            actionAdder(new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #18
0
        public override IEnumerable<EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            EntityToken possibleCurrentEntityToken;

            TreeSimpleElementEntityToken treeSimpleElementEntityToken = childEntityToken as TreeSimpleElementEntityToken;
            if (treeSimpleElementEntityToken != null) {
                possibleCurrentEntityToken = treeSimpleElementEntityToken.ParentEntityToken;
            }
            else
            {
                possibleCurrentEntityToken = childEntityToken;
            }

            foreach (EntityToken entityToken in this.ParentNode.GetEntityTokens(possibleCurrentEntityToken, dynamicContext))
            {
                yield return new TreeSimpleElementEntityToken(this.Id, this.Tree.TreeId, EntityTokenSerializer.Serialize(entityToken));
            }
        }
예제 #19
0
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            ActionToken actionToken = new MessageBoxActionNodeActionToken(
                this.TitleDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                this.MessageDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                this.Serialize(), 
                this.PermissionTypes
                );

            ElementAction elementAction = new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = this.CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            };

            elementAction.VisualData.ActionLocation = this.Location;

            actionAdder(elementAction);
        }
예제 #20
0
        public IEnumerable <Element> GetElementsByTreeId(string treeId, EntityToken parentEntityToken, Dictionary <string, string> piggybag)
        {
            Tree tree = GetTree(treeId);

            if (tree == null)
            {
                return new Element[] { }
            }
            ;

            var dynamicContext = new TreeNodeDynamicContext(TreeNodeDynamicContextDirection.Down)
            {
                Piggybag           = piggybag,
                CurrentEntityToken = parentEntityToken,
                CurrentTreeNode    = tree.RootTreeNode
            };

            return(tree.RootTreeNode.GetElements(parentEntityToken, dynamicContext));
        }
예제 #21
0
        private Expression CreateSimpleExpression(TreeNodeDynamicContext dynamicContext)
        {
            ParameterExpression parameterExpression = Expression.Parameter(this.InterfaceType, "data");

            Expression filterExpression = CreateAccumulatedFilterExpression(parameterExpression, this.InterfaceType, dynamicContext);

            Expression whereExpression = ExpressionHelper.CreateWhereExpression(DataFacade.GetData(this.InterfaceType).Expression, parameterExpression, filterExpression);

            Expression resultExpression = whereExpression;
            bool       isFirst          = true;

            foreach (OrderByNode orderByNode in this.OrderByNodes)
            {
                resultExpression = orderByNode.CreateOrderByExpression(resultExpression, parameterExpression, isFirst);
                isFirst          = false;
            }

            return(resultExpression);
        }
예제 #22
0
        public override Expression CreateUpwardsFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext)
        {
            DataEntityToken currentEntityToken = dynamicContext.CurrentEntityToken as DataEntityToken;
            IData filteredDataItem = null;

            Func<IData, bool> upwardsFilter = dataItem =>
            {
                var ancestorEntityToken = dataItem.GetDataEntityToken();

                var replaceContext = new DynamicValuesHelperReplaceContext
                {
                    CurrentDataItem = dataItem,
                    CurrentEntityToken = ancestorEntityToken,
                    PiggybagDataFinder = new PiggybagDataFinder(dynamicContext.Piggybag, ancestorEntityToken)
                };

                XElement markup = this.FunctionMarkupDynamicValuesHelper.ReplaceValues(replaceContext);

                BaseRuntimeTreeNode baseRuntimeTreeNode = FunctionTreeBuilder.Build(markup);
                LambdaExpression expression = GetLambdaExpression(baseRuntimeTreeNode);

                if (expression.Parameters.Count != 1)
                {
                    throw new InvalidOperationException("Only 1 parameter lamdas supported when calling function: " + markup);
                }

                Delegate compiledExpression = expression.Compile();

                if (filteredDataItem == null)
                {
                    filteredDataItem = currentEntityToken.Data;
                }

                return (bool)compiledExpression.DynamicInvoke(filteredDataItem);
            };

            
            return upwardsFilter.Target != null 
                ? Expression.Call(Expression.Constant(upwardsFilter.Target), upwardsFilter.Method, parameterExpression)
                : Expression.Call(upwardsFilter.Method, parameterExpression);

        }
예제 #23
0
        public override Expression CreateDownwardsFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext)
        {
            IData parentDataItem = GetParentDataItem(this.ParentFilterType, dynamicContext.CurrentEntityToken, dynamicContext);
            if (parentDataItem == null) return null;

            object parentFieldValue = this.KeyPropertyInfo.GetValue(parentDataItem, null);

            Expression expression = Expression.Equal(ExpressionHelper.CreatePropertyExpression(this.ReferenceFieldName, parameterExpression), Expression.Constant(parentFieldValue, this.ReferencePropertyInfo.PropertyType));

            if (ReferencePropertyInfo.PropertyType.IsGenericType && ReferencePropertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                PropertyInfo propertyInfo = ReferencePropertyInfo.PropertyType.GetProperty("HasValue");

                Expression hasValueExpression = Expression.Property(Expression.Property(parameterExpression, this.ReferenceFieldName), propertyInfo);

                expression = Expression.AndAlso(hasValueExpression, expression);
            }

            return expression;
        }
        internal object FindParentKeyValue(TreeNodeDynamicContext dynamicContext)
        {
            if ((dynamicContext.CurrentEntityToken is DataEntityToken))
            {
                DataEntityToken currentDataEntityToken = dynamicContext.CurrentEntityToken as DataEntityToken;
                if (currentDataEntityToken.InterfaceType == this.ParentFilterType)
                {
                    return(this.KeyPropertyInfo.GetValue(currentDataEntityToken.Data, null));
                }
            }

            EntityToken ownFilterEntityToken = FindOwnEntityToken(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken, dynamicContext);

            DataEntityToken dataEntityToken = (DataEntityToken)ownFilterEntityToken;

            IData data = dataEntityToken.Data;

            object parentFieldValue = this.ReferencePropertyInfo.GetValue(data, null);

            return(parentFieldValue);
        }
예제 #25
0
        public override Expression CreateDownwardsFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext)
        {
            var replaceContext = new DynamicValuesHelperReplaceContext(dynamicContext.CurrentEntityToken, dynamicContext.Piggybag);

            XElement markup = this.FunctionMarkupDynamicValuesHelper.ReplaceValues(replaceContext);

            BaseRuntimeTreeNode baseRuntimeTreeNode = FunctionTreeBuilder.Build(markup);
            LambdaExpression expression = GetLambdaExpression(baseRuntimeTreeNode);

            if (expression.Parameters.Count != 1)
            {
                throw new InvalidOperationException("Only 1 parameter lamdas supported when calling function: " + markup);
            }


            ParameterChangerExpressionVisitor expressionVisitor = new ParameterChangerExpressionVisitor(expression.Parameters.Single(), parameterExpression);

            Expression resultExpression = expressionVisitor.Visit(expression.Body);

            return resultExpression;
        }        
예제 #26
0
        /// <exclude />
        protected override void OnAddAction(Action<ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            StringBuilder payload = new StringBuilder();
            StringConversionServices.SerializeKeyValuePair(payload, "TreeId", this.OwnerNode.Tree.TreeId);
            StringConversionServices.SerializeKeyValuePair(payload, "ActionId", this.Id);

            WorkflowActionToken actionToken = new WorkflowActionToken(
                WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.ReportFunctionActionWorkflow"), 
                this.PermissionTypes)                
            {
                Payload = this.Serialize(),
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken)),
                DoIgnoreEntityTokenLocking = true
            };
            

            actionAdder(new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #27
0
        private Expression CreateFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext)
        {            
            object value = ValueTypeConverter.Convert(this.FieldValue, this.PropertyInfo.PropertyType);

            Expression valueExpression = Expression.Constant(value, this.PropertyInfo.PropertyType);

            Expression expression;
            switch (this.Operator)
            {
                case FieldFilterNodeOperator.Equal:
                    expression = Expression.Equal(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                case FieldFilterNodeOperator.Inequal:
                    expression = Expression.NotEqual(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                case FieldFilterNodeOperator.Greater:
                    expression = Expression.GreaterThan(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                case FieldFilterNodeOperator.GreaterEqual:
                    expression = Expression.GreaterThanOrEqual(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                case FieldFilterNodeOperator.Lesser:
                    expression = Expression.LessThan(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                case FieldFilterNodeOperator.LesserEqual:
                    expression = Expression.LessThanOrEqual(ExpressionHelper.CreatePropertyExpression(this.FieldName, parameterExpression), valueExpression);
                    break;

                default:
                    throw new NotImplementedException();
            }
            

            return expression;
        }
예제 #28
0
        private Expression CreateJoinExpression(TreeNodeDynamicContext dynamicContext)
        {
            //MRJ: Multiple Parent Filter: Here we have to make either multiple calls or create a multiple inner join, kinda hard
            // Create inner expression tree
            Expression innerDistinctExpression = CreateInnerExpression(dynamicContext, this.JoinParentIdFilterNode, this.JoinDataElementsTreeNode);


            // Create outer expression tree
            ParameterExpression outerParameterExpression = Expression.Parameter(this.InterfaceType, "outerData");

            Expression outerFilterExpression = CreateAccumulatedFilterExpression(outerParameterExpression, this.InterfaceType, dynamicContext);

            Expression outerWhereExpression = ExpressionHelper.CreateWhereExpression(DataFacade.GetData(this.InterfaceType).Expression, outerParameterExpression, outerFilterExpression);

            Expression outerResultExpression = outerWhereExpression;
            bool       isFirst = true;

            foreach (OrderByNode orderByNode in this.OrderByNodes)
            {
                outerResultExpression = orderByNode.CreateOrderByExpression(outerResultExpression, outerParameterExpression, isFirst);
                isFirst = false;
            }


            // Create join lambda expressions
            PropertyInfo     outerKeyPropertyInfo       = this.KeyPropertyInfo;
            LambdaExpression outerKeySelectorExpression = Expression.Lambda(Expression.Property(outerParameterExpression, outerKeyPropertyInfo), outerParameterExpression);

            ParameterExpression innerKeySelectorParameterExpression = Expression.Parameter(this.JoinInnerKeyReferencePropertyInfo.PropertyType, "innerKeyParam");
            LambdaExpression    innerKeySelectorExpression          = Expression.Lambda(innerKeySelectorParameterExpression, innerKeySelectorParameterExpression);

            ParameterExpression parameterExpression1 = Expression.Parameter(this.InterfaceType, "param1");
            ParameterExpression parameterExpression2 = Expression.Parameter(outerKeyPropertyInfo.PropertyType, "param2");
            LambdaExpression    resultSelector       = Expression.Lambda(parameterExpression1, parameterExpression1, parameterExpression2);

            Expression joinExpression = ExpressionHelper.CreateJoinExpression(outerResultExpression, innerDistinctExpression, outerKeySelectorExpression, innerKeySelectorExpression, resultSelector);

            return(joinExpression);
        }
        protected override IEnumerable<Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            foreach (var kvp in GetFunctionResult())
            {
                Element element = new Element(new ElementHandle(
                    dynamicContext.ElementProviderName,
                    new TreeFunctionElementGeneratorEntityToken(this.Id.ToString(), this.Tree.TreeId, EntityTokenSerializer.Serialize(parentEntityToken), kvp.Key),
                    dynamicContext.Piggybag.PreparePiggybag(this.ParentNode, parentEntityToken)
                ));

                element.VisualData = new ElementVisualizedData
                {
                    Label = kvp.Value,
                    ToolTip = kvp.Value,
                    HasChildren = ChildNodes.Count() > 0,
                    Icon = Core.ResourceSystem.ResourceHandle.BuildIconFromDefaultProvider("folder"),
                    OpenedIcon = Core.ResourceSystem.ResourceHandle.BuildIconFromDefaultProvider("folder")
                };

                yield return element;
            }
        }
예제 #30
0
        internal override IEnumerable<EntityToken> FilterParentGeneretedEntityTokens(EntityToken selfEntityToken, IEnumerable<EntityToken> parentGeneretedEntityTokens, TreeNodeDynamicContext dynamicContext)
        {
            // Check below ensures that the parent EntityToken actually present in a tree and not been filtered out

            TreeSimpleElementEntityToken treeSimpleElementEntityToken = (TreeSimpleElementEntityToken) selfEntityToken;
            EntityToken parentEntityToken = treeSimpleElementEntityToken.ParentEntityToken;
            foreach (EntityToken entityToken in parentGeneretedEntityTokens)
            {
                if (parentEntityToken.Equals(entityToken))
                {
                    return new[] { parentEntityToken };
                }

                TreeSimpleElementEntityToken castedEntityToken = entityToken as TreeSimpleElementEntityToken;
                if ((castedEntityToken != null) &&
                    (parentEntityToken.Equals(castedEntityToken.ParentEntityToken)))
                {
                    return new [] { parentEntityToken };
                }
            }

            return new EntityToken[0];
        }
예제 #31
0
        private AncestorMatch GetAncestorFromParentFilter(TreeNodeDynamicContext dynamicContext)
        {
            var dataNode = dynamicContext.CurrentTreeNode as DataElementsTreeNode;

            if (dataNode == null)
            {
                return(null);
            }

            var parentIdFilter = dynamicContext.CurrentTreeNode.FilterNodes.OfType <ParentIdFilterNode>().FirstOrDefault();

            if (parentIdFilter == null)
            {
                return(null);
            }

            Type   ancestorType = parentIdFilter.ParentFilterType;
            object key          = parentIdFilter.FindParentKeyValue(dynamicContext);

            return(key == null ? null : new AncestorMatch {
                InterfaceType = ancestorType, KeyValue = key
            });
        }
예제 #32
0
        /// <exclude />
        public IEnumerable <Element> GetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            IEnumerable <Element> elements = OnGetElements(parentEntityToken, dynamicContext);

            var localizeDataWorkflow = WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.LocalizeDataWorkflow");

            foreach (Element element in elements)
            {
                bool isForeignLocaleDataItem = element.Actions
                                               .Any(x => x.ActionHandle.ActionToken is WorkflowActionToken &&
                                                    ((WorkflowActionToken)x.ActionHandle.ActionToken).WorkflowType == localizeDataWorkflow);

                if (!isForeignLocaleDataItem)
                {
                    foreach (ActionNode actionNode in this.ActionNodes)
                    {
                        actionNode.AddAction(element.AddAction, element.ElementHandle.EntityToken, dynamicContext);
                    }
                }

                yield return(element);
            }
        }
예제 #33
0
        public override IEnumerable<EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            TreeSimpleElementEntityToken treeSimpleElementEntityToken = childEntityToken as TreeSimpleElementEntityToken;
            if (treeSimpleElementEntityToken != null)
            {
                yield return treeSimpleElementEntityToken.ParentEntityToken;
            }
            else
            {
                AncestorMatch ancestorFromFilter = GetAncestorFromParentFilter(dynamicContext);

                foreach (IAttachmentPoint attachmentPoint in this.Tree.AttachmentPoints)
                {
                    if(attachmentPoint is DynamicDataItemAttachmentPoint 
                        && ancestorFromFilter != null)
                    {
                        var dynamicAttachmentPoint = attachmentPoint as DynamicDataItemAttachmentPoint;

                        if (ancestorFromFilter.InterfaceType == dynamicAttachmentPoint.InterfaceType)
                        {
                            if (dynamicAttachmentPoint.KeyValue.Equals(ancestorFromFilter.KeyValue))
                            {
                                foreach (var e in dynamicAttachmentPoint.GetEntityTokens(null, null)) {
                                    yield return e;
                                }
                            }
                            continue;
                        }
                    }

                    foreach (EntityToken entityToken in attachmentPoint.GetEntityTokens(childEntityToken, dynamicContext))
                    {
                        yield return entityToken;
                    }
                }
            }
        }
예제 #34
0
 /// <summary>
 /// This is call when this nodes entity tokens are needed to climb up the tree.
 /// If this tree nodes elements dont have any children, then this method will not be called.
 /// </summary>
 /// <param name="childEntityToken">The child entity token.</param>
 /// <param name="dynamicContext">The dynamic context.</param>
 /// <returns></returns>
 public abstract IEnumerable<EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext);
예제 #35
0
        private static void DoInitialize(string elementAttachingProviderName)
        {
            var sharedRootFolders = new Dictionary<string, CustomTreePerspectiveInfo>();

            var treeNodeDynamicContext = new TreeNodeDynamicContext(TreeNodeDynamicContextDirection.Down);
            treeNodeDynamicContext.Piggybag = new Dictionary<string, string>();

            foreach (var tree in TreeFacade.AllTrees)
            {
                if (!tree.ShareRootElementById) continue;

                IEnumerable<NamedAttachmentPoint> namedAttachmentPoints =
                    tree.AttachmentPoints.
                    OfType<NamedAttachmentPoint>();

                if (namedAttachmentPoints.Count() != 1) continue;

                if (tree.RootTreeNode.ChildNodes.Count() != 1) continue;

                SimpleElementTreeNode childTreeNode = tree.RootTreeNode.ChildNodes.Single() as SimpleElementTreeNode;

                if (childTreeNode == null) continue;

                NamedAttachmentPoint namedAttachmentPoint = namedAttachmentPoints.Single();


                EntityToken perspectiveEntityToken;
                if (!sharedRootFolders.ContainsKey(childTreeNode.Id))
                {
                    perspectiveEntityToken = new TreePerspectiveEntityToken(childTreeNode.Id);

                    var dynamicValuesHelperReplaceContext = new DynamicValuesHelperReplaceContext(
                        namedAttachmentPoint.AttachingPoint.EntityToken, 
                        null);

                    // MRJ: Collection actions
                    Element element = new Element(new ElementHandle(elementAttachingProviderName, perspectiveEntityToken))
                    {
                        VisualData = new ElementVisualizedData
                        {
                            Label = childTreeNode.LabelDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                            ToolTip = childTreeNode.ToolTipDynamicValuesHelper.ReplaceValues(dynamicValuesHelperReplaceContext),
                            HasChildren = true,
                            Icon = childTreeNode.Icon,
                            OpenedIcon = childTreeNode.OpenIcon
                        }
                    };

                    sharedRootFolders.Add(childTreeNode.Id, new CustomTreePerspectiveInfo
                    {
                        AttachmentPoint = new NamedAttachmentPoint
                        {
                            AttachingPoint = new AttachingPoint(namedAttachmentPoint.AttachingPoint),
                            Position = namedAttachmentPoint.Position
                        },
                        Element = element,
                        Trees = new List<Tree> { tree }
                    });
                }
                else
                {
                    perspectiveEntityToken = sharedRootFolders[childTreeNode.Id].Element.ElementHandle.EntityToken;
                    sharedRootFolders[childTreeNode.Id].Trees.Add(tree);
                }

                namedAttachmentPoint.AttachingPoint = new AttachingPoint(perspectiveEntityToken);
                tree.RootTreeNode = childTreeNode;
            }
            
            _sharedRootFolders = sharedRootFolders;
        }
        public Dictionary <EntityToken, IEnumerable <EntityToken> > GetParents(IEnumerable <EntityToken> entityTokens)
        {
            Dictionary <EntityToken, IEnumerable <EntityToken> > result = new Dictionary <EntityToken, IEnumerable <EntityToken> >();

            foreach (EntityToken entityToken in entityTokens)
            {
                TreeNodeDynamicContext dynamicContext = new TreeNodeDynamicContext(TreeNodeDynamicContextDirection.Up)
                {
                    CurrentEntityToken = entityToken
                };


                if (entityToken is TreeSimpleElementEntityToken ||
                    entityToken is TreeFunctionElementGeneratorEntityToken)
                {
                    var parentEntityTokenSource = entityToken as IEntityTokenContainingParentEntityToken;

                    try
                    {
                        result.Add(entityToken, new[] { parentEntityTokenSource.GetParentEntityToken() });
                    }
                    catch (Exception ex)
                    {
                        string treeId;

                        if (entityToken is TreeSimpleElementEntityToken)
                        {
                            treeId = (entityToken as TreeSimpleElementEntityToken).TreeNodeId;
                        }
                        else if (entityToken is TreeFunctionElementGeneratorEntityToken)
                        {
                            treeId = (entityToken as TreeFunctionElementGeneratorEntityToken).TreeNodeId;
                        }
                        else
                        {
                            throw new InvalidOperationException("This code should not be reachable.");
                        }

                        Log.LogError("TreeFacade", "The tree '{0}' failed to return parent entity tokens and are ignored", treeId);
                        Log.LogError("TreeFacade", ex);
                    }
                }
                else if (entityToken is TreeDataFieldGroupingElementEntityToken)
                {
                    TreeDataFieldGroupingElementEntityToken treeDataFieldGroupingElementEntityToken = entityToken as TreeDataFieldGroupingElementEntityToken;
                    string treeId = entityToken.Source;

                    try
                    {
                        Tree tree = TreeFacade.GetTree(treeId);

                        string   treeNodeId = treeDataFieldGroupingElementEntityToken.TreeNodeId;
                        TreeNode treeNode   = tree.GetTreeNode(treeNodeId);

                        dynamicContext.FieldGroupingValues    = treeDataFieldGroupingElementEntityToken.GroupingValues;
                        dynamicContext.FieldFolderRangeValues = treeDataFieldGroupingElementEntityToken.FolderRangeValues;
                        dynamicContext.CurrentTreeNode        = treeNode;

                        result.Add(entityToken, treeNode.ParentNode.GetEntityTokens(entityToken, dynamicContext));
                    }
                    catch (Exception ex)
                    {
                        Log.LogError("TreeFacade", $"The tree '{treeId}' failed to return parent entity tokens and are ignored");
                        Log.LogError("TreeFacade", ex);
                    }
                }
                else if (entityToken is DataEntityToken)
                {
                    DataEntityToken dataEntityToken = entityToken as DataEntityToken;

                    Type interfaceType = dataEntityToken.InterfaceType;

                    foreach (Tree tree in TreeFacade.AllTrees)
                    {
                        List <TreeNode> treeNodes;
                        if (!tree.BuildProcessContext.DataInteraceToTreeNodes.TryGetValue(interfaceType, out treeNodes))
                        {
                            continue;
                        }

                        IEnumerable <EntityToken> concatList = null;

                        foreach (TreeNode treeNode in treeNodes)
                        {
                            try
                            {
                                dynamicContext.CurrentTreeNode = treeNode;

                                concatList = concatList.ConcatOrDefault(treeNode.ParentNode.GetEntityTokens(entityToken, dynamicContext));
                            }
                            catch (Exception ex)
                            {
                                Log.LogError("TreeFacade", $"The tree '{treeNode.Tree.TreeId}' failed to return parent entity tokens and are ignored");
                                Log.LogError("TreeFacade", ex);
                            }
                        }

                        if (concatList != null)
                        {
                            // Filtering the current element to avoid loops while resolving security
                            concatList = concatList.Where(e => !entityToken.Equals(e));

                            IEnumerable <EntityToken> existingList;
                            if (result.TryGetValue(entityToken, out existingList))
                            {
                                result[entityToken] = existingList.Concat(concatList);
                            }
                            else
                            {
                                result.Add(entityToken, concatList);
                            }
                        }
                    }
                }
                else if (entityToken is TreePerspectiveEntityToken)
                {
                    result.Add(entityToken, new[] { TreeSharedRootsFacade.SharedRootFolders[entityToken.Id].AttachmentPoint.AttachingPoint.EntityToken });
                }
            }

            return(result);
        }
예제 #37
0
        /// <exclude />
        public override IEnumerable <EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            IEnumerable <IData> dataset = GetDataset(dynamicContext, false).DataItems;

            return(dataset.Select(f => (EntityToken)f.GetDataEntityToken()).Evaluate());
        }
예제 #38
0
        internal override IEnumerable <EntityToken> FilterParentGeneretedEntityTokens(EntityToken selfEntityToken, IEnumerable <EntityToken> parentGeneretedEntityTokens, TreeNodeDynamicContext dynamicContext)
        {
            // Check below ensures that the parent EntityToken actually present in a tree and not been filtered out

            TreeSimpleElementEntityToken treeSimpleElementEntityToken = (TreeSimpleElementEntityToken)selfEntityToken;
            EntityToken parentEntityToken = treeSimpleElementEntityToken.ParentEntityToken;

            foreach (EntityToken entityToken in parentGeneretedEntityTokens)
            {
                if (parentEntityToken.Equals(entityToken))
                {
                    return(new[] { parentEntityToken });
                }

                TreeSimpleElementEntityToken castedEntityToken = entityToken as TreeSimpleElementEntityToken;
                if ((castedEntityToken != null) &&
                    (parentEntityToken.Equals(castedEntityToken.ParentEntityToken)))
                {
                    return(new [] { parentEntityToken });
                }
            }

            return(new EntityToken[0]);
        }
        /// <exclude />
        protected override void OnAddAction(Action <ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            var payload = new StringBuilder();

            this.Serialize(payload);

            if (this.ParentIdEntries.Count > 0)
            {
                List <EntityToken> entityTokens = dynamicContext.Piggybag.GetParentEntityTokens().ToList();
                entityTokens.Reverse();

                entityTokens.Add(dynamicContext.CurrentEntityToken);
                entityTokens.Add(entityToken);

                entityTokens.Reverse();

                foreach (ParentIdEntry parentIdEntry in this.ParentIdEntries)
                {
                    DataEntityToken dataEntityToken = entityTokens.FindDataEntityToken(parentIdEntry.TargetInterface);
                    if (dataEntityToken == null)
                    {
                        continue;
                    }

                    IData data = dataEntityToken.Data;

                    object keyValue = parentIdEntry.TargetPropertyInfo.GetValue(data, null);

                    StringConversionServices.SerializeKeyValuePair(payload, parentIdEntry.SourcePropertyName, keyValue);
                }
            }

            StringConversionServices.SerializeKeyValuePair(payload, "_InterfaceType_", InterfaceType);
            StringConversionServices.SerializeKeyValuePair(payload, "_IconResourceName_", Icon.ResourceName);

            if (!String.IsNullOrEmpty(CustomFormMarkupPath))
            {
                StringConversionServices.SerializeKeyValuePair(payload, "_CustomFormMarkupPath_", CustomFormMarkupPath);
            }

            actionAdder(new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.GenericAddDataWorkflow"), this.PermissionTypes)
            {
                Payload = payload.ToString(),
                DoIgnoreEntityTokenLocking = true,
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken))
            }))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #40
0
        protected override IEnumerable <Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            var entityToken = new TreeSimpleElementEntityToken(
                this.Id,
                this.Tree.TreeId,
                EntityTokenSerializer.Serialize(parentEntityToken));

            Element element = new Element(new ElementHandle(
                                              dynamicContext.ElementProviderName,
                                              entityToken,
                                              dynamicContext.Piggybag.PreparePiggybag(this.ParentNode, parentEntityToken)
                                              ));


            if (parentEntityToken is TreePerspectiveEntityToken)
            {
                element.ElementHandle.Piggyback[StringConstants.PiggybagTreeId] = Tree.TreeId;
            }

            var replaceContext = new DynamicValuesHelperReplaceContext(parentEntityToken, dynamicContext.Piggybag);

            element.VisualData = new ElementVisualizedData
            {
                Label       = this.LabelDynamicValuesHelper.ReplaceValues(replaceContext),
                ToolTip     = this.ToolTipDynamicValuesHelper.ReplaceValues(replaceContext),
                HasChildren = ChildNodes.Any(),
                Icon        = this.Icon,
                OpenedIcon  = this.OpenIcon
            };

            yield return(element);
        }
예제 #41
0
 public override AncestorResult GetParentEntityToken(EntityToken childEntityToken, Type parentInterfaceOfInterest, TreeNodeDynamicContext dynamicContext)
 {
     throw new NotImplementedException("Should never get called");
 }
예제 #42
0
        private List <T> GetObjects <T>(TreeNodeDynamicContext dynamicContext)
        {
            Expression expression = GetObjectsExpression(dynamicContext);

            return(ExpressionHelper.GetCastedObjects <T>(this.InterfaceType, expression));
        }
예제 #43
0
 /// <summary>
 /// This is called when this nodes elements are needed to create next sub level of tree elements.
 /// </summary>
 /// <param name="parentEntityToken"></param>
 /// <param name="dynamicContext"></param>
 /// <returns></returns>
 protected abstract IEnumerable<Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext);
예제 #44
0
        /// <exclude />
        public override AncestorResult GetParentEntityToken(EntityToken ownEntityToken, Type parentInterfaceOfInterest, TreeNodeDynamicContext dynamicContext)
        {
            if (this.ParentFilteringHelpers == null)
            {
                throw new InvalidOperationException(string.Format("Failed to find parent, are you missing a parent filter for the type '{0}'", this.InterfaceType));
            }

            ParentFilterHelper helper;

            if (this.ParentFilteringHelpers.TryGetValue(parentInterfaceOfInterest, out helper) == false)
            {
                // We cant find the interface of interest directly, so we will give 'some' parent entity token
                // by using 'one' of our own parent id filters

                helper = this.ParentFilteringHelpers.First().Value;
            }

            DataEntityToken dataEntityToken = (DataEntityToken)ownEntityToken;
            IData           data            = dataEntityToken.Data;

            Verify.ArgumentCondition(data != null, "ownEntityToken", "Failed to get data");

            object parentFieldValue = helper.ParentReferencedPropertyInfo.GetValue(data, null);

            ParameterExpression parameterExpression = Expression.Parameter(helper.ParentIdFilterNode.ParentFilterType, "data");

            Expression expression = Expression.Equal(
                ExpressionHelper.CreatePropertyExpression(helper.ParentRefereePropertyName, parameterExpression),
                Expression.Constant(parentFieldValue, helper.ParentReferencedPropertyInfo.PropertyType)
                );

            Expression whereExpression = ExpressionHelper.CreateWhereExpression(
                DataFacade.GetData(helper.ParentIdFilterNode.ParentFilterType).Expression,
                parameterExpression, expression
                );

            IData parentDataItem = ExpressionHelper.GetCastedObjects <IData>(helper.ParentIdFilterNode.ParentFilterType, whereExpression)
                                   .FirstOrDefault();

            Verify.IsNotNull(parentDataItem, "Failed to get parent data item. Check if there's a broken parent reference.");

            DataEntityToken parentEntityToken = parentDataItem.GetDataEntityToken();

            TreeNode parentTreeNode       = this.ParentNode;
            var      dataElementsTreeNode = parentTreeNode as DataElementsTreeNode;

            while (dataElementsTreeNode == null ||
                   dataElementsTreeNode.InterfaceType != parentEntityToken.InterfaceType)
            {
                parentTreeNode = parentTreeNode.ParentNode;
            }

            return(new AncestorResult(parentTreeNode, parentEntityToken));
        }
        /// <exclude />
        protected override void OnAddAction(Action <ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            StringBuilder payload = new StringBuilder();

            StringConversionServices.SerializeKeyValuePair(payload, "TreeId", this.OwnerNode.Tree.TreeId);
            StringConversionServices.SerializeKeyValuePair(payload, "ActionId", this.Id);

            WorkflowActionToken actionToken = new WorkflowActionToken(
                WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.ReportFunctionActionWorkflow"),
                this.PermissionTypes)
            {
                Payload      = this.Serialize(),
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken)),
                DoIgnoreEntityTokenLocking = true
            };


            actionAdder(new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #46
0
        }                                                   // Requried


        protected override void OnAddAction(Action <ElementAction> actionAdder, EntityToken entityToken, TreeNodeDynamicContext dynamicContext, DynamicValuesHelperReplaceContext dynamicValuesHelperReplaceContext)
        {
            WorkflowActionToken actionToken = new WorkflowActionToken(
                WorkflowFacade.GetWorkflowType(TypeManager.SerializeType(this.WorkflowType)),
                this.PermissionTypes)
            {
                Payload      = this.Serialize(),
                ExtraPayload = PiggybagSerializer.Serialize(dynamicContext.Piggybag.PreparePiggybag(dynamicContext.CurrentTreeNode, dynamicContext.CurrentEntityToken)),
                DoIgnoreEntityTokenLocking = true
            };


            actionAdder(new ElementAction(new ActionHandle(actionToken))
            {
                VisualData = CreateActionVisualizedData(dynamicValuesHelperReplaceContext)
            });
        }
예제 #47
0
        public override IEnumerable <EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            TreeSimpleElementEntityToken treeSimpleElementEntityToken = childEntityToken as TreeSimpleElementEntityToken;

            if (treeSimpleElementEntityToken != null)
            {
                yield return(treeSimpleElementEntityToken.ParentEntityToken);
            }
            else
            {
                AncestorMatch ancestorFromFilter = GetAncestorFromParentFilter(dynamicContext);

                foreach (IAttachmentPoint attachmentPoint in this.Tree.AttachmentPoints)
                {
                    if (attachmentPoint is DynamicDataItemAttachmentPoint &&
                        ancestorFromFilter != null)
                    {
                        var dynamicAttachmentPoint = attachmentPoint as DynamicDataItemAttachmentPoint;

                        if (ancestorFromFilter.InterfaceType == dynamicAttachmentPoint.InterfaceType)
                        {
                            if (dynamicAttachmentPoint.KeyValue.Equals(ancestorFromFilter.KeyValue))
                            {
                                foreach (var e in dynamicAttachmentPoint.GetEntityTokens(null, null))
                                {
                                    yield return(e);
                                }
                            }
                            continue;
                        }
                    }

                    foreach (EntityToken entityToken in attachmentPoint.GetEntityTokens(childEntityToken, dynamicContext))
                    {
                        yield return(entityToken);
                    }
                }
            }
        }
예제 #48
0
 public override Expression CreateUpwardsFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext)
 {
     return CreateFilterExpression(parameterExpression, dynamicContext);
 }
예제 #49
0
        private List <object> GetObjects(TreeNodeDynamicContext dynamicContext, bool includeAllGroupingFields = false)
        {
            Expression expression = GetObjectsExpression(dynamicContext, includeAllGroupingFields);

            return(ExpressionHelper.GetObjects(this.InterfaceType, expression));
        }
예제 #50
0
 public override AncestorResult GetParentEntityToken(EntityToken ownEntityToken, Type parentInterfaceOfInterest, TreeNodeDynamicContext dynamicContext)
 {
     return(new AncestorResult(this.ParentNode, ((TreeSimpleElementEntityToken)ownEntityToken).ParentEntityToken));
 }
예제 #51
0
        protected override IEnumerable <Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            foreach (TreeNode childTreeNode in this.ChildNodes)
            {
                foreach (Element element in childTreeNode.GetElements(parentEntityToken, dynamicContext))
                {
                    element.ElementHandle.Piggyback[StringConstants.PiggybagTreeId] = this.Tree.TreeId;

                    yield return(element);
                }
            }
        }
예제 #52
0
        public IEnumerable<ElementAction> GetActions(EntityToken entityToken)
        {
            if (TreeFacade.HasPossibleAttachmentPoints(entityToken))
            {
                yield return new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.AddApplicationWorkflow"), AddPermissionTypes) { DoIgnoreEntityTokenLocking = true }))
                {
                    VisualData = new ActionVisualizedData
                    {
                        Label = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "AddApplicationWorkflow.AddApplication.Label"),
                        ToolTip = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "AddApplicationWorkflow.AddApplication.ToolTip"),
                        Icon = AddApplicationIcon,
                        Disabled = false,
                        ActionLocation = new ActionLocation
                        {
                            ActionType = ActionType.Other,
                            IsInFolder = false,
                            IsInToolbar = false,
                            ActionGroup = ApplicationsActionGroup
                        }
                    }
                };


                yield return new ElementAction(new ActionHandle(new WorkflowActionToken(WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.RemoveApplicationWorkflow"), RemovePermissionTypes) { DoIgnoreEntityTokenLocking = true }))
                {
                    VisualData = new ActionVisualizedData
                    {
                        Label = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "RemoveApplicationWorkflow.RemoveApplication.Label"),
                        ToolTip = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "RemoveApplicationWorkflow.RemoveApplication.ToolTip"),
                        Icon = RemoveApplicationIcon,
                        Disabled = false,
                        ActionLocation = new ActionLocation
                        {
                            ActionType = ActionType.Other,
                            IsInFolder = false,
                            IsInToolbar = false,
                            ActionGroup = ApplicationsActionGroup
                        }
                    }
                };
            }


            List<ElementAction> elementActions = new List<ElementAction>();
            foreach (Tree tree in TreeFacade.GetTreesByEntityToken(entityToken))
            {
                TreeNodeDynamicContext dynamicContext = new TreeNodeDynamicContext(TreeNodeDynamicContextDirection.Down)
                {
                    CurrentTreeNode = tree.RootTreeNode,
                    CurrentEntityToken = entityToken,
                    Piggybag = new Dictionary<string, string>()
                };

                foreach (ActionNode actionNode in tree.RootTreeNode.ActionNodes)
                {
                    actionNode.AddAction(f => elementActions.Add(f), entityToken, dynamicContext);
                }
            }


            foreach (ElementAction elementAction in elementActions)
            {
                yield return elementAction;
            }
        }
예제 #53
0
        /// <exclude />
        public IEnumerable<Element> GetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            IEnumerable<Element> elements = OnGetElements(parentEntityToken, dynamicContext);

            var localizeDataWorkflow = WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.LocalizeDataWorkflow");

            foreach (Element element in elements)
            {
                bool isForeignLocaleDataItem = element.Actions
                        .Any(x => x.ActionHandle.ActionToken is WorkflowActionToken 
                        && ((WorkflowActionToken)x.ActionHandle.ActionToken).WorkflowType == localizeDataWorkflow);

                if (!isForeignLocaleDataItem)
                {
                    foreach (ActionNode actionNode in this.ActionNodes)
                    {
                        actionNode.AddAction(element.AddAction, element.ElementHandle.EntityToken, dynamicContext);
                    }
                }

                yield return element;
            }
        }
예제 #54
0
        private IData GetParentDataItem(Type parentType, EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            if (dynamicContext.CustomData.ContainsKey("ParentData"))
            {
                return((IData)dynamicContext.CustomData["ParentData"]);
            }

            IData parentDataItem = null;

            if (parentEntityToken is DataEntityToken)
            {
                DataEntityToken dataEntityToken = parentEntityToken as DataEntityToken;
                Type            type            = dataEntityToken.InterfaceType;
                if (type == parentType)
                {
                    return(dataEntityToken.Data);
                }
            }

            if (parentDataItem == null)
            {
                foreach (EntityToken entityToken in dynamicContext.Piggybag.GetParentEntityTokens())
                {
                    DataEntityToken dataEntityToken = entityToken as DataEntityToken;

                    if (dataEntityToken == null)
                    {
                        continue;
                    }

                    Type type = dataEntityToken.InterfaceType;
                    if (type != parentType)
                    {
                        continue;
                    }

                    return(dataEntityToken.Data);
                }
            }

            throw new InvalidOperationException();
        }
예제 #55
0
        /// <exclude />
        protected override IEnumerable <Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            bool localizationEnabled = this.ShowForeignItems && !UserSettings.ActiveLocaleCultureInfo.Equals(UserSettings.ForeignLocaleCultureInfo);

            NodeDataSet dataset = GetDataset(dynamicContext);

            var itemKeys = new List <object>();
            IEnumerable <IData>  dataItems;
            IEnumerable <object> keysJoinedByParentFilters = dataset.JoinedKeys;

            if (localizationEnabled && UserSettings.ForeignLocaleCultureInfo != null)
            {
                NodeDataSet foreignDataset;
                using (new DataScope(UserSettings.ForeignLocaleCultureInfo))
                {
                    foreignDataset = GetDataset(dynamicContext);
                }

                ParameterExpression parameterExpression = Expression.Parameter(this.InterfaceType, "data");

                IEnumerable combinedData = dataset.DataItems.Concat(foreignDataset.DataItems).ToCastedDataEnumerable(this.InterfaceType);

                Expression orderByExpression = this.CreateOrderByExpression(combinedData.AsQueryable().Expression, parameterExpression);

                dataItems = combinedData.AsQueryable().Provider.CreateQuery <IData>(orderByExpression);

                foreach (IData data in dataset.DataItems)
                {
                    Verify.IsNotNull(data, "Fetching data for data interface '{0}' with expression '{1}' yielded an null element".FormatWith(this.InterfaceType, orderByExpression));

                    object keyValue = this.KeyPropertyInfo.GetValue(data, null);
                    itemKeys.Add(keyValue);
                }

                keysJoinedByParentFilters = keysJoinedByParentFilters.ConcatOrDefault(foreignDataset.JoinedKeys);
            }
            else
            {
                dataItems = dataset.DataItems;
                itemKeys  = new List <object>();
            }


            var replaceContext = new DynamicValuesHelperReplaceContext(parentEntityToken, dynamicContext.Piggybag);

            var elements = new List <Element>();

            foreach (IData data in dataItems)
            {
                Verify.IsNotNull(data, "Fetching data for data interface '{0}' yielded an null element".FormatWith(this.InterfaceType));

                var element = BuildElement(data, replaceContext, dynamicContext, localizationEnabled, itemKeys, ref keysJoinedByParentFilters, parentEntityToken);
                if (element == null)
                {
                    continue;
                }

                elements.Add(element);
            }

            if (!this.OrderByNodes.Any())
            {
                return(elements.OrderBy(f => f.VisualData.Label));
            }

            return(elements);
        }
예제 #56
0
 public override AncestorResult GetParentEntityToken(EntityToken childEntityToken, Type parentInterfaceOfInterest, TreeNodeDynamicContext dynamicContext)
 {            
     throw new NotImplementedException("Should never get called");            
 }
예제 #57
0
        internal override Expression CreateFilterExpression(ParameterExpression parameterExpression, TreeNodeDynamicContext dynamicContext, IList <int> filtersToSkip = null)
        {
            var dataEntityToken = dynamicContext.CurrentEntityToken as DataEntityToken;
            var treeSimpleElementEntityToken = dynamicContext.CurrentEntityToken as TreeSimpleElementEntityToken;

            Expression fieldExpression = ExpressionHelper.CreatePropertyExpression(this.InterfaceType, this.PropertyInfo.DeclaringType, this.FieldName, parameterExpression);

            object value;

            Func <Expression> resultFilterExpressionFactory = () =>
                                                              this.UseChildGeneratingFilterExpression
                ? this.ChildGeneratingDataElementsTreeNode.CreateFilterExpression(parameterExpression, dynamicContext)
                : null;


            if (this.FolderRanges == null)
            {
                if (dynamicContext.FieldGroupingValues.ContainsKey(this.GroupingValuesFieldName))
                {
                    value = dynamicContext.FieldGroupingValues[this.GroupingValuesFieldName];
                }
                else if (dataEntityToken != null)
                {
                    if (CreateFilterExpression_GetValueFromDataEntityToken(dataEntityToken, out value) == false)
                    {
                        return(resultFilterExpressionFactory());
                    }
                }
                else if (treeSimpleElementEntityToken != null &&
                         treeSimpleElementEntityToken.ParentEntityToken is DataEntityToken)
                {
                    var parentDataEntityToken = treeSimpleElementEntityToken.ParentEntityToken as DataEntityToken;

                    if (CreateFilterExpression_GetValueFromDataEntityToken(parentDataEntityToken, out value) == false)
                    {
                        return(resultFilterExpressionFactory());
                    }
                }
                else if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
                {
                    // We shall not create filter for our self when unfolding

                    return(resultFilterExpressionFactory());
                }
                else if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Up)
                {
                    // At this point we are going upwards, building the filter and one or
                    // more of the parent elements has not been opened, so we are not able to
                    // create a filter.
                    // This will happen if a parent filter is below us
                    return(null);
                }
                else
                {
                    // This will only happen if we are searching up and are given another entity token that
                    // TreeDataFieldGroupingElementEntityToken and DataEntityToken or TreeSimpleElementEntityToken
                    throw new NotImplementedException(string.Format("Unsupported child entity token type '{0}'", dynamicContext.CurrentEntityToken.GetType()));
                }
            }
            else
            {
                if (dynamicContext.FieldFolderRangeValues.ContainsKey(this.FieldName))
                {
                    value = dynamicContext.FieldFolderRangeValues[this.FieldName];
                }
                else if (dataEntityToken != null)
                {
                    if (CreateFilterExpression_GetFolderIndexFromDataEntityToken(dataEntityToken, parameterExpression, fieldExpression, out value) == false)
                    {
                        return(resultFilterExpressionFactory());
                    }
                }
                else if (treeSimpleElementEntityToken != null &&
                         treeSimpleElementEntityToken.ParentEntityToken is DataEntityToken)
                {
                    DataEntityToken parentDataEntityToken = treeSimpleElementEntityToken.ParentEntityToken as DataEntityToken;

                    if (CreateFilterExpression_GetFolderIndexFromDataEntityToken(parentDataEntityToken, parameterExpression, fieldExpression, out value) == false)
                    {
                        return(resultFilterExpressionFactory());
                    }
                }
                else if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
                {
                    // We shall not create filter for our self when unfolding
                    return(resultFilterExpressionFactory());
                }
                else if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Up)
                {
                    // At this point we are going upwards, building the filter and one or
                    // more of the parent elements has not been opened, so we are not able to
                    // create a filter.
                    // This will happen if a parent filter is below us
                    return(null);
                }
                else
                {
                    // This will only happen if we are searching up and are given another entity token that
                    // TreeDataFieldGroupingElementEntityToken and DataEntityToken or TreeSimpleElementEntityToken
                    throw new NotImplementedException(string.Format("Unsupported child entity token type '{0}'", dynamicContext.CurrentEntityToken.GetType()));
                }
            }

            Expression filterExpression;

            if (this.FolderRanges != null)
            {
                int folderRangeIndex = (int)value;

                filterExpression = CreateFolderRangeFilterExpression(folderRangeIndex, fieldExpression);
            }
            else if (this.FirstLetterOnly)
            {
                filterExpression = CreateFirstLetterOnlyFilterExpression(value, fieldExpression);
            }
            else
            {
                filterExpression = CreateSimpleFilterExpression(value, fieldExpression);
            }

            if (dynamicContext.Direction == TreeNodeDynamicContextDirection.Down)
            {
                if (this.UseChildGeneratingFilterExpression)
                {
                    Expression childFilerExpression = this.ChildGeneratingDataElementsTreeNode.CreateFilterExpression(parameterExpression, dynamicContext);

                    filterExpression = filterExpression.NestedAnd(childFilerExpression);
                }
            }

            return(filterExpression);
        }
예제 #58
0
        private Element BuildElement(IData data,
                                     DynamicValuesHelperReplaceContext replaceContext,
                                     TreeNodeDynamicContext dynamicContext,
                                     bool localizationEnabled,
                                     List <object> itemKeys,
                                     ref IEnumerable <object> keysJoinedByParentFilters,
                                     EntityToken parentEntityToken
                                     )
        {
            replaceContext.CurrentDataItem = data;

            object keyValue = this.KeyPropertyInfo.GetValue(data, null);

            bool itemLocalizationEnabledAndForeign = localizationEnabled && !data.DataSourceId.LocaleScope.Equals(UserSettings.ActiveLocaleCultureInfo);

            if (itemLocalizationEnabledAndForeign && itemKeys.Contains(keyValue))
            {
                return(null);
            }

            var currentEntityToken = data.GetDataEntityToken();

            var element = new Element(new ElementHandle
                                      (
                                          dynamicContext.ElementProviderName,
                                          currentEntityToken,
                                          dynamicContext.Piggybag.PreparePiggybag(this.ParentNode, parentEntityToken)
                                      ));


            bool           hasChildren;
            bool           isDisabled = false;
            ResourceHandle icon, openedIcon;

            if (itemLocalizationEnabledAndForeign)
            {
                hasChildren = false;
                isDisabled  = !data.IsTranslatable();

                if (this.Icon != null)
                {
                    icon       = this.Icon;
                    openedIcon = this.OpenedIcon;
                }
                else
                {
                    icon       = data.GetForeignIcon();
                    openedIcon = icon;
                }
            }
            else
            {
                if (this.Display != LeafDisplayMode.Auto)
                {
                    hasChildren = ChildNodes.Any();
                }
                else
                {
                    hasChildren = ChildNodes.OfType <SimpleElementTreeNode>().Any();

                    if (!hasChildren)
                    {
                        if (keysJoinedByParentFilters != null)
                        {
                            keysJoinedByParentFilters = keysJoinedByParentFilters.Evaluate();

                            hasChildren = keysJoinedByParentFilters.Contains(keyValue);
                        }
                    }

                    // Checking children filtered by FunctionFilters
                    if (!hasChildren)
                    {
                        foreach (var childNode in this.ChildNodes.OfType <DataElementsTreeNode>()
                                 .Where(n => n.FilterNodes.OfType <FunctionFilterNode>().Any()))
                        {
                            var newDynamicContext = new TreeNodeDynamicContext(TreeNodeDynamicContextDirection.Down)
                            {
                                ElementProviderName = dynamicContext.ElementProviderName,
                                Piggybag            = dynamicContext.Piggybag.PreparePiggybag(this.ParentNode, parentEntityToken),
                                CurrentEntityToken  = currentEntityToken
                            };

                            if (childNode.GetDataset(newDynamicContext, false).DataItems.Any())
                            {
                                hasChildren = true;
                                break;
                            }
                        }
                    }
                }

                if (this.Icon != null)
                {
                    icon       = this.Icon;
                    openedIcon = this.OpenedIcon;
                }
                else
                {
                    openedIcon = icon = data.GetIcon();
                }
            }

            string label = this.Label.IsNullOrEmpty()
                            ? data.GetLabel()
                            : this.LabelDynamicValuesHelper.ReplaceValues(replaceContext);

            string toolTip = this.ToolTip.IsNullOrEmpty()
                            ? label
                            : this.ToolTipDynamicValuesHelper.ReplaceValues(replaceContext);

            if (itemLocalizationEnabledAndForeign)
            {
                label = string.Format("{0} ({1})", label, DataLocalizationFacade.GetCultureTitle(UserSettings.ForeignLocaleCultureInfo));

                if (!data.IsTranslatable())
                {
                    toolTip = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "LocalizeDataWorkflow.DisabledData");
                }
                else
                {
                    toolTip = string.Format("{0} ({1})", toolTip, DataLocalizationFacade.GetCultureTitle(UserSettings.ForeignLocaleCultureInfo));
                }
            }

            element.VisualData = new ElementVisualizedData
            {
                Label       = label,
                ToolTip     = toolTip,
                HasChildren = hasChildren,
                Icon        = icon,
                OpenedIcon  = openedIcon,
                IsDisabled  = isDisabled
            };


            if (InternalUrls.DataTypeSupported(data.DataSourceId.InterfaceType))
            {
                var dataReference = data.ToDataReference();

                if (DataUrls.CanBuildUrlForData(dataReference))
                {
                    string internalUrl = InternalUrls.TryBuildInternalUrl(dataReference);

                    if (internalUrl != null)
                    {
                        element.PropertyBag.Add("Uri", internalUrl);
                    }
                }
            }


            if (itemLocalizationEnabledAndForeign)
            {
                var actionToken = new WorkflowActionToken(
                    WorkflowFacade.GetWorkflowType("Composite.C1Console.Trees.Workflows.LocalizeDataWorkflow"),
                    LocalizeDataPermissionTypes);

                element.AddAction(new ElementAction(new ActionHandle(actionToken))
                {
                    VisualData = new ActionVisualizedData
                    {
                        Label          = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "LocalizeDataWorkflow.LocalizeDataLabel"),
                        ToolTip        = StringResourceSystemFacade.GetString("Composite.C1Console.Trees", "LocalizeDataWorkflow.LocalizeDataToolTip"),
                        Icon           = LocalizeDataTypeIcon,
                        Disabled       = false,
                        ActionLocation = ActionLocation.OtherPrimaryActionLocation
                    }
                });
            }

            return(element);
        }
예제 #59
0
 protected override IEnumerable<Element> OnGetElements(EntityToken parentEntityToken, TreeNodeDynamicContext dynamicContext)
 {
     foreach (TreeNode childTreeNode in this.ChildNodes)
     {
         foreach (Element element in childTreeNode.GetElements(parentEntityToken, dynamicContext))
         {                    
             element.ElementHandle.Piggyback[StringConstants.PiggybagTreeId] = this.Tree.TreeId;
             
             yield return element;
         }
     }
 }
예제 #60
0
        public override IEnumerable <EntityToken> GetEntityTokens(EntityToken childEntityToken, TreeNodeDynamicContext dynamicContext)
        {
            EntityToken possibleCurrentEntityToken;

            TreeSimpleElementEntityToken treeSimpleElementEntityToken = childEntityToken as TreeSimpleElementEntityToken;

            if (treeSimpleElementEntityToken != null)
            {
                possibleCurrentEntityToken = treeSimpleElementEntityToken.ParentEntityToken;
            }
            else
            {
                possibleCurrentEntityToken = childEntityToken;
            }

            foreach (EntityToken entityToken in this.ParentNode.GetEntityTokens(possibleCurrentEntityToken, dynamicContext))
            {
                yield return(new TreeSimpleElementEntityToken(this.Id, this.Tree.TreeId, EntityTokenSerializer.Serialize(entityToken)));
            }
        }