/// <summary>
        /// Add web part to a wiki style page
        /// </summary>
        /// <param name="properties">Site to insert the web part on</param>
        /// <param name="webPart">Information about the web part to insert</param>
        /// <param name="page">Page to add the web part on</param>
        /// <param name="row">Row of the wiki table that should hold the inserted web part</param>
        /// <param name="col">Column of the wiki table that should hold the inserted web part</param>
        /// <param name="addSpace">Does a blank line need to be added after the web part (to space web parts)</param>
        public void AddWebPartToWikiPage(ClientContext ctx, Web web, string folder, WebPartEntity webPart, string page, int row, int col, bool addSpace)
        {
            //Note: getfilebyserverrelativeurl did not work...not sure why not
            Microsoft.SharePoint.Client.Folder pagesLib = web.GetFolderByServerRelativeUrl(folder);
            ctx.Load(pagesLib.Files);
            ctx.ExecuteQuery();

            Microsoft.SharePoint.Client.File webPartPage = null;

            foreach (Microsoft.SharePoint.Client.File aspxFile in pagesLib.Files)
            {
                if (aspxFile.Name.Equals(page, StringComparison.InvariantCultureIgnoreCase))
                {
                    webPartPage = aspxFile;
                    break;
                }
            }

            if (webPartPage == null)
            {
                return;
            }

            ctx.Load(webPartPage);
            ctx.Load(webPartPage.ListItemAllFields);
            ctx.ExecuteQuery();

            string wikiField = (string)webPartPage.ListItemAllFields["WikiField"];

            LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
            WebPartDefinition     oWebPartDefinition    = limitedWebPartManager.ImportWebPart(webPart.WebPartXml);
            WebPartDefinition     wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0);

            ctx.Load(wpdNew);
            ctx.ExecuteQuery();

            //HTML structure in default team site home page (W16)
            //<div class="ExternalClass284FC748CB4242F6808DE69314A7C981">
            //  <div class="ExternalClass5B1565E02FCA4F22A89640AC10DB16F3">
            //    <table id="layoutsTable" style="width&#58;100%;">
            //      <tbody>
            //        <tr style="vertical-align&#58;top;">
            //          <td colspan="2">
            //            <div class="ms-rte-layoutszone-outer" style="width&#58;100%;">
            //              <div class="ms-rte-layoutszone-inner" style="word-wrap&#58;break-word;margin&#58;0px;border&#58;0px;">
            //                <div><span><span><div class="ms-rtestate-read ms-rte-wpbox"><div class="ms-rtestate-read 9ed0c0ac-54d0-4460-9f1c-7e98655b0847" id="div_9ed0c0ac-54d0-4460-9f1c-7e98655b0847"></div><div class="ms-rtestate-read" id="vid_9ed0c0ac-54d0-4460-9f1c-7e98655b0847" style="display&#58;none;"></div></div></span></span><p> </p></div>
            //                <div class="ms-rtestate-read ms-rte-wpbox">
            //                  <div class="ms-rtestate-read c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" id="div_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0"></div>
            //                  <div class="ms-rtestate-read" id="vid_c7a1f9a9-4e27-4aa3-878b-c8c6c87961c0" style="display&#58;none;"></div>
            //                </div>
            //              </div>
            //            </div>
            //          </td>
            //        </tr>
            //        <tr style="vertical-align&#58;top;">
            //          <td style="width&#58;49.95%;">
            //            <div class="ms-rte-layoutszone-outer" style="width&#58;100%;">
            //              <div class="ms-rte-layoutszone-inner" style="word-wrap&#58;break-word;margin&#58;0px;border&#58;0px;">
            //                <div class="ms-rtestate-read ms-rte-wpbox">
            //                  <div class="ms-rtestate-read b55b18a3-8a3b-453f-a714-7e8d803f4d30" id="div_b55b18a3-8a3b-453f-a714-7e8d803f4d30"></div>
            //                  <div class="ms-rtestate-read" id="vid_b55b18a3-8a3b-453f-a714-7e8d803f4d30" style="display&#58;none;"></div>
            //                </div>
            //              </div>
            //            </div>
            //          </td>
            //          <td class="ms-wiki-columnSpacing" style="width&#58;49.95%;">
            //            <div class="ms-rte-layoutszone-outer" style="width&#58;100%;">
            //              <div class="ms-rte-layoutszone-inner" style="word-wrap&#58;break-word;margin&#58;0px;border&#58;0px;">
            //                <div class="ms-rtestate-read ms-rte-wpbox">
            //                  <div class="ms-rtestate-read 0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" id="div_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95"></div>
            //                  <div class="ms-rtestate-read" id="vid_0b2f12a4-3ab5-4a59-b2eb-275bbc617f95" style="display&#58;none;"></div>
            //                </div>
            //              </div>
            //            </div>
            //          </td>
            //        </tr>
            //      </tbody>
            //    </table>
            //    <span id="layoutsData" style="display&#58;none;">true,false,2</span>
            //  </div>
            //</div>

            XmlDocument xd = new XmlDocument();

            xd.PreserveWhitespace = true;
            xd.LoadXml(wikiField);

            // Sometimes the wikifield content seems to be surrounded by an additional div?
            XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement;

            if (layoutsTable == null)
            {
                layoutsTable = xd.SelectSingleNode("div/table") as XmlElement;
            }

            XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement;
            // - space element
            XmlElement space = xd.CreateElement("p");
            XmlText    text  = xd.CreateTextNode(" ");

            space.AppendChild(text);

            // - wpBoxDiv
            XmlElement wpBoxDiv = xd.CreateElement("div");

            layoutsZoneInner.AppendChild(wpBoxDiv);

            if (addSpace)
            {
                layoutsZoneInner.AppendChild(space);
            }

            XmlAttribute attribute = xd.CreateAttribute("class");

            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read ms-rte-wpbox";
            attribute       = xd.CreateAttribute("contentEditable");
            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "false";
            // - div1
            XmlElement div1 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div1);
            div1.IsEmpty = false;
            attribute    = xd.CreateAttribute("class");
            div1.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D");
            attribute       = xd.CreateAttribute("id");
            div1.Attributes.Append(attribute);
            attribute.Value = "div_" + wpdNew.Id.ToString("D");
            // - div2
            XmlElement div2 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div2);
            div2.IsEmpty = false;
            attribute    = xd.CreateAttribute("style");
            div2.Attributes.Append(attribute);
            attribute.Value = "display:none";
            attribute       = xd.CreateAttribute("id");
            div2.Attributes.Append(attribute);
            attribute.Value = "vid_" + wpdNew.Id.ToString("D");

            ListItem listItem = webPartPage.ListItemAllFields;

            listItem["WikiField"] = xd.OuterXml;
            listItem.Update();
            ctx.ExecuteQuery();
        }
        private void ExtractWikiPage(Microsoft.SharePoint.Client.File file, ProvisioningTemplate template, PnPMonitoredScope scope, ListItem listItem)
        {
            scope.LogDebug(String.Format("ExtractWikiPage {0}", file.ServerRelativeUrl));
            var fullUri = GetFullUri(web);
            var page    = new Page()
            {
                Layout    = WikiPageLayout.Custom,
                Overwrite = true,
                Url       = fullUri.PathAndQuery.TokenizeUrl(web.Url),
            };
            var wikiField      = listItem.FieldValues["WikiField"];
            var pageContents   = wikiField.ToString();
            var regexClientIds = new System.Text.RegularExpressions.Regex(@"id=\""div_(?<ControlId>(\w|\-)+)");

            if (regexClientIds.IsMatch(pageContents))
            {
                LimitedWebPartManager limitedWPManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                foreach (System.Text.RegularExpressions.Match webPartMatch in regexClientIds.Matches(pageContents))
                {
                    String serverSideControlId = webPartMatch.Groups["ControlId"].Value;

                    try
                    {
                        String serverSideControlIdToSearchFor = String.Format("g_{0}",
                                                                              serverSideControlId.Replace("-", "_"));
                        //var webParts = limitedWPManager.WebParts.ToList();
                        WebPartDefinition webPart = limitedWPManager.WebParts.GetByControlId(serverSideControlIdToSearchFor);

                        if (webPart != null && webPart.Id != null)
                        {
                            web.Context.Load(webPart,
                                             wp => wp.Id,
                                             wp => wp.WebPart.Title,
                                             wp => wp.WebPart.ZoneIndex
                                             );
                            web.Context.ExecuteQueryRetry();

                            var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, file.ServerRelativeUrl));

                            page.WebParts.Add(new OfficeDevPnP.Core.Framework.Provisioning.Model.WebPart()
                            {
                                Title    = webPart.WebPart.Title,
                                Contents = webPartxml,
                                Order    = (uint)webPart.WebPart.ZoneIndex,
                                Row      = 1, // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                                Column   = 1  // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                            });

                            pageContents = Regex.Replace(pageContents, serverSideControlId, string.Format("{{webpartid:{0}}}", webPart.WebPart.Title), RegexOptions.IgnoreCase);
                        }
                    }
                    catch (PropertyOrFieldNotInitializedException)
                    {
                        scope.LogWarning("Found a WebPart ID which is not available on the server-side. ID: {0}", serverSideControlId);
                        try
                        {
                            web.Context.ExecuteQueryRetry();
                        }
                        catch
                        {
                            //suppress pending transaction
                            // avoids issues with invalid/corrupted wiki pages
                        }
                    }
                    catch (ServerException)
                    {
                        scope.LogWarning("Found a WebPart ID which is not available on the server-side. ID: {0}", serverSideControlId);
                    }
                }
            }

            page.Fields.Add("WikiField", pageContents);
            template.Pages.Add(page);
        }
Example #3
0
        /// <summary>
        /// Function to update project landing page as per new project name
        /// </summary>
        /// <param name="siteContext">Client context</param>
        /// <param name="projectToUpdate">Details of project to be updated</param>
        /// <param name="guid">Project GUID</param>
        /// <param name="calendarStatus">If Calendar is created</param>
        /// <param name="taskStatus">If task is created</param>
        /// <param name="rssFeedStatus">If RSS feed is created</param>
        public static void UpdateProjectLandingPage(ClientContext siteContext, Project projectToUpdate, string guid,
                                                    bool calendarStatus, bool taskStatus, bool rssFeedStatus, IConfigurationRoot configuration)
        {
            int listID = RetrieveItemId(siteContext, Constants.SITE, guid);

            try
            {
                if (-1 != listID)
                {
                    List     list     = siteContext.Web.Lists.GetByTitle(Constants.SITE);
                    ListItem listItem = list.GetItemById(listID);
                    siteContext.Load(listItem);
                    Microsoft.SharePoint.Client.File file = listItem.File;
                    listItem["Title"] = projectToUpdate.NewProjectName;
                    listItem.Update();

                    /// Update stamped project and project GUID on project landing page
                    LimitedWebPartManager wpm = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                    siteContext.Load(wpm.WebParts, wps => wps.Include(wp => wp.WebPart.Properties, wp => wp.WebPart.Title));
                    siteContext.ExecuteQuery();

                    WebPartDefinitionCollection oWebPartDefinition = wpm.WebParts;
                    siteContext.Load(oWebPartDefinition, item => item.Include(li => li.ZoneId, li => li.WebPart, li => li.WebPart.Properties));
                    siteContext.ExecuteQuery();

                    foreach (WebPartDefinition zone in oWebPartDefinition)
                    {
                        if (zone.WebPart.Title.ToLower() == "rss viewer")
                        {
                            rssFeedStatus = true;
                            break;
                        }
                    }

                    foreach (WebPartDefinition zone in oWebPartDefinition)
                    {
                        if (("HeaderZone").Equals(zone.ZoneId))
                        {
                            zone.DeleteWebPart();
                            break;
                        }
                    }
                    string catalogAssetsPathStyles = configuration.GetSection("General")["CatalogAssetsStyles"];
                    string sharePointDLLVersion    = configuration.GetSection("General")["SharePointDLLVersion"];
                    string matterLandingcss        = configuration.GetSection("General")["ProjectLandingCss"];
                    string projectLandingAssets    = configuration.GetSection("General")["ProjectLandingAssets"];
                    string projectCenterAssets     = configuration.GetSection("General")["ProjectCenterAssets"];

                    string projectLandingSectionContent = "<div id=\"{0}\"></div>";
                    string styleTag                      = "<link href=\"{0}\" type=\"text/css\" rel=\"stylesheet\" />";
                    string cssLink                       = string.Format(CultureInfo.InvariantCulture, catalogAssetsPathStyles + matterLandingcss, projectCenterAssets + Constants.FRONTSLASH + projectLandingAssets);
                    string commonCssLink                 = string.Format(CultureInfo.InvariantCulture, catalogAssetsPathStyles + Constants.COMMONCSS, projectCenterAssets + Constants.FRONTSLASH + Constants.COMMONASSETS);
                    string headerWebPartSection          = string.Format(CultureInfo.InvariantCulture, projectLandingSectionContent, Constants.MATTERCENTERHEADER);
                    string projectLandingStampProperties = "var documentLibraryName = \"{0}\", isNewProjectLandingPage = true, documentLibraryGUID=\"{1}\";";
                    string scriptTagWithContents         = "<script type=\"text/javascript\">{0}</script>";
                    headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, styleTag, cssLink), headerWebPartSection);
                    headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, styleTag, commonCssLink), headerWebPartSection);
                    headerWebPartSection = string.Concat(string.Format(CultureInfo.InvariantCulture, scriptTagWithContents, string.Format(CultureInfo.InvariantCulture, projectLandingStampProperties, projectToUpdate.NewProjectName, guid)), headerWebPartSection);

                    string            headerWebPart     = string.Format(CultureInfo.InvariantCulture, Constants.ContentEditorWebPart, headerWebPartSection, sharePointDLLVersion);
                    WebPartDefinition webPartDefinition = null;
                    if (!string.IsNullOrWhiteSpace(headerWebPart))
                    {
                        LimitedWebPartManager limitedWebPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                        webPartDefinition = limitedWebPartManager.ImportWebPart(headerWebPart);
                        limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, "HeaderZone", 1);
                        siteContext.ExecuteQuery();
                    }

                    // Remove existing web-parts from page and recreate
                    List projectList = siteContext.Web.Lists.GetByTitle(projectToUpdate.NewProjectName);
                    siteContext.Load(projectList, lst => lst.Title, lst => lst.EntityTypeName);
                    siteContext.ExecuteQuery();
                    DeleteProjectWebparts(siteContext, projectList);

                    CreateOneNote(siteContext, projectList, projectToUpdate.NewProjectName, configuration);
                    if (taskStatus)
                    {
                        CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.TASK, Constants.TASKPANE, 2, configuration);
                    }
                    if (calendarStatus)
                    {
                        CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.CALENDAR, Constants.CALENDARPANE, 3, configuration);
                    }
                    if (rssFeedStatus)
                    {
                        CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.RSSTITLE, Constants.RSSPANE, 4, configuration);
                        CreateWebPart(siteContext, projectList, projectToUpdate.NewProjectName, Constants.RSSFEED, Constants.RSSPANE, 5, configuration);
                    }
                }
                else
                {
                    //frmMain.status.UpdateStatus("Project landing page not found with GUID: " + projectToUpdate.ProjectGUID, MatterCenter.Common.Message.MessageType.Error);
                }
            }
            catch (Exception exception)
            {
                throw;
            }
        }
        /// <summary>
        /// Add web part to a wiki style page
        /// </summary>
        /// <param name="web">Site to be processed - can be root web or sub site</param>
        /// <param name="serverRelativePageUrl">Server relative url of the page to add the webpart to</param>
        /// <param name="webPart">Information about the web part to insert</param>
        /// <param name="row">Row of the wiki table that should hold the inserted web part</param>
        /// <param name="col">Column of the wiki table that should hold the inserted web part</param>
        /// <param name="addSpace">Does a blank line need to be added after the web part (to space web parts)</param>
        /// <exception cref="System.ArgumentException">Thrown when serverRelativePageUrl is a zero-length string or contains only white space</exception>
        /// <exception cref="System.ArgumentNullException">Thrown when serverRelativePageUrl or webPart is null</exception>
        public static void AddWebPartToWikiPage(this Web web, string serverRelativePageUrl, WebPartEntity webPart, int row, int col, bool addSpace)
        {
            if (string.IsNullOrEmpty(serverRelativePageUrl))
            {
                throw (serverRelativePageUrl == null)
                  ? new ArgumentNullException("serverRelativePageUrl")
                  : new ArgumentException("Empty parameter", "serverRelativePageUrl");
            }

            if (webPart == null)
            {
                throw new ArgumentNullException("webPart");
            }

            File webPartPage = web.GetFileByServerRelativeUrl(serverRelativePageUrl);

            if (webPartPage == null)
            {
                return;
            }

            web.Context.Load(webPartPage, wp => wp.ListItemAllFields);
            web.Context.ExecuteQueryRetry();

            string wikiField = (string)webPartPage.ListItemAllFields["WikiField"];

            LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
            WebPartDefinition     oWebPartDefinition    = limitedWebPartManager.ImportWebPart(webPart.WebPartXml);
            WebPartDefinition     wpdNew = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0);

            web.Context.Load(wpdNew);
            web.Context.ExecuteQueryRetry();

            // Close all BR tags
            Regex brRegex = new Regex("<br>", RegexOptions.IgnoreCase);

            wikiField = brRegex.Replace(wikiField, "<br/>");

            XmlDocument xd = new XmlDocument();

            xd.PreserveWhitespace = true;
            xd.LoadXml(wikiField);

            // Sometimes the wikifield content seems to be surrounded by an additional div?
            XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement;

            if (layoutsTable == null)
            {
                layoutsTable = xd.SelectSingleNode("div/table") as XmlElement;
            }

            XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement;
            // - space element
            XmlElement space = xd.CreateElement("p");
            XmlText    text  = xd.CreateTextNode(" ");

            space.AppendChild(text);

            // - wpBoxDiv
            XmlElement wpBoxDiv = xd.CreateElement("div");

            layoutsZoneInner.AppendChild(wpBoxDiv);

            if (addSpace)
            {
                layoutsZoneInner.AppendChild(space);
            }

            XmlAttribute attribute = xd.CreateAttribute("class");

            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read ms-rte-wpbox";
            attribute       = xd.CreateAttribute("contentEditable");
            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "false";
            // - div1
            XmlElement div1 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div1);
            div1.IsEmpty = false;
            attribute    = xd.CreateAttribute("class");
            div1.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D");
            attribute       = xd.CreateAttribute("id");
            div1.Attributes.Append(attribute);
            attribute.Value = "div_" + wpdNew.Id.ToString("D");
            // - div2
            XmlElement div2 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div2);
            div2.IsEmpty = false;
            attribute    = xd.CreateAttribute("style");
            div2.Attributes.Append(attribute);
            attribute.Value = "display:none";
            attribute       = xd.CreateAttribute("id");
            div2.Attributes.Append(attribute);
            attribute.Value = "vid_" + wpdNew.Id.ToString("D");

            ListItem listItem = webPartPage.ListItemAllFields;

            listItem["WikiField"] = xd.OuterXml;
            listItem.Update();
            web.Context.ExecuteQueryRetry();
        }
 /// <summary>
 /// Adding All Web Parts on Matter Landing Page
 /// </summary>
 /// <param name="clientContext">SharePoint Client Context</param>
 /// <param name="limitedWebPartManager">LimitedWebPartManager object to import web parts</param>
 /// <param name="webPartDefinition">WebPartDefinition object to add web parts on page.</param>
 /// <param name="webParts">Array of web parts that should be added on Matter Landing Page</param>
 /// <param name="zones">Array of Zone IDs</param>
 /// <returns>true if success else false</returns>
 internal static string AddWebPart(ClientContext clientContext, LimitedWebPartManager limitedWebPartManager, WebPartDefinition webPartDefinition, string[] webParts, string[] zones)
 {
     int index = 0;
     int ZoneIndex = 1;
     for (index = 0; index < webParts.Length; index++)
     {
         if (!string.IsNullOrWhiteSpace(webParts[index]))
         {
             webPartDefinition = limitedWebPartManager.ImportWebPart(webParts[index]);
             limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, zones[index], ZoneIndex);
             clientContext.ExecuteQuery();
         }
     }
     return Constants.TRUE;
 }
        private static void TestClassicPage()
        {
            string url            = "https://m365x725618.sharepoint.com/sites/ClassicPublishing01";
            string searchKeyword  = "Contoso";
            string replaceKeyword = "NewContoso";

            using (ClientContext context = GetClientContext(url))
            {
                // enumaret "Pages" Lib
                var files = context.Web.Lists.GetByTitle("Pages").RootFolder.Files;
                context.Load(files,
                             fs => fs.Include(f => f.ServerRelativeUrl),
                             fs => fs.Include(f => f.CheckedOutByUser.UserPrincipalName),
                             fs => fs.Include(f => f.ListItemAllFields),
                             fs => fs.Include(f => f.CheckOutType));
                context.ExecuteQuery();

                foreach (var file in files)
                {
                    if (file.CheckOutType == CheckOutType.None)
                    {
                        //string pageUrl = "https://m365x725618.sharepoint.com/sites/ClassicPublishing01/Pages/TestClassicPage.aspx";
                        //Microsoft.SharePoint.Client.File file = context.Web.GetFileByUrl(pageUrl);

                        LimitedWebPartManager manager = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                        context.Load(manager.WebParts,
                                     wps => wps.Include(wp => wp.WebPart.Title),
                                     wps => wps.Include(wp => wp.WebPart.ZoneIndex),
                                     wps => wps.Include(wp => wp.WebPart.Properties),
                                     wps => wps.Include(wp => wp.Id),
                                     wps => wps.Include(wp => wp.ZoneId));
                        context.ExecuteQuery();

                        //check out file for change.
                        bool pageChanged = false;
                        file.CheckOut();

                        //Update PublishingPageContent
                        string pageContent = file.ListItemAllFields["PublishingPageContent"].ToString();
                        if (pageContent.IndexOf(searchKeyword, StringComparison.CurrentCultureIgnoreCase) != -1)
                        {
                            file.ListItemAllFields["PublishingPageContent"] = pageContent.Replace(searchKeyword, replaceKeyword);
                            file.ListItemAllFields.Update();
                            pageChanged = true;
                        }

                        foreach (var wp in manager.WebParts)
                        {
                            if (wp.WebPart.Title == "Content Editor")
                            {
                                //export the web to get CEWP's content
                                var wpXml = manager.ExportWebPart(wp.Id);
                                context.ExecuteQuery();

                                string wpContent = wpXml.Value;

                                if (wpContent.IndexOf(searchKeyword, StringComparison.CurrentCultureIgnoreCase) != -1)
                                {
                                    Console.WriteLine("Found '{0}' at {1}", searchKeyword, file.ServerRelativeUrl);
                                    string zoneId    = wp.ZoneId;
                                    int    zoneIndex = wp.WebPart.ZoneIndex;

                                    //replace the content
                                    string wpNewContext = wpContent.Replace(searchKeyword, replaceKeyword);

                                    //remove old wp
                                    wp.DeleteWebPart();
                                    context.ExecuteQuery();

                                    //import the wp
                                    var wpDef = manager.ImportWebPart(wpNewContext);
                                    manager.AddWebPart(wpDef.WebPart, zoneId, zoneIndex);
                                    context.ExecuteQuery();
                                    Console.WriteLine("Replace '{0}' to '{1}' at {2}", searchKeyword, replaceKeyword, file.ServerRelativeUrl);

                                    pageChanged = true;
                                }
                            }
                        }
                        if (pageChanged)
                        {
                            file.CheckIn("replace content", CheckinType.MajorCheckIn);
                        }
                        else
                        {
                            file.UndoCheckOut();
                        }
                        context.ExecuteQuery();
                        Console.WriteLine("File '{0}' was processed and {1} changes", file.ServerRelativeUrl, pageChanged ? "found" : "no");
                    }
                    else
                    {
                        Console.WriteLine("File '{0}' was checked out by {1}", file.ServerRelativeUrl, file.CheckedOutByUser.UserPrincipalName);
                    }
                }
            }
        }
        public bool Validate(PageCollection sourcePages, Microsoft.SharePoint.Client.ClientContext ctx)
        {
            int scount = 0;
            int tcount = 0;


            Web web = ctx.Web;

            ctx.Load(web, w => w.Url, w => w.ServerRelativeUrl);
            ctx.ExecuteQueryRetry();

            foreach (var sourcePage in sourcePages)
            {
                string pageUrl = sourcePage.Url.ToString();
                pageUrl = pageUrl.Replace("{site}", web.ServerRelativeUrl);

                Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl(pageUrl);
                ctx.Load(file, page => page.ListItemAllFields, page => page.ListItemAllFields.RoleAssignments.Include(roleAsg => roleAsg.Member,
                                                                                                                      roleAsg => roleAsg.RoleDefinitionBindings.Include(roleDef => roleDef.Name)));
                ctx.ExecuteQueryRetry();

                if (file != null)
                {
                    #region Page - Fields

                    if (sourcePage.Fields.Count > 0)
                    {
                        scount = 0;
                        tcount = 0;
                        string sourceWikifield = sourcePage.Fields["WikiField"].ToString();
                        string targetwikiField = (string)file.ListItemAllFields["WikiField"];

                        if (sourceWikifield.Trim() != RemoveHTMLTags(targetwikiField).Trim())
                        {
                            return(false);
                        }
                    }

                    #endregion

                    #region  Page - Webparts

                    if (!ctx.Web.IsNoScriptSite() && sourcePage.WebParts.Count > 0)
                    {
                        LimitedWebPartManager wpm = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                        ctx.Load(wpm.WebParts, wps => wps.Include(wp => wp.WebPart.Title, wp => wp.WebPart.Properties));
                        ctx.ExecuteQueryRetry();

                        if (wpm.WebParts.Count > 0)
                        {
                            foreach (var spwp in sourcePage.WebParts)
                            {
                                scount++;
                                foreach (WebPartDefinition wpd in wpm.WebParts)
                                {
                                    if (spwp.Title == wpd.WebPart.Title)
                                    {
                                        tcount++;

                                        //Page - Webpart Properties
                                        Microsoft.SharePoint.Client.WebParts.WebPart wp = wpd.WebPart;
                                        var isWebPropertiesMatch = CSOMWebPartPropertiesValidation(spwp.Contents, wp.Properties);
                                        if (!isWebPropertiesMatch)
                                        {
                                            return(false);
                                        }
                                    }
                                    else
                                    {
                                        return(false);
                                    }
                                }
                            }
                            if (scount != tcount)
                            {
                                return(false);
                            }
                        }
                        else
                        {
                            return(false);
                        }
                    }

                    #endregion

                    #region Page - Security

                    scount = 0;
                    tcount = 0;

                    if (sourcePage.Security != null && file.ListItemAllFields.RoleAssignments.Count > 0)
                    {
                        bool securityResult = ValidateSecurityCSOM(ctx, sourcePage.Security, file.ListItemAllFields);

                        if (!securityResult)
                        {
                            return(false);
                        }
                    }
                    #endregion
                }
                else
                {
                    return(false);
                }
            }

            return(true);
        }
