コード例 #1
0
        /// <summary>
        /// Helper method for loading the portal items
        /// </summary>
        /// <param name="bw"></param>
        private void LoadPortalItems(BackgroundWorker bw, bool isLegacyPortal)
        {
            portalItems = new List <EditablePortalItem>();
            bw.ReportProgress(0, "Loading Web pages...");
            portalItems.AddRange(WebPage.GetItems(Service));
            bw.ReportProgress(0, "Loading Entity forms...");
            portalItems.AddRange(EntityForm.GetItems(Service, ref isLegacyPortal));
            bw.ReportProgress(0, "Loading Entity lists...");
            portalItems.AddRange(EntityList.GetItems(Service, ref isLegacyPortal));
            bw.ReportProgress(0, "Loading Web templates...");
            portalItems.AddRange(WebTemplate.GetItems(Service, ref isLegacyPortal));
            bw.ReportProgress(0, "Loading Web files...");
            portalItems.AddRange(WebFile.GetItems(Service));
            bw.ReportProgress(0, "Loading Web form steps...");
            portalItems.AddRange(WebFormStep.GetItems(Service));
            bw.ReportProgress(0, "Loading Content Snippets...");
            portalItems.AddRange(ContentSnippet.GetItems(Service, ref isLegacyPortal));

            if (!isLegacyPortal)
            {
                bw.ReportProgress(0, "Loading Portal languages...");
                ctvf.Languages = Service.RetrieveMultiple(new QueryExpression("adx_websitelanguage")
                {
                    ColumnSet = new ColumnSet(true)
                }).Entities.ToList();
            }
        }
コード例 #2
0
        private void BindDataGrid()
        {
            ContentSnippet current = ContentSnippet.Get(guidSnippetID);

            litSlug.Text        = current.ContentSnippetSlug;
            litSnippetName.Text = current.ContentSnippetName;

            if (current.ContentSnippetActive != true)
            {
                imgStatus.ImageUrl      = hdnInactive.Value;
                imgStatus.AlternateText = "Inactive";
            }
            imgStatus.ToolTip = imgStatus.AlternateText;

            var lstS = current.GetHistory();

            GeneralUtilities.BindDataBoundControl(gvPages, lstS);

            foreach (GridViewRow dgItem in gvPages.Rows)
            {
                CheckBox chkContent = (CheckBox)dgItem.FindControl("chkContent");

                if (chkContent.Attributes["value"].ToString() == current.ContentSnippetID.ToString())
                {
                    chkContent.Visible = false;
                }
            }

            if (lstS.Count < 1)
            {
                btnRemove.Visible = false;
            }
        }
コード例 #3
0
        protected void btnSave_Click(object sender, EventArgs e)
        {
            ContentSnippet item = null;

            if (guidRootItemID != Guid.Empty)
            {
                item = ContentSnippet.Get(guidRootItemID);
            }
            else
            {
                item = ContentSnippet.GetVersion(guidVersionItemID);
            }

            if (item == null || (item != null && item.Root_ContentSnippetID == Guid.Empty))
            {
                item = new ContentSnippet(SiteData.CurrentSiteID);
                item.CreateUserId = SecurityData.CurrentUserGuid;
            }

            item.ContentSnippetSlug   = txtSlug.Text;
            item.ContentSnippetName   = txtLabel.Text;
            item.ContentBody          = reBody.Text;
            item.EditUserId           = SecurityData.CurrentUserGuid;
            item.ContentSnippetActive = chkPublic.Checked;

            item.GoLiveDate = ucReleaseDate.GetDate();
            item.RetireDate = ucRetireDate.GetDate();

            item.Save();

            Response.Redirect(SiteData.CurrentScriptName + "?id=" + item.Root_ContentSnippetID.ToString());
        }
コード例 #4
0
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            ContentSnippet item = ContentSnippet.Get(guidRootItemID);

            item.Delete();

            Response.Redirect(SiteFilename.ContentSnippetIndexURL);
        }
