Ejemplo n.º 1
0
        public void ProcessChanges(List <Script> allScripts)
        {
            var         xml = UiItem.GetAttributeValue <string>(ItemUpdateAttribute) ?? UiItem.GetAttributeValue <string>(ItemAttribute);
            XmlDocument doc = new XmlDocument();

            doc.LoadXml(xml);

            if (Type == "Form event" || Type == "Subgrid event")
            {
                if (Action == ScriptAction.Create)
                {
                    XmlNode eventNode = null;
                    XmlNode eventsNode;

                    if (Event == "ontabstatechange")
                    {
                        var tabNode = doc.SelectSingleNode("//tab[@id='" + AttributeLogicalName + "']");
                        if (tabNode == null)
                        {
                            throw new Exception($"Unable to find tab Node with id {AttributeLogicalName}");
                        }

                        eventsNode = tabNode.GetOrCreateNode("events");
                        eventNode  = eventsNode.SelectSingleNode("event[@application='false' and @name='tabstatechange']");
                    }
                    else
                    {
                        eventsNode = doc.FirstChild.GetOrCreateNode("events");

                        if (Event == "onchange")
                        {
                            if (Type == "Form event")
                            {
                                eventNode = eventsNode.SelectSingleNode(
                                    "event[@application='false' and @name='onchange' and @attribute='" +
                                    AttributeLogicalName + "']");
                            }
                            else
                            {
                                var parts = AttributeLogicalName.Split(':');
                                eventNode = eventsNode.SelectSingleNode(
                                    "event[@application='false' and @name='onchange' and @attribute='" +
                                    parts[1] + "' and @control='" + parts[0] + "']");
                            }
                        }
                        else if (Event == "onload" || Event == "onsave" || Event == "onrecordselect")
                        {
                            if (Type == "Form event")
                            {
                                eventNode = eventsNode.SelectSingleNode(
                                    "event[@application='false' and @name='" + Event + "']");
                            }
                            else
                            {
                                eventNode = eventsNode.SelectSingleNode(
                                    "event[@application='false' and @name='" + Event + "' and @control='" +
                                    AttributeLogicalName + "']");
                            }
                        }
                    }

                    if (eventNode == null)
                    {
                        eventNode = eventsNode.AppendNewNode("event",
                                                             new Dictionary <string, string>
                        {
                            { "name", Event == "ontabstatechange" ? "tabstatechange" : Event },
                            { "application", "false" },
                            { "active", "false" }
                        }
                                                             );

                        if (Type == "Form event" && Event == "onchange")
                        {
                            eventNode.AddAttribute("attribute", AttributeLogicalName);
                        }

                        if (Type == "Subgrid event")
                        {
                            var parts = AttributeLogicalName.Split(':');

                            eventNode.AddAttribute("relationship", "");
                            eventNode.AddAttribute("control", parts[0]);

                            if (Event == "onchange")
                            {
                                eventNode.AddAttribute("attribute", parts[1]);
                            }
                            ;
                        }

                        eventsNode.AppendChild(eventNode);
                    }

                    var handlersNode = eventNode.GetOrCreateNode("Handlers");

                    handlersNode.AppendNewNodeAtIndex("Handler",
                                                      new Dictionary <string, string>
                    {
                        { "functionName", MethodCalled },
                        { "libraryName", Library },
                        { "handlerUniqueId", Guid.NewGuid().ToString("B").ToLower() },
                        { "enabled", (Enabled ?? false).ToString().ToLower() },
                        { "parameters", Parameters },
                        { "passExecutionContext", (PassExecutionContext ?? false).ToString().ToLower() }
                    },
                                                      NewOrder ?? Order);
                }
                else
                {
                    var parts = AttributeLogicalName.Split(':');

                    var handlerNode = doc.SelectSingleNode("//event[@name='" + Event +
                                                           (Event == "onchange" ? "' and @attribute='" + (parts.Length > 1 ? parts[1] : AttributeLogicalName) : "") + "'" +
                                                           (Type == "Subgrid event" ? " and @control='" + parts[0] + "'" : "") +
                                                           "]/Handlers/Handler[@libraryName='" + Library + "' and @functionName='" + MethodCalled + "']");

                    if (handlerNode == null)
                    {
                        throw new Exception("Cannot find Handler node");
                    }

                    if (Action == ScriptAction.Delete)
                    {
                        var handlersNode = handlerNode.ParentNode;
                        var eventNode    = handlersNode.ParentNode;
                        var eventsNode   = eventNode.ParentNode;

                        if (handlersNode.ChildNodes.Count > 1)
                        {
                            handlersNode.RemoveChild(handlerNode);
                        }
                        else
                        {
                            eventNode.ParentNode.RemoveChild(eventNode);
                        }

                        if (eventsNode.ChildNodes.Count == 0)
                        {
                            eventsNode.ParentNode.RemoveChild(eventsNode);
                        }
                    }
                    else if (Action == ScriptAction.Update)
                    {
                        if (NewEnabled.HasValue)
                        {
                            handlerNode.Attributes["enabled"].Value = NewEnabled.Value ? "true" : "false";
                        }

                        if (!string.IsNullOrEmpty(NewParameters))
                        {
                            handlerNode.Attributes["parameters"].Value = NewParameters;
                        }

                        if (!string.IsNullOrEmpty(NewLibrary))
                        {
                            handlerNode.Attributes["libraryName"].Value = NewLibrary;
                        }

                        if (!string.IsNullOrEmpty(NewMethodCalled))
                        {
                            handlerNode.Attributes["functionName"].Value = NewMethodCalled;
                        }

                        if (NewPassExecutionContext.HasValue)
                        {
                            handlerNode.Attributes["passExecutionContext"].Value =
                                NewPassExecutionContext.Value ? "true" : "false";
                        }

                        if (NewOrder.HasValue)
                        {
                            var eventScripts = allScripts.Where(s =>
                                                                s.Type == Type &&
                                                                s.Event == Event && s.UiItem.Id == UiItem.Id &&
                                                                s.AttributeLogicalName == AttributeLogicalName)
                                               .OrderBy(s => s.NewOrder ?? s.Order);

                            var            parentNode = handlerNode.ParentNode;
                            List <XmlNode> nodes      = new List <XmlNode>();
                            foreach (var eventScript in eventScripts)
                            {
                                var esParts = eventScript.AttributeLogicalName.Split(':');

                                var node = doc.SelectSingleNode("//event[@name='" + eventScript.Event +
                                                                (eventScript.Event == "onchange" ? "' and @attribute='" + (esParts.Length > 1 ? esParts[1] : eventScript.AttributeLogicalName) : "") + "'" +
                                                                (eventScript.Type == "Subgrid event" ? " and @control='" + esParts[0] + "'" : "") +
                                                                "]/Handlers/Handler[@libraryName='" + eventScript.Library + "' and @functionName='" + eventScript.MethodCalled + "']");

                                //var node = doc.SelectSingleNode("//event[@name='" + eventScript.Event + (eventScript.Event == "onchange" ? "' and @attribute='" + eventScript.AttributeLogicalName : "") + "']/Handlers/Handler[@libraryName='" +
                                //                                eventScript.Library +
                                //                                       "' and @functionName='" + eventScript.MethodCalled + "']");

                                if (node == null)
                                {
                                    continue;
                                }

                                nodes.Add(node);
                                parentNode.RemoveChild(node);
                            }

                            foreach (var node in nodes)
                            {
                                parentNode.AppendChild(node);
                            }
                        }
                    }
                }
            }
            else if (Type == "Form Library")
            {
                if (Action == ScriptAction.Create)
                {
                    var librariesNode = doc.FirstChild.GetOrCreateNode("formLibraries");
                    librariesNode.AppendNewNodeAtIndex("Library",
                                                       new Dictionary <string, string>
                    {
                        { "name", Library },
                        { "libraryUniqueId", Guid.NewGuid().ToString("B").ToLower() },
                    }, NewOrder ?? Order);
                }
                else
                {
                    var node = doc.FirstChild.SelectSingleNode("formLibraries/Library[@name = '" + Library + "']");
                    if (node == null)
                    {
                        throw new Exception("Unable to find Library node");
                    }

                    if (Action == ScriptAction.Update)
                    {
                        if (!string.IsNullOrEmpty(NewLibrary))
                        {
                            node.Attributes["name"].Value = NewLibrary;
                        }

                        if (NewOrder.HasValue)
                        {
                            var eventScripts = allScripts.Where(s =>
                                                                s.Type == Type &&
                                                                s.UiItem.Id == UiItem.Id)
                                               .OrderBy(s => s.NewOrder ?? s.Order);

                            var            parentNode = node.ParentNode;
                            List <XmlNode> tempNodes  = new List <XmlNode>();
                            foreach (var eventScript in eventScripts)
                            {
                                var tempNode = doc.FirstChild.SelectSingleNode("formLibraries/Library[@name = '" + eventScript.Library + "' or @name='" + eventScript.NewLibrary + "']");
                                if (tempNode == null)
                                {
                                    continue;
                                }

                                tempNodes.Add(tempNode);
                                parentNode.RemoveChild(tempNode);
                            }

                            foreach (var tempNode in tempNodes)
                            {
                                parentNode.AppendChild(tempNode);
                            }
                        }
                    }
                    else if (Action == ScriptAction.Delete)
                    {
                        var parentNode = node.ParentNode;
                        parentNode.RemoveChild(node);
                        if (parentNode.ChildNodes.Count == 0)
                        {
                            parentNode.ParentNode.RemoveChild(parentNode);
                        }
                    }
                }
            }
            else if (Type == "Homepage Grid event")
            {
                if (Action == ScriptAction.Create)
                {
                    XmlNode eventNode  = null;
                    XmlNode eventsNode = doc.FirstChild.GetOrCreateNode("events");

                    if (Event == "onchange")
                    {
                        eventNode = eventsNode.SelectSingleNode(
                            "event[@application='false' and @name='onchange' and @attribute='" +
                            AttributeLogicalName + "']");
                    }
                    else if (Event == "onsave" || Event == "onrecordselect")
                    {
                        eventNode = eventsNode.SelectSingleNode(
                            "event[@application='false' and @name='" + Event + "']");
                    }

                    if (eventNode == null)
                    {
                        eventNode = eventsNode.AppendNewNode("event",
                                                             new Dictionary <string, string>
                        {
                            { "name", Event.ToLower() },
                            { "application", "false" },
                            { "active", "false" },
                            { "control", "Grids" },
                            { "relationship", "" }
                        }
                                                             );

                        if (Event == "onchange")
                        {
                            eventNode.AddAttribute("attribute", AttributeLogicalName);
                        }
                    }

                    var handlersNode = eventNode.GetOrCreateNode("Handlers");
                    handlersNode.AppendNewNodeAtIndex("Handler",
                                                      new Dictionary <string, string>
                    {
                        { "functionName", MethodCalled },
                        { "libraryName", Library },
                        { "handlerUniqueId", Guid.NewGuid().ToString("B").ToLower() },
                        { "enabled", (Enabled ?? false).ToString().ToLower() },
                        { "parameters", Parameters },
                        { "passExecutionContext", (PassExecutionContext ?? false).ToString().ToLower() }
                    },
                                                      NewOrder ?? Order
                                                      );
                }
                else
                {
                    var handlerNode = doc.SelectSingleNode("//event[@name='" + Event + (Event == "onchange" ? "' and @attribute='" + AttributeLogicalName : "") + "']/Handlers/Handler[@libraryName='" +
                                                           Library +
                                                           "' and @functionName='" + MethodCalled + "']");

                    if (handlerNode == null)
                    {
                        throw new Exception("Cannot find Handler node");
                    }

                    if (Action == ScriptAction.Delete)
                    {
                        var handlersNode = handlerNode.ParentNode;
                        var eventNode    = handlersNode.ParentNode;
                        var eventsNode   = eventNode.ParentNode;

                        if (handlersNode.ChildNodes.Count > 1)
                        {
                            handlersNode.RemoveChild(handlerNode);
                        }
                        else
                        {
                            eventNode.ParentNode.RemoveChild(eventNode);
                        }

                        if (eventsNode.ChildNodes.Count == 0)
                        {
                            eventsNode.ParentNode.RemoveChild(eventsNode);
                        }
                    }
                    else if (Action == ScriptAction.Update)
                    {
                        if (NewEnabled.HasValue)
                        {
                            handlerNode.Attributes["enabled"].Value = NewEnabled.Value ? "true" : "false";
                        }

                        if (!string.IsNullOrEmpty(NewParameters))
                        {
                            handlerNode.Attributes["parameters"].Value = NewParameters;
                        }

                        if (!string.IsNullOrEmpty(NewLibrary))
                        {
                            handlerNode.Attributes["libraryName"].Value = NewLibrary;
                        }

                        if (!string.IsNullOrEmpty(NewMethodCalled))
                        {
                            handlerNode.Attributes["functionName"].Value = NewMethodCalled;
                        }

                        if (NewPassExecutionContext.HasValue)
                        {
                            handlerNode.Attributes["passExecutionContext"].Value =
                                NewPassExecutionContext.Value ? "true" : "false";
                        }

                        if (NewOrder.HasValue)
                        {
                            var eventScripts = allScripts.Where(s =>
                                                                s.Type == Type &&
                                                                s.Event == Event && s.UiItem.Id == UiItem.Id &&
                                                                s.AttributeLogicalName == AttributeLogicalName)
                                               .OrderBy(s => s.NewOrder ?? s.Order);

                            var            parentNode = handlerNode.ParentNode;
                            List <XmlNode> nodes      = new List <XmlNode>();
                            foreach (var eventScript in eventScripts)
                            {
                                var node = doc.SelectSingleNode("//event[@name='" + eventScript.Event + (eventScript.Event == "onchange" ? "' and @attribute='" + eventScript.AttributeLogicalName : "") + "']/Handlers/Handler[@libraryName='" +
                                                                eventScript.Library +
                                                                "' and @functionName='" + eventScript.MethodCalled + "']");

                                if (node == null)
                                {
                                    continue;
                                }

                                nodes.Add(node);
                                parentNode.RemoveChild(node);
                            }

                            foreach (var node in nodes)
                            {
                                parentNode.AppendChild(node);
                            }
                        }
                    }
                }
            }
            else if (Type == "Homepage Grid Library")
            {
                if (Action == ScriptAction.Create)
                {
                    var formLibrariesNode = doc.FirstChild.GetOrCreateNode("formLibraries");
                    formLibrariesNode.AppendNewNodeAtIndex("Library",
                                                           new Dictionary <string, string>
                    {
                        { "name", Library },
                        { "libraryUniqueId", Guid.NewGuid().ToString("B").ToLower() }
                    },
                                                           NewOrder ?? Order
                                                           );
                }
                else
                {
                    var node = doc.SelectSingleNode("//Library[@name = '" + Library + "']");
                    if (node == null)
                    {
                        throw new Exception("Unable to find Library node");
                    }

                    if (Action == ScriptAction.Update)
                    {
                        if (!string.IsNullOrEmpty(NewLibrary))
                        {
                            node.Attributes["name"].Value = NewLibrary;
                        }

                        if (NewOrder.HasValue)
                        {
                            var eventScripts = allScripts.Where(s =>
                                                                s.Type == Type &&
                                                                s.UiItem.Id == UiItem.Id)
                                               .OrderBy(s => s.NewOrder ?? s.Order);

                            var            parentNode = node.ParentNode;
                            List <XmlNode> tempNodes  = new List <XmlNode>();
                            foreach (var eventScript in eventScripts)
                            {
                                var tempNode = doc.FirstChild.SelectSingleNode("//Library[@name = '" + eventScript.Library + "' or @name='" + eventScript.NewLibrary + "']");
                                if (tempNode == null)
                                {
                                    continue;
                                }

                                tempNodes.Add(tempNode);
                                parentNode.RemoveChild(tempNode);
                            }

                            foreach (var tempNode in tempNodes)
                            {
                                parentNode.AppendChild(tempNode);
                            }
                        }
                    }
                    else if (Action == ScriptAction.Delete)
                    {
                        var parentNode = node.ParentNode;
                        parentNode.RemoveChild(node);
                        if (parentNode.ChildNodes.Count == 0)
                        {
                            parentNode.ParentNode.RemoveChild(parentNode);
                        }
                    }
                }
            }
            else if (Type == "Grid Icon")
            {
                var node = doc.DocumentElement.SelectSingleNode("row/cell[@name='" + AttributeLogicalName + "']");
                if (node == null)
                {
                    throw new Exception($"Unable to find cell node for attribute {AttributeLogicalName}");
                }

                if (Action == ScriptAction.Update || Action == ScriptAction.Create)
                {
                    if (!string.IsNullOrEmpty(NewLibrary))
                    {
                        if (node.Attributes["imageproviderwebresource"] == null)
                        {
                            node.AddAttribute("imageproviderwebresource", $"$webresource:{NewLibrary}");
                        }
                        else
                        {
                            node.Attributes["imageproviderwebresource"].Value = $"$webresource:{NewLibrary}";
                        }
                    }

                    if (!string.IsNullOrEmpty(NewMethodCalled))
                    {
                        if (node.Attributes["imageproviderfunctionname"] == null)
                        {
                            node.AddAttribute("imageproviderfunctionname", NewMethodCalled);
                        }
                        else
                        {
                            node.Attributes["imageproviderfunctionname"].Value = NewMethodCalled;
                        }
                    }
                }
                else if (Action == ScriptAction.Delete)
                {
                    node.Attributes.Remove(node.Attributes["imageproviderwebresource"]);
                    node.Attributes.Remove(node.Attributes["imageproviderfunctionname"]);
                }
            }
            else
            {
                return;
            }

            UiItem[ItemUpdateAttribute] = doc.OuterXml;
        }