Example #8
0
 private static void MoveWebPartsToWikiOrPublishingContentEditorWebPartZone(ClientContext ctx,
                                                                            Dictionary <string, string> newIdMappings, LimitedWebPartManager limitedWebPartManager)
 {
     foreach (var wp in limitedWebPartManager.WebParts)
     {
         if (newIdMappings.Values.Contains(wp.Id.ToString().Replace("{", "").Replace("}", "").ToLower()))
         {
             wp.MoveWebPartTo("wpz", 0);
             wp.SaveWebPartChanges();
             ctx.ExecuteQueryRetry();
         }
     }
 }
Example #9
0
 private static void LoadWebPartManagerFromSharePoint(ClientContext ctx,
                                                      LimitedWebPartManager limitedWebPartManager)
 {
     ctx.Load(limitedWebPartManager.WebParts, wps => wps.Include(wp => wp.Id));
     ctx.ExecuteQueryRetry();
 }
        private static bool SetViewForWebpart(string fileUrl, ClientContext context, List list, string webpartName)
        {
            //Setup
            bool result = true;

            _log.Debug("Inside SetViewForWebpart");
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            try
            {
                File file = context.Web.GetFileByServerRelativeUrl(fileUrl);

                LimitedWebPartManager webPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared);
                context.Load(webPartManager,
                             w => w.WebParts,
                             w => w.WebParts.Include(wp => wp.WebPart),
                             w => w.WebParts.Include(wp => wp.WebPart.Properties));
                context.ExecuteQueryRetry();

                WebPartDefinitionCollection webPartDefinitionCollection = webPartManager.WebParts;

                foreach (WebPartDefinition webPartDefinition in webPartDefinitionCollection)
                {
                    WebPart webpart = webPartDefinition.WebPart;

                    Dictionary <string, object> propertyValue = webpart.Properties.FieldValues;

                    if (propertyValue["Title"].ToString().Equals(webpartName))
                    {
                        View listView   = list.Views.GetById(webPartDefinition.Id);
                        var  viewFields = listView.ViewFields;

                        context.Load(listView, l => l.ListViewXml);
                        context.Load(viewFields);
                        context.ExecuteQueryRetry();

                        if (true)
                        {
                            int styleId = 0;

                            //parse xml
                            XmlDocument doc = new XmlDocument();
                            doc.LoadXml(listView.ListViewXml);

                            XmlElement element = (XmlElement)doc.SelectSingleNode("//View//ViewStyle");
                            if (element == null)
                            {
                                element = doc.CreateElement("ViewStyle");
                                element.SetAttribute("ID", styleId.ToString());
                                doc.DocumentElement.AppendChild(element);
                            }
                            else
                            {
                                element.SetAttribute("ID", styleId.ToString());
                            }

                            listView.ListViewXml = doc.FirstChild.InnerXml;

                            //Performance
                            listView.Update();
                            context.ExecuteQueryRetry();
                        }

                        webpart.Properties["InplaceSearchEnabled"]    = false;
                        webpart.Properties["DisableViewSelectorMenu"] = true;
                        webPartDefinition.SaveWebPartChanges();
                        context.ExecuteQueryRetry();

                        if (true)
                        {
                            listView.ViewFields.RemoveAll();
                            listView.ViewFields.Add("ID");
                            listView.ViewFields.Add("FileLeafRef");
                        }

                        listView.RowLimit    = 30;
                        listView.TabularView = false;
                        listView.Update();
                        context.ExecuteQueryRetry();
                    }
                }
            }
            catch (Exception e)
            {
                result = false;
                _log.Error(e, "Error inside SetViewForWebpart");
            }

            stopwatch.Stop();
            _log.Debug($"It took {stopwatch.Elapsed} to set the view");
            return(true);
        }