コード例 #5
0
        private void LoadItems()
        {
            ctv.Enabled = false;
            WorkAsync(new WorkAsyncInfo
            {
                Message = "Loading portal items...",
                Work    = (bw, e) =>
                {
                    portalItems = new List <EditablePortalItem>();
                    bw.ReportProgress(0, "Loading Web pages...");
                    portalItems.AddRange(WebPage.GetItems(Service));
                    bw.ReportProgress(0, "Loading Entity forms...");
                    portalItems.AddRange(EntityForm.GetItems(Service, ref isLegacyPortal));
                    bw.ReportProgress(0, "Loading Entity lists...");
                    portalItems.AddRange(EntityList.GetItems(Service, ref isLegacyPortal));
                    bw.ReportProgress(0, "Loading Web templates...");
                    portalItems.AddRange(WebTemplate.GetItems(Service, ref isLegacyPortal));
                    bw.ReportProgress(0, "Loading Web files...");
                    portalItems.AddRange(WebFile.GetItems(Service));
                    bw.ReportProgress(0, "Loading Web form steps...");
                    portalItems.AddRange(WebFormStep.GetItems(Service));
                    bw.ReportProgress(0, "Loading Content Snippets...");
                    portalItems.AddRange(ContentSnippet.GetItems(Service, ref isLegacyPortal));

                    portalItems.SelectMany(p => p.Items).ToList().ForEach(i => i.StateChanged += CodeItem_StateChanged);
                },
                ProgressChanged = e =>
                {
                    SetWorkingMessage(e.UserState.ToString());
                },
                PostWorkCallBack = e =>
                {
                    if (e.Error != null)
                    {
                        if (((FaultException <OrganizationServiceFault>)e.Error).Detail.ErrorCode == -2147217149)
                        {
                            MessageBox.Show(e.Error.ToString());

                            var message =
                                "Unable to load code items: Please ensure you are targeting an organization linked to a Microsoft Portal (not a legacy Adxstudio one)";
                            MessageBox.Show(this, message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            LogError(message);
                        }
                        else
                        {
                            MessageBox.Show(this, $"An error occured while loading code items: {e.Error.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            LogError($"An error occured while loading code items: {e.Error.ToString()}");
                        }
                    }

                    ctv.DisplayCodeItems(portalItems, isLegacyPortal);
                    ctv.Enabled = true;
                }
            });
        }
コード例 #6
0
        protected void btnRemove_Click(object sender, EventArgs e)
        {
            List <Guid> lstDel = GeneralUtilities.GetCheckedItemGuidsByValue(gvPages, true, "chkContent");

            foreach (Guid delID in lstDel)
            {
                ContentSnippet.GetVersion(delID).DeleteThisVersion();
            }

            BindDataGrid();
        }
コード例 #7
0
        public ContentSnippetHistoryModel(Guid id)
            : this()
        {
            this.Item = ContentSnippet.Get(id);

            this.History.SetData(this.Item.GetHistory());

            this.History.TotalRecords = this.History.DataSource.Count;
            this.History.PageSize     = this.History.TotalRecords * 2;

            this.History.InitOrderBy(x => x.ContentSnippetName);
        }
コード例 #8
0
        public ContentSnippet Create(ContentSnippet model)
        {
            try
            {
                Context.ContentSnippet.Add(model);
                Context.SaveChanges();

                return(model);
            }
            catch (Exception ex)
            {
                log.Fatal(ex);
                throw new Exception("DB error", ex.InnerException);
            }
        }
コード例 #9
0
        public bool Update(ContentSnippet model)
        {
            try
            {
                this.Context.ContentSnippet.Update(model);
                this.Context.SaveChanges();

                return(true);
            }
            catch (Exception ex)
            {
                Log.Fatal(ex);
                throw new Exception("DB error", ex.InnerException);
            }
        }
コード例 #10
0
        private void cmsTreeview_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            if (e.ClickedItem == tsmiRefreshFromPortal)
            {
                var item = tvCodeItems.SelectedNode.Tag;

                if (item == null)
                {
                    return;
                }

                ActionRequested?.Invoke(this, new RefreshContentEventArgs(item));
            }
            else if (e.ClickedItem == tsmiUpdate)
            {
                var item = tvCodeItems.SelectedNode.Tag;

                if (item == null)
                {
                    return;
                }

                var portalItem = item as EditablePortalItem;
                var epi        = portalItem ?? ((CodeItem)item).Parent;

                ActionRequested?.Invoke(this, new UpdatePendingChangesEventArgs(new List <EditablePortalItem> {
                    epi
                }));
            }
            else if (e.ClickedItem == tsmiCreateNewItem)
            {
                var node = tvCodeItems.SelectedNode;
                while (node.Parent != null)
                {
                    node = node.Parent;
                }

                if (tvCodeItems.SelectedNode.Name == "WebTemplate")
                {
                    var dialog = new NewWebTemplateForm(Service, node.Tag as EntityReference);
                    if (dialog.ShowDialog(this) == DialogResult.OK)
                    {
                        var newTemplate = new WebTemplate(dialog.Template);
                        newTemplate.Code.StateChanged += JavaScript_StateChanged;

                        var newNode = new TreeNode(newTemplate.Name)
                        {
                            Tag = newTemplate.Code
                        };
                        newTemplate.Code.Node = newNode;

                        tvCodeItems.SelectedNode.Nodes.Add(newNode);
                        tvCodeItems.Sort();

                        ApplyCounting(node, "WebTemplate");
                    }
                }
                else if (tvCodeItems.SelectedNode.Name == "Html")
                {
                    var dialog = new NewContentSnippetForm(756150001, Service, node.Tag as EntityReference, Languages);
                    if (dialog.ShowDialog(this) == DialogResult.OK)
                    {
                        var newContentSnippet = new ContentSnippet(dialog.Template);
                        newContentSnippet.Code.StateChanged += JavaScript_StateChanged;

                        var newNode = new TreeNode(newContentSnippet.Name)
                        {
                            Tag = newContentSnippet.Code
                        };
                        newContentSnippet.Code.Node = newNode;

                        tvCodeItems.SelectedNode.Nodes.Add(newNode);
                        tvCodeItems.Sort();

                        CountContentSnippet(node);
                    }
                }
                else if (tvCodeItems.SelectedNode.Name == "Text")
                {
                    var dialog = new NewContentSnippetForm(756150000, Service, node.Tag as EntityReference, Languages);
                    if (dialog.ShowDialog(this) == DialogResult.OK)
                    {
                        var newContentSnippet = new ContentSnippet(dialog.Template);
                        newContentSnippet.Code.StateChanged += JavaScript_StateChanged;

                        var newNode = new TreeNode(newContentSnippet.Name)
                        {
                            Tag = newContentSnippet.Code
                        };
                        newContentSnippet.Code.Node = newNode;

                        tvCodeItems.SelectedNode.Nodes.Add(newNode);
                        tvCodeItems.Sort();

                        CountContentSnippet(node);
                    }
                }
            }
        }
コード例 #11
0
        protected void Page_Load(object sender, EventArgs e)
        {
            Master.ActivateTab(AdminBaseMasterPage.SectionID.ContentSnippet);

            guidRootItemID    = GetGuidIDFromQuery();
            guidVersionItemID = GetGuidParameterFromQuery("versionid");

            guidItemID = guidRootItemID;

            if (guidItemID == Guid.Empty)
            {
                guidItemID = guidVersionItemID;
            }

            if (!IsPostBack)
            {
                DateTime dtSite = CMSConfigHelper.CalcNearestFiveMinTime(SiteData.CurrentSite.Now);
                ucReleaseDate.SetDate(dtSite);
                ucRetireDate.SetDate(dtSite.AddYears(200));

                ContentSnippet item = null;

                if (guidRootItemID != Guid.Empty)
                {
                    item = ContentSnippet.Get(guidRootItemID);
                }
                else
                {
                    item = ContentSnippet.GetVersion(guidVersionItemID);
                }

                if (item != null)
                {
                    bool bRet = item.RecordSnippetLock(SecurityData.CurrentUserGuid);
                    bLocked = item.IsSnippetLocked();

                    if (bLocked && item.Heartbeat_UserId != null)
                    {
                        MembershipUser usr = SecurityData.GetUserByGuid(item.Heartbeat_UserId.Value);
                        litUser.Text = "Read only mode. User '" + usr.UserName + "' is currently editing the snippet.";
                    }

                    txtSlug.Text   = item.ContentSnippetSlug;
                    txtLabel.Text  = item.ContentSnippetName;
                    reBody.Text    = item.ContentBody;
                    guidRootItemID = item.Root_ContentSnippetID;

                    ucReleaseDate.SetDate(item.GoLiveDate);
                    ucRetireDate.SetDate(item.RetireDate);

                    chkPublic.Checked       = item.ContentSnippetActive;
                    btnDeleteButton.Visible = true;
                    pnlReview.Visible       = true;

                    Dictionary <string, string> dataVersions = (from v in ContentSnippet.GetHistory(guidRootItemID)
                                                                join u in ExtendedUserData.GetUserList() on v.EditUserId equals u.UserId
                                                                orderby v.EditDate descending
                                                                select new KeyValuePair <string, string>(v.ContentSnippetID.ToString(), string.Format("{0} ({1}) {2}", v.EditDate, u.UserName, (v.IsLatestVersion ? " [**] " : " ")))
                                                                ).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

                    GeneralUtilities.BindListDefaultText(ddlVersions, dataVersions, null, "Versions", "00000");
                }
                else
                {
                    btnDeleteButton.Visible = false;
                    pnlReview.Visible       = false;
                }
            }

            sPageMode = GetStringParameterFromQuery("mode");
            if (sPageMode.ToLowerInvariant() == "raw")
            {
                reBody.CssClass   = "rawEditor";
                divCenter.Visible = false;
            }

            pnlHB.Visible      = !bLocked;
            pnlHBEmpty.Visible = bLocked;
            pnlButtons.Visible = !bLocked;
            divEditing.Visible = bLocked;
        }
コード例 #12
0
        public override string ToHtmlString()
        {
            LoadData();

            StringBuilder sb = new StringBuilder();

            string sBody = String.Empty;

            ContentSnippet cs = null;

            try {
                bool bIsEditor = SecurityData.IsAdmin || SecurityData.IsSiteEditor;

                if (this.SnippetID != Guid.Empty)
                {
                    cs = ContentSnippet.GetSnippetByID(SiteData.CurrentSiteID, this.SnippetID, !bIsEditor);
                }
                else
                {
                    cs = ContentSnippet.GetSnippetBySlug(SiteData.CurrentSiteID, this.SnippetSlug, !bIsEditor);
                }

                string sBodyNote = String.Empty;
                string sIdent    = String.Empty;

                if (cs != null)
                {
                    if (bIsEditor && (cs.IsRetired || cs.IsUnReleased || !cs.ContentSnippetActive))
                    {
                        string sBodyFlags = String.Empty;
                        if (!cs.ContentSnippetActive)
                        {
                            sBodyFlags += CMSConfigHelper.InactivePagePrefix + " - Status : " + cs.ContentSnippetActive.ToString() + " ";
                        }
                        if (cs.IsRetired)
                        {
                            sBodyFlags += CMSConfigHelper.RetiredPagePrefix + " - Retired : " + cs.RetireDate.ToString() + " ";
                        }
                        if (cs.IsUnReleased)
                        {
                            sBodyFlags += CMSConfigHelper.UnreleasedPagePrefix + " - Unreleased : " + cs.GoLiveDate.ToString() + " ";
                        }

                        if (SecurityData.AdvancedEditMode)
                        {
                            sBodyNote = "<div class=\"cmsSnippetOuter\"> <div class=\"cmsSnippetInner\">\r\n" + cs.ContentSnippetSlug + ": " + sBodyFlags.Trim() + "\r\n<br style=\"clear: both;\" /></div></div>";
                        }
                        else
                        {
                            sBodyNote = "<div>\r\n" + cs.ContentSnippetSlug + ": " + sBodyFlags.Trim() + "\r\n<br style=\"clear: both;\" /></div>";
                        }
                    }

                    if (SecurityData.AdvancedEditMode)
                    {
                        sIdent = "<div class=\"cmsSnippetOuter\"> <div class=\"cmsSnippetInner\">\r\n" + cs.ContentSnippetSlug + ": " + cs.ContentSnippetName + "\r\n<br style=\"clear: both;\" /></div></div>";
                    }

                    sBody = String.Format("{0}\r\n{1}\r\n{2}", sIdent, cs.ContentBody, sBodyNote);
                }
            } catch {
                if (!SiteData.IsWebView)
                {
                    if (this.SnippetID != Guid.Empty)
                    {
                        sBody = this.SnippetID.ToString();
                    }
                    else
                    {
                        sBody = this.SnippetSlug;
                    }
                }
            }

            sBody = SiteData.CurrentSite.UpdateContentSnippet(sBody);

            sb.AppendLine();
            sb.Append(sBody);
            sb.AppendLine();

            return(sb.ToString());
        }
コード例 #13
0
        protected override void RenderContents(HtmlTextWriter output)
        {
            string sBody = string.Empty;

            ContentSnippet cs = null;

            try {
                bool bIsEditor = SecurityData.IsAdmin || SecurityData.IsSiteEditor;

                if (this.SnippetID != Guid.Empty)
                {
                    cs = ContentSnippet.GetSnippetByID(SiteData.CurrentSiteID, this.SnippetID, !bIsEditor);
                }
                else
                {
                    cs = ContentSnippet.GetSnippetBySlug(SiteData.CurrentSiteID, this.SnippetSlug, !bIsEditor);
                }

                string sBodyNote = string.Empty;
                string sIdent    = String.Empty;

                if (cs != null)
                {
                    if (bIsEditor && (cs.IsRetired || cs.IsUnReleased || !cs.ContentSnippetActive))
                    {
                        string sBodyFlags = string.Empty;
                        if (!cs.ContentSnippetActive)
                        {
                            sBodyFlags += CMSConfigHelper.InactivePagePrefix + " - Status : " + cs.ContentSnippetActive.ToString() + " ";
                        }
                        if (cs.IsRetired)
                        {
                            sBodyFlags += CMSConfigHelper.RetiredPagePrefix + " - Retired : " + cs.RetireDate.ToString() + " ";
                        }
                        if (cs.IsUnReleased)
                        {
                            sBodyFlags += CMSConfigHelper.UnreleasedPagePrefix + " - Unreleased : " + cs.GoLiveDate.ToString() + " ";
                        }

                        if (SecurityData.AdvancedEditMode)
                        {
                            sBodyNote = "<div class=\"cmsSnippetOuter\"> <div class=\"cmsSnippetInner\">\r\n" + cs.ContentSnippetSlug + ": " + sBodyFlags.Trim() + "\r\n<br style=\"clear: both;\" /></div></div>";
                        }
                        else
                        {
                            sBodyNote = "<div>\r\n" + cs.ContentSnippetSlug + ": " + sBodyFlags.Trim() + "\r\n<br style=\"clear: both;\" /></div>";
                        }
                    }

                    if (SecurityData.AdvancedEditMode)
                    {
                        sIdent = "<div class=\"cmsSnippetOuter\"> <div class=\"cmsSnippetInner\">\r\n" + cs.ContentSnippetSlug + ": " + cs.ContentSnippetName + "\r\n<br style=\"clear: both;\" /></div></div>";
                    }

                    sBody = String.Format("{0}\r\n{1}\r\n{2}", sIdent, cs.ContentBody, sBodyNote);
                }
            } catch {
                if (!SiteData.IsWebView)
                {
                    if (this.SnippetID != Guid.Empty)
                    {
                        sBody = this.SnippetID.ToString();
                    }
                    else
                    {
                        sBody = this.SnippetSlug;
                    }
                }
            }

            this.Text = SiteData.CurrentSite.UpdateContentSnippet(sBody);

            int indent = output.Indent;

            output.Indent = indent + 3;
            output.WriteLine();

            output.WriteLine();
            output.Write(this.Text);
            output.WriteLine();

            output.Indent = indent;
        }
コード例 #14
0
        public void DisplayCodeItems(List <EditablePortalItem> items, bool isLegacyPortal)
        {
            IsLegacyPortal = isLegacyPortal;
            portalItems    = items;
            tvCodeItems.Nodes.Clear();
            var rootNodes = new Dictionary <Guid, TreeNode>();

            if (isLegacyPortal)
            {
                rootNodes.Add(Guid.Empty, new TreeNode("(Not website related)"));
            }

            var searchText    = txtSearch.Text.ToLower();
            var filteredItems = items.Where(i => searchText.Length == 0 ||
                                            i.Name.ToLower().Contains(searchText) ||
                                            chkSearchInContent.Checked &&
                                            i.Items.Any(i2 => i2.Content.ToLower().Contains(searchText)))
                                .ToList();

            if (!filteredItems.Any() && searchText.Length > 0)
            {
                txtSearch.BackColor = Color.LightCoral;
                return;
            }

            foreach (var item in filteredItems)
            {
                item.UpdateRequired += Item_UpdateRequired;
                var websiteReference = item.WebsiteReference;

                if (websiteReference == null)
                {
                    continue;
                }

                TreeNode parentNode;
                TreeNode contentSnippetsNode;
                if (rootNodes.ContainsKey(websiteReference.Id))
                {
                    parentNode = rootNodes[websiteReference.Id];
                }
                else
                {
                    var name     = websiteReference.Id == Guid.Empty ? "(Not website related)" : websiteReference.Name;
                    var rootNode = new TreeNode(name);

                    var snippetsNode = new TreeNode("Content Snippets")
                    {
                        Name = "ContentSnippet"
                    };
                    var htmlSnippetsNode = new TreeNode("Html")
                    {
                        Name = "Html"
                    };
                    var textSnippetsNode = new TreeNode("Text")
                    {
                        Name = "Text"
                    };
                    snippetsNode.Nodes.Add(htmlSnippetsNode);
                    snippetsNode.Nodes.Add(textSnippetsNode);
                    rootNodes.Add(websiteReference.Id, rootNode);
                    parentNode          = rootNode;
                    contentSnippetsNode = snippetsNode;

                    parentNode.Nodes.Add(new TreeNode("Web Pages")
                    {
                        Name = "WebPage"
                    });

                    if (!IsLegacyPortal)
                    {
                        parentNode.Nodes.Add(new TreeNode("Entity Forms")
                        {
                            Name = "EntityForm"
                        });
                        parentNode.Nodes.Add(new TreeNode("Entity Lists")
                        {
                            Name = "EntityList"
                        });
                        parentNode.Nodes.Add(new TreeNode("Web Forms")
                        {
                            Name = "WebForm"
                        });
                        parentNode.Nodes.Add(new TreeNode("Web Templates")
                        {
                            Name = "WebTemplate"
                        });

                        parentNode.Nodes.Add(snippetsNode);
                    }

                    parentNode.Nodes.Add(new TreeNode("Web Files")
                    {
                        Name = "WebFile"
                    });
                }

                TreeNode typeNode;

                if (item is WebPage)
                {
                    typeNode = parentNode.Nodes["WebPage"];

                    WebPage page = (WebPage)item;
                    page.JavaScript.StateChanged += JavaScript_StateChanged;
                    page.Style.StateChanged      += JavaScript_StateChanged;

                    TreeNode node;
                    if (page.IsRoot || page.ParentPageId == Guid.Empty)
                    {
                        node = new TreeNode(page.Name)
                        {
                            Tag = item
                        };
                        typeNode.Nodes.Add(node);

                        if (isLegacyPortal)
                        {
                            var scriptNode = new TreeNode("JavaScript")
                            {
                                Tag = page.JavaScript
                            };
                            page.JavaScript.Node = scriptNode;
                            var styleNode = new TreeNode("Style")
                            {
                                Tag = page.Style
                            };
                            page.Style.Node = styleNode;

                            node.Nodes.Add(scriptNode);
                            node.Nodes.Add(styleNode);
                        }
                    }
                    else
                    {
                        var parentPageNode = typeNode.Nodes.Cast <TreeNode>().FirstOrDefault(t => ((WebPage)t.Tag).Id == page.ParentPageId);
                        if (parentPageNode == null)
                        {
                            continue;
                        }

                        node = new TreeNode(page.Language)
                        {
                            Tag = item
                        };

                        var scriptNode = new TreeNode("JavaScript")
                        {
                            Tag = page.JavaScript
                        };
                        page.JavaScript.Node = scriptNode;
                        var styleNode = new TreeNode("Style")
                        {
                            Tag = page.Style
                        };
                        page.Style.Node = styleNode;

                        node.Nodes.Add(scriptNode);
                        node.Nodes.Add(styleNode);

                        parentPageNode.Nodes.Add(node);
                    }
                }
                else if (item is EntityForm)
                {
                    typeNode = parentNode.Nodes["EntityForm"];

                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Entity Forms")
                        {
                            Name = "EntityForm"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                    }

                    EntityForm form = (EntityForm)item;
                    form.JavaScript.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(form.Name)
                    {
                        Tag = form.JavaScript
                    };
                    form.JavaScript.Node = node;

                    typeNode.Nodes.Add(node);
                }
                else if (item is EntityList)
                {
                    typeNode = parentNode.Nodes["EntityList"];

                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Entity Lists")
                        {
                            Name = "EntityList"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                    }

                    EntityList list = (EntityList)item;
                    list.JavaScript.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(list.Name)
                    {
                        Tag = list.JavaScript
                    };
                    list.JavaScript.Node = node;

                    typeNode.Nodes.Add(node);
                }
                else if (item is WebTemplate)
                {
                    typeNode = parentNode.Nodes["WebTemplate"];

                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Web Templates")
                        {
                            Name = "WebTemplate"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                    }

                    WebTemplate template = (WebTemplate)item;
                    template.Code.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(template.Name)
                    {
                        Tag = template.Code
                    };
                    template.Code.Node = node;

                    typeNode.Nodes.Add(node);
                }
                else if (item is WebFile)
                {
                    typeNode = parentNode.Nodes["WebFile"];

                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Web Files")
                        {
                            Name = "WebFile"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                    }

                    WebFile file = (WebFile)item;
                    file.Code.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(file.Name)
                    {
                        Tag = file.Code
                    };
                    file.Code.Node = node;

                    typeNode.Nodes.Add(node);
                }
                else if (item is WebFormStep)
                {
                    typeNode = parentNode.Nodes["WebForm"];

                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Web Forms")
                        {
                            Name = "WebForm"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                    }

                    WebFormStep wfStep = (WebFormStep)item;
                    wfStep.JavaScript.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(wfStep.Name)
                    {
                        Tag = wfStep.JavaScript
                    };
                    wfStep.JavaScript.Node = node;

                    if (wfStep.WebFormReference != null)
                    {
                        TreeNode webFormNode;

                        if (typeNode.Nodes.ContainsKey(wfStep.WebFormReference.Name))
                        {
                            webFormNode = typeNode.Nodes[wfStep.WebFormReference.Name];
                        }
                        else
                        {
                            webFormNode = new TreeNode(wfStep.WebFormReference.Name)
                            {
                                Name = wfStep.WebFormReference.Name
                            };

                            typeNode.Nodes.Add(webFormNode);
                        }

                        webFormNode.Nodes.Add(node);
                    }
                    else
                    {
                        typeNode.Nodes.Add(node);
                    }
                }
                else if (item is ContentSnippet)
                {
                    typeNode = parentNode.Nodes["ContentSnippet"];
                    if (typeNode == null)
                    {
                        typeNode = new TreeNode("Content Snippets")
                        {
                            Name = "ContentSnippet"
                        };
                        rootNodes[item.WebsiteReference.Id].Nodes.Add(typeNode);
                        var htmlSnippetsNode = new TreeNode("Html")
                        {
                            Name = "Html"
                        };
                        var textSnippetsNode = new TreeNode("Text")
                        {
                            Name = "Text"
                        };

                        typeNode.Nodes.Add(htmlSnippetsNode);
                        typeNode.Nodes.Add(textSnippetsNode);
                    }
                    ContentSnippet snippet = (ContentSnippet)item;
                    snippet.Code.StateChanged += JavaScript_StateChanged;

                    var node = new TreeNode(snippet.Name)
                    {
                        Tag = snippet.Code
                    };
                    snippet.Code.Node = node;

                    if (snippet.Type == "Text")
                    {
                        typeNode.Nodes["Text"].Nodes.Add(node);
                    }
                    else
                    {
                        typeNode.Nodes["Html"].Nodes.Add(node);
                    }
                }
                else
                {
                    throw new Exception($"Unsupported portal item type: {item.GetType().Name}");
                }
            }

            foreach (var node in rootNodes.Values)
            {
                ApplyCounting(node, "WebPage");
                ApplyCounting(node, "EntityForm");
                ApplyCounting(node, "EntityList");
                ApplyCounting(node, "WebTemplate");
                ApplyCounting(node, "WebFile");
                ApplyCounting(node, "WebForm");
                CountContentSnippet(node);

                tvCodeItems.Nodes.Add(node);
                node.Expand();
            }
        }