Skip to content
This repository has been archived by the owner on Jan 19, 2021. It is now read-only.

Commit

Permalink
Merge pull request #1800 from SharePoint/dev
Browse files Browse the repository at this point in the history
December 2018 Release
  • Loading branch information
erwinvanhunen authored Dec 10, 2018
2 parents 082278c + 91bd1af commit 032c0cf
Show file tree
Hide file tree
Showing 16 changed files with 1,692 additions and 15 deletions.
Binary file not shown.
Binary file not shown.
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).

### Added

- ConvertTo-PnPClientSidePage: creates a modern client side page from a classic wiki or web part page

### Changed
- Added support for setting the page header type in Set-PnPClientSidePage

### Deprecated

Expand Down Expand Up @@ -46,7 +49,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).

### Contributors
- Paul Bullock (pkbullock)
- François-Xavier Cat (lazywinadmin)
- Fran�ois-Xavier Cat (lazywinadmin)
- Koen Zomers (KoenZomers)
- Kevin McDonnell (kevmcdonk)

Expand Down
10 changes: 6 additions & 4 deletions Commands/Admin/NewSite.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,9 @@ protected override void ExecuteCmdlet()
{
creationInformation.SiteDesign = _communicationSiteParameters.SiteDesign;
}
var results = ClientContext.CreateSiteAsync(creationInformation);
var returnedContext = results.GetAwaiter().GetResult();
var returnedContext = OfficeDevPnP.Core.Sites.SiteCollection.Create(ClientContext, creationInformation);
//var results = ClientContext.CreateSiteAsync(creationInformation);
//var returnedContext = results.GetAwaiter().GetResult();
WriteObject(returnedContext.Url);
}
else
Expand All @@ -140,8 +141,9 @@ protected override void ExecuteCmdlet()
creationInformation.IsPublic = _teamSiteParameters.IsPublic;
creationInformation.Lcid = _teamSiteParameters.Lcid;

var results = ClientContext.CreateSiteAsync(creationInformation);
var returnedContext = results.GetAwaiter().GetResult();
var returnedContext = OfficeDevPnP.Core.Sites.SiteCollection.Create(ClientContext, creationInformation);
//var results = ClientContext.CreateSiteAsync(creationInformation);
//var returnedContext = results.GetAwaiter().GetResult();
WriteObject(returnedContext.Url);
}
}
Expand Down
77 changes: 77 additions & 0 deletions Commands/Base/PipeBinds/PagePipeBind.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#if !ONPREMISES
using Microsoft.SharePoint.Client;
using SharePointPnP.PowerShell.Commands.ClientSidePages;
using System;
using System.Linq;

namespace SharePointPnP.PowerShell.Commands.Base.PipeBinds
{
public sealed class PagePipeBind
{
private const string CAMLQueryByExtensionAndName = @"
<View Scope='Recursive'>
<Query>
<Where>
<Eq>
<FieldRef Name='FileLeafRef'/>
<Value Type='text'>{0}</Value>
</Eq>
</Where>
</Query>
</View>";

private readonly ListItem pageListItem;
private readonly string name;

public PagePipeBind(ListItem pageListItem)
{
this.pageListItem = pageListItem;
if (this.pageListItem != null)
{
this.name = this.pageListItem.FieldValues["FileLeafRef"].ToString();
}
}

public PagePipeBind(string name)
{
this.name = ClientSidePageUtilities.EnsureCorrectPageName(name);
this.pageListItem = null;
}

public ListItem PageListItem => this.pageListItem;

public string Name => this.name;

internal ListItem GetPage(Web web)
{
// Get pages library
ListCollection listCollection = web.Lists;
listCollection.EnsureProperties(coll => coll.Include(li => li.BaseTemplate));
var sitePagesLibrary = listCollection.Where(p => p.BaseTemplate == (int)ListTemplateType.WebPageLibrary).FirstOrDefault();
if (sitePagesLibrary != null)
{
CamlQuery query = null;
if (!string.IsNullOrEmpty(this.name))
{
query = new CamlQuery
{
ViewXml = string.Format(CAMLQueryByExtensionAndName, this.name)
};

var page = sitePagesLibrary.GetItems(query);
web.Context.Load(page);
web.Context.ExecuteQueryRetry();

if (page.Count == 1)
{
return page[0];
}
}
}

return null;
}

}
}
#endif
162 changes: 162 additions & 0 deletions Commands/ClientSidePages/ConvertToClientSidePage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
#if !ONPREMISES
using SharePointPnP.PowerShell.CmdletHelpAttributes;
using System;
using System.Management.Automation;
using SharePointPnP.PowerShell.Commands.Base.PipeBinds;
using SharePointPnP.Modernization.Framework.Transform;
using SharePointPnP.PowerShell.Commands.Utilities;
using System.Reflection;