Example #11
0
        /// <summary>
        /// Analyses a wiki page
        /// </summary>
        /// <returns>Information about the analyzed wiki page</returns>
        public Tuple <PageLayout, List <WebPartEntity> > Analyze()
        {
            List <WebPartEntity> webparts = new List <WebPartEntity>();

            //Load the page
            var wikiPageUrl = page[Constants.FileRefField].ToString();
            var wikiPage    = cc.Web.GetFileByServerRelativeUrl(wikiPageUrl);

            cc.Load(wikiPage);
            cc.ExecuteQueryRetry();

            // Load wiki content in HTML parser
            if (page.FieldValues[Constants.WikiField] == null)
            {
                throw new Exception("WikiField contents was set to null, this is an invalid and empty wiki page.");
            }

            var pageContents = page.FieldValues[Constants.WikiField].ToString();
            var htmlDoc      = parser.Parse(pageContents);
            var layout       = GetLayout(htmlDoc);

            if (string.IsNullOrEmpty(pageContents))
            {
                layout = PageLayout.Wiki_OneColumn;
            }

            List <WebPartPlaceHolder> webPartsToRetrieve = new List <WebPartPlaceHolder>();

            var rows     = htmlDoc.All.Where(p => p.LocalName == "tr");
            int rowCount = 0;

            foreach (var row in rows)
            {
                rowCount++;
                var columns = row.Children.Where(p => p.LocalName == "td" && p.Parent == row);

                int colCount = 0;
                foreach (var column in columns)
                {
                    colCount++;
                    var contentHost = column.Children.Where(p => p.LocalName == "div" && (p.ClassName != null && p.ClassName.Equals("ms-rte-layoutszone-outer", StringComparison.InvariantCultureIgnoreCase))).FirstOrDefault();

                    // Check if this element is nested in another already processed element...this needs to be skipped to avoid content duplication and possible processing errors
                    if (contentHost != null && contentHost.FirstElementChild != null && !IsNestedLayoutsZoneOuter(contentHost))
                    {
                        var content = contentHost.FirstElementChild;

                        // Drop elements which we anyhow can't transform and/or which are stripped out from RTE
                        CleanHtml(content, htmlDoc);

                        StringBuilder textContent = new StringBuilder();
                        int           order       = 0;
                        foreach (var node in content.ChildNodes)
                        {
                            // Do we find a web part inside...
                            if (((node as IHtmlElement) != null) && ContainsWebPart(node as IHtmlElement))
                            {
                                var    extraText              = StripWebPart(node as IHtmlElement);
                                string extraTextAfterWebPart  = null;
                                string extraTextBeforeWebPart = null;
                                if (!string.IsNullOrEmpty(extraText))
                                {
                                    // Should be, but checking anyhow
                                    int webPartMarker = extraText.IndexOf(webPartMarkerString);
                                    if (webPartMarker > -1)
                                    {
                                        extraTextBeforeWebPart = extraText.Substring(0, webPartMarker);
                                        extraTextAfterWebPart  = extraText.Substring(webPartMarker + webPartMarkerString.Length);

                                        // there could have been multiple web parts in a row (we don't support text inbetween them for now)...strip the remaining markers
                                        extraTextBeforeWebPart = extraTextBeforeWebPart.Replace(webPartMarkerString, "");
                                        extraTextAfterWebPart  = extraTextAfterWebPart.Replace(webPartMarkerString, "");
                                    }
                                }

                                if (!string.IsNullOrEmpty(extraTextBeforeWebPart))
                                {
                                    textContent.AppendLine(extraTextBeforeWebPart);
                                }

                                // first insert text part (if it was available)
                                if (!string.IsNullOrEmpty(textContent.ToString()))
                                {
                                    order++;
                                    webparts.Add(CreateWikiTextPart(textContent.ToString(), rowCount, colCount, order));
                                    textContent.Clear();
                                }

                                // then process the web part
                                order++;
                                Regex regexClientIds = new Regex(@"id=\""div_(?<ControlId>(\w|\-)+)");
                                if (regexClientIds.IsMatch((node as IHtmlElement).OuterHtml))
                                {
                                    foreach (Match webPartMatch in regexClientIds.Matches((node as IHtmlElement).OuterHtml))
                                    {
                                        // Store the web part we need, will be retrieved afterwards to optimize performance
                                        string serverSideControlId            = webPartMatch.Groups["ControlId"].Value;
                                        var    serverSideControlIdToSearchFor = $"g_{serverSideControlId.Replace("-", "_")}";
                                        webPartsToRetrieve.Add(new WebPartPlaceHolder()
                                        {
                                            ControlId = serverSideControlIdToSearchFor, Id = serverSideControlId, Row = rowCount, Column = colCount, Order = order
                                        });
                                    }
                                }

                                // Process the extra text that was positioned after the web part (if any)
                                if (!string.IsNullOrEmpty(extraTextAfterWebPart))
                                {
                                    textContent.AppendLine(extraTextAfterWebPart);
                                }
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(node.TextContent.Trim()) && node.TextContent.Trim() == "\n")
                                {
                                    // ignore, this one is typically added after a web part
                                }
                                else
                                {
                                    if (node.HasChildNodes)
                                    {
                                        textContent.AppendLine((node as IHtmlElement).OuterHtml);
                                    }
                                    else
                                    {
                                        if (!string.IsNullOrEmpty(node.TextContent.Trim()))
                                        {
                                            textContent.AppendLine(node.TextContent);
                                        }
                                        else
                                        {
                                            if (node.NodeName.Equals("br", StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                textContent.AppendLine("<BR>");
                                            }
                                            // given that wiki html can contain embedded images and videos while not having child nodes we need include these.
                                            // case: img/iframe tag as "only" element to evaluate (e.g. first element in the contenthost)
                                            else if (node.NodeName.Equals("img", StringComparison.InvariantCultureIgnoreCase) ||
                                                     node.NodeName.Equals("iframe", StringComparison.InvariantCultureIgnoreCase))
                                            {
                                                textContent.AppendLine((node as IHtmlElement).OuterHtml);
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        // there was only one text part
                        if (!string.IsNullOrEmpty(textContent.ToString()))
                        {
                            // insert text part to the web part collection
                            order++;
                            webparts.Add(CreateWikiTextPart(textContent.ToString(), rowCount, colCount, order));
                        }
                    }
                }
            }

            // Bulk load the needed web part information
            if (webPartsToRetrieve.Count > 0)
            {
                // Load web part manager and use it to load each web part
                LimitedWebPartManager limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
                cc.Load(limitedWPManager);

                foreach (var webPartToRetrieve in webPartsToRetrieve)
                {
                    // Check if the web part was loaded when we loaded the web parts collection via the web part manager
                    if (!Guid.TryParse(webPartToRetrieve.Id, out Guid webPartToRetrieveGuid))
                    {
                        // Skip since guid is not valid
                        continue;
                    }

                    // Sometimes the returned wiki html contains web parts which are not anymore on the page...using the ExceptionHandlingScope
                    // we can handle these errors server side while just doing a single roundtrip
                    var scope = new ExceptionHandlingScope(cc);
                    using (scope.StartScope())
                    {
                        using (scope.StartTry())
                        {
                            webPartToRetrieve.WebPartDefinition = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId);
                            cc.Load(webPartToRetrieve.WebPartDefinition, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties);
                        }
                        using (scope.StartCatch())
                        {
                        }
                    }
                }
                cc.ExecuteQueryRetry();


                // Load the web part XML for the web parts that do allow it
                bool isDirty = false;
                foreach (var webPartToRetrieve in webPartsToRetrieve)
                {
                    // Important to only process the web parts that did not return an error in the previous server call
                    if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false))
                    {
                        // Retry to load the properties, sometimes they're not retrieved
                        webPartToRetrieve.WebPartDefinition.EnsureProperty(wp => wp.Id);
                        webPartToRetrieve.WebPartDefinition.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties);

                        if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode == WebPartExportMode.All)
                        {
                            webPartToRetrieve.WebPartXml = limitedWPManager.ExportWebPart(webPartToRetrieve.WebPartDefinition.Id);
                            isDirty = true;
                        }
                    }
                }
                if (isDirty)
                {
                    cc.ExecuteQueryRetry();
                }

                // Determine the web part type and store it in the web parts array
                foreach (var webPartToRetrieve in webPartsToRetrieve)
                {
                    if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false))
                    {
                        // Important to only process the web parts that did not return an error in the previous server call
                        if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode != WebPartExportMode.All)
                        {
                            // Use different approach to determine type as we can't export the web part XML without indroducing a change
                            webPartToRetrieve.WebPartType = GetTypeFromProperties(webPartToRetrieve.WebPartDefinition.WebPart.Properties);
                        }
                        else
                        {
                            webPartToRetrieve.WebPartType = GetType(webPartToRetrieve.WebPartXml.Value);
                        }

                        webparts.Add(new WebPartEntity()
                        {
                            Title           = webPartToRetrieve.WebPartDefinition.WebPart.Title,
                            Type            = webPartToRetrieve.WebPartType,
                            Id              = webPartToRetrieve.WebPartDefinition.Id,
                            ServerControlId = webPartToRetrieve.Id,
                            Row             = webPartToRetrieve.Row,
                            Column          = webPartToRetrieve.Column,
                            Order           = webPartToRetrieve.Order,
                            ZoneId          = "",
                            ZoneIndex       = (uint)webPartToRetrieve.WebPartDefinition.WebPart.ZoneIndex,
                            IsClosed        = webPartToRetrieve.WebPartDefinition.WebPart.IsClosed,
                            Hidden          = webPartToRetrieve.WebPartDefinition.WebPart.Hidden,
                            Properties      = Properties(webPartToRetrieve.WebPartDefinition.WebPart.Properties, webPartToRetrieve.WebPartType, webPartToRetrieve.WebPartXml == null ? "" : webPartToRetrieve.WebPartXml.Value),
                        });
                    }
                }

                #region old approach

                /*
                 * // Load web parts on wiki page
                 * var limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
                 * cc.Load(limitedWPManager);
                 * var webParts = limitedWPManager.WebParts;
                 * cc.Load(webParts, p => p.Include(wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties));
                 * cc.ExecuteQueryRetry();
                 *
                 * foreach (var webPartToRetrieve in webPartsToRetrieve)
                 * {
                 *  try
                 *  {
                 *      // Check if the web part was loaded when we loaded the web parts collection via the web part manager
                 *      Guid webPartToRetrieveGuid;
                 *      if (!Guid.TryParse(webPartToRetrieve.Id, out webPartToRetrieveGuid))
                 *      {
                 *          // Skip since guid is not valid
                 *          continue;
                 *      }
                 *
                 *      var foundWebPart = webParts.Where(p => p.Id.Equals(webPartToRetrieveGuid)).FirstOrDefault();
                 *      if (foundWebPart == null)
                 *      {
                 *          // If not found then try to retrieve the webpart via the GetByControlId method
                 *          foundWebPart = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId);
                 *          cc.Load(foundWebPart, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties);
                 *          cc.ExecuteQueryRetry();
                 *      }
                 *
                 *      if (foundWebPart != null)
                 *      {
                 *          // Retry to load the properties, sometimes they're not retrieved
                 *          foundWebPart.EnsureProperty(wp => wp.Id);
                 *          foundWebPart.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties);
                 *
                 *          //var changed = false;
                 *          string webPartXml = "";
                 *          string webPartType = "";
                 *          var exportMode = foundWebPart.WebPart.ExportMode;
                 *          if (foundWebPart.WebPart.ExportMode != WebPartExportMode.All)
                 *          {
                 *              // Use different approach to determine type as we can't export the web part XML without indroducing a change
                 *              webPartType = GetTypeFromProperties(foundWebPart.WebPart.Properties);
                 *          }
                 *          else
                 *          {
                 *
                 *              var result = limitedWPManager.ExportWebPart(foundWebPart.Id);
                 *              cc.ExecuteQueryRetry();
                 *              webPartXml = result.Value;
                 *              webPartType = GetType(webPartXml);
                 *          }
                 *
                 *          webparts.Add(new WebPartEntity()
                 *          {
                 *              Title = foundWebPart.WebPart.Title,
                 *              Type = webPartType,
                 *              Id = foundWebPart.Id,
                 *              ServerControlId = webPartToRetrieve.Id,
                 *              Row = webPartToRetrieve.Row,
                 *              Column = webPartToRetrieve.Column,
                 *              Order = webPartToRetrieve.Order,
                 *              ZoneId = "",
                 *              ZoneIndex = (uint)foundWebPart.WebPart.ZoneIndex,
                 *              IsClosed = foundWebPart.WebPart.IsClosed,
                 *              Hidden = foundWebPart.WebPart.Hidden,
                 *              Properties = Properties(foundWebPart.WebPart.Properties, webPartType, webPartXml),
                 *          });
                 *      }
                 *  }
                 *  catch (ServerException)
                 *  {
                 *      //Eat exception because we've found a WebPart ID which is not available on the server-side
                 *  }
                 * }
                 */
                #endregion
            }

            // Somehow the wiki was not standard formatted, so lets wrap its contents in a text block
            if (webparts.Count == 0 && !String.IsNullOrEmpty(htmlDoc.Source.Text))
            {
                webparts.Add(CreateWikiTextPart(htmlDoc.Source.Text, 1, 1, 1));
            }

            return(new Tuple <PageLayout, List <WebPartEntity> >(layout, webparts));
        }
        private static void AddWebPartToWikiPage(ClientContext ctx, string fileUrl, WebPartEntity webPart, int row, int col, bool addSpace)
        {
            _log.Debug("Inside AddWebPartToWikiPage");
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            File webPartPage = ctx.Web.GetFileByServerRelativeUrl(fileUrl);

            if (webPartPage == null)
            {
                return;
            }

            ctx.Load(webPartPage);
            ctx.Load(webPartPage.ListItemAllFields);
            ctx.ExecuteQuery();

            string wikiField = (string)webPartPage.ListItemAllFields["WikiField"];

            LimitedWebPartManager limitedWebPartManager = webPartPage.GetLimitedWebPartManager(PersonalizationScope.Shared);

            ctx.Load(limitedWebPartManager);
            ctx.ExecuteQuery();

            WebPartDefinition oWebPartDefinition = limitedWebPartManager.ImportWebPart(webPart.WebPartXml);
            WebPartDefinition wpdNew             = limitedWebPartManager.AddWebPart(oWebPartDefinition.WebPart, "wpz", 0);

            ctx.Load(wpdNew);
            ctx.ExecuteQuery();

            XmlDocument xd = new XmlDocument();

            xd.PreserveWhitespace = true;
            xd.LoadXml(wikiField);

            // Sometimes the wikifield content seems to be surrounded by an additional div?
            XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement;

            if (layoutsTable == null)
            {
                layoutsTable = xd.SelectSingleNode("div/table") as XmlElement;
            }

            XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement;
            // - space element
            XmlElement space = xd.CreateElement("p");
            XmlText    text  = xd.CreateTextNode(" ");

            space.AppendChild(text);

            // - wpBoxDiv
            XmlElement wpBoxDiv = xd.CreateElement("div");

            layoutsZoneInner.AppendChild(wpBoxDiv);

            if (addSpace)
            {
                layoutsZoneInner.AppendChild(space);
            }

            XmlAttribute attribute = xd.CreateAttribute("class");

            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read ms-rte-wpbox";
            attribute       = xd.CreateAttribute("contentEditable");
            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "false";
            // - div1
            XmlElement div1 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div1);
            div1.IsEmpty = false;
            attribute    = xd.CreateAttribute("class");
            div1.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D");
            attribute       = xd.CreateAttribute("id");
            div1.Attributes.Append(attribute);
            attribute.Value = "div_" + wpdNew.Id.ToString("D");
            // - div2
            XmlElement div2 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div2);
            div2.IsEmpty = false;
            attribute    = xd.CreateAttribute("style");
            div2.Attributes.Append(attribute);
            attribute.Value = "display:none";
            attribute       = xd.CreateAttribute("id");
            div2.Attributes.Append(attribute);
            attribute.Value = "vid_" + wpdNew.Id.ToString("D");

            ListItem listItem = webPartPage.ListItemAllFields;

            listItem["WikiField"] = xd.OuterXml;
            listItem.Update();
            ctx.ExecuteQuery();

            stopwatch.Stop();
            _log.Debug($"It took {stopwatch.Elapsed} to create the webpart");
        }
