Exemple #1
0
        //====================================================================================================
        /// <summary>
        /// load a feature from the current row of a contentSet
        /// </summary>
        /// <param name="CP"></param>
        /// <param name="csFeature"></param>
        /// <returns></returns>
        public static PortalDataFeatureModel loadPortalFeatureFromCs(CPBaseClass CP, CPCSBaseClass csFeature)
        {
            PortalDataFeatureModel feature = new PortalDataFeatureModel();

            try {
                feature.id         = csFeature.GetInteger("id");
                feature.name       = csFeature.GetText("name");
                feature.heading    = csFeature.GetText("heading");
                feature.sortOrder  = csFeature.GetText("sortOrder");
                feature.addPadding = csFeature.GetBoolean("addPadding");
                if (string.IsNullOrEmpty(feature.heading))
                {
                    feature.heading = feature.name;
                }
                feature.guid = csFeature.GetText("ccguid");
                if (string.IsNullOrEmpty(feature.guid))
                {
                    feature.guid = CP.Utils.CreateGuid();
                    csFeature.SetField("ccguid", feature.guid);
                }
                //
                feature.addonId         = csFeature.GetInteger("addonId");
                feature.dataContentId   = csFeature.GetInteger("dataContentId");
                feature.parentFeatureId = csFeature.GetInteger("parentFeatureId");
            } catch (Exception ex) {
                CP.Site.ErrorReport(ex, "exception in loadPortal");
                throw;
            }
            return(feature);
        }
 //====================================================================================================
 /// <summary>
 /// create a feature list box
 /// </summary>
 /// <param name="cp"></param>
 /// <param name="feature"></param>
 /// <returns></returns>
 public static string getFeatureList(CPBaseClass cp, PortalDataModel portalData, PortalDataFeatureModel feature, string frameRqs)
 {
     try {
         //string activeNavHeading = feature.heading;
         string items = "";
         foreach (KeyValuePair <string, PortalDataFeatureModel> kvp in portalData.featureList)
         {
             PortalDataFeatureModel liFeature = kvp.Value;
             if ((liFeature.parentFeatureId == feature.id) && (liFeature.parentFeatureId != 0))
             {
                 string featureHeading = liFeature.heading;
                 if (string.IsNullOrEmpty(featureHeading))
                 {
                     featureHeading = liFeature.name;
                 }
                 if (liFeature.dataContentId != 0)
                 {
                     //
                     // -- display content button if content is not developeronly, or if this is a developer
                     ContentModel featureContent = DbBaseModel.create <ContentModel>(cp, liFeature.dataContentId);
                     if (featureContent != null)
                     {
                         if ((!featureContent.developerOnly) || (cp.User.IsDeveloper))
                         {
                             string qs = frameRqs;
                             qs     = cp.Utils.ModifyQueryString(qs, "addonid", "", false);
                             qs     = cp.Utils.ModifyQueryString(qs, Constants.rnDstFeatureGuid, "", false);
                             qs     = cp.Utils.ModifyQueryString(qs, "cid", liFeature.dataContentId.ToString());
                             items += "<li><a target=\"_blank\" href=\"?" + qs + "\">" + featureHeading + "</a></li>";
                         }
                     }
                 }
                 else
                 {
                     string qs = cp.Utils.ModifyQueryString(frameRqs, Constants.rnDstFeatureGuid, liFeature.guid);
                     items += "<li><a href=\"?" + qs + "\">" + featureHeading + "</a></li>";
                 }
             }
         }
         FormSimpleClass content = new FormSimpleClass {
             title = feature.heading,
             body  = "<ul class=\"afwButtonList\">" + items + "</ul>"
         };
         return(content.getHtml(cp));
     } catch (Exception ex) {
         cp.Site.ErrorReport(ex, "portalClass.getFeatureList exception");
         throw;
     }
 }
        //====================================================================================================
        /// <summary>
        /// get the portal html. portalId=0  returns the first order by id.
        /// </summary>
        /// <param name="CP"></param>
        /// <param name="portalSelectSqlCriteria"></param>
        /// <returns></returns>
        public string getPortalAddonHtml(CPBaseClass CP, int portalId)
        {
            try {
                if (!CP.User.IsAdmin)
                {
                    return(Constants.blockedMessage);
                }
                PortalDataModel portalData = PortalDataModel.create(CP, portalId);
                //string frameRqs = CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnSetPortalId, portalData.id.ToString(), true);
                //
                // -- Add Nav items
                PortalBuilderClass portalBuilder = new PortalBuilderClass();
                foreach (KeyValuePair <string, PortalDataFeatureModel> kvp in portalData.featureList)
                {
                    PortalDataFeatureModel feature = kvp.Value;
                    if (feature.parentFeatureId == 0)
                    {
                        //
                        // -- feature has no parent, add to nav
                        var navFlyoutList = new List <PortalBuilderSubNavItemViewModel>();
                        if (feature.addonId == 0 && feature.dataContentId == 0)
                        {
                            //
                            // -- parent feature has no addon or content, add flyout if it has child features
                            foreach (var subFeature in feature.subFeatureList)
                            {
                                navFlyoutList.Add(new PortalBuilderSubNavItemViewModel {
                                    subActive       = true,
                                    subCaption      = subFeature.heading,
                                    subIsPortalLink = false,
                                    subLink         = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, subFeature.guid),
                                    sublinkTarget   = (subFeature.dataContentId > 0) || (!string.IsNullOrEmpty(subFeature.dataContentGuid)) ? "_blank" : ""
                                });
                            }
                        }
                        portalBuilder.addNav(new PortalBuilderNavItemViewModel {
                            active        = false,
                            caption       = feature.heading,
                            isPortalLink  = false,
                            link          = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, feature.guid),
                            linkTarget    = (feature.dataContentId > 0) || (!string.IsNullOrEmpty(feature.dataContentGuid)) ? "_blank" : "",
                            navFlyoutList = navFlyoutList
                        });
                        portalBuilder.navCaption = feature.heading;
                        portalBuilder.navLink    = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, feature.guid);
                    }
                }
                //
                // add developer nav item
                //
                if (CP.User.IsDeveloper)
                {
                    if (portalData.featureList.ContainsKey(Constants.devToolGuid))
                    {
                        CP.Site.ErrorReport("loadPortalFromDb, the portal [" + portalData.name + "] appears to have the devTool feature saved in either the Db features or the defaultConfig. This is not allowed.");
                    }
                    else
                    {
                        portalBuilder.addNav();
                        portalBuilder.navCaption = "Developer Tool";
                        portalBuilder.navLink    = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, Constants.devToolGuid);
                    }
                }
                //
                // add linked features nav items
                //
                if (portalData.linkedPortals.Count > 0)
                {
                    foreach (PortalDataModel linkedPortal in portalData.linkedPortals)
                    {
                        portalBuilder.addNav();
                        portalBuilder.navCaption = linkedPortal.name;
                        portalBuilder.navLink    = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnSetPortalId, linkedPortal.id.ToString());
                    }
                }
                string body             = "";
                string dstFeatureGuid   = CP.Doc.GetText(Constants.rnDstFeatureGuid);
                string activeNavHeading = "";
                //
                //   execute feature, if it returns empty, display default feature
                //
                if (dstFeatureGuid == Constants.devToolGuid)
                {
                    //
                    // execute developer tool panel
                    //
                    CP.Doc.AddRefreshQueryString(Constants.rnDstFeatureGuid, Constants.devToolGuid);
                    body             = DevToolView.getDevTool(CP, portalData, CP.Doc.RefreshQueryString);
                    activeNavHeading = "Developer Tool";
                }
                else
                {
                    if (portalData.featureList.ContainsKey(dstFeatureGuid))
                    {
                        //
                        // add feature guid to frameRqs so if the feature uses ajax, the featureGuid will be part of it
                        // add feature guid to rqs so if an addon is used that does not support frameRqs it will work
                        //
                        PortalDataFeatureModel dstDataFeature = portalData.featureList[dstFeatureGuid];
                        //frameRqs = CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, feature.guid);
                        if (dstDataFeature.addonId != 0)
                        {
                            //
                            // feature is an addon, execute it
                            //
                            CP.Doc.SetProperty(Constants.rnFrameRqs, CP.Doc.RefreshQueryString);
                            CP.Doc.AddRefreshQueryString(Constants.rnDstFeatureGuid, dstDataFeature.guid);
                            body = CP.Addon.Execute(dstDataFeature.addonId);
                            //
                            // -- portal title is a doc property set in each portal-builder that populates the title in the subnav.
                            portalBuilder.subNavTitle = CP.Doc.GetText("portalSubNavTitle");
                            //
                            // -- if the feature addon has sibling features, build the subnav
                            //
                            if (!string.IsNullOrEmpty(dstDataFeature.parentFeatureGuid))
                            {
                                if (portalData.featureList.ContainsKey(dstDataFeature.parentFeatureGuid))
                                {
                                    PortalDataFeatureModel dstFeatureParent = portalData.featureList[dstDataFeature.parentFeatureGuid];
                                    if (dstFeatureParent != null)
                                    {
                                        if (dstFeatureParent.addonId > 0 || dstFeatureParent.dataContentId > 0)
                                        {
                                            //
                                            // -- if parent is content or addon features, show subnav (otherwise, show flyout)
                                            foreach (var dstFeatureSibling in dstFeatureParent.subFeatureList)
                                            {
                                                portalBuilder.addSubNav(new PortalBuilderSubNavItemViewModel {
                                                    subActive       = true,
                                                    subCaption      = dstFeatureSibling.heading,
                                                    subIsPortalLink = false,
                                                    subLink         = "?" + CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, dstFeatureSibling.guid),
                                                    sublinkTarget   = (dstFeatureSibling.dataContentId > 0) || (!string.IsNullOrEmpty(dstFeatureSibling.dataContentGuid)) ? "_blank" : ""
                                                });
                                            }
                                        }
                                    }
                                }
                            }
                            //
                            //
                        }
                        else if (dstDataFeature.dataContentId != 0)
                        {
                            //
                            // this is a data content feature -- should not be here, link should have taken them to the content
                            //
                            CP.Response.Redirect("?cid=" + dstDataFeature.dataContentId.ToString());
                            FormSimpleClass content = new FormSimpleClass {
                                title = dstDataFeature.heading,
                                body  = "Redirecting to content"
                            };
                            body = content.getHtml(CP);
                        }
                        else
                        {
                            //
                            // this is a feature list, display the feature list
                            //
                            body = FeatureListView.getFeatureList(CP, portalData, dstDataFeature, CP.Doc.RefreshQueryString);
                        }
                        //
                        // -- set active heading
                        PortalDataFeatureModel dstFeatureRootFeature = PortalDataFeatureModel.getRootFeature(CP, dstDataFeature, portalData.featureList);
                        activeNavHeading = dstFeatureRootFeature.heading;
                        //
                        // -- if body not created, consider this a feature list
                        if (string.IsNullOrEmpty(body))
                        {
                            foreach (KeyValuePair <string, PortalDataFeatureModel> kvp in portalData.featureList)
                            {
                                PortalDataFeatureModel parentFeature = kvp.Value;
                                if (parentFeature.id == dstDataFeature.parentFeatureId)
                                {
                                    //
                                    // if feature returned empty and it is in a feature list, execute the feature list
                                    body = FeatureListView.getFeatureList(CP, portalData, parentFeature, CP.Doc.RefreshQueryString);
                                }
                            }
                        }


                        //
                        // -- add pading
                        if (dstDataFeature.addPadding)
                        {
                            body = CP.Html.div(body, "", "afwBodyPad", "");
                        }
                    }
                }
                if (string.IsNullOrEmpty(body))
                {
                    //
                    // if the feature returns blank, run the default feature
                    //
                    if (portalData.defaultFeature != null)
                    {
                        PortalDataFeatureModel feature = portalData.defaultFeature;
                        activeNavHeading = feature.heading;
                        //frameRqs = CP.Utils.ModifyQueryString(CP.Doc.RefreshQueryString, Constants.rnDstFeatureGuid, feature.guid);
                        CP.Doc.SetProperty(Constants.rnFrameRqs, CP.Doc.RefreshQueryString);
                        CP.Doc.AddRefreshQueryString(Constants.rnDstFeatureGuid, feature.guid);
                        body = CP.Addon.Execute(feature.addonId);
                        if (feature.addPadding)
                        {
                            body = CP.Html.div(body, "", "afwBodyPad", "");
                        }
                    }
                    if (string.IsNullOrEmpty(body))
                    {
                        FormSimpleClass simple = new FormSimpleClass {
                            body = "This portal feature has no content."
                        };
                        body = simple.getHtml(CP);
                    }
                }
                portalBuilder.setActiveNav(activeNavHeading);
                //
                //Assemble
                //
                portalBuilder.body             = CP.Html.div(body, "", "", "afwBodyFrame");
                portalBuilder.title            = portalData.name;
                portalBuilder.isOuterContainer = true;
                string returnHtml = portalBuilder.getHtml(CP);
                //
                // assemble body
                //
                CP.Doc.AddHeadStyle(Properties.Resources.styles);
                CP.Doc.AddHeadJavascript("var afwFrameRqs='" + CP.Doc.RefreshQueryString + "';");
                CP.Doc.AddHeadJavascript(Properties.Resources.javascript);
                //
                return(returnHtml);
            } catch (Exception ex) {
                CP.Site.ErrorReport(ex, "portalClass");
                throw;
            }
        }