namespace SharePointPnP.PowerShell.Commands.ClientSidePages
{

[Cmdlet(VerbsData.ConvertTo, "PnPClientSidePage")]
[CmdletHelp("Converts a classic page (wiki or web part page) into a Client-Side Page",
Category = CmdletHelpCategory.ClientSidePages, SupportedPlatform = CmdletSupportedPlatform.Online)]
[CmdletExample(
Code = @"PS:> ConvertTo-PnPClientSidePage -Identity ""somepage.aspx"" -Overwrite",
Remarks = "Converts a wiki page named 'somepage' to a client side page",
SortOrder = 1)]
[CmdletExample(
Code = @"PS:> ConvertTo-PnPClientSidePage -Identity ""somepage.aspx"" -Overwrite -WebPartMappingFile c:\contoso\webpartmapping.xml",
Remarks = "Converts a wiki page named 'somepage' to a client side page using a custom provided mapping file",
SortOrder = 2)]
public class ConvertToClientSidePage : PnPWebCmdlet
{
private Assembly modernizationAssembly;
private Assembly sitesCoreAssembly;
private Assembly newtonsoftAssembly;

[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0, HelpMessage = "The name of the page to convert")]
public PagePipeBind Identity;

[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true, HelpMessage = "Path and name of the web part mapping file driving the transformation", ParameterSetName = "WebPartMappingFile")]
public string WebPartMappingFile;

[Parameter(Mandatory = false, HelpMessage = "Overwrites page if already existing")]
public SwitchParameter Overwrite = false;

[Parameter(Mandatory = false, HelpMessage = "Created client side page takes name from previous classic page. Classic page gets renamed to previous_<Page>.aspx")]
public SwitchParameter TakeSourcePageName = false;

[Parameter(Mandatory = false, HelpMessage = "Replaces a home page with a default stock modern home page")]
public SwitchParameter ReplaceHomePageWithDefault = false;

[Parameter(Mandatory = false, HelpMessage = "Adds the page accept banner web part. The actual web part is specified in webpartmapping.xml file")]
public SwitchParameter AddPageAcceptBanner = false;

protected override void ExecuteCmdlet()
{
string tempPath = null;

try
{
//Fix loading of modernization framework
FixAssemblyResolving();

// Load the page to transform
var page = Identity.GetPage(this.ClientContext.Web);

if (page == null)
{
throw new Exception($"Page '{Identity?.Name}' does not exist");
}

if (string.IsNullOrEmpty(this.WebPartMappingFile))
{
// Load the default one from resources
string webpartMappingFileContents = WebPartMappingLoader.LoadFile("SharePointPnP.PowerShell.Commands.ClientSidePages.webpartmapping.xml");

// Save the file to a temp location
tempPath = System.IO.Path.GetTempFileName();
System.IO.File.WriteAllText(tempPath, webpartMappingFileContents);
this.WebPartMappingFile = tempPath;

this.WriteVerbose("Using embedded webpartmapping file (https://github.com/SharePoint/PnP-PowerShell/blob/master/Commands/ClientSidePages/webpartmapping.xml)");
}

// Validate webpartmappingfile
if (!string.IsNullOrEmpty(this.WebPartMappingFile))
{
if (!System.IO.File.Exists(this.WebPartMappingFile))
{
throw new Exception($"Provided webpartmapping file {this.WebPartMappingFile} does not exist");
}
}

// Create transformator instance
PageTransformator pageTransformator = new PageTransformator(this.ClientContext, this.WebPartMappingFile);

// Setup Transformation information
PageTransformationInformation pti = new PageTransformationInformation(page)
{
Overwrite = this.Overwrite,
TargetPageTakesSourcePageName = this.TakeSourcePageName,
ReplaceHomePageWithDefaultHomePage = this.ReplaceHomePageWithDefault,
ModernizationCenterInformation = new ModernizationCenterInformation()
{
AddPageAcceptBanner = this.AddPageAcceptBanner
},
};

string serverRelativeClientPageUrl = pageTransformator.Transform(pti);

ClientSidePagePipeBind cpb = new ClientSidePagePipeBind(System.IO.Path.GetFileName(serverRelativeClientPageUrl));
var clientSidePage = cpb.GetPage(this.ClientContext);

if (clientSidePage != null)
{
WriteObject(clientSidePage);
}
}
finally
{
if (!string.IsNullOrEmpty(tempPath) && System.IO.File.Exists(tempPath))
{
System.IO.File.Delete(tempPath);
}
}
}

private string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return System.IO.Path.GetDirectoryName(path);
}
}