Example #13
0
        private void GetUsageInList(Web rootWeb, ref List list, ref string actualWebPartType)
        {
            // list = rootWeb.Lists.GetByTitle("Pages");

            try
            {
                //Load the necessary properties with the list
                ctx.Load(list, l => l.Title, l => l.IsSiteAssetsLibrary, l => l.IsPrivate, l => l.IsCatalog, l => l.IsApplicationList);
                ctx.ExecuteQuery();
            }
            catch
            {
                list = null;
            }


            //Skip the OOB libraries
            if (list != null)
            {
                CamlQuery query = new CamlQuery();
                //Get only the items where the checkedout user field is not empty (which means the file is checked out)
                query.ViewXml = "<View Scope=\"RecursiveAll\"></View>";

                ListItemCollection items = list.GetItems(query);
                //Load all the items
                ctx.Load(items);
                ctx.ExecuteQuery();

                WriteLine("Found " + items.Count + " item(s) on list " + list.Title);

                //Iterate each items to get write to the log
                foreach (ListItem item in items)
                {
                    ctx.Load(item, i => i.File, i => i.File.ServerRelativeUrl, i => i.File.Name);
                    ctx.ExecuteQuery();

                    if (item.File.Name.EndsWith(".aspx", StringComparison.InvariantCultureIgnoreCase))
                    {
                        var oFile = item.File;

                        LimitedWebPartManager limitedWebPartManager =
                            oFile.GetLimitedWebPartManager(PersonalizationScope.Shared);

                        ctx.Load(limitedWebPartManager.WebParts,
                                 wps => wps.Include(
                                     wp => wp.WebPart.Title,
                                     wp => wp.Id,
                                     wp => wp.WebPart.Properties,
                                     wp => wp.WebPart.ZoneIndex));

                        ctx.ExecuteQuery();

                        if (limitedWebPartManager.WebParts.Count == 0)
                        {
                            WriteLine("No Web Parts on this page.");
                        }
                        else
                        {
                            foreach (WebPartDefinition wpDef in limitedWebPartManager.WebParts)
                            {
                                try
                                {
                                    string ZoneID = string.Empty;

                                    #region Get Type Name
                                    string webPartPropertiesXml = GetWebPartPropertiesServiceCall(wpDef.Id.ToString(),
                                                                                                  oFile.ServerRelativeUrl, rootWeb.Url);

                                    string WebPartTypeName = string.Empty;

                                    if (webPartPropertiesXml.Contains("WebPart/v2"))
                                    {
                                        XmlDataDocument xmldoc = new XmlDataDocument();
                                        xmldoc.LoadXml(webPartPropertiesXml);
                                        WebPartTypeName = xmldoc.DocumentElement.GetElementsByTagName("TypeName").Item(0).FirstChild.Value;
                                        ZoneID          = xmldoc.DocumentElement.GetElementsByTagName("ZoneID").Item(0).FirstChild.Value;
                                        xmldoc          = null;
                                    }
                                    else
                                    {
                                        webParts webPartProp = null;
                                        byte[]   byteArray   = Encoding.UTF8.GetBytes(webPartPropertiesXml);
                                        using (MemoryStream stream = new MemoryStream(byteArray))
                                        {
                                            using (StreamReader streamReader = new StreamReader(stream))
                                            {
                                                using (System.Xml.XmlReader reader = new XmlTextReader(streamReader))
                                                {
                                                    XmlSerializer serializer = new XmlSerializer(typeof(webParts));
                                                    webPartProp     = (webParts)serializer.Deserialize(reader);
                                                    WebPartTypeName = webPartProp.webPart.metaData.type.name;
                                                    reader.Close();
                                                    reader.Dispose();
                                                }
                                                streamReader.Close();
                                                streamReader.Dispose();
                                            }
                                            stream.Close();
                                            stream.Flush();
                                            stream.Dispose();
                                        }
                                        byteArray = null;
                                    }

                                    actualWebPartType = GetWebPartShortTypeName(WebPartTypeName);
                                    #endregion

                                    if (WebPartsToRetrieve.Contains(actualWebPartType))
                                    {
                                        WriteLine(oFile.ServerRelativeUrl + "\t" +
                                                  wpDef.Id + "\t" +
                                                  wpDef.Id + "\t" +
                                                  wpDef.WebPart.Title + "\t" +
                                                  actualWebPartType + "\t" +
                                                  rootWeb.Url + "\t" +
                                                  ZoneID + "\t" +
                                                  wpDef.WebPart.ZoneIndex + Environment.NewLine);
                                        Program.strOutput +=
                                            oFile.ServerRelativeUrl + "," +
                                            wpDef.Id + "," +
                                            wpDef.Id + "," +
                                            wpDef.WebPart.Title + "," +
                                            actualWebPartType + "," +
                                            rootWeb.Url + "," +
                                            ZoneID + "," +
                                            wpDef.WebPart.ZoneIndex + Environment.NewLine;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    WriteLine("Error in Web Part Definition: " + wpDef.WebPart.Title);
                                    WriteLine(ex.Message);
                                }
                            }
                        }
                    }
                }
            }
        }
Example #14
0
        protected void btnAddToPage_Click(object sender, EventArgs e)
        {
            var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);
            using (var clientContext = spContext.CreateUserClientContextForSPHost())
            {
                //get the web part page (DevHome.aspx) which is specific to a developer site template
                var list = clientContext.Web.Lists.GetByTitle("Site Pages");
                CamlQuery camlQuery = new CamlQuery();
                var items = list.GetItems(camlQuery);
                clientContext.Load(items, i =>
                    i.Include(item => item.DisplayName, item => item["WikiField"]).Where(item => item.DisplayName == "DevHome"));
                clientContext.ExecuteQuery();
                
                //get the webpart xml
                string wpXML = "";
                using (var stream = System.IO.File.OpenRead(Server.MapPath("~/MyPicWebPart.dwp")))
                {
                    XDocument xdoc = XDocument.Load(stream);
                    wpXML = xdoc.ToString();
                    wpXML = wpXML.Replace("\r\n", "");
                }

                //add the webpart to the page
                var wikiPage = items[0].File;
                LimitedWebPartManager limitedWebPartManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
                WebPartDefinition wpd = limitedWebPartManager.ImportWebPart(wpXML);
                var newWP = limitedWebPartManager.AddWebPart(wpd.WebPart, "wpz", 0);
                clientContext.Load(newWP);
                clientContext.ExecuteQuery();

                // Create reference to WebPart in HTML
                string wikiField = items[0]["WikiField"] as string;
                XmlDocument xd = new XmlDocument();
                xd.PreserveWhitespace = true;
                xd.LoadXml(wikiField);
                XmlElement layoutsZoneInner = xd.SelectSingleNode("div/table/tbody/tr/td/div/div") as XmlElement;

                //create wrapper
                XmlElement wpWrapper = xd.CreateElement("div");
                layoutsZoneInner.AppendChild(wpWrapper);
                XmlAttribute attribute = xd.CreateAttribute("class");
                wpWrapper.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-read ms-rte-wpbox";

                //create inner elements
                XmlElement div1 = xd.CreateElement("div");
                wpWrapper.AppendChild(div1);
                div1.IsEmpty = false;
                attribute = xd.CreateAttribute("class");
                div1.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-notify ms-rtestate-read " + newWP.Id.ToString("D");
                attribute = xd.CreateAttribute("id");
                div1.Attributes.Append(attribute);
                attribute.Value = "div_" + newWP.Id.ToString("D");

                XmlElement div2 = xd.CreateElement("div");
                wpWrapper.AppendChild(div2);
                div2.IsEmpty = false;
                attribute = xd.CreateAttribute("class");
                div2.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-read";
                attribute = xd.CreateAttribute("style");
                div2.Attributes.Append(attribute);
                attribute.Value = "display:none";
                attribute = xd.CreateAttribute("id");
                div2.Attributes.Append(attribute);
                attribute.Value = "vid_" + newWP.Id.ToString("D");

                // Update
                items[0]["WikiField"] = xd.OuterXml;
                items[0].Update();
                clientContext.ExecuteQuery();

                //toggle the UI
                imgWPP.ImageUrl = "~/Images/Yes.png";
                btnAddToPage.Enabled = false;
            }
        }
        public override ProvisioningTemplate ExtractObjects(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo)
        {
            using (var scope = new PnPMonitoredScope(this.Name))
            {
                // Extract the Home Page
                web.EnsureProperties(w => w.RootFolder.WelcomePage, w => w.ServerRelativeUrl, w => w.Url);

                var homepageUrl = web.RootFolder.WelcomePage;
                if (string.IsNullOrEmpty(homepageUrl))
                {
                    homepageUrl = "Default.aspx";
                }
                var welcomePageUrl = UrlUtility.Combine(web.ServerRelativeUrl, homepageUrl);

                var file = web.GetFileByServerRelativeUrl(welcomePageUrl);
                try
                {
                    var listItem = file.EnsureProperty(f => f.ListItemAllFields);
                    if (listItem != null)
                    {
                        if (listItem.FieldValues.ContainsKey("WikiField"))
                        {
                            // Wiki page
                            var fullUri = new Uri(UrlUtility.Combine(web.Url, web.RootFolder.WelcomePage));

                            var folderPath = fullUri.Segments.Take(fullUri.Segments.Count() - 1).ToArray().Aggregate((i, x) => i + x).TrimEnd('/');
                            var fileName   = fullUri.Segments[fullUri.Segments.Count() - 1];

                            var homeFile = web.GetFileByServerRelativeUrl(welcomePageUrl);

                            LimitedWebPartManager limitedWPManager =
                                homeFile.GetLimitedWebPartManager(PersonalizationScope.Shared);

                            web.Context.Load(limitedWPManager);

                            var webParts = web.GetWebParts(welcomePageUrl);

                            var page = new Page()
                            {
                                Layout    = WikiPageLayout.Custom,
                                Overwrite = true,
                                Url       = Tokenize(fullUri.PathAndQuery, web.Url),
                            };
                            var pageContents = listItem.FieldValues["WikiField"].ToString();

                            Regex regexClientIds = new Regex(@"id=\""div_(?<ControlId>(\w|\-)+)");
                            if (regexClientIds.IsMatch(pageContents))
                            {
                                foreach (Match webPartMatch in regexClientIds.Matches(pageContents))
                                {
                                    String serverSideControlId = webPartMatch.Groups["ControlId"].Value;

                                    WebPartDefinition webPart = limitedWPManager.WebParts.GetByControlId(String.Format("g_{0}",
                                                                                                                       serverSideControlId.Replace("-", "_")));
                                    web.Context.Load(webPart,
                                                     wp => wp.Id,
                                                     wp => wp.WebPart.Title,
                                                     wp => wp.WebPart.ZoneIndex
                                                     );
                                    web.Context.ExecuteQueryRetry();

                                    var webPartxml = TokenizeWebPartXml(web, web.GetWebPartXml(webPart.Id, welcomePageUrl));

                                    page.WebParts.Add(new Model.WebPart()
                                    {
                                        Title    = webPart.WebPart.Title,
                                        Contents = webPartxml,
                                        Order    = (uint)webPart.WebPart.ZoneIndex,
                                        Row      = 1, // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                                        Column   = 1  // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                                    });

                                    pageContents = Regex.Replace(pageContents, serverSideControlId, string.Format("{{webpartid:{0}}}", webPart.WebPart.Title), RegexOptions.IgnoreCase);
                                }
                            }

                            page.Fields.Add("WikiField", pageContents);
                            template.Pages.Add(page);

                            // Set the homepage
                            if (template.WebSettings == null)
                            {
                                template.WebSettings = new WebSettings();
                            }
                            template.WebSettings.WelcomePage = homepageUrl;
                        }
                        else
                        {
                            if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION))
                            {
                                // Not a wikipage
                                template = GetFileContents(web, template, welcomePageUrl, creationInfo, scope);
                                if (template.WebSettings == null)
                                {
                                    template.WebSettings = new WebSettings();
                                }
                                template.WebSettings.WelcomePage = homepageUrl;
                            }
                            else
                            {
                                WriteWarning(string.Format("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION), ProvisioningMessageType.Warning);
                                scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION);
                            }
                        }
                    }
                }
                catch (ServerException ex)
                {
                    if (ex.ServerErrorCode != -2146232832)
                    {
                        throw;
                    }
                    else
                    {
                        if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION))
                        {
                            // Page does not belong to a list, extract the file as is
                            template = GetFileContents(web, template, welcomePageUrl, creationInfo, scope);
                            if (template.WebSettings == null)
                            {
                                template.WebSettings = new WebSettings();
                            }
                            template.WebSettings.WelcomePage = homepageUrl;
                        }
                        else
                        {
                            WriteWarning(string.Format("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION), ProvisioningMessageType.Warning);
                            scope.LogWarning("Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}", web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION);
                        }
                    }
                }

                // If a base template is specified then use that one to "cleanup" the generated template model
                if (creationInfo.BaseTemplate != null)
                {
                    template = CleanupEntities(template, creationInfo.BaseTemplate);
                }
            }
            return(template);
        }
Example #16
0
        private void GetPage(Web web, ProvisioningTemplate template, ProvisioningTemplateCreationInformation creationInfo, string pageUrl)
        {
            try
            {
                var pageFullUrl = UrlUtility.Combine(web.ServerRelativeUrl, pageUrl);

                var file = web.GetFileByServerRelativeUrl(pageFullUrl);
                web.Context.Load(file, f => f.Name, f => f.CheckOutType, f => f.ListItemAllFields.ParentList.ForceCheckout, f => f.Level);
                web.Context.ExecuteQueryRetry();
                FileLevel fileLevel  = file.Level;
                var       checkedOut = CheckOutIfNeeded(web, file);
                try
                {
                    var listItem = file.EnsureProperty(f => f.ListItemAllFields);
                    if (listItem != null)
                    {
                        if (listItem.FieldValues.ContainsKey("WikiField"))
                        {
                            #region Wiki page

                            var fullUri = new Uri(UrlUtility.Combine(web.Url, web.RootFolder.WelcomePage));

                            var folderPath =
                                fullUri.Segments.Take(fullUri.Segments.Count() - 1)
                                .ToArray()
                                .Aggregate((i, x) => i + x)
                                .TrimEnd('/');
                            var fileName = fullUri.Segments[fullUri.Segments.Count() - 1];

                            var homeFile = web.GetFileByServerRelativeUrl(pageFullUrl);

                            LimitedWebPartManager limitedWPManager =
                                homeFile.GetLimitedWebPartManager(PersonalizationScope.Shared);

                            web.Context.Load(limitedWPManager);

                            var webParts = web.GetWebParts(pageFullUrl);

                            var page = new Page()
                            {
                                Layout    = WikiPageLayout.Custom,
                                Overwrite = true,
                                Url       = Tokenize(fullUri.PathAndQuery, web.Url),
                            };
                            var pageContents = listItem.FieldValues["WikiField"].ToString();

                            Regex regexClientIds = new Regex(@"id=\""div_(?<ControlId>(\w|\-)+)");
                            if (regexClientIds.IsMatch(pageContents))
                            {
                                foreach (Match webPartMatch in regexClientIds.Matches(pageContents))
                                {
                                    String serverSideControlId = webPartMatch.Groups["ControlId"].Value;

                                    try
                                    {
                                        String serverSideControlIdToSearchFor = String.Format("g_{0}",
                                                                                              serverSideControlId.Replace("-", "_"));

                                        WebPartDefinition webPart =
                                            limitedWPManager.WebParts.GetByControlId(serverSideControlIdToSearchFor);
                                        web.Context.Load(webPart,
                                                         wp => wp.Id,
                                                         wp => wp.WebPart.Title,
                                                         wp => wp.WebPart.ZoneIndex
                                                         );
                                        web.Context.ExecuteQueryRetry();

                                        var webPartxml = TokenizeWebPartXml(web,
                                                                            web.GetWebPartXml(webPart.Id, pageFullUrl));

                                        page.WebParts.Add(new OfficeDevPnP.Core.Framework.Provisioning.Model.WebPart()
                                        {
                                            Title    = webPart.WebPart.Title,
                                            Contents = webPartxml,
                                            Order    = (uint)webPart.WebPart.ZoneIndex,
                                            Row      = 1,
                                            // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                                            Column = 1
                                                     // By default we will create a onecolumn layout, add the webpart to it, and later replace the wikifield on the page to position the webparts correctly.
                                        });

                                        pageContents = Regex.Replace(pageContents, serverSideControlId,
                                                                     string.Format("{{webpartid:{0}}}", webPart.WebPart.Title),
                                                                     RegexOptions.IgnoreCase);
                                    }
                                    catch (ServerException)
                                    {
                                        Console.WriteLine(
                                            "Found a WebPart ID which is not available on the server-side. ID: {0}",
                                            serverSideControlId);
                                    }
                                }
                            }

                            page.Fields.Add("WikiField", pageContents);
                            template.Pages.Add(page);

                            // Set the homepage
                            if (template.WebSettings == null)
                            {
                                template.WebSettings = new WebSettings();
                            }
                            //template.WebSettings.WelcomePage = homepageUrl;

                            #endregion
                        }
                        else
                        {
                            if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION))
                            {
                                // Not a wikipage
                                template = GetFileContents(web, template, pageFullUrl, creationInfo, pageUrl);
                            }
                            else
                            {
                                Console.WriteLine(
                                    string.Format(
                                        "Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}",
                                        web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION),
                                    ProvisioningMessageType.Warning);
                                Console.WriteLine(
                                    "Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}",
                                    web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION);
                            }
                        }
                    }
                }
                catch (ServerException ex)
                {
                    if (ex.ServerErrorCode != -2146232832)
                    {
                        throw;
                    }
                    else
                    {
                        if (web.Context.HasMinimalServerLibraryVersion(Constants.MINIMUMZONEIDREQUIREDSERVERVERSION))
                        {
                            // Page does not belong to a list, extract the file as is
                            template = GetFileContents(web, template, pageFullUrl, creationInfo, pageUrl);
                        }
                        else
                        {
                            Console.WriteLine(
                                string.Format(
                                    "Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}",
                                    web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION),
                                ProvisioningMessageType.Warning);
                            Console.WriteLine(
                                "Page content export requires a server version that is newer than the current server. Server version is {0}, minimal required is {1}",
                                web.Context.ServerLibraryVersion, Constants.MINIMUMZONEIDREQUIREDSERVERVERSION);
                        }
                    }
                }
                switch (fileLevel)
                {
                case Microsoft.SharePoint.Client.FileLevel.Published:
                {
                    file.PublishFileToLevel(Microsoft.SharePoint.Client.FileLevel.Published);
                    break;
                }

                case Microsoft.SharePoint.Client.FileLevel.Draft:
                {
                    file.PublishFileToLevel(Microsoft.SharePoint.Client.FileLevel.Draft);
                    break;
                }

                default:
                {
                    if (checkedOut)
                    {
                        file.CheckIn("", CheckinType.MajorCheckIn);
                        web.Context.ExecuteQueryRetry();
                    }
                    break;
                }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static void AddCEWP(ClientContext clientContext, string formUrl, string WebPartTitle, string Zone, string contentLink, bool closeDefaultWebPart)
        {
            formUrl     = formUrl.Replace("//", "/");
            contentLink = contentLink.Replace("//", "/");
            System.Console.WriteLine(contentLink);
            Microsoft.SharePoint.Client.File oFile = clientContext.Web.GetFileByServerRelativeUrl(formUrl);
            LimitedWebPartManager            limitedWebPartManager = oFile.GetLimitedWebPartManager(PersonalizationScope.Shared);
            string webpartxml = @"<?xml version='1.0' encoding='utf-8'?>
<WebPart xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.microsoft.com/WebPart/v2'>
  <Title>" + WebPartTitle + @"</Title>
  <FrameType>Default</FrameType>
  <Description />
  <IsIncluded>true</IsIncluded>
  <ZoneID>" + Zone + @"</ZoneID>
  <PartOrder>0</PartOrder>
  <FrameState>Normal</FrameState>
  <Height />
  <Width />
  <AllowRemove>true</AllowRemove>
  <AllowZoneChange>true</AllowZoneChange>
  <AllowMinimize>true</AllowMinimize>
  <AllowConnect>true</AllowConnect>
  <AllowEdit>true</AllowEdit>
  <AllowHide>true</AllowHide>
  <IsVisible>true</IsVisible>
  <DetailLink />
  <HelpLink />
  <HelpMode>Modeless</HelpMode>
  <Dir>Default</Dir>
  <PartImageSmall />
  <MissingAssembly>Cannot import this Web Part.</MissingAssembly>
  <PartImageLarge>/_layouts/15/images/mscontl.gif</PartImageLarge>
  <IsIncludedFilter />
  <ContentLink>" + contentLink + @"</ContentLink>
  <Assembly>Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
  <TypeName>Microsoft.SharePoint.WebPartPages.ContentEditorWebPart</TypeName>
  <ContentLink xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor'>" + contentLink + @"</ContentLink>
  <Content xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor' />
  <PartStorage xmlns='http://schemas.microsoft.com/WebPart/v2/ContentEditor' />
</WebPart>" /*The webpart XML */;

            try
            {
                clientContext.Load(limitedWebPartManager.WebParts);
                clientContext.ExecuteQuery();

                if (closeDefaultWebPart)
                {
                    CloseDefaultWebPart(clientContext, limitedWebPartManager.WebParts);
                }

                DeleteWebPart(clientContext, formUrl, WebPartTitle);

                var wpd = limitedWebPartManager.ImportWebPart(webpartxml);
                limitedWebPartManager.AddWebPart(wpd.WebPart, Zone, 0);
                clientContext.ExecuteQuery();
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("error while adding the web part to the {0} form", formUrl);
                System.Console.WriteLine(ex.Message);
            }
        }
        internal void LoadWebPartsInWikiContentFromServer(List <WebPartEntity> webparts, File wikiPage, List <WebPartPlaceHolder> webPartsToRetrieve)
        {
            // Load web part manager and use it to load each web part
            LimitedWebPartManager limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);

            cc.Load(limitedWPManager);

            foreach (var webPartToRetrieve in webPartsToRetrieve)
            {
                // Check if the web part was loaded when we loaded the web parts collection via the web part manager
                if (!Guid.TryParse(webPartToRetrieve.Id, out Guid webPartToRetrieveGuid))
                {
                    // Skip since guid is not valid
                    continue;
                }

                // Sometimes the returned wiki html contains web parts which are not anymore on the page...using the ExceptionHandlingScope
                // we can handle these errors server side while just doing a single roundtrip
                var scope = new ExceptionHandlingScope(cc);
                using (scope.StartScope())
                {
                    using (scope.StartTry())
                    {
                        webPartToRetrieve.WebPartDefinition = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId);
                        cc.Load(webPartToRetrieve.WebPartDefinition, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties);
                    }
                    using (scope.StartCatch())
                    {
                    }
                }
            }
            cc.ExecuteQueryRetry();


            // Load the web part XML for the web parts that do allow it
            bool isDirty = false;

            foreach (var webPartToRetrieve in webPartsToRetrieve)
            {
                // Important to only process the web parts that did not return an error in the previous server call
                if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false))
                {
                    // Retry to load the properties, sometimes they're not retrieved
                    webPartToRetrieve.WebPartDefinition.EnsureProperty(wp => wp.Id);
                    webPartToRetrieve.WebPartDefinition.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties);

                    if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode == WebPartExportMode.All)
                    {
                        webPartToRetrieve.WebPartXml = limitedWPManager.ExportWebPart(webPartToRetrieve.WebPartDefinition.Id);
                        isDirty = true;
                    }
                }
            }
            if (isDirty)
            {
                cc.ExecuteQueryRetry();
            }

            // Determine the web part type and store it in the web parts array
            foreach (var webPartToRetrieve in webPartsToRetrieve)
            {
                if (webPartToRetrieve.WebPartDefinition != null && (webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.HasValue && webPartToRetrieve.WebPartDefinition.ServerObjectIsNull.Value == false))
                {
                    // Important to only process the web parts that did not return an error in the previous server call
                    if (webPartToRetrieve.WebPartDefinition.WebPart.ExportMode != WebPartExportMode.All)
                    {
                        // Use different approach to determine type as we can't export the web part XML without indroducing a change
                        webPartToRetrieve.WebPartType = GetTypeFromProperties(webPartToRetrieve.WebPartDefinition.WebPart.Properties);
                    }
                    else
                    {
                        webPartToRetrieve.WebPartType = GetType(webPartToRetrieve.WebPartXml.Value);
                    }

                    webparts.Add(new WebPartEntity()
                    {
                        Title           = webPartToRetrieve.WebPartDefinition.WebPart.Title,
                        Type            = webPartToRetrieve.WebPartType,
                        Id              = webPartToRetrieve.WebPartDefinition.Id,
                        ServerControlId = webPartToRetrieve.Id,
                        Row             = webPartToRetrieve.Row,
                        Column          = webPartToRetrieve.Column,
                        Order           = webPartToRetrieve.Order,
                        ZoneId          = "",
                        ZoneIndex       = (uint)webPartToRetrieve.WebPartDefinition.WebPart.ZoneIndex,
                        IsClosed        = webPartToRetrieve.WebPartDefinition.WebPart.IsClosed,
                        Hidden          = webPartToRetrieve.WebPartDefinition.WebPart.Hidden,
                        Properties      = Properties(webPartToRetrieve.WebPartDefinition.WebPart.Properties, webPartToRetrieve.WebPartType, webPartToRetrieve.WebPartXml == null ? "" : webPartToRetrieve.WebPartXml.Value),
                    });
                }
            }

            #region old approach

            /*
             * // Load web parts on wiki page
             * var limitedWPManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
             * cc.Load(limitedWPManager);
             * var webParts = limitedWPManager.WebParts;
             * cc.Load(webParts, p => p.Include(wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties));
             * cc.ExecuteQueryRetry();
             *
             * foreach (var webPartToRetrieve in webPartsToRetrieve)
             * {
             *  try
             *  {
             *      // Check if the web part was loaded when we loaded the web parts collection via the web part manager
             *      Guid webPartToRetrieveGuid;
             *      if (!Guid.TryParse(webPartToRetrieve.Id, out webPartToRetrieveGuid))
             *      {
             *          // Skip since guid is not valid
             *          continue;
             *      }
             *
             *      var foundWebPart = webParts.Where(p => p.Id.Equals(webPartToRetrieveGuid)).FirstOrDefault();
             *      if (foundWebPart == null)
             *      {
             *          // If not found then try to retrieve the webpart via the GetByControlId method
             *          foundWebPart = limitedWPManager.WebParts.GetByControlId(webPartToRetrieve.ControlId);
             *          cc.Load(foundWebPart, wp => wp.Id, wp => wp.WebPart.ExportMode, wp => wp.WebPart.Title, wp => wp.WebPart.ZoneIndex, wp => wp.WebPart.IsClosed, wp => wp.WebPart.Hidden, wp => wp.WebPart.Properties);
             *          cc.ExecuteQueryRetry();
             *      }
             *
             *      if (foundWebPart != null)
             *      {
             *          // Retry to load the properties, sometimes they're not retrieved
             *          foundWebPart.EnsureProperty(wp => wp.Id);
             *          foundWebPart.WebPart.EnsureProperties(wp => wp.ExportMode, wp => wp.Title, wp => wp.ZoneIndex, wp => wp.IsClosed, wp => wp.Hidden, wp => wp.Properties);
             *
             *          //var changed = false;
             *          string webPartXml = "";
             *          string webPartType = "";
             *          var exportMode = foundWebPart.WebPart.ExportMode;
             *          if (foundWebPart.WebPart.ExportMode != WebPartExportMode.All)
             *          {
             *              // Use different approach to determine type as we can't export the web part XML without indroducing a change
             *              webPartType = GetTypeFromProperties(foundWebPart.WebPart.Properties);
             *          }
             *          else
             *          {
             *
             *              var result = limitedWPManager.ExportWebPart(foundWebPart.Id);
             *              cc.ExecuteQueryRetry();
             *              webPartXml = result.Value;
             *              webPartType = GetType(webPartXml);
             *          }
             *
             *          webparts.Add(new WebPartEntity()
             *          {
             *              Title = foundWebPart.WebPart.Title,
             *              Type = webPartType,
             *              Id = foundWebPart.Id,
             *              ServerControlId = webPartToRetrieve.Id,
             *              Row = webPartToRetrieve.Row,
             *              Column = webPartToRetrieve.Column,
             *              Order = webPartToRetrieve.Order,
             *              ZoneId = "",
             *              ZoneIndex = (uint)foundWebPart.WebPart.ZoneIndex,
             *              IsClosed = foundWebPart.WebPart.IsClosed,
             *              Hidden = foundWebPart.WebPart.Hidden,
             *              Properties = Properties(foundWebPart.WebPart.Properties, webPartType, webPartXml),
             *          });
             *      }
             *  }
             *  catch (ServerException)
             *  {
             *      //Eat exception because we've found a WebPart ID which is not available on the server-side
             *  }
             * }
             */
            #endregion
        }
        public override void Provision(ClientContext context, Web web)
        {
            //create the group
            createYammerGroup(txtGroupName.Text, (cboNewsfeedType.SelectedValue == "Private") ? true : false);

            //get user details
            var     response  = getYammerJson(String.Format("https://www.yammer.com/api/v1/users/current.json?access_token={0}", hdnYammerAccessToken.Value));
            JObject oResponse = JObject.Parse(response);
            var     network   = oResponse.SelectToken("network_domains[0]").ToString();
            var     userId    = oResponse.SelectToken("id").ToString();

            //get the users groups to check for the group
            response = getYammerJson(String.Format("https://www.yammer.com/api/v1/groups/for_user/{0}.json", userId));
            var    groups  = JsonConvert.DeserializeObject <List <YamGroup> >(response);
            string groupId = null;

            for (int i = 0; i < groups.Count; i++)
            {
                if (groups[i].full_name.Equals(txtGroupName.Text, StringComparison.CurrentCultureIgnoreCase))
                {
                    groupId = groups[i].Id;
                    break;
                }
            }

            if (groupId != null)
            {
                string wpXML = @"
<?xml version='1.0' encoding='utf-8'?>
<webParts>
<webPart xmlns='http://schemas.microsoft.com/WebPart/v3'>
<metaData>
<type name='Microsoft.SharePoint.WebPartPages.ScriptEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' />
<importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>
</metaData>
<data>
<properties>
<property name='Title' type='string'>$Resources:core,ScriptEditorWebPartTitle;</property>
<property name='Description' type='string'>$Resources:core,ScriptEditorWebPartDescription;</property>
<property name='ChromeType' type='chrometype'>None</property>
<property name='Content' type='string'>
<![CDATA[
<div id='embedded-feed' style='height: 500px;'></div>
<script type='text/javascript' src='https://assets.yammer.com/assets/platform_embed.js'></script>
<script type='text/javascript'>  yam.connect.embedFeed({ container: '#embedded-feed', network: '" + network + @"', feedType: 'group', feedId: '" + groupId + @"'}); </script>

]]>
</property>
</properties>
</data>
</webPart>
</webParts>";
                wpXML = wpXML.Replace("\r\n", "");

                //get the web part page
                var       list      = web.Lists.GetByTitle("Site Pages");
                CamlQuery camlQuery = new CamlQuery();
                var       items     = list.GetItems(camlQuery);
                context.Load(items, i =>
                             i.Include(item => item.DisplayName, item => item["WikiField"]).Where(item => item.DisplayName == "Home"));
                context.ExecuteQuery();

                //remove the sitefeed
                var wikiPage = items[0].File;
                LimitedWebPartManager limitedWebPartManager = wikiPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
                var wps = limitedWebPartManager.WebParts;
                context.Load(wps);
                context.ExecuteQuery();
                for (int i = 0; i < wps.Count; i++)
                {
                    var wp = wps[i].WebPart;
                    context.Load(wp);
                    context.ExecuteQuery();

                    if (wp.ZoneIndex == 1)
                    {
                        wps[i].DeleteWebPart();
                        context.ExecuteQuery();
                        break;
                    }
                }

                //add the yammer embed
                WebPartDefinition wpd = limitedWebPartManager.ImportWebPart(wpXML);
                var newWP             = limitedWebPartManager.AddWebPart(wpd.WebPart, "wpz", 0);
                context.Load(newWP);
                context.ExecuteQuery();

                // Create reference to WebPart in HTML
                string      wikiField = items[0]["WikiField"] as string;
                XmlDocument xd        = new XmlDocument();
                xd.PreserveWhitespace = true;
                xd.LoadXml(wikiField);
                XmlElement layoutsZoneInner = xd.SelectSingleNode("div/table/tbody/tr[2]/td/div/div") as XmlElement;

                //create wrapper
                XmlElement wpWrapper = xd.CreateElement("div");
                layoutsZoneInner.AppendChild(wpWrapper);
                XmlAttribute attribute = xd.CreateAttribute("class");
                wpWrapper.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-read ms-rte-wpbox";

                //create inner elements
                XmlElement div1 = xd.CreateElement("div");
                wpWrapper.AppendChild(div1);
                div1.IsEmpty = false;
                attribute    = xd.CreateAttribute("class");
                div1.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-notify ms-rtestate-read " + newWP.Id.ToString("D");
                attribute       = xd.CreateAttribute("id");
                div1.Attributes.Append(attribute);
                attribute.Value = "div_" + newWP.Id.ToString("D");

                XmlElement div2 = xd.CreateElement("div");
                wpWrapper.AppendChild(div2);
                div2.IsEmpty = false;
                attribute    = xd.CreateAttribute("class");
                div2.Attributes.Append(attribute);
                attribute.Value = "ms-rtestate-read";
                attribute       = xd.CreateAttribute("style");
                div2.Attributes.Append(attribute);
                attribute.Value = "display:none";
                attribute       = xd.CreateAttribute("id");
                div2.Attributes.Append(attribute);
                attribute.Value = "vid_" + newWP.Id.ToString("D");

                // Update
                items[0]["WikiField"] = xd.OuterXml;
                items[0].Update();
                context.ExecuteQuery();
            }
        }