Exemple #4
0
        //====================================================================================================
        /// <summary>
        /// If the portal does not exist in the Db, create it and all its features based on the portal argument
        /// </summary>
        /// <param name="CP"></param>
        /// <param name="newPortal"></param>
        public static void savePortalToDb(CPBaseClass CP, PortalDataModel newPortal)
        {
            try {
                CPCSBaseClass cs  = CP.CSNew();
                CPCSBaseClass cs2 = CP.CSNew();
                //
                // insert or update the portal record
                //
                if (!cs.Open("portals", "ccguid=" + CP.Db.EncodeSQLText(newPortal.guid), "", true, "", 9999, 1))
                {
                    cs.Close();
                    cs.Insert("portals");
                    newPortal.id = cs.GetInteger("id");
                }
                newPortal.id = cs.GetInteger("id");
                cs.SetField("ccguid", newPortal.guid);
                cs.SetField("name", newPortal.name);
                cs.Close();
                //
                // insert or update portal feature records
                //
                foreach (KeyValuePair <string, PortalDataFeatureModel> kvp in newPortal.featureList)
                {
                    PortalDataFeatureModel feature = kvp.Value;
                    if (feature.guid != Constants.devToolGuid)
                    {
                        if (!cs.Open("portal features", "ccguid=" + CP.Db.EncodeSQLText(feature.guid), "", true, "", 9999, 1))
                        {
                            cs.Insert("portal features");
                            cs.SetField("ccGuid", feature.guid);
                        }
                        if (cs.OK())
                        {
                            feature.id = cs.GetInteger("id");
                            cs.SetField("portalId", newPortal.id.ToString());
                            cs.SetField("name", feature.name);
                            cs.SetField("heading", feature.heading);
                            cs.SetField("sortOrder", feature.sortOrder);
                            if (feature.addonId == 0 && !string.IsNullOrEmpty(feature.addonGuid))
                            {
                                //
                                // lookup addon by guid, set addonid
                                //
                                if (cs2.Open("add-ons", "ccguid=" + CP.Db.EncodeSQLText(feature.addonGuid), "", true, "", 9999, 1))
                                {
                                    cs.SetField("addonId", cs2.GetInteger("id").ToString());
                                }
                                cs2.Close();
                            }
                            if (feature.dataContentId == 0 && !string.IsNullOrEmpty(feature.dataContentGuid))
                            {
                                //
                                // save dataContentId based on dataContentGuid
                                //
                                if (cs2.Open("content", "ccguid=" + CP.Db.EncodeSQLText(feature.dataContentGuid), "", true, "", 9999, 1))
                                {
                                    feature.dataContentId = cs2.GetInteger("id");
                                    cs.SetField("dataContentId", feature.dataContentId.ToString());
                                }
                                cs2.Close();
                            }
                            if (newPortal.defaultFeature.guid == feature.guid)
                            {
                                newPortal.defaultFeature = feature;
                            }
                        }
                        cs.Close();
                    }
                }
                //
                // lookup parent features by guid and set id
                //

                foreach (KeyValuePair <string, PortalDataFeatureModel> kvp in newPortal.featureList)
                {
                    PortalDataFeatureModel feature = kvp.Value;
                    if (feature.guid != Constants.devToolGuid)
                    {
                        if (feature.parentFeatureId == 0 && !string.IsNullOrEmpty(feature.parentFeatureGuid))
                        {
                            //
                            // get the id of the parentFeature
                            //
                            if (cs.Open("portal features", "ccguid=" + CP.Db.EncodeSQLText(feature.parentFeatureGuid), "", true, "", 9999, 1))
                            {
                                feature.parentFeatureId = cs.GetInteger("id");
                            }
                            cs.Close();
                            if (feature.parentFeatureId > 0)
                            {
                                //
                                // set the parentFeatureId field of the current feature
                                //
                                if (cs.Open("portal features", "id=" + feature.id.ToString(), "", true, "", 9999, 1))
                                {
                                    cs.SetField("parentFeatureId", feature.parentFeatureId.ToString());
                                }
                                cs.Close();
                            }
                        }
                    }
                }
            } catch (Exception ex) {
                CP.Site.ErrorReport(ex, "exception in loadPortal");
                throw;
            }
        }