private void FixAssemblyResolving()
{
try
{
newtonsoftAssembly = Assembly.LoadFrom(System.IO.Path.Combine(AssemblyDirectory, "NewtonSoft.Json.dll"));
sitesCoreAssembly = Assembly.LoadFrom(System.IO.Path.Combine(AssemblyDirectory, "OfficeDevPnP.Core.dll"));
modernizationAssembly = Assembly.LoadFrom(System.IO.Path.Combine(AssemblyDirectory, "SharePointPnP.Modernization.Framework.dll"));
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
catch { }
}

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith("OfficeDevPnP.Core"))
{
return sitesCoreAssembly;
}
if (args.Name.StartsWith("Newtonsoft.Json"))
{
return newtonsoftAssembly;
}
if (args.Name.StartsWith("SharePointPnP.Modernization.Framework"))
{
return modernizationAssembly;
}
return null;
}
}
}
#endif
68 changes: 67 additions & 1 deletion Commands/ClientSidePages/SetClientSidePage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,25 @@ namespace SharePointPnP.PowerShell.Commands.ClientSidePages
Code = @"PS:> Set-PnPClientSidePage -Identity ""MyPage"" -CommentsEnabled:$false",
Remarks = "Disables the comments on the Client-Side page named 'MyPage'",
SortOrder = 3)]
public class SetClientSidePage : PnPWebCmdlet
[CmdletExample(
Code = @"PS:> Set-PnPClientSidePage -Identity ""MyPage"" -HeaderType Default",
Remarks = "Sets the header of the page to the default header",
SortOrder = 4)]
[CmdletExample(
Code = @"PS:> Set-PnPClientSidePage -Identity ""MyPage"" -HeaderType None",
Remarks = "Removes the header of the page",
SortOrder = 5)]
[CmdletExample(
Code = @"PS:> Set-PnPClientSidePage -Identity ""MyPage"" -HeaderType Custom -ServerRelativeImageUrl ""/sites/demo1/assets/myimage.png"" -TranslateX 10.5 -TranslateY 11.0",
Remarks = "Sets the header of the page to custom header, using the specified image and translates the location of the image in the header given the values specified",
SortOrder = 6)]
[CmdletAdditionalParameter(ParameterType = typeof(string), ParameterName = "ServerRelativeImageUrl", HelpMessage = "The URL of the image to show in the header", ParameterSetName = ParameterSet_CUSTOMHEADER)]
[CmdletAdditionalParameter(ParameterType = typeof(double), ParameterName = "TranslateX", HelpMessage = "A value defining how to translate the image on the x-axis", ParameterSetName = ParameterSet_CUSTOMHEADER)]
[CmdletAdditionalParameter(ParameterType = typeof(double), ParameterName = "TranslateY", HelpMessage = "A value defining how to translate the image on the y-axis", ParameterSetName = ParameterSet_CUSTOMHEADER)]
public class SetClientSidePage : PnPWebCmdlet, IDynamicParameters
{
const string ParameterSet_CUSTOMHEADER = "Custom Header";

[Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0, HelpMessage = "The name/identity of the page")]
public ClientSidePagePipeBind Identity;

Expand All @@ -45,10 +62,25 @@ public class SetClientSidePage : PnPWebCmdlet
[Parameter(Mandatory = false, HelpMessage = "Publishes the page once it is saved.")]
public SwitchParameter Publish;

[Parameter(Mandatory = false, HelpMessage = "Sets the page header type")]
public ClientSidePageHeaderType HeaderType;

[Obsolete("This parameter value will be ignored")]
[Parameter(Mandatory = false, HelpMessage = "Sets the message for publishing the page.")]
public string PublishMessage = string.Empty;

private CustomHeaderDynamicParameters customHeaderParameters;

public object GetDynamicParameters()
{
if (HeaderType == ClientSidePageHeaderType.Custom)
{
customHeaderParameters = new CustomHeaderDynamicParameters();
return customHeaderParameters;
}
return null;
}

protected override void ExecuteCmdlet()
{

Expand All @@ -70,6 +102,28 @@ protected override void ExecuteCmdlet()
clientSidePage.PageTitle = Title;
}

if (MyInvocation.BoundParameters.ContainsKey("HeaderType"))
{
switch (HeaderType)
{
case ClientSidePageHeaderType.Default:
{
clientSidePage.SetDefaultPageHeader();
break;
}
case ClientSidePageHeaderType.Custom:
{
clientSidePage.SetCustomPageHeader(customHeaderParameters.ServerRelativeImageUrl, customHeaderParameters.TranslateX, customHeaderParameters.TranslateY);
break;
}
case ClientSidePageHeaderType.None:
{
clientSidePage.RemovePageHeader();
break;
}
}
}

clientSidePage.Save(name);

// If a specific promote type is specified, promote the page as Home or Article or ...
Expand Down Expand Up @@ -105,6 +159,18 @@ protected override void ExecuteCmdlet()

WriteObject(clientSidePage);
}

public class CustomHeaderDynamicParameters
{
[Parameter(Mandatory = true)]
public string ServerRelativeImageUrl { get; set; }

[Parameter(Mandatory = false)]
public double TranslateX { get; set; } = 0.0;

[Parameter(Mandatory = false)]
public double TranslateY { get; set; } = 0.0;
}
}
}
#endif
Loading

0 comments on commit 032c0cf

Please sign in to comment.