Example #20
0
        public SPRemoteEventResult ProcessEvent(SPRemoteEventProperties properties)
        {
            SPRemoteEventResult result = new SPRemoteEventResult();

            try
            {
                using (ClientContext clientContext =
                           TokenHelper.CreateAppEventClientContext(properties, useAppWeb: false))
                {
                    if (clientContext != null)
                    {
                        /*INSTALLED*/
                        if (properties.EventType == SPRemoteEventType.AppInstalled)
                        {
                            //Enable Publishing Feature
                            Guid id     = new Guid(PUBLISHING_INFRASTRUCTURE_FEATURE_ID);
                            var  query1 = from f in clientContext.Site.Features
                                          where f.DefinitionId == id
                                          select f;
                            var features = clientContext.LoadQuery(query1);
                            clientContext.ExecuteQuery();

                            if (features.Count() == 0)
                            {
                                clientContext.Site.Features.Add(id, false, FeatureDefinitionScope.None);
                                clientContext.ExecuteQuery();
                            }

                            //Create Search Center
                            var query2 = from w in clientContext.Site.RootWeb.Webs
                                         where w.Title == SEARCH_CENTER_TITLE
                                         select w;
                            var webs = clientContext.LoadQuery(query2);
                            clientContext.ExecuteQuery();

                            if (webs.Count() == 0)
                            {
                                WebCreationInformation webCreationInfo = new WebCreationInformation();
                                webCreationInfo.Url   = SEARCH_CENTER_URL;
                                webCreationInfo.Title = SEARCH_CENTER_TITLE;
                                webCreationInfo.UseSamePermissionsAsParentSite = true;
                                webCreationInfo.WebTemplate = SEARCH_CENTER_TEMPLATE;
                                Web newWeb = clientContext.Web.Webs.Add(webCreationInfo);
                                clientContext.ExecuteQuery();
                            }

                            //Upload Display template
                            List   gallery = clientContext.Site.RootWeb.Lists.GetByTitle(MASTER_PAGE_GALLERY_TITLE);
                            Folder folder  = clientContext.Site.RootWeb.GetFolderByServerRelativeUrl(DISPLAY_TEMPLATE_FOLDER_URL);
                            clientContext.ExecuteQuery();

                            var query3 = from f in folder.Files
                                         where f.Name == DISPLAY_TEMPLATE_NAME
                                         select f;
                            var files = clientContext.LoadQuery(query3);
                            clientContext.ExecuteQuery();

                            if (files.Count() == 0)
                            {
                                System.IO.FileStream fs = System.IO.File.Open(
                                    HostingEnvironment.MapPath(DISPLAY_TEMPLATE_PATH),
                                    System.IO.FileMode.Open, System.IO.FileAccess.Read);

                                FileCreationInformation fileCreationInfo = new FileCreationInformation();
                                fileCreationInfo.ContentStream = fs;
                                fileCreationInfo.Url           = DISPLAY_TEMPLATE_NAME;
                                fileCreationInfo.Overwrite     = true;
                                Microsoft.SharePoint.Client.File newFile = folder.Files.Add(fileCreationInfo);
                                clientContext.Load(newFile);
                                clientContext.ExecuteQuery();
                            }

                            //Set web part properties
                            webs = clientContext.LoadQuery(query2);
                            clientContext.ExecuteQuery();

                            File resultsPage = webs.First().GetFileByServerRelativeUrl(SEARCH_PAGE_URL);
                            resultsPage.CheckOut();
                            clientContext.ExecuteQuery();

                            LimitedWebPartManager manager = resultsPage.GetLimitedWebPartManager(PersonalizationScope.Shared);
                            var webPartDefs = manager.WebParts;
                            clientContext.Load(webPartDefs, parts => parts.Include(part => part.WebPart.Properties), parts => parts.Include(part => part.WebPart.Title));
                            clientContext.ExecuteQuery();

                            foreach (var webPartDef in webPartDefs)
                            {
                                if (webPartDef.WebPart.Title == RESULTS_WEB_PART_TITLE)
                                {
                                    webPartDef.WebPart.Properties[DATA_PROVIDER_PROPERTY] = "{\"QueryGroupName\":\"Default\",\"QueryPropertiesTemplateUrl\":\"sitesearch://webroot\",\"IgnoreQueryPropertiesTemplateUrl\":false,\"SourceID\":\"33b36a58-671f-4805-8db1-0078509b88c9\",\"SourceName\":\"InstallerResultSource\",\"SourceLevel\":\"SPSite\",\"CollapseSpecification\":\"\",\"QueryTemplate\":\"{searchboxquery}\",\"FallbackSort\":null,\"FallbackSortJson\":\"null\",\"RankRules\":null,\"RankRulesJson\":\"null\",\"AsynchronousResultRetrieval\":false,\"SendContentBeforeQuery\":true,\"BatchClientQuery\":true,\"FallbackLanguage\":-1,\"FallbackRankingModelID\":\"\",\"EnableStemming\":true,\"EnablePhonetic\":false,\"EnableNicknames\":false,\"EnableInterleaving\":true,\"EnableQueryRules\":true,\"EnableOrderingHitHighlightedProperty\":false,\"HitHighlightedMultivaluePropertyLimit\":-1,\"IgnoreContextualScope\":false,\"ScopeResultsToCurrentSite\":false,\"TrimDuplicates\":true,\"Properties\":{},\"PropertiesJson\":\"{}\",\"ClientType\":\"AllResultsQuery\",\"UpdateAjaxNavigate\":true,\"SummaryLength\":180,\"DesiredSnippetLength\":90,\"PersonalizedQuery\":false,\"FallbackRefinementFilters\":null,\"IgnoreStaleServerQuery\":true,\"RenderTemplateId\":\"\",\"AlternateErrorMessage\":null,\"Title\":\"\"}";
                                    webPartDef.SaveWebPartChanges();
                                    clientContext.ExecuteQuery();
                                }
                                if (webPartDef.WebPart.Title == NAVIGATION_WEB_PART_TITLE)
                                {
                                    webPartDef.DeleteWebPart();
                                    clientContext.ExecuteQuery();
                                }
                            }

                            resultsPage.CheckIn("Modified by Search Installer.", CheckinType.MajorCheckIn);
                            resultsPage.Publish("Modified by Search Installer.");
                            clientContext.ExecuteQuery();
                        }

                        /*UNINSTALLING*/
                        if (properties.EventType == SPRemoteEventType.AppUninstalling)
                        {
                            //Find Search Center
                            var web   = clientContext.Site.RootWeb;
                            var query = from w in clientContext.Site.RootWeb.Webs
                                        where w.Url == SEARCH_CENTER_URL
                                        select w;
                            var webs = clientContext.LoadQuery(query);
                            clientContext.ExecuteQuery();


                            //Delete the Search Center
                            if (webs.First() != null)
                            {
                                webs.First().DeleteObject();
                                clientContext.ExecuteQuery();
                            }
                        }
                    }
                }
                result.Status = SPRemoteEventServiceStatus.Continue;
            }
            catch (ServerException x)
            {
#if DEBUG
                if (!System.Diagnostics.EventLog.SourceExists("Installer App Events"))
                {
                    System.Diagnostics.EventLog.CreateEventSource(
                        "Installer App Events",
                        "Application");
                }

                System.Diagnostics.EventLog.WriteEntry(
                    "Installer App Events",
                    x.Message);
#endif
                result.Status = SPRemoteEventServiceStatus.Continue;
            }

            return(result);
        }
        public static string AddWebPart(ClientContext clientContext, ListItem listItem, LimitedWebPartManager wpm, string wikiField, string wpFilename, string zone)
        {
            string            filepath            = HttpContext.Current.Server.MapPath("~/Configuration/" + wpFilename);
            string            webPartFileContents = System.IO.File.ReadAllText(filepath);
            WebPartDefinition wpd    = wpm.ImportWebPart(webPartFileContents);
            WebPartDefinition wpdNew = wpm.AddWebPart(wpd.WebPart, "wpz", 0);

            clientContext.Load(wpdNew);
            clientContext.ExecuteQuery();

            // Create reference to WebPart in HTML
            string marker = String.Format(CultureInfo.InvariantCulture, "<div class=\"ms-rtestate-read ms-rte-wpbox\" contentEditable=\"false\"><div class=\"ms-rtestate-read {0}\" id=\"div_{0}\"></div><div style='display:none' id=\"vid_{0}\"></div></div>", new object[] { wpdNew.Id.ToString("D") });

            wikiField = wikiField.Replace(zone, zone + marker);

            return(wikiField);
        }