Exemple #5
0
 //====================================================================================================
 /// <summary>
 /// Return a portal object read from the Db based on the portal guid argument
 /// </summary>
 /// <param name="cp"></param>
 /// <param name="portalRecordGuid"></param>
 /// <returns></returns>
 public static PortalDataModel create(CPBaseClass CP, int portalId)
 {
     try {
         PortalDataModel result = new PortalDataModel {
             featureList = new Dictionary <string, PortalDataFeatureModel>()
         };
         using (CPCSBaseClass portalCs = CP.CSNew()) {
             string defaultConfigJson;
             if (!portalCs.Open("portals", (portalId == 0 ? "" : "id=" + portalId), "id", true, "", 9999, 1))
             {
                 //
                 // -- no portals found, create demo portal
                 portalCs.Close();
                 result.name        = "Empty";
                 result.guid        = "";
                 result.id          = 0;
                 result.featureList = new Dictionary <string, PortalDataFeatureModel>();
                 PortalDataFeatureModel feature = new PortalDataFeatureModel {
                     addonId         = 0,
                     dataContentId   = 0,
                     guid            = "",
                     heading         = "Sample",
                     id              = 0,
                     name            = "Demo",
                     parentFeatureId = 0,
                     sortOrder       = ""
                 };
                 return(result);
             }
             //
             // -- load selected portal
             result.name = portalCs.GetText("name");
             result.guid = portalCs.GetText("ccguid");
             result.id   = portalCs.GetInteger("id");
             int portalDefaultFeatureId = portalCs.GetInteger("defaultFeatureId");
             defaultConfigJson = portalCs.GetText("defaultConfigJson");
             portalCs.Close();
             //
             // -- portal links
             result.linkedPortals = new List <PortalDataModel>();
             string sql = "select p.id,p.ccguid,p.name from ccPortals p left join ccPortalLinks l on l.toPortalId=p.id where p.active>0 and l.fromPortalId=" + result.id;
             if (portalCs.OpenSQL(sql))
             {
                 do
                 {
                     int linkedPortalId = portalCs.GetInteger("id");
                     if (!result.id.Equals(linkedPortalId))
                     {
                         PortalDataModel linkedPortal = new PortalDataModel {
                             id   = linkedPortalId,
                             name = portalCs.GetText("name")
                         };
                         result.linkedPortals.Add(linkedPortal);
                     }
                     portalCs.GoNext();
                 } while (portalCs.OK());
             }
             portalCs.Close();
             //
             // -- load features and subfeatures
             string featureSql = ""
                                 + " select"
                                 + " f.id,f.name,f.heading,f.sortOrder,f.addPadding,f.ccguid,f.addonId,f.dataContentId,f.parentFeatureId,"
                                 + " sub.id as subId,sub.name as subName,sub.heading as subheading,sub.sortOrder as subSortOrder,sub.addPadding as subAddPadding,sub.ccguid as subccGuid,sub.addonId as subAddonId,sub.dataContentId as subdatacontentid,sub.parentFeatureId as subparentFeatureId"
                                 + " from ccPortalFeatures f left join ccPortalFeatures sub on sub.parentFeatureId=f.id "
                                 + " where (f.active>0) and ((sub.active is null)or(sub.active>0))and f.portalid=" + portalId
                                 + " order by f.sortOrder,f.name,sub.name";
             using (CPCSBaseClass csFeature = CP.CSNew()) {
                 if (csFeature.OpenSQL(featureSql))
                 {
                     //
                     // -- load features from Db
                     int lastFeatureId = 0;
                     PortalDataFeatureModel feature = null;
                     do
                     {
                         if (lastFeatureId != csFeature.GetInteger("id"))
                         {
                             //
                             // -- new feature, load the feature
                             feature = new PortalDataFeatureModel {
                                 id                = csFeature.GetInteger("id"),
                                 name              = csFeature.GetText("name"),
                                 heading           = (string.IsNullOrEmpty(csFeature.GetText("heading")) ? csFeature.GetText("name") : csFeature.GetText("heading")),
                                 sortOrder         = csFeature.GetText("sortOrder"),
                                 addPadding        = csFeature.GetBoolean("addPadding"),
                                 guid              = csFeature.GetText("ccguid"),
                                 addonId           = csFeature.GetInteger("addonId"),
                                 dataContentId     = csFeature.GetInteger("dataContentId"),
                                 parentFeatureId   = csFeature.GetInteger("parentFeatureId"),
                                 subFeatureList    = new List <PortalDataFeatureModel>(),
                                 addonGuid         = "",
                                 dataContentGuid   = "",
                                 parentFeatureGuid = ""
                             };
                             //
                             // -- add the new feature to the list
                             string featureGuid = csFeature.GetText("ccguid");
                             if (result.featureList.ContainsKey(featureGuid))
                             {
                                 //
                                 // -- data error, duplicate features
                                 CP.Site.ErrorReport("Portal Error, 2 portal features with the same guid [" + featureGuid + "]");
                             }
                             else
                             {
                                 result.featureList.Add(featureGuid, feature);
                                 if (result.defaultFeature == null)
                                 {
                                     result.defaultFeature = feature;
                                 }
                                 if (portalDefaultFeatureId == feature.id)
                                 {
                                     result.defaultFeature = feature;
                                 }
                             }
                         }
                         //
                         // -- load subfeatures
                         int subFeatureId = csFeature.GetInteger("subid");
                         if (subFeatureId > 0)
                         {
                             PortalDataFeatureModel subFeature = new PortalDataFeatureModel {
                                 id              = subFeatureId,
                                 name            = csFeature.GetText("subname"),
                                 heading         = (string.IsNullOrEmpty(csFeature.GetText("subheading")) ? csFeature.GetText("subname") : csFeature.GetText("subheading")),
                                 sortOrder       = csFeature.GetText("subsortOrder"),
                                 addPadding      = csFeature.GetBoolean("subaddPadding"),
                                 guid            = csFeature.GetText("subccguid"),
                                 addonId         = csFeature.GetInteger("subaddonId"),
                                 dataContentId   = csFeature.GetInteger("subdataContentId"),
                                 parentFeatureId = csFeature.GetInteger("subparentFeatureId"),
                             };
                             feature.subFeatureList.Add(subFeature);
                         }
                         lastFeatureId = csFeature.GetInteger("id");
                         csFeature.GoNext();
                     } while (csFeature.OK());
                     csFeature.Close();
                     //
                     // -- populate parentFeatureGuid from parentFeatureId
                     foreach (var kvp in result.featureList)
                     {
                         PortalDataFeatureModel testFeature = kvp.Value;
                         if ((testFeature.parentFeatureId > 0) && string.IsNullOrEmpty(testFeature.parentFeatureGuid))
                         {
                             foreach (var searchFeature in  result.featureList)
                             {
                                 if (testFeature.parentFeatureId == searchFeature.Value.id)
                                 {
                                     //
                                     testFeature.parentFeatureGuid = searchFeature.Value.guid;
                                     break;
                                 }
                             }
                         }
                     }
                     return(result);
                 }
             }
             //
             // -- no features found, load default portal features
             if (string.IsNullOrEmpty(defaultConfigJson))
             {
                 //
                 // no default, fake a tab
                 //
                 result.featureList = new Dictionary <string, PortalDataFeatureModel>();
                 PortalDataFeatureModel feature = new PortalDataFeatureModel {
                     addonId         = 0,
                     dataContentId   = 0,
                     guid            = "",
                     heading         = "Sample",
                     id              = 0,
                     name            = "Demo",
                     parentFeatureId = 0,
                     sortOrder       = "",
                     addPadding      = false
                 };
                 return(result);
             }
             //
             // legacy - load features from portal record alone
             //
             System.Web.Script.Serialization.JavaScriptSerializer msJson = new System.Web.Script.Serialization.JavaScriptSerializer();
             result = msJson.Deserialize <PortalDataModel>(defaultConfigJson);
             savePortalToDb(CP, result);
             //
             using (CPCSBaseClass featureCs = CP.CSNew()) {
                 if (!string.IsNullOrEmpty(result.defaultFeature.guid))
                 {
                     if (featureCs.Open("portal features", "ccguid=" + CP.Db.EncodeSQLText(result.defaultFeature.guid), "", true, "", 9999, 1))
                     {
                         result.defaultFeature = loadPortalFeatureFromCs(CP, featureCs);
                     }
                     featureCs.Close();
                 }
             }
             return(result);
         }
     } catch (Exception ex) {
         CP.Site.ErrorReport(ex, "exception in loadPortal");
         throw;
     }
 }