Example #22
0
        public SPOWebPartDefinition AddWebPartToWikiPage(string webPartXml, string title, int row, int col, bool addSpace)
        {
            string      wikiField = (string)ListItemAllFields["WikiField"];
            XmlDocument xd        = new XmlDocument();

            xd.PreserveWhitespace = true;
            xd.LoadXml(wikiField);

            // Sometimes the wikifield content seems to be surrounded by an additional div?
            XmlElement layoutsTable = xd.SelectSingleNode("div/div/table") as XmlElement;

            if (layoutsTable == null)
            {
                layoutsTable = xd.SelectSingleNode("div/table") as XmlElement;
            }

            XmlElement layoutsZoneInner = layoutsTable.SelectSingleNode(string.Format("tbody/tr[{0}]/td[{1}]/div/div", row, col)) as XmlElement;

            if (layoutsZoneInner == null)
            {
                throw new ArgumentException("Unable to locate row and/or column to insert HTML into.");
            }

            LimitedWebPartManager limitedWebPartManager = File.GetLimitedWebPartManager(PersonalizationScope.Shared);
            WebPartDefinition     webPartDefinition     = limitedWebPartManager.ImportWebPart(webPartXml);
            var wpdNew = limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, "wpz", 0);

            File.Context.Load(wpdNew, w => w.Id, w => w.WebPart);
            File.Context.ExecuteQuery();


            // - space element
            XmlElement space = xd.CreateElement("p");
            XmlText    text  = xd.CreateTextNode(" ");

            space.AppendChild(text);

            // - wpBoxDiv
            XmlElement wpBoxDiv = xd.CreateElement("div");

            layoutsZoneInner.AppendChild(wpBoxDiv);

            if (addSpace)
            {
                layoutsZoneInner.AppendChild(space);
            }

            XmlAttribute attribute = xd.CreateAttribute("class");

            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read ms-rte-wpbox";
            attribute       = xd.CreateAttribute("contentEditable");
            wpBoxDiv.Attributes.Append(attribute);
            attribute.Value = "false";
            // - div1
            XmlElement div1 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div1);
            div1.IsEmpty = false;
            attribute    = xd.CreateAttribute("class");
            div1.Attributes.Append(attribute);
            attribute.Value = "ms-rtestate-read " + wpdNew.Id.ToString("D");
            attribute       = xd.CreateAttribute("id");
            div1.Attributes.Append(attribute);
            attribute.Value = "div_" + wpdNew.Id.ToString("D");
            // - div2
            XmlElement div2 = xd.CreateElement("div");

            wpBoxDiv.AppendChild(div2);
            div2.IsEmpty = false;
            attribute    = xd.CreateAttribute("style");
            div2.Attributes.Append(attribute);
            attribute.Value = "display:none";
            attribute       = xd.CreateAttribute("id");
            div2.Attributes.Append(attribute);
            attribute.Value = "vid_" + wpdNew.Id.ToString("D");

            var listItem = ListItemAllFields;

            listItem["WikiField"] = xd.OuterXml;
            listItem.Update();

            var spowpd = new SPOWebPartDefinition(wpdNew);

            if (spowpd.WebPart.Title != title)
            {
                spowpd.WebPart.Title = title;
                spowpd.SaveWebPartChanges();
            }
            return(spowpd);
        }
Example #23
0
        private Dictionary <string, string> ReplaceWebPartWebSpecificIDsWithTokens(ClientContext ctx, Web web,
                                                                                   string fileUrl, LimitedWebPartManager webPartManager, Dictionary <Guid, List> listIds)
        {
            var webPartsXml = new Dictionary <string, string>();

            foreach (var wpmWebPart in webPartManager.WebParts)
            {
                var part = RequestContextCredentials == null
                    ? WebPartUtility.GetWebPart(ctx, web, fileUrl, wpmWebPart.Id)
                           .Replace("\r", "")
                           .Replace("\n", "")
                           .Trim()
                           .Replace("  ", " ")
                           .Replace("  ", " ")
                    : WebPartUtility.GetWebPart(web, RequestContextCredentials, fileUrl, wpmWebPart.Id)
                           .Replace("\r", "")
                           .Replace("\n", "")
                           .Trim()
                           .Replace("  ", " ")
                           .Replace("  ", " ");

                part = TokenizeText(web, listIds, part);
                webPartsXml[wpmWebPart.Id.ToString().ToLower().Replace("{", "").Replace("}", "")] = part;
            }
            return(webPartsXml);
        }
Example #24
0
        /// <summary>
        /// Add a web part to a site page.
        /// </summary>
        /// <param name="context">
        /// The SharePoint context.
        /// </param>
        /// <param name="webpartxml">
        /// The web part XML.
        /// </param>
        /// <param name="pageUrl">
        /// The destination page URL.
        /// </param>
        /// <param name="zone">
        /// The zone ID.
        /// </param>
        /// <param name="zoneIndex">
        /// The zone index.
        /// </param>
        /// <param name="replacetag">Placeholder tag to replace on publishing pages.</param>
        public static void AddWebPart(ClientContext context, string webpartxml, string pageUrl, string zone, int zoneIndex, string replacetag)
        {
            Microsoft.SharePoint.Client.File page = null;
            try
            {
                page = context.Web.GetFileByServerRelativeUrl(pageUrl);
                ListItem listItemHome = page.ListItemAllFields;
                context.Load(page);
                context.Load(listItemHome);
                context.ExecuteQuery();

                page.CheckOut();
                LimitedWebPartManager wpm = page.GetLimitedWebPartManager(PersonalizationScope.Shared);

                WebPartDefinition importedWebPart = wpm.ImportWebPart(webpartxml);
                WebPartDefinition webPart         = wpm.AddWebPart(importedWebPart.WebPart, zone, zoneIndex);
                context.Load(webPart, w => w.Id);
                context.ExecuteQuery();

                // Position the part at top of the Publishing Page
                if (zone == "wpz")
                {
                    // SitePage item
                    if (listItemHome.FieldValues.ContainsKey("WikiField"))
                    {
                        // Look for Placeholder text to replace, keeps the web part in the table (no zones)
                        string pageContents = listItemHome["WikiField"] as string;
                        if (pageContents != null && pageContents.Contains(replacetag))
                        {
                            listItemHome["WikiField"] = pageContents.Replace(replacetag, GetEmbeddedWebPart(webPart.Id));
                        }
                        else
                        {
                            listItemHome["WikiField"] = string.Concat(GetEmbeddedWebPart(webPart.Id), pageContents);
                        }
                    }
                    else if (listItemHome.FieldValues.ContainsKey("PublishingPageContent"))
                    {
                        // Pages item
                        listItemHome["PublishingPageContent"] = string.Concat(GetEmbeddedWebPart(webPart.Id), "<br/>", listItemHome["PublishingPageContent"], "<br/>");
                    }

                    listItemHome.Update();
                    context.ExecuteQuery();
                }
            }
            catch (Exception e)
            {
                // Error handling
                System.Diagnostics.Trace.TraceError("Error Adding Opportunity WebPart to page " + e.Message);
            }
            finally
            {
                if (page != null)
                {
                    page.CheckIn("Added the Opportunity Details Web Part", CheckinType.MinorCheckIn);
                    ////page.Publish("Added the Opportunity Details Web Part");
                    context.ExecuteQuery();
                }
            }
        }
Example #25
0
 /// <summary>
 /// Adds all web parts on matter landing page.
 /// </summary>
 /// <param name="clientContext">Client Context</param>
 /// <param name="limitedWebPartManager">LimitedWebPartManager object to import web parts</param>
 /// <param name="webPartDefinition">WebPartDefinition object to add web parts on page</param>
 /// <param name="webParts">Array of web parts that should be added on Matter Landing Page</param>
 /// <param name="zones">Array of Zone IDs</param>
 /// <returns>Success flag</returns>
 public bool AddWebPart(ClientContext clientContext, LimitedWebPartManager limitedWebPartManager, WebPartDefinition webPartDefinition, 
     string[] webParts, string[] zones)
 {
     bool result = false;
     if (null != clientContext && null != limitedWebPartManager && null != webParts && null != zones)
     {
         int index = 0;
         try
         {
             for (index = 0; index < webParts.Length; index++)
             {
                 if (!string.IsNullOrWhiteSpace(webParts[index]))
                 {
                     webPartDefinition = limitedWebPartManager.ImportWebPart(webParts[index]);
                     limitedWebPartManager.AddWebPart(webPartDefinition.WebPart, zones[index], ServiceConstants.ZONE_INDEX);
                     clientContext.ExecuteQuery();
                 }
             }
         }
         catch (Exception)
         {
             result = false;
         }
     }
     return result;
 }
Example #26
0
        public static void SetSupportCaseContent(ClientContext ctx, string pageName, string url, string queryurl)
        {
            List pages = ctx.Web.Lists.GetByTitle("Pages");

            ctx.Load(pages.RootFolder, f => f.ServerRelativeUrl);
            ctx.ExecuteQuery();

            Microsoft.SharePoint.Client.File file =
                ctx.Web.GetFileByServerRelativeUrl(pages.RootFolder.ServerRelativeUrl + "/" + pageName + ".aspx");
            ctx.Load(file);
            ctx.ExecuteQuery();

            file.CheckOut();

            LimitedWebPartManager limitedWebPartManager = file.GetLimitedWebPartManager(PersonalizationScope.Shared);

            string quicklaunchmenuFormat =
                @"<div><a href='{0}/{1}'>Sample Home Page</a></div>
                <br />
                <div style='font-weight:bold'>CSR Dashboard</div>
                <div class='cdsm_mainmenu'>
                    <ul>
                        <li><a href='{0}/CSRInfo/{1}'>My CSR Info</a></li>
                        <li><a href='{0}/CallQueue/{1}'>Call Queue</a></li>
                        <li>
                            <span class='collapse_arrow'></span>
                            <span><a href='{0}/CustomerDashboard/{1}'>Customer Dashboard</a></span>
                            <ul>
                                <li><a href='{0}/CustomerDashboard/Orders{1}'>Recent Orders</a></li>
                                <li><a class='current' href='#'>Support Cases</a></li>
                                <li><a href='{0}/CustomerDashboard/Notes{1}'>Notes</a></li>
                            </ul>
                        </li>
                    </ul>
                </div>
                <div class='cdsm_submenu'>

                </div>";

            string quicklaunchmenu = string.Format(quicklaunchmenuFormat, url, queryurl);

            string            qlwebPartXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><webParts><webPart xmlns=\"http://schemas.microsoft.com/WebPart/v3\"><metaData><type name=\"Microsoft.SharePoint.WebPartPages.ScriptEditorWebPart, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c\" /><importErrorMessage>Cannot import this Web Part.</importErrorMessage></metaData><data><properties><property name=\"Content\" type=\"string\"><![CDATA[" + quicklaunchmenu + "​​​]]></property><property name=\"ChromeType\" type=\"chrometype\">None</property></properties></data></webPart></webParts>";
            WebPartDefinition qlWpd        = limitedWebPartManager.ImportWebPart(qlwebPartXml);
            WebPartDefinition qlWpdNew     = limitedWebPartManager.AddWebPart(qlWpd.WebPart, "SupportCasesZoneLeft", 0);

            ctx.Load(qlWpdNew);

            //Customer Dropdown List Script Web Part
            string            dpwebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/CustomerDropDownlist.webpart");
            WebPartDefinition dpWpd        = limitedWebPartManager.ImportWebPart(dpwebPartXml);
            WebPartDefinition dpWpdNew     = limitedWebPartManager.AddWebPart(dpWpd.WebPart, "SupportCasesZoneTop", 0);

            ctx.Load(dpWpdNew);

            //Support Case CBS Info Web Part
            string            cbsInfoWebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCaseCBSWebPartInfo.webpart");
            WebPartDefinition cbsInfoWpd        = limitedWebPartManager.ImportWebPart(cbsInfoWebPartXml);
            WebPartDefinition cbsInfoWpdNew     = limitedWebPartManager.AddWebPart(cbsInfoWpd.WebPart, "SupportCasesZoneMiddle", 0);

            ctx.Load(cbsInfoWpdNew);

            //Support Case Content By Search Web Part
            string            cbswebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCase CBS Webpart/SupportCaseCBS.webpart");
            WebPartDefinition cbsWpd        = limitedWebPartManager.ImportWebPart(cbswebPartXml);
            WebPartDefinition cbsWpdNew     = limitedWebPartManager.AddWebPart(cbsWpd.WebPart, "SupportCasesZoneMiddle", 1);

            ctx.Load(cbsWpdNew);

            //Support Cases App Part
            string            appPartXml  = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/SupportCaseAppPart.webpart");
            WebPartDefinition appPartWpd  = limitedWebPartManager.ImportWebPart(appPartXml);
            WebPartDefinition appPartdNew = limitedWebPartManager.AddWebPart(appPartWpd.WebPart, "SupportCasesZoneBottom", 0);

            ctx.Load(appPartdNew);

            //Get Host Web Query String and show support case list web part
            string            querywebPartXml = System.IO.File.ReadAllText(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "Assets/GetHostWebQueryStringAndShowList.webpart");
            WebPartDefinition queryWpd        = limitedWebPartManager.ImportWebPart(querywebPartXml);
            WebPartDefinition queryWpdNew     = limitedWebPartManager.AddWebPart(queryWpd.WebPart, "SupportCasesZoneBottom", 1);

            ctx.Load(queryWpdNew);


            file.CheckIn("Data storage model", CheckinType.MajorCheckIn);
            file.Publish("Data storage model");
            ctx.Load(file);
            ctx.ExecuteQuery();